From 931fced027399f364f57ab7c3b0cad1bb9d91d4b Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 22 Mar 2016 21:03:27 -0700 Subject: [PATCH 0001/1011] Remove dependency apt-transport-sftp --- build_debian.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index 453a6c1d6cf6..35b8c8d4ccb3 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -169,7 +169,6 @@ sudo LANG=C chroot $FILESYSTEM_ROOT pip uninstall -y pip echo '[INFO] Install apt-transport-sftp package from deps directory' sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install libssh2-1 -sudo dpkg --root=$FILESYSTEM_ROOT -i deps/apt-transport-sftp_*.deb ## Config DHCP for eth0 sudo tee -a $FILESYSTEM_ROOT/etc/network/interfaces > /dev/null < Date: Tue, 22 Mar 2016 21:23:05 -0700 Subject: [PATCH 0002/1011] (document) --- README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d6525945899e..36f51966773a 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,23 @@ # Description Build an [Open Network Install Environment (ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also build docker images running inside the NOS. +# Prerequisite +## 1. Linux kernel with switch drivers +Build the [Azure/sonic-linux-kernel](https://github.com/Azure/sonic-linux-kernel) project and copy the output .deb file into ./deps directory. + +## 2. initramfs-tools with loop device support +Run the script to build the .deb file into ./deps directory. + + ./get_deps.sh + # Usage ## Build NOS installer image ./build_debian USERNAME PASSWORD_ENCRYPTED && ./build_image.sh -For example, the user name is 'acsadmin' and the password is 'YourPaSsWoRd'. +For example, the user name is 'admin' and the password is 'YourPaSsWoRd'. - ./build_debian.sh "acsadmin" "$(perl -e 'print crypt("YourPaSsWoRd", "salt"),"\n"')" && ./build_image.sh + ./build_debian.sh "admin" "$(perl -e 'print crypt("YourPaSsWoRd", "salt"),"\n"')" && ./build_image.sh The root is disabled, but the created user could sudo. From e39d3b8299b570a2e7bb8980a4792bdcfe1fdcc0 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 23 Mar 2016 17:47:37 -0700 Subject: [PATCH 0003/1011] sswsyncd container: add python to be ansible --- docker-sswsyncd/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-sswsyncd/Dockerfile b/docker-sswsyncd/Dockerfile index d260f442b392..9894d46c3153 100755 --- a/docker-sswsyncd/Dockerfile +++ b/docker-sswsyncd/Dockerfile @@ -7,6 +7,7 @@ RUN apt-get clean && apt-get update ## Pre-install the fundamental packages ## TODO: sswsyncd depends on ifupdown RUN apt-get -y install \ + python \ ifupdown \ rsyslog From 537242d213788e3ac29ac006f510381d3c3b4525 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 6 Apr 2016 11:55:25 -0700 Subject: [PATCH 0004/1011] Update README.md with build environment --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 36f51966773a..d311061174ac 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,12 @@ Build an [Open Network Install Environment (ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also build docker images running inside the NOS. # Prerequisite -## 1. Linux kernel with switch drivers +## 1. Build environment +Preferably use [the Dockerfile](https://github.com/Azure/sonic-build-tools/blob/master/sonic-slave/Dockerfile), or use Debian Jessie and manually install packages appearing in the Dockerfile. +## 2. Linux kernel with switch drivers Build the [Azure/sonic-linux-kernel](https://github.com/Azure/sonic-linux-kernel) project and copy the output .deb file into ./deps directory. -## 2. initramfs-tools with loop device support +## 3. initramfs-tools with loop device support Run the script to build the .deb file into ./deps directory. ./get_deps.sh From 85f354b77b0121aeabd1cd9f2fe08a71862479d4 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 27 May 2016 13:30:13 -0700 Subject: [PATCH 0005/1011] Sqush merge latest code to github branch --- .gitmodules | 3 ++ README.md | 1 + build_debian.sh | 32 ++++++++++----- build_docker.sh | 31 +++++++++----- build_image.sh | 2 +- docker-base | 1 + docker-basic_router/Dockerfile | 17 ++++++++ docker-bgp/Dockerfile | 15 +++---- docker-database/Dockerfile | 20 ++++----- docker-fpm/Dockerfile | 21 ++++++++++ docker-lldp/Dockerfile | 24 +++++++---- docker-mlnx-sswsyncd-rpc/Dockerfile | 38 +++++++++++++++++ docker-mlnx-sswsyncd/Dockerfile | 30 ++++++++++++++ docker-orchagent/Dockerfile | 22 ++++++++++ docker-platform-monitor/Dockerfile | 16 ++++++++ docker-snmp/Dockerfile | 30 ++++++++++---- docker-sswsyncd/Dockerfile | 18 ++++----- docker-syncd-mlnx/Dockerfile | 33 +++++++++++++++ docker-syncd/Dockerfile | 24 +++++++++++ docker-vas/Dockerfile | 36 +++++++++++++++++ files/apt/apt.conf.d/81norecommends | 3 ++ files/dhcp/rfc3442-classless-routes | 63 +++++++++++++++++++++++++++++ files/sources.list | 8 ---- 23 files changed, 413 insertions(+), 75 deletions(-) create mode 100644 .gitmodules create mode 160000 docker-base create mode 100644 docker-basic_router/Dockerfile create mode 100755 docker-fpm/Dockerfile create mode 100644 docker-mlnx-sswsyncd-rpc/Dockerfile create mode 100755 docker-mlnx-sswsyncd/Dockerfile create mode 100755 docker-orchagent/Dockerfile create mode 100755 docker-platform-monitor/Dockerfile create mode 100755 docker-syncd-mlnx/Dockerfile create mode 100755 docker-syncd/Dockerfile create mode 100755 docker-vas/Dockerfile create mode 100644 files/apt/apt.conf.d/81norecommends create mode 100644 files/dhcp/rfc3442-classless-routes delete mode 100644 files/sources.list diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000000..267fb9435909 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "docker-base"] + path = docker-base + url = https://github.com/Azure/sonic-docker-base.git diff --git a/README.md b/README.md index d311061174ac..07ec85b1569b 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ The root is disabled, but the created user could sudo. ./build_docker.sh docker-bgp ./build_docker.sh docker-snmp ./build_docker.sh docker-lldp + ./build_docker.sh docker-basic_router # Contribution guide diff --git a/build_debian.sh b/build_debian.sh index 35b8c8d4ccb3..a8149ca72289 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -61,7 +61,7 @@ mkdir -p $FILESYSTEM_ROOT ## Build a basic Debian system by debootstrap echo '[INFO] Debootstrap...' -sudo debootstrap --arch amd64 jessie $FILESYSTEM_ROOT http://ftp.us.debian.org/debian +sudo debootstrap --variant=minbase --arch amd64 jessie $FILESYSTEM_ROOT http://ftp.us.debian.org/debian ## Config hostname and hosts, otherwise 'sudo ...' will complain 'sudo: unable to resolve host ...' sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo '$HOSTNAME' > /etc/hostname" @@ -82,11 +82,13 @@ clean_sys() { $FILESYSTEM_ROOT/sys/fs/cgroup \ $FILESYSTEM_ROOT/sys || true } -trap_push 'sudo umount $FILESYSTEM_ROOT/sys || true' +trap_push clean_sys sudo LANG=C chroot $FILESYSTEM_ROOT mount sysfs /sys -t sysfs ## Pointing apt to public apt mirrors and getting latest packages, needed for latest security updates -sudo cp files/sources.list $FILESYSTEM_ROOT/etc/apt/ +sudo cp docker-base/sources.list $FILESYSTEM_ROOT/etc/apt/ +sudo cp files/apt/apt.conf.d/81norecommends $FILESYSTEM_ROOT/etc/apt/apt.conf.d/ +sudo LANG=C chroot $FILESYSTEM_ROOT bash -c 'apt-mark auto `apt-mark showmanual`' ## Note: set lang to prevent locale warnings in your chroot sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y update @@ -110,7 +112,7 @@ sudo dpkg --root=$FILESYSTEM_ROOT -i deps/initramfs-tools_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f sudo dpkg --root=$FILESYSTEM_ROOT -i deps/linux-image-3.16.0-4-amd64_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f - + ## Update initramfs for booting with squashfs+aufs cat files/initramfs-tools/modules | sudo tee -a $FILESYSTEM_ROOT/etc/initramfs-tools/modules > /dev/null @@ -129,7 +131,6 @@ curl -sSL https://get.docker.com/ | sudo LANG=C chroot $FILESYSTEM_ROOT sh ## Remove garbage left by docker installation script sudo rm $FILESYSTEM_ROOT/etc/apt/sources.list.d/docker.list sudo chroot $FILESYSTEM_ROOT service docker stop -sudo chroot $FILESYSTEM_ROOT service dbus stop ## Add docker config drop-in to select aufs, otherwise it may other storage driver ## Note: $_ means last argument of last command sudo mkdir -p $FILESYSTEM_ROOT/etc/systemd/system/docker.service.d/ @@ -149,16 +150,23 @@ sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install \ ## Note: gdisk is needed for sgdisk in install.sh ## Note: parted is needed for partprobe in install.sh sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install \ + file \ + ifupdown \ + iproute2 \ + isc-dhcp-client \ sudo \ vim \ tcpdump \ ntp \ + ntpstat \ openssh-server \ python \ python-setuptools \ + rsyslog \ python-apt \ - gdisk \ - parted \ + traceroute \ + iputils-ping \ + net-tools \ efibootmgr ## docker-py is needed by Ansible docker module @@ -167,9 +175,6 @@ sudo LANG=C chroot $FILESYSTEM_ROOT pip install 'docker-py==1.6.0' ## Remove pip which is unnecessary in the base image sudo LANG=C chroot $FILESYSTEM_ROOT pip uninstall -y pip -echo '[INFO] Install apt-transport-sftp package from deps directory' -sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install libssh2-1 - ## Config DHCP for eth0 sudo tee -a $FILESYSTEM_ROOT/etc/network/interfaces > /dev/null </dev/null 2>&1; then + mkdir -p $DOCKER_BUILD_DIR/deps + cp -r deps/* $DOCKER_BUILD_DIR/deps +fi ## Copy the suggested Debian sources ## ref: https://wiki.debian.org/SourcesList -mkdir -p $DOCKER_BUILD_DIR/files -cp files/sources.list $DOCKER_BUILD_DIR/files -docker build -t $docker_image_name $DOCKER_BUILD_DIR +cp -r files $DOCKER_BUILD_DIR/files +docker build --no-cache -t $docker_image_name $DOCKER_BUILD_DIR + +## Flatten the image by importing an exported container on this image +## Note: it will squash the image with only one layer and lost all metadata such as ENTRYPOINT, +## so apply only to the base image +## TODO: wait docker-squash supporting Docker 1.10+ +## ref: https://github.com/jwilder/docker-squash/issues/45 +if [ "$docker_image_name" = "docker-base" ]; then + tmp_container=$(docker run -d ${docker_image_name} /bin/bash) + docker export $tmp_container | docker import - ${docker_image_name} + docker rm -f $tmp_container || true +fi if [ -n "$REGISTRY_SERVER" ] && [ -n "$REGISTRY_PORT" ]; then ## Add registry information as tag, so will push as latest ## Temporarily add -f option to prevent error message of Docker engine version < 1.10.0 - docker tag -f $docker_image_name $REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name - + docker tag -f $docker_image_name $remote_image_name + ## Login the docker image registry server ## Note: user name and password are passed from command line, use fake email address to bypass login check docker login -u $REGISTRY_USERNAME -p "$REGISTRY_PASSWD" -e "@" $REGISTRY_SERVER:$REGISTRY_PORT - docker push $REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name + docker push $remote_image_name fi docker save $docker_image_name | gzip -c > $docker_image_gz diff --git a/build_image.sh b/build_image.sh index 34e5d783956b..75a3bce521af 100755 --- a/build_image.sh +++ b/build_image.sh @@ -13,7 +13,7 @@ } ## Retrieval short version of Git revision hash for partition metadata -[ -z $(git status --untracked-files=no -s) ] || { +[ -z "$(git status --untracked-files=no -s)" ] || { echo "Error: There is local changes not committed to git repo. Cannot get a revision hash for partition metadata." exit 1 } diff --git a/docker-base b/docker-base new file mode 160000 index 000000000000..915f0fc71276 --- /dev/null +++ b/docker-base @@ -0,0 +1 @@ +Subproject commit 915f0fc71276e8819107edf605ab891764a01870 diff --git a/docker-basic_router/Dockerfile b/docker-basic_router/Dockerfile new file mode 100644 index 000000000000..095de44b02e2 --- /dev/null +++ b/docker-basic_router/Dockerfile @@ -0,0 +1,17 @@ +FROM docker-base + +MAINTAINER Xudong Wu + +## Set the apt source +RUN apt-get clean && apt-get update + +COPY deps /deps +RUN dpkg -i /deps/libopennsl_*.deb; \ + dpkg -i /deps/libsaibcm_*.deb; \ + apt-get -y install -f + + +RUN mv /deps/basic_router /usr/sbin/basic_router + +ENTRYPOINT service rsyslog start \ + && /bin/bash diff --git a/docker-bgp/Dockerfile b/docker-bgp/Dockerfile index 711e48fee206..bf286a14ab86 100755 --- a/docker-bgp/Dockerfile +++ b/docker-bgp/Dockerfile @@ -1,17 +1,12 @@ -FROM debian:jessie - -## Set the apt source -COPY files/sources.list /etc/sources.list -RUN apt-get clean && apt-get update - -## Pre-install the fundamental packages -RUN apt-get -y install \ - rsyslog \ - python +FROM docker-base COPY deps /deps RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/quagga_*.deb +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + ENTRYPOINT service rsyslog start \ && service quagga start \ && /bin/bash diff --git a/docker-database/Dockerfile b/docker-database/Dockerfile index e830385d4fb8..2282f7cadca9 100755 --- a/docker-database/Dockerfile +++ b/docker-database/Dockerfile @@ -1,14 +1,14 @@ -FROM debian:jessie - -## Set the apt source -COPY files/sources.list /etc/sources.list -RUN apt-get clean && apt-get update +FROM docker-base ## Pre-install the fundamental packages -RUN apt-get -y install \ - rsyslog \ +RUN apt-get update && apt-get -y install \ redis-server -ENTRYPOINT service rsyslog start \ - && service redis-server start \ - && /bin/bash +RUN sed -ri 's/^daemonize yes$/daemonize no/' /etc/redis/redis.conf \ + && sed -ri 's/^logfile .*$/logfile ""/' /etc/redis/redis.conf \ + && sed -ri 's/^# syslog-enabled no$/syslog-enabled no/' /etc/redis/redis.conf + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y + +ENTRYPOINT service redis-server start diff --git a/docker-fpm/Dockerfile b/docker-fpm/Dockerfile new file mode 100755 index 000000000000..c223a746fffe --- /dev/null +++ b/docker-fpm/Dockerfile @@ -0,0 +1,21 @@ +FROM docker-base + +RUN apt-get update + +COPY deps /deps +## Get fpmsyncd +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libswsscommon_*.deb +COPY /deps/fpmsyncd /usr/local/bin/fpmsyncd + +## Get Quagga +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/quagga_*.deb + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT service rsyslog start \ + && service quagga start \ + && (fpmsyncd &) \ + && /bin/bash diff --git a/docker-lldp/Dockerfile b/docker-lldp/Dockerfile index 322a92f57ea3..176270c3ec81 100755 --- a/docker-lldp/Dockerfile +++ b/docker-lldp/Dockerfile @@ -1,12 +1,7 @@ -FROM debian:jessie - -## Set the apt source -COPY files/sources.list /etc/sources.list -RUN apt-get clean && apt-get update +FROM docker-base ## Pre-install the fundamental packages -RUN apt-get -y install \ - rsyslog \ +RUN apt-get update && apt-get -y install \ lldpd COPY deps /deps @@ -18,6 +13,21 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return ## Note: dpkg_apt function has the benefit to detect missing .deb file RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/lldpsyncd_*.deb +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +## There is a known bug: agetty processes at 100% cpu +## When: +## 1. running container in --privileged mode +## 2. container runs /sbin/init +## ref: https://github.com/docker/docker/issues/4040 +## Temporary solution: +## Disable tty services permanently +RUN systemctl --no-pager list-unit-files --type=service | grep getty | awk '{print $1}' | xargs systemctl mask +## Note: getty@.service in last grep output will not mask below cases +RUN systemctl mask getty@tty1.service + ## Specify init as CMD to enable systemd ## Note: don't provide ENTRYPOINT at the same time CMD ["/sbin/init"] diff --git a/docker-mlnx-sswsyncd-rpc/Dockerfile b/docker-mlnx-sswsyncd-rpc/Dockerfile new file mode 100644 index 000000000000..2e53ab64f752 --- /dev/null +++ b/docker-mlnx-sswsyncd-rpc/Dockerfile @@ -0,0 +1,38 @@ +FROM docker-base + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +## Pre-install the fundamental packages +RUN apt-get update \ + && apt-get -y install \ + net-tools + +COPY deps /deps +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/python-tabulate_*.deb \ + && dpkg_apt /deps/applibs_*.deb \ + && dpkg_apt /deps/applibs-dev_*.deb \ + && dpkg_apt /deps/sx-complib_*.deb \ + && dpkg_apt /deps/sxd-libs_*.deb \ + && dpkg_apt /deps/sx-scew_*.deb \ + && dpkg_apt /deps/sx-examples_*.deb \ + && dpkg_apt /deps/sx-gen-utils_*.deb \ + && dpkg_apt /deps/python-sdk-api_*.deb \ + && dpkg_apt /deps/sx-libnl_*.deb \ + && dpkg_apt /deps/iproute2_*.deb \ + && dpkg_apt /deps/libsswsdk_*.deb \ + && dpkg_apt /deps/libthrift-0.9.2_*.deb \ + && dpkg_apt /deps/libthrift-dev_*.deb + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/mlnx-sai_*.deb \ + && dpkg_apt /deps/sswsyncd-saithrift_*.deb + +## Clean up +RUN apt-get clean -y ; apt-get autoclean -y ; apt-get autoremove -y ; rm -rf /deps + +ENTRYPOINT service rsyslog start \ + && mkdir -p /dev/sxdevs && ( [ -e /dev/sxdevs/sxcdev ] || mknod /dev/sxdevs/sxcdev c 231 193 ) \ + && service sswsyncd start \ + && /bin/bash diff --git a/docker-mlnx-sswsyncd/Dockerfile b/docker-mlnx-sswsyncd/Dockerfile new file mode 100755 index 000000000000..4ce980aee35f --- /dev/null +++ b/docker-mlnx-sswsyncd/Dockerfile @@ -0,0 +1,30 @@ +FROM docker-base + +RUN apt-get update + +## Pre-install the fundamental packages +RUN apt-get update \ + && apt-get -y install \ + net-tools + +COPY deps /deps +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/python-tabulate_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/applibs_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/applibs-dev_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sx-complib_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sxd-libs_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sx-scew_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sx-examples_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sx-gen-utils_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/python-sdk-api_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sx-libnl_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/iproute2_*.deb + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/mlnx-sai_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsswsdk_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sswsyncd_*.deb + +ENTRYPOINT service rsyslog start \ + && mkdir -p /dev/sxdevs && ( [ -e /dev/sxdevs/sxcdev ] || mknod /dev/sxdevs/sxcdev c 231 193 ) \ + && sleep 5 && service sswsyncd start \ + && /bin/bash diff --git a/docker-orchagent/Dockerfile b/docker-orchagent/Dockerfile new file mode 100755 index 000000000000..3c674c9bb4c5 --- /dev/null +++ b/docker-orchagent/Dockerfile @@ -0,0 +1,22 @@ +FROM docker-base + +RUN apt-get update + +COPY deps /deps + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libswsscommon_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsairedis_*.deb + +## TODO: add ifupdown into Depends +RUN apt-get install -f -y ifupdown + +## Copy executable binaries +COPY ["/deps/orchagent","/deps/swssconfig","/deps/portsyncd","/deps/intfsyncd","/deps/neighsyncd","/usr/local/bin/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT service rsyslog start \ + && /bin/bash diff --git a/docker-platform-monitor/Dockerfile b/docker-platform-monitor/Dockerfile new file mode 100755 index 000000000000..7cda4d4f4d91 --- /dev/null +++ b/docker-platform-monitor/Dockerfile @@ -0,0 +1,16 @@ +FROM docker-base + +## Pre-install the fundamental packages +RUN apt-get update && apt-get -y install \ + smartmontools \ + sensord + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT service rsyslog start \ + && service lm-sensors start \ + && service smartmontools start \ + && service sensord start \ + && /bin/bash diff --git a/docker-snmp/Dockerfile b/docker-snmp/Dockerfile index 2afc5eddeee8..1f64fe7d0b9d 100755 --- a/docker-snmp/Dockerfile +++ b/docker-snmp/Dockerfile @@ -1,13 +1,8 @@ -FROM debian:jessie - -## Set the apt source -COPY files/sources.list /etc/sources.list -RUN apt-get clean && apt-get update +FROM docker-base ## Pre-install the fundamental packages -RUN apt-get -y install \ - rsyslog \ - snmp \ +RUN apt-get update && apt-get -y install \ + snmp \ snmpd COPY deps /deps @@ -18,6 +13,25 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return ## Install SNMP subagent RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/acs-snmp-subagent_*.deb +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +## There is a known bug: agetty processes at 100% cpu +## When: +## 1. running container in --privileged mode +## 2. container runs /sbin/init +## ref: https://github.com/docker/docker/issues/4040 +## Temporary solution: +## Disable tty services permanently +RUN systemctl --no-pager list-unit-files --type=service | grep getty | awk '{print $1}' | xargs systemctl mask +## Note: getty@.service in last grep output will not mask below cases +RUN systemctl mask getty@tty1.service + +## Although exposing ports is not need for host net mode, keep it for possible bridge mode +EXPOSE 161/udp +EXPOSE 162/udp + ## Specify init as CMD to enable systemd ## Note: don't provide ENTRYPOINT at the same time CMD ["/sbin/init"] diff --git a/docker-sswsyncd/Dockerfile b/docker-sswsyncd/Dockerfile index 9894d46c3153..9af14c2a561e 100755 --- a/docker-sswsyncd/Dockerfile +++ b/docker-sswsyncd/Dockerfile @@ -1,22 +1,18 @@ -FROM debian:jessie +FROM docker-base -## Set the apt source -COPY files/sources.list /etc/sources.list -RUN apt-get clean && apt-get update - -## Pre-install the fundamental packages -## TODO: sswsyncd depends on ifupdown -RUN apt-get -y install \ - python \ - ifupdown \ - rsyslog +RUN apt-get update COPY deps /deps +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/python-tabulate_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libopennsl_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsaibcm_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsswsdk_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sswsyncd_*.deb +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + ENTRYPOINT service rsyslog start \ && service sswsyncd start \ && /bin/bash diff --git a/docker-syncd-mlnx/Dockerfile b/docker-syncd-mlnx/Dockerfile new file mode 100755 index 000000000000..d422374fc479 --- /dev/null +++ b/docker-syncd-mlnx/Dockerfile @@ -0,0 +1,33 @@ +FROM docker-base + +RUN apt-get update + +COPY deps /deps + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/applibs_*.deb \ + && dpkg_apt /deps/applibs-dev_*.deb \ + && dpkg_apt /deps/sx-complib_*.deb \ + && dpkg_apt /deps/sxd-libs_*.deb \ + && dpkg_apt /deps/sx-scew_*.deb \ + && dpkg_apt /deps/sx-examples_*.deb \ + && dpkg_apt /deps/sx-gen-utils_*.deb \ + && dpkg_apt /deps/python-sdk-api_*.deb \ + && dpkg_apt /deps/sx-libnl_*.deb \ + && dpkg_apt /deps/iproute2_*.deb \ + && dpkg_apt /deps/mft*.deb \ + + && dpkg_apt /deps/libhiredis0.13*.deb \ + && dpkg_apt /deps/libswsscommon_*.deb \ + && dpkg_apt /deps/mlnx-sai_*.deb \ + && dpkg_apt /deps/libsairedis_*.deb + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT service rsyslog start \ + && service syncd start \ + && /bin/bash diff --git a/docker-syncd/Dockerfile b/docker-syncd/Dockerfile new file mode 100755 index 000000000000..f720b6c19bbd --- /dev/null +++ b/docker-syncd/Dockerfile @@ -0,0 +1,24 @@ +FROM docker-base + +RUN apt-get update + +COPY deps /deps + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libswsscommon_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libopennsl_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsaibcm_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsairedis_*.deb + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb + +## TODO: add kmod into Depends +RUN apt-get install -f kmod + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT service rsyslog start \ + && service syncd start \ + && /bin/bash diff --git a/docker-vas/Dockerfile b/docker-vas/Dockerfile new file mode 100755 index 000000000000..cd9378523ea2 --- /dev/null +++ b/docker-vas/Dockerfile @@ -0,0 +1,36 @@ +FROM docker-base + +## Pre-install the fundamental packages +RUN apt-get update && apt-get -y install \ + sudo + +COPY deps /deps +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/vasclnt_*.deb && \ + dpkg_apt /deps/vasgp_*.deb + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +## Expose to host, ie. image content will copy to host when container started +## For .so +VOLUME /host/lib/x86_64-linux-gnu +## For config +VOLUME /etc/pam.d/ +VOLUME /host/etc +## For domain socket and local caches +VOLUME /var/opt/quest/vas/vasd/ +## For home directory +VOLUME /home/ + +## Delete the symlinks and create full copies to host folder +ENTRYPOINT service rsyslog start \ + && cp --remove-destination /opt/quest/lib64/nss/libnss_vas4.so.2 \ + /host/lib/x86_64-linux-gnu/ \ + && cp --remove-destination /opt/quest/lib64/security/pam_vas3.so \ + /host/lib/x86_64-linux-gnu/security/ \ + && cp --remove-destination /etc/nsswitch.conf \ + /host/etc/ \ + && service vasd start \ + && /bin/bash diff --git a/files/apt/apt.conf.d/81norecommends b/files/apt/apt.conf.d/81norecommends new file mode 100644 index 000000000000..d868eb45e228 --- /dev/null +++ b/files/apt/apt.conf.d/81norecommends @@ -0,0 +1,3 @@ +APT::Install-Recommends "false"; +APT::AutoRemove::RecommendsImportant "false"; +APT::AutoRemove::SuggestsImportant "false"; diff --git a/files/dhcp/rfc3442-classless-routes b/files/dhcp/rfc3442-classless-routes new file mode 100644 index 000000000000..64e24192816b --- /dev/null +++ b/files/dhcp/rfc3442-classless-routes @@ -0,0 +1,63 @@ +# set classless routes based on the format specified in RFC3442 +# e.g.: +# new_rfc3442_classless_static_routes='24 192 168 10 192 168 1 1 8 10 10 17 66 41' +# specifies the routes: +# 192.168.10.0/24 via 192.168.1.1 +# 10.0.0.0/8 via 10.10.17.66.41 + +RUN="yes" + + +if [ "$RUN" = "yes" ]; then + if [ -n "$new_rfc3442_classless_static_routes" ]; then + if [ "$reason" = "BOUND" ] || [ "$reason" = "REBOOT" ]; then + + set -- $new_rfc3442_classless_static_routes + + while [ $# -gt 0 ]; do + net_length=$1 + via_arg='' + + case $net_length in + 32|31|30|29|28|27|26|25) + net_address="${2}.${3}.${4}.${5}" + gateway="${6}.${7}.${8}.${9}" + shift 9 + ;; + 24|23|22|21|20|19|18|17) + net_address="${2}.${3}.${4}.0" + gateway="${5}.${6}.${7}.${8}" + shift 8 + ;; + 16|15|14|13|12|11|10|9) + net_address="${2}.${3}.0.0" + gateway="${4}.${5}.${6}.${7}" + shift 7 + ;; + 8|7|6|5|4|3|2|1) + net_address="${2}.0.0.0" + gateway="${3}.${4}.${5}.${6}" + shift 6 + ;; + 0) # default route + net_address="0.0.0.0" + gateway="${2}.${3}.${4}.${5}" + shift 5 + ;; + *) # error + return 1 + ;; + esac + + # take care of link-local routes + if [ "${gateway}" != '0.0.0.0' ]; then + via_arg="via ${gateway}" + fi + + # set route (ip detects host routes automatically) + ip -4 route add "${net_address}/${net_length}" \ + ${via_arg} dev "${interface}" table default >/dev/null 2>&1 + done + fi + fi +fi diff --git a/files/sources.list b/files/sources.list deleted file mode 100644 index d2aaf4251bb3..000000000000 --- a/files/sources.list +++ /dev/null @@ -1,8 +0,0 @@ -deb http://httpredir.debian.org/debian jessie main contrib non-free -deb-src http://httpredir.debian.org/debian jessie main contrib non-free - -deb http://httpredir.debian.org/debian jessie-updates main contrib non-free -deb-src http://httpredir.debian.org/debian jessie-updates main contrib non-free - -deb http://security.debian.org/ jessie/updates main contrib non-free -deb-src http://security.debian.org/ jessie/updates main contrib non-free From 9b387bfd24097dd235fb9ad75ecbd707bd764cc6 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 16 Jun 2016 13:54:41 -0700 Subject: [PATCH 0006/1011] Update README.md Refine document about git submodule --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 07ec85b1569b..1789c09487c2 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,11 @@ Build the [Azure/sonic-linux-kernel](https://github.com/Azure/sonic-linux-kernel Run the script to build the .deb file into ./deps directory. ./get_deps.sh + +## 4. Fetch the git submodule +If there is no files under ./docker-base, manually fetch them. + + git submodule update --init --recursive # Usage ## Build NOS installer image From a79b519618295c006a2d06f0c7189070809ab320 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 21 Jun 2016 12:14:24 -0700 Subject: [PATCH 0007/1011] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1789c09487c2..27171d288cde 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ The root is disabled, but the created user could sudo. # Contribution guide -All contributors must sign a contribution license agreement before contributions can be accepted. Contact kasubra@microsoft.com or daloher@microsoft.com. Later this will be automated. +All contributors must sign a contribution license agreement before contributions can be accepted. Contact daloher@microsoft.com. Later this will be automated. ### GitHub Workflow @@ -76,3 +76,5 @@ For example: * Push your changes to your private fork and do "pull-request" to this repository * Use a pull request to do code review * Use issues to keep track of what is going on + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. From a79966998a3652887c8374524e99e5cf19ee4a59 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 26 Jul 2016 12:01:58 -0700 Subject: [PATCH 0008/1011] Squash merge latest code to github branch --- build_debian.sh | 46 ++++++++- build_docker.sh | 98 ++++++++++++++----- build_image.sh | 4 - docker-base | 2 +- docker-bgp/Dockerfile | 11 ++- docker-bgp/daemons | 31 ++++++ docker-database/Dockerfile | 10 +- docker-fpm/Dockerfile | 13 +-- docker-fpm/start.sh | 5 + docker-lldp/Dockerfile | 19 ++-- docker-orchagent/Dockerfile | 13 +-- docker-orchagent/start.sh | 25 +++++ docker-platform-monitor/Dockerfile | 11 +-- docker-snmp/Dockerfile | 51 +++++++--- docker-sswsyncd/Dockerfile | 26 +++-- docker-syncd-mlnx-rpc/Dockerfile | 46 +++++++++ docker-syncd/Dockerfile | 23 ++--- docker-syncd/start.sh | 4 + docker-vas/Dockerfile | 21 ++-- docker-vas/user-override | 2 + files/Aboot/boot0 | 25 ++++- files/docker/docker.service.conf | 2 +- files/initramfs-tools/union-mount | 13 ++- files/sshd/host-ssh-keygen.sh | 10 ++ files/sshd/sshd.service | 16 +++ functions.sh | 7 ++ installer/x86_64/dell-s6000-replace-reboot.sh | 16 +++ installer/x86_64/install.sh | 36 ++++++- onie-mk-demo.sh | 11 +-- 29 files changed, 461 insertions(+), 136 deletions(-) create mode 100644 docker-bgp/daemons create mode 100755 docker-fpm/start.sh mode change 100755 => 100644 docker-lldp/Dockerfile create mode 100755 docker-orchagent/start.sh mode change 100755 => 100644 docker-snmp/Dockerfile create mode 100644 docker-syncd-mlnx-rpc/Dockerfile create mode 100755 docker-syncd/start.sh create mode 100644 docker-vas/user-override create mode 100755 files/sshd/host-ssh-keygen.sh create mode 100644 files/sshd/sshd.service create mode 100755 installer/x86_64/dell-s6000-replace-reboot.sh diff --git a/build_debian.sh b/build_debian.sh index a8149ca72289..e283e5965ead 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -32,6 +32,9 @@ PASSWORD_ENCRYPTED=$2 ## Enable debug output for script set -x -e +## docker engine version (with platform) +DOCKER_VERSION=1.11.1-0~jessie_amd64 + ## Working directory to prepare the file system FILESYSTEM_ROOT=./fsroot ## Hostname for the linux image @@ -127,13 +130,21 @@ sudo chroot $FILESYSTEM_ROOT update-initramfs -u ## Install docker echo '[INFO] Install docker' -curl -sSL https://get.docker.com/ | sudo LANG=C chroot $FILESYSTEM_ROOT sh -## Remove garbage left by docker installation script -sudo rm $FILESYSTEM_ROOT/etc/apt/sources.list.d/docker.list +## Install apparmor utils since they're missing and apparmor is enabled in the kernel +## Otherwise Docker will fail to start +sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install apparmor +docker_deb_url=https://apt.dockerproject.org/repo/pool/main/d/docker-engine/docker-engine_${DOCKER_VERSION}.deb +docker_deb_temp=`mktemp` +trap_push "rm -f $docker_deb_temp" +wget $docker_deb_url -qO $docker_deb_temp && { \ + sudo dpkg --root=$FILESYSTEM_ROOT -i $docker_deb_temp || \ + sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f; \ +} +sudo chroot $FILESYSTEM_ROOT docker version sudo chroot $FILESYSTEM_ROOT service docker stop ## Add docker config drop-in to select aufs, otherwise it may other storage driver -## Note: $_ means last argument of last command sudo mkdir -p $FILESYSTEM_ROOT/etc/systemd/system/docker.service.d/ +## Note: $_ means last argument of last command sudo cp files/docker/docker.service.conf $_ ## Create default user @@ -149,6 +160,7 @@ sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install \ ## Pre-install the fundamental packages ## Note: gdisk is needed for sgdisk in install.sh ## Note: parted is needed for partprobe in install.sh +## Note: ca-certificates is needed for easy_install sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install \ file \ ifupdown \ @@ -167,8 +179,34 @@ sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install \ traceroute \ iputils-ping \ net-tools \ + bsdmainutils \ + ca-certificates \ + i2c-tools \ efibootmgr +## Remove sshd host keys, and will regenerate on first sshd start +sudo rm -f $FILESYSTEM_ROOT/etc/ssh/ssh_host_*_key* +sudo cp files/sshd/host-ssh-keygen.sh $FILESYSTEM_ROOT/usr/local/bin/ +sudo cp -f files/sshd/sshd.service $FILESYSTEM_ROOT/lib/systemd/system/ssh.service +## Config sshd +sudo augtool --autosave "set /files/etc/ssh/sshd_config/UseDNS no" -r $FILESYSTEM_ROOT + +## Config sysctl +sudo mkdir -p $FILESYSTEM_ROOT/var/core +sudo augtool --autosave " +set /files/etc/sysctl.conf/kernel.core_pattern '|/usr/bin/coredump-compress %e %p' +set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_accept 0 +set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_announce 0 +set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_filter 0 +set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_notify 0 +set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_ignore 0 +set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_accept 0 +set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_announce 1 +set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_filter 0 +set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_notify 1 +set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_ignore 2 +" -r $FILESYSTEM_ROOT + ## docker-py is needed by Ansible docker module sudo LANG=C chroot $FILESYSTEM_ROOT easy_install pip sudo LANG=C chroot $FILESYSTEM_ROOT pip install 'docker-py==1.6.0' diff --git a/build_docker.sh b/build_docker.sh index 177c1e6a64b8..14a545bfc73b 100755 --- a/build_docker.sh +++ b/build_docker.sh @@ -1,10 +1,45 @@ #!/bin/bash ## This script is to automate the preparation for docker images for ACS. ## If registry server and port provided, the images will be pushed there. -## Usage: -## sudo ./build_docker.sh DOCKER_BUILD_DIR [REGISTRY_SERVER REGISTRY_PORT] -set -x -e +set -e + +. ./functions.sh + +usage() { + cat >&2 <&2 + usage + exit 1 + ;; + esac +done +shift "$((OPTIND - 1))" ## Dockerfile directory DOCKER_BUILD_DIR=$1 @@ -18,36 +53,39 @@ REGISTRY_PASSWD=$5 exit 1 } -## Docker image label, so no need to remember its hash -docker_image_name=$DOCKER_BUILD_DIR -remote_image_name=$REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name - -## File name for docker image -docker_image_gz=$docker_image_name.gz - -[ -n "$docker_image_gz" ] || { - echo "Error: Output docker image filename is empty" - exit 1 +[ -n "$docker_image_name" ] || { + docker_image_name=$DOCKER_BUILD_DIR } -function cleanup { - rm -rf $DOCKER_BUILD_DIR/files - rm -rf $DOCKER_BUILD_DIR/deps - docker rmi $remote_image_name || true +[ ${BUILD_NUMBER} ] || { + echo "No BUILD_NUMBER found, setting to 0." + BUILD_NUMBER="0" } -trap cleanup exit + +remote_image_name=$REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name:latest +timestamp="$(date -u +%Y%m%d)" +build_version="${timestamp}.${BUILD_NUMBER}" +build_remote_image_name=$REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name:$build_version ## Copy dependencies ## Note: Dockerfile ADD doesn't support reference files outside the folder, so copy it locally if ls deps/* 1>/dev/null 2>&1; then + trap_push "rm -rf $DOCKER_BUILD_DIR/deps" mkdir -p $DOCKER_BUILD_DIR/deps cp -r deps/* $DOCKER_BUILD_DIR/deps fi ## Copy the suggested Debian sources ## ref: https://wiki.debian.org/SourcesList +trap_push "rm -rf $DOCKER_BUILD_DIR/deps" cp -r files $DOCKER_BUILD_DIR/files +docker_try_rmi $docker_image_name + +## Build the docker image docker build --no-cache -t $docker_image_name $DOCKER_BUILD_DIR +## Get the ID of the built image +## Note: inspect output has quotation characters, so sed to remove it as an argument +image_id=$(docker inspect --format="{{json .Id}}" $docker_image_name | sed -e 's/^"//' -e 's/"$//') ## Flatten the image by importing an exported container on this image ## Note: it will squash the image with only one layer and lost all metadata such as ENTRYPOINT, @@ -57,18 +95,30 @@ docker build --no-cache -t $docker_image_name $DOCKER_BUILD_DIR if [ "$docker_image_name" = "docker-base" ]; then tmp_container=$(docker run -d ${docker_image_name} /bin/bash) docker export $tmp_container | docker import - ${docker_image_name} - docker rm -f $tmp_container || true + trap_push "docker rmi $image_id" + trap_push "docker rm -f $tmp_container || true" fi +image_sha='' if [ -n "$REGISTRY_SERVER" ] && [ -n "$REGISTRY_PORT" ]; then ## Add registry information as tag, so will push as latest + ## Add additional tag with build information ## Temporarily add -f option to prevent error message of Docker engine version < 1.10.0 - docker tag -f $docker_image_name $remote_image_name + docker tag $docker_image_name $remote_image_name + docker tag $docker_image_name $build_remote_image_name ## Login the docker image registry server - ## Note: user name and password are passed from command line, use fake email address to bypass login check - docker login -u $REGISTRY_USERNAME -p "$REGISTRY_PASSWD" -e "@" $REGISTRY_SERVER:$REGISTRY_PORT - docker push $remote_image_name + ## Note: user name and password are passed from command line + docker login -u $REGISTRY_USERNAME -p "$REGISTRY_PASSWD" $REGISTRY_SERVER:$REGISTRY_PORT + + ## Push image to registry server + ## And get the image digest SHA256 + trap_push "docker rmi $remote_image_name" + trap_push "docker rmi $build_remote_image_name" + image_sha=$(docker push $remote_image_name | sed -n "s/.*: digest: sha256:\([0-9a-f]*\).*/\\1/p") + docker push $build_remote_image_name fi -docker save $docker_image_name | gzip -c > $docker_image_gz +mkdir -p target +rm -f target/$docker_image_name.*.gz +docker save $docker_image_name | gzip -c > target/$docker_image_name.$image_sha.gz diff --git a/build_image.sh b/build_image.sh index 75a3bce521af..e4a93d8dfbf8 100755 --- a/build_image.sh +++ b/build_image.sh @@ -23,10 +23,6 @@ sudo rm -f $OUTPUT_ONIE_IMAGE if [ "$TARGET_MACHINE" = "generic" ]; then ## Generate an ONIE installer image ## Note: Don't leave blank between lines. It is single line command. - CONSOLE_SPEED=9600 \ - CONSOLE_DEV=0 \ - CONSOLE_FLAG=0 \ - CONSOLE_PORT=0x3f8 \ ./onie-mk-demo.sh $TARGET_PLATFORM $TARGET_MACHINE $TARGET_PLATFORM-$TARGET_MACHINE-$ONIEIMAGE_VERSION \ installer $TARGET_MACHINE/platform.conf $OUTPUT_ONIE_IMAGE OS $GIT_REVISION $ONIE_IMAGE_PART_SIZE \ $ONIE_INSTALLER_PAYLOAD diff --git a/docker-base b/docker-base index 915f0fc71276..dfb5c2f46bf9 160000 --- a/docker-base +++ b/docker-base @@ -1 +1 @@ -Subproject commit 915f0fc71276e8819107edf605ab891764a01870 +Subproject commit dfb5c2f46bf982207c8dbc2c5af589a0ba1b3ddc diff --git a/docker-bgp/Dockerfile b/docker-bgp/Dockerfile index bf286a14ab86..b01698e31118 100755 --- a/docker-bgp/Dockerfile +++ b/docker-bgp/Dockerfile @@ -1,11 +1,12 @@ FROM docker-base -COPY deps /deps -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/quagga_*.deb +COPY deps/quagga_*.deb /deps/ +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ + dpkg_apt /deps/quagga_*.deb && \ + apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ + rm -rf /deps -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +COPY daemons /etc/quagga/ ENTRYPOINT service rsyslog start \ && service quagga start \ diff --git a/docker-bgp/daemons b/docker-bgp/daemons new file mode 100644 index 000000000000..cb7c2322c9fb --- /dev/null +++ b/docker-bgp/daemons @@ -0,0 +1,31 @@ +# This file tells the quagga package which daemons to start. +# +# Entries are in the format: =(yes|no|priority) +# 0, "no" = disabled +# 1, "yes" = highest priority +# 2 .. 10 = lower priorities +# Read /usr/share/doc/quagga/README.Debian for details. +# +# Sample configurations for these daemons can be found in +# /usr/share/doc/quagga/examples/. +# +# ATTENTION: +# +# When activation a daemon at the first time, a config file, even if it is +# empty, has to be present *and* be owned by the user and group "quagga", else +# the daemon will not be started by /etc/init.d/quagga. The permissions should +# be u=rw,g=r,o=. +# When using "vtysh" such a config file is also needed. It should be owned by +# group "quaggavty" and set to ug=rw,o= though. Check /etc/pam.d/quagga, too. +# +# The watchquagga daemon is always started. Per default in monitoring-only but +# that can be changed via /etc/quagga/debian.conf. +# +zebra=yes +bgpd=yes +ospfd=no +ospf6d=no +ripd=no +ripngd=no +isisd=no +babeld=no diff --git a/docker-database/Dockerfile b/docker-database/Dockerfile index 2282f7cadca9..4499f4a8f8fa 100755 --- a/docker-database/Dockerfile +++ b/docker-database/Dockerfile @@ -1,14 +1,14 @@ FROM docker-base ## Pre-install the fundamental packages -RUN apt-get update && apt-get -y install \ - redis-server +## Clean up +RUN apt-get -y install \ + redis-server \ + && \ + apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y RUN sed -ri 's/^daemonize yes$/daemonize no/' /etc/redis/redis.conf \ && sed -ri 's/^logfile .*$/logfile ""/' /etc/redis/redis.conf \ && sed -ri 's/^# syslog-enabled no$/syslog-enabled no/' /etc/redis/redis.conf -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y - ENTRYPOINT service redis-server start diff --git a/docker-fpm/Dockerfile b/docker-fpm/Dockerfile index c223a746fffe..d877c408baab 100755 --- a/docker-fpm/Dockerfile +++ b/docker-fpm/Dockerfile @@ -2,20 +2,21 @@ FROM docker-base RUN apt-get update -COPY deps /deps +COPY ["deps/libhiredis0.13*.deb", "deps/libswsscommon_*.deb", "deps/quagga_*", "/deps/"] + ## Get fpmsyncd RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libswsscommon_*.deb -COPY /deps/fpmsyncd /usr/local/bin/fpmsyncd +COPY deps/fpmsyncd /usr/local/bin/ ## Get Quagga RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/quagga_*.deb +COPY start.sh /usr/bin/start.sh + ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /deps -ENTRYPOINT service rsyslog start \ - && service quagga start \ - && (fpmsyncd &) \ - && /bin/bash +ENTRYPOINT /usr/bin/start.sh \ + && /bin/bash diff --git a/docker-fpm/start.sh b/docker-fpm/start.sh new file mode 100755 index 000000000000..90a1d515fa3a --- /dev/null +++ b/docker-fpm/start.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +service rsyslog start +service quagga start +fpmsyncd & diff --git a/docker-lldp/Dockerfile b/docker-lldp/Dockerfile old mode 100755 new mode 100644 index 176270c3ec81..bcfd378a73da --- a/docker-lldp/Dockerfile +++ b/docker-lldp/Dockerfile @@ -1,21 +1,18 @@ FROM docker-base -## Pre-install the fundamental packages -RUN apt-get update && apt-get -y install \ - lldpd - -COPY deps /deps +COPY deps/*py2*.whl deps/python-sswsdk_*.deb deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ +## Pre-install the fundamental packages ## Install Python SSWSDK (lldpsyncd dependancy) -## Note: dpkg_apt function has the benefit to detect missing .deb file -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/python-sswsdk_*.deb ## Install LLDP Sync Daemon ## Note: dpkg_apt function has the benefit to detect missing .deb file -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/lldpsyncd_*.deb - ## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ + dpkg_apt /deps/lldpd_*.deb && \ + dpkg_apt /deps/lldpsyncd_*.deb && \ + apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ + pip install --no-cache-dir /deps/*.whl && \ + rm -rf /deps ## There is a known bug: agetty processes at 100% cpu ## When: diff --git a/docker-orchagent/Dockerfile b/docker-orchagent/Dockerfile index 3c674c9bb4c5..17fbfe9e7274 100755 --- a/docker-orchagent/Dockerfile +++ b/docker-orchagent/Dockerfile @@ -2,21 +2,22 @@ FROM docker-base RUN apt-get update -COPY deps /deps +COPY ["deps/libhiredis0.13*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libswsscommon_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsairedis_*.deb -## TODO: add ifupdown into Depends -RUN apt-get install -f -y ifupdown +RUN apt-get install -f -y ifupdown bridge-utils ## Copy executable binaries -COPY ["/deps/orchagent","/deps/swssconfig","/deps/portsyncd","/deps/intfsyncd","/deps/neighsyncd","/usr/local/bin/"] +COPY ["deps/orchagent","deps/swssconfig","deps/portsyncd","deps/intfsyncd","deps/neighsyncd","/usr/local/bin/"] + +COPY start.sh /usr/bin/start.sh ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /deps -ENTRYPOINT service rsyslog start \ - && /bin/bash +ENTRYPOINT /usr/bin/start.sh \ + && /bin/bash diff --git a/docker-orchagent/start.sh b/docker-orchagent/start.sh new file mode 100755 index 000000000000..a5155e0513ad --- /dev/null +++ b/docker-orchagent/start.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +. /host/machine.conf + +MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` + +ORCHAGENT_ARGS="" + +PORTSYNCD_ARGS="" + +if [ "$onie_platform" == "x86_64-dell_s6000_s1220-r0" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" + PORTSYNCD_ARGS+="-p /etc/ssw/ACS-S6000/port_config.ini" +elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ]; then + ORCHAGENT_ARGS+="-p /etc/ssw/ACS-MSN2700/port_config.ini" +fi + +service rsyslog start +orchagent $ORCHAGENT_ARGS & +sleep 5 +portsyncd $PORTSYNCD_ARGS & +sleep 5 +intfsyncd & +sleep 5 +neighsyncd & diff --git a/docker-platform-monitor/Dockerfile b/docker-platform-monitor/Dockerfile index 7cda4d4f4d91..041f03f69927 100755 --- a/docker-platform-monitor/Dockerfile +++ b/docker-platform-monitor/Dockerfile @@ -1,13 +1,12 @@ FROM docker-base ## Pre-install the fundamental packages -RUN apt-get update && apt-get -y install \ - smartmontools \ - sensord - ## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN apt-get -y install \ + smartmontools \ + sensord \ + && \ + apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y ENTRYPOINT service rsyslog start \ && service lm-sensors start \ diff --git a/docker-snmp/Dockerfile b/docker-snmp/Dockerfile old mode 100755 new mode 100644 index 1f64fe7d0b9d..7286b7fe570d --- a/docker-snmp/Dockerfile +++ b/docker-snmp/Dockerfile @@ -1,21 +1,47 @@ FROM docker-base -## Pre-install the fundamental packages -RUN apt-get update && apt-get -y install \ - snmp \ - snmpd +COPY deps/snmp_*.deb deps/snmpd_*.deb deps/libsnmp-base_*.deb deps/libsnmp30_*.deb /deps/ +COPY deps/python3/*.whl /python3/ -COPY deps /deps +# enable -O for all Python calls +ENV PYTHONOPTIMIZE 1 +## Pre-install the fundamental packages ## Install Python SSWSDK (SNMP subagent dependancy) -## Note: dpkg_apt function has the benefit to detect missing .deb file -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/python-sswsdk_*.deb ## Install SNMP subagent -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/acs-snmp-subagent_*.deb - +## Note: dpkg_apt function has the benefit to detect missing .deb file ## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ + dpkg_apt /deps/libsnmp-base_*.deb && \ + dpkg_apt /deps/libsnmp30_*.deb && \ + dpkg_apt /deps/snmp_*.deb && \ + dpkg_apt /deps/snmpd_*.deb && \ + rm -rf /deps + +# install subagent +RUN apt-get -y install build-essential wget libssl-dev openssl && \ + rm -rf /var/lib/apt/lists/* && \ + wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz && \ + tar xvf Python-3.5.2.tgz && cd Python-3.5.2 && \ + ./configure --without-doc-strings --prefix=/usr --without-pymalloc --enable-shared && \ + make && make install && \ + ldconfig && \ + cd .. && rm -rf Python-3.5.2 && rm Python-3.5.2.tgz && \ + pip3 install --no-cache-dir /python3/*py3*.whl hiredis && \ + rm -rf /python3 && \ + python3 -m pip uninstall -y pip setuptools && \ + rm -rf /usr/lib/python3.5/unittest && \ + rm -rf /usr/lib/python3.5/lib2to3 && \ + rm -rf /usr/lib/python3.5/tkinter && \ + rm -rf /usr/lib/python3.5/idlelib && \ + rm -rf /usr/lib/python3.5/email && \ + rm -rf /usr/lib/python3.5/test && \ + apt-get -y remove build-essential wget libssl-dev openssl && \ + apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ + python3 -m acs_ax_impl install && \ + find / | grep -E "__pycache__" | xargs rm -rf && \ + rm -rf ~/.cache && \ + systemctl enable acs-snmp-subagent.service ## There is a known bug: agetty processes at 100% cpu ## When: @@ -29,8 +55,7 @@ RUN systemctl --no-pager list-unit-files --type=service | grep getty | awk '{pri RUN systemctl mask getty@tty1.service ## Although exposing ports is not need for host net mode, keep it for possible bridge mode -EXPOSE 161/udp -EXPOSE 162/udp +EXPOSE 161/udp 162/udp ## Specify init as CMD to enable systemd ## Note: don't provide ENTRYPOINT at the same time diff --git a/docker-sswsyncd/Dockerfile b/docker-sswsyncd/Dockerfile index 9af14c2a561e..7d83c67a259b 100755 --- a/docker-sswsyncd/Dockerfile +++ b/docker-sswsyncd/Dockerfile @@ -1,17 +1,23 @@ FROM docker-base -RUN apt-get update - -COPY deps /deps -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/python-tabulate_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libopennsl_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsaibcm_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsswsdk_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sswsyncd_*.deb +COPY \ + deps/python-tabulate_*.deb \ + deps/libopennsl_*.deb \ + deps/libsaibcm_*.deb \ + deps/libsswsdk_*.deb \ + deps/sswsyncd_*.deb \ + /deps/ +## Install packages ## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ + dpkg_apt /deps/python-tabulate_*.deb && \ + dpkg_apt /deps/libopennsl_*.deb && \ + dpkg_apt /deps/libsaibcm_*.deb && \ + dpkg_apt /deps/libsswsdk_*.deb && \ + dpkg_apt /deps/sswsyncd_*.deb && \ + apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ + rm -rf /deps ENTRYPOINT service rsyslog start \ && service sswsyncd start \ diff --git a/docker-syncd-mlnx-rpc/Dockerfile b/docker-syncd-mlnx-rpc/Dockerfile new file mode 100644 index 000000000000..3aed6f080506 --- /dev/null +++ b/docker-syncd-mlnx-rpc/Dockerfile @@ -0,0 +1,46 @@ +FROM docker-syncd-mlnx + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +## Pre-install the fundamental packages +RUN apt-get update \ + && apt-get -y install \ + net-tools \ + python-pip \ + build-essential \ + libssl-dev \ + libffi-dev \ + python-dev \ + wget \ + cmake \ + && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ + && tar xvfz 1.0.0.tar.gz \ + && cd nanomsg-1.0.0 \ + && mkdir -p build \ + && cmake . \ + && make install \ + && ldconfig \ + && cd .. \ + && rm -fr nanomsg-1.0.0 \ + && pip install cffi \ + && pip install --upgrade cffi \ + && pip install nnpy \ + && mkdir -p /opt \ + && cd /opt \ + && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py + +COPY deps /deps + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ + && dpkg -r syncd \ + && dpkg_apt /deps/syncd_*.deb \ + && dpkg_apt /deps/libthrift-0.9.2_*.deb + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT service rsyslog start \ + && service syncd start \ + && /bin/bash diff --git a/docker-syncd/Dockerfile b/docker-syncd/Dockerfile index f720b6c19bbd..a3d45eb71fe7 100755 --- a/docker-syncd/Dockerfile +++ b/docker-syncd/Dockerfile @@ -2,23 +2,24 @@ FROM docker-base RUN apt-get update -COPY deps /deps +COPY ["deps/libhiredis0.13*.deb", "deps/libswsscommon_*.deb", "deps/libopennsl_*.deb", "deps/libsaibcm_*.deb", "deps/libsairedis_*.deb", "deps/syncd_*.deb", "/deps/"] -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libswsscommon_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libopennsl_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsaibcm_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsairedis_*.deb - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/libhiredis0.13*.deb \ + && dpkg_apt /deps/libswsscommon_*.deb \ + && dpkg_apt /deps/libopennsl_*.deb \ + && dpkg_apt /deps/libsaibcm_*.deb \ + && dpkg_apt /deps/libsairedis_*.deb \ + && dpkg_apt /deps/syncd_*.deb ## TODO: add kmod into Depends RUN apt-get install -f kmod +COPY ["deps/dsserve", "deps/bcmcmd", "start.sh", "/usr/local/bin/"] + ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /deps -ENTRYPOINT service rsyslog start \ - && service syncd start \ - && /bin/bash +ENTRYPOINT /usr/local/bin/start.sh \ + && /bin/bash diff --git a/docker-syncd/start.sh b/docker-syncd/start.sh new file mode 100755 index 000000000000..346936ff2f59 --- /dev/null +++ b/docker-syncd/start.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +service rsyslog start +service syncd start diff --git a/docker-vas/Dockerfile b/docker-vas/Dockerfile index cd9378523ea2..1b51bb968cff 100755 --- a/docker-vas/Dockerfile +++ b/docker-vas/Dockerfile @@ -1,17 +1,18 @@ FROM docker-base -## Pre-install the fundamental packages -RUN apt-get update && apt-get -y install \ - sudo - -COPY deps /deps -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/vasclnt_*.deb && \ - dpkg_apt /deps/vasgp_*.deb +COPY deps/vasclnt_*.deb deps/vasgp_*.deb /deps/ +COPY user-override /etc/opt/quest/vas/user-override +## Pre-install the fundamental packages ## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ + apt-get -y install \ + sudo \ + && \ + dpkg_apt /deps/vasclnt_*.deb && \ + dpkg_apt /deps/vasgp_*.deb && \ + apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ + rm -rf /deps ## Expose to host, ie. image content will copy to host when container started ## For .so diff --git a/docker-vas/user-override b/docker-vas/user-override new file mode 100644 index 000000000000..cb16ea6ded0f --- /dev/null +++ b/docker-vas/user-override @@ -0,0 +1,2 @@ +# Overrides every member to have the bash shell +::::::/bin/bash diff --git a/files/Aboot/boot0 b/files/Aboot/boot0 index 98522bdfe647..8a0d0b77cf11 100644 --- a/files/Aboot/boot0 +++ b/files/Aboot/boot0 @@ -1,3 +1,4 @@ +#!/bin/sh # Copyright (C) 2016 Arista Networks, Inc. # # This program is free software: you can redistribute it and/or modify @@ -37,11 +38,33 @@ if [ -d "${swipath}" ]; then exit 1 fi -## Determine whether installing by hash file in the image +## Check the hash file in the image, and determine to install or just skip GIT_REVISION=$(unzip -p ${swipath} .imagehash) LOCAL_IMAGEHASH=$(cat $TARGET_PATH/.imagehash 2>/dev/null || true) if [ "$GIT_REVISION" != "$LOCAL_IMAGEHASH" ]; then + ## Clean old directory for read-write layer + rm -rf ${TARGET_PATH}/rw + + ## Unzip the image unzip -oq ${swipath} -x boot0 -d ${TARGET_PATH} + + ## Detect SKU and create a hardware description file + aboot_version=`grep ^Aboot /etc/cmdline | sed 's/^.*norcal.-//'` + aboot_build_date=`stat -c %y /bin/sysinit | sed 's/ /T/'` + if `grep -q platform=raven /etc/cmdline`; then + aboot_machine=arista_7050_qx32 + else + aboot_machine=arista_7050_qx32s + fi + cat < ${TARGET_PATH}/machine.conf +aboot_version=$aboot_version +aboot_vendor=arista +aboot_platform=x86_64-$aboot_machine +aboot_machine=$aboot_machine +aboot_arch=x86_64 +aboot_build_date=$aboot_build_date +EOF + fi echo "${append}" >/tmp/append diff --git a/files/docker/docker.service.conf b/files/docker/docker.service.conf index 2d6d3cfaa6fb..bfc44fb48f99 100644 --- a/files/docker/docker.service.conf +++ b/files/docker/docker.service.conf @@ -1,3 +1,3 @@ [Service] ExecStart= -ExecStart=/usr/bin/docker daemon -H fd:// --storage-driver=aufs +ExecStart=/usr/bin/docker daemon -H fd:// --storage-driver=aufs --bip=240.127.1.1/24 diff --git a/files/initramfs-tools/union-mount b/files/initramfs-tools/union-mount index 85fba9df3a0a..b343d56c6e22 100644 --- a/files/initramfs-tools/union-mount +++ b/files/initramfs-tools/union-mount @@ -4,10 +4,15 @@ case $1 in exit 0 ;; esac + +## Mount the aufs file system: rw layer over squashfs mkdir -p ${rootmnt}/host/rw mount -n -o dirs=${rootmnt}/host/rw:${rootmnt}=ro -t aufs root-aufs ${rootmnt} +## Mount the raw partition again mount ${ROOT} ${rootmnt}/host -mkdir -p /root/var/lib/docker -mount --bind /root/host/var/lib/docker /root/var/lib/docker -mkdir -p /root/boot -mount --bind /root/host/boot /root/boot +## Mount the working directory of docker engine in the raw partition, bypass the aufs +mkdir -p ${rootmnt}/var/lib/docker +mount --bind ${rootmnt}/host/var/lib/docker ${rootmnt}/var/lib/docker +## Mount the boot directory in the raw partition, bypass the aufs +mkdir -p ${rootmnt}/boot +mount --bind ${rootmnt}/host/boot ${rootmnt}/boot diff --git a/files/sshd/host-ssh-keygen.sh b/files/sshd/host-ssh-keygen.sh new file mode 100755 index 000000000000..476dd00a2800 --- /dev/null +++ b/files/sshd/host-ssh-keygen.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +[ -r /etc/ssh/ssh_host_key ] || { + rm -f /etc/ssh/ssh_host_*_key* + /usr/bin/ssh-keygen -t rsa -N '' -f /etc/ssh/ssh_host_rsa_key + /usr/bin/ssh-keygen -t dsa -N '' -f /etc/ssh/ssh_host_dsa_key + /usr/bin/ssh-keygen -t rsa1 -N '' -f /etc/ssh/ssh_host_key + /usr/bin/ssh-keygen -t ecdsa -N '' -f /etc/ssh/ssh_host_ecdsa_key + /usr/bin/ssh-keygen -t ed25519 -N '' -f /etc/ssh/ssh_host_ed25519_key +} diff --git a/files/sshd/sshd.service b/files/sshd/sshd.service new file mode 100644 index 000000000000..d79c574da516 --- /dev/null +++ b/files/sshd/sshd.service @@ -0,0 +1,16 @@ +[Unit] +Description=OpenBSD Secure Shell server +After=network.target auditd.service +ConditionPathExists=!/etc/ssh/sshd_not_to_be_run + +[Service] +EnvironmentFile=-/etc/default/ssh +ExecStartPre=-/usr/local/bin/host-ssh-keygen.sh +ExecStart=/usr/sbin/sshd -D $SSHD_OPTS +ExecReload=/bin/kill -HUP $MAINPID +KillMode=process +Restart=on-failure + +[Install] +WantedBy=multi-user.target +Alias=sshd.service diff --git a/functions.sh b/functions.sh index b9e7ee0b55e6..99dfcb9db3f1 100644 --- a/functions.sh +++ b/functions.sh @@ -36,3 +36,10 @@ die() { warn "$message" exit 1 } + +docker_try_rmi() { + local image_name="$1" + ## Note: inspect output has quotation characters, so sed to remove it as an argument + local image_id=$(docker inspect --format="{{json .Id}}" $image_name | sed -e 's/^"//' -e 's/"$//') + [ -z "$image_id" ] || docker rmi $image_name +} diff --git a/installer/x86_64/dell-s6000-replace-reboot.sh b/installer/x86_64/dell-s6000-replace-reboot.sh new file mode 100755 index 000000000000..48ac8a62f548 --- /dev/null +++ b/installer/x86_64/dell-s6000-replace-reboot.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +echo "Replace ONIE reboot with Dell reset commands" + +# set I2C GPIO mux +echo 1 > /sys/class/gpio/export +echo 2 > /sys/class/gpio/export +echo out > /sys/class/gpio/gpio1/direction +echo out > /sys/class/gpio/gpio2/direction +echo 0 > /sys/class/gpio/gpio1/value +echo 0 > /sys/class/gpio/gpio2/value + +# replace the original reboot binary with the following command +rm /sbin/reboot +echo 'i2cset -y 0 0x31 1 0xfd' > /sbin/reboot +chmod a+x /sbin/reboot diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 528c14727280..58243be24283 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -39,6 +39,28 @@ if [ $(id -u) -ne 0 ] exit 1 fi +# get running machine from conf file +[ -r /etc/machine.conf ] && . /etc/machine.conf + +echo "onie_platform: $onie_platform" + +# default console settings +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=9600 + +# Get platform specific linux kernel command line arguments +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="" +# platform specific configurations +if [ "$onie_platform" == "x86_64-dell_s6000_s1220-r0" ]; then + `pwd`/dell-s6000-replace-reboot.sh +elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ]; then + ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="acpi_enforce_resources=lax acpi=noirq" +elif [ "$onie_platform" == "x86_64-dell_s6100_c2538-r0" ]; then + CONSOLE_PORT=0x2f8 + CONSOLE_DEV=1 +fi + # Install demo on same block device as ONIE onie_dev=$(blkid | grep ONIE-BOOT | head -n 1 | awk '{print $1}' | sed -e 's/:.*$//') blk_dev=$(echo $onie_dev | sed -e 's/[1-9][0-9]*$//' | sed -e 's/\([0-9]\)\(p\)/\1/') @@ -180,6 +202,7 @@ create_demo_gpt_partition() --attributes=${demo_part}:=:$attr_bitmask \ --change-name=${demo_part}:$demo_volume_revision_label $blk_dev \ || { + echo "Warning: The first trial of creating partition failed, trying the largest aligned available block of sectors on the disk" begin=$(sgdisk -F $blk_dev) end=$(sgdisk -E $blk_dev) sgdisk --new=${demo_part}:$begin:$end \ @@ -379,7 +402,10 @@ ${onie_bin} mount -t ext4 -o defaults,rw $demo_dev $demo_mnt || { # Decompress the file for the file system directly to the partition unzip $ONIE_INSTALLER_PAYLOAD -d $demo_mnt -# store installation log in demo file system +# Store machine description in target file system +cp /etc/machine.conf $demo_mnt + +# Store installation log in target file system rm -f $onie_initrd_tmp/tmp/onie-support.tar.bz2 ${onie_bin} onie-support /tmp mv $onie_initrd_tmp/tmp/onie-support.tar.bz2 $demo_mnt @@ -408,8 +434,8 @@ trap_push "rm $grub_cfg || true" [ -r ./platform.conf ] && . ./platform.conf -DEFAULT_GRUB_SERIAL_COMMAND="serial --port=%%CONSOLE_PORT%% --speed=%%CONSOLE_SPEED%% --word=8 --parity=no --stop=1" -DEFAULT_GRUB_CMDLINE_LINUX="console=tty0 console=ttyS%%CONSOLE_DEV%%,%%CONSOLE_SPEED%%n8 quiet" +DEFAULT_GRUB_SERIAL_COMMAND="serial --port=${CONSOLE_PORT} --speed=${CONSOLE_SPEED} --word=8 --parity=no --stop=1" +DEFAULT_GRUB_CMDLINE_LINUX="console=tty0 console=ttyS${CONSOLE_DEV},${CONSOLE_SPEED}n8 quiet" GRUB_SERIAL_COMMAND=${GRUB_SERIAL_COMMAND:-"$DEFAULT_GRUB_SERIAL_COMMAND"} GRUB_CMDLINE_LINUX=${GRUB_CMDLINE_LINUX:-"$DEFAULT_GRUB_CMDLINE_LINUX"} export GRUB_SERIAL_COMMAND @@ -460,7 +486,7 @@ menuentry '$demo_grub_entry' { insmod ext2 linux /boot/vmlinuz-3.16.0-4-amd64 root=$demo_dev rw $GRUB_CMDLINE_LINUX \ loop=$FILESYSTEM_SQUASHFS loopfstype=squashfs \ - apparmor=1 security=apparmor + apparmor=1 security=apparmor $ONIE_PLATFORM_EXTRA_CMDLINE_LINUX echo 'Loading $demo_volume_revision_label $demo_type initial ramdisk ...' initrd /boot/initrd.img-3.16.0-4-amd64 } @@ -474,3 +500,5 @@ mkdir -p $onie_initrd_tmp/$demo_mnt/grub cp $grub_cfg $onie_initrd_tmp/$demo_mnt/grub/grub.cfg cd / + +echo "Installed SONiC base image $demo_volume_revision_label successfully" diff --git a/onie-mk-demo.sh b/onie-mk-demo.sh index 3dd81b876fd6..992558e23f3a 100755 --- a/onie-mk-demo.sh +++ b/onie-mk-demo.sh @@ -39,11 +39,6 @@ fi exit 1 } -[ -n "$CONSOLE_SPEED" ] || { - echo "Error: Invalid CONSOLE_SPEED" - exit 1 -} - [ -r "$platform_conf" ] || { echo "Error: Unable to read installer platform configuration file: $platform_conf" exit 1 @@ -81,7 +76,7 @@ tmp_dir=$(mktemp --directory) tmp_installdir="$tmp_dir/installer" mkdir $tmp_installdir || clean_up 1 -cp $installer_dir/$arch/install.sh $tmp_installdir || clean_up 1 +cp $installer_dir/$arch/* $tmp_installdir || clean_up 1 cp onie-image.conf $tmp_installdir # Escape special chars in the user provide kernel cmdline string for use in @@ -92,10 +87,6 @@ EXTRA_CMDLINE_LINUX=`echo $EXTRA_CMDLINE_LINUX | sed -e 's/[\/&]/\\\&/g'` sed -i -e "s/%%DEMO_TYPE%%/$demo_type/g" \ -e "s/%%GIT_REVISION%%/$git_revision/g" \ -e "s/%%ONIE_IMAGE_PART_SIZE%%/$onie_image_part_size/" \ - -e "s/%%CONSOLE_SPEED%%/$CONSOLE_SPEED/g" \ - -e "s/%%CONSOLE_DEV%%/$CONSOLE_DEV/g" \ - -e "s/%%CONSOLE_FLAG%%/$CONSOLE_FLAG/g" \ - -e "s/%%CONSOLE_PORT%%/$CONSOLE_PORT/g" \ -e "s/%%EXTRA_CMDLINE_LINUX%%/$EXTRA_CMDLINE_LINUX/" \ $tmp_installdir/install.sh || clean_up 1 echo -n "." From 854d12f8484684ce1a6b9c9d59b720aa3386f6a3 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 27 Jul 2016 11:55:18 -0700 Subject: [PATCH 0009/1011] Add .gitignore, creat a symlink --- .gitignore | 2 ++ docker-orchagent-mlnx | 1 + 2 files changed, 3 insertions(+) create mode 100644 .gitignore create mode 120000 docker-orchagent-mlnx diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000000..0288d69b6418 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +deps/ + diff --git a/docker-orchagent-mlnx b/docker-orchagent-mlnx new file mode 120000 index 000000000000..8d52609c56e5 --- /dev/null +++ b/docker-orchagent-mlnx @@ -0,0 +1 @@ +docker-orchagent \ No newline at end of file From e4bd20c18a1a479957b63775d9a9f1880bf91f0e Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 4 Aug 2016 10:39:33 -0700 Subject: [PATCH 0010/1011] Squash merge master (11de390) --- .gitmodules | 14 ++- Makefile | 111 ++++++++++++++++++ README.md | 46 ++++---- build_debian.sh | 4 +- build_docker.sh | 18 +-- build_image.sh | 1 + docker-ptf/Dockerfile | 48 -------- docker-base => dockers/docker-base | 0 .../docker-basic_router}/Dockerfile | 0 {docker-bgp => dockers/docker-bgp}/Dockerfile | 0 {docker-bgp => dockers/docker-bgp}/daemons | 0 .../docker-database}/Dockerfile | 0 {docker-fpm => dockers/docker-fpm}/Dockerfile | 0 {docker-fpm => dockers/docker-fpm}/start.sh | 0 .../docker-lldp}/Dockerfile | 6 +- .../docker-mlnx-sswsyncd-rpc}/Dockerfile | 0 .../docker-mlnx-sswsyncd}/Dockerfile | 0 .../docker-orchagent-mlnx | 0 .../docker-orchagent}/Dockerfile | 0 .../docker-orchagent}/start.sh | 2 +- .../docker-platform-monitor}/Dockerfile | 0 dockers/docker-ptf/Dockerfile | 75 ++++++++++++ .../docker-ptf}/supervisord.conf | 0 .../docker-snmp}/Dockerfile | 0 .../docker-sswsyncd}/Dockerfile | 0 .../docker-syncd-mlnx-rpc}/Dockerfile | 0 .../docker-syncd-mlnx}/Dockerfile | 0 .../docker-syncd}/Dockerfile | 4 +- .../docker-syncd}/start.sh | 0 {docker-vas => dockers/docker-vas}/Dockerfile | 0 .../docker-vas}/user-override | 0 functions.sh | 8 +- get_deps.sh | 19 --- onie-image.conf | 4 +- src/Makefile | 67 +++++++++++ src/brcm-sdk/filelist.txt | 4 + src/hiredis/build.sh | 14 +++ src/initramfs-tools/build.sh | 19 +++ .../loopback-file-system-support.patch | 0 src/mlnx-sdk/filelist.txt | 32 +++++ src/quagga/build.sh | 36 ++++++ src/redis/build.sh | 14 +++ src/sonic-linux-kernel | 1 + src/sonic-sairedis | 1 + src/sonic-swss | 1 + src/sonic-swss-common | 1 + 46 files changed, 441 insertions(+), 109 deletions(-) create mode 100644 Makefile delete mode 100644 docker-ptf/Dockerfile rename docker-base => dockers/docker-base (100%) rename {docker-basic_router => dockers/docker-basic_router}/Dockerfile (100%) rename {docker-bgp => dockers/docker-bgp}/Dockerfile (100%) rename {docker-bgp => dockers/docker-bgp}/daemons (100%) rename {docker-database => dockers/docker-database}/Dockerfile (100%) rename {docker-fpm => dockers/docker-fpm}/Dockerfile (100%) rename {docker-fpm => dockers/docker-fpm}/start.sh (100%) rename {docker-lldp => dockers/docker-lldp}/Dockerfile (87%) rename {docker-mlnx-sswsyncd-rpc => dockers/docker-mlnx-sswsyncd-rpc}/Dockerfile (100%) rename {docker-mlnx-sswsyncd => dockers/docker-mlnx-sswsyncd}/Dockerfile (100%) rename docker-orchagent-mlnx => dockers/docker-orchagent-mlnx (100%) rename {docker-orchagent => dockers/docker-orchagent}/Dockerfile (100%) rename {docker-orchagent => dockers/docker-orchagent}/start.sh (88%) rename {docker-platform-monitor => dockers/docker-platform-monitor}/Dockerfile (100%) create mode 100644 dockers/docker-ptf/Dockerfile rename {docker-ptf => dockers/docker-ptf}/supervisord.conf (100%) rename {docker-snmp => dockers/docker-snmp}/Dockerfile (100%) rename {docker-sswsyncd => dockers/docker-sswsyncd}/Dockerfile (100%) rename {docker-syncd-mlnx-rpc => dockers/docker-syncd-mlnx-rpc}/Dockerfile (100%) rename {docker-syncd-mlnx => dockers/docker-syncd-mlnx}/Dockerfile (100%) rename {docker-syncd => dockers/docker-syncd}/Dockerfile (86%) rename {docker-syncd => dockers/docker-syncd}/start.sh (100%) rename {docker-vas => dockers/docker-vas}/Dockerfile (100%) rename {docker-vas => dockers/docker-vas}/user-override (100%) delete mode 100755 get_deps.sh create mode 100644 src/Makefile create mode 100644 src/brcm-sdk/filelist.txt create mode 100755 src/hiredis/build.sh create mode 100755 src/initramfs-tools/build.sh rename {patch => src}/initramfs-tools/loopback-file-system-support.patch (100%) create mode 100644 src/mlnx-sdk/filelist.txt create mode 100755 src/quagga/build.sh create mode 100755 src/redis/build.sh create mode 160000 src/sonic-linux-kernel create mode 160000 src/sonic-sairedis create mode 160000 src/sonic-swss create mode 160000 src/sonic-swss-common diff --git a/.gitmodules b/.gitmodules index 267fb9435909..88123322f032 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,15 @@ [submodule "docker-base"] - path = docker-base + path = dockers/docker-base url = https://github.com/Azure/sonic-docker-base.git +[submodule "sonic-swss-common"] + path = src/sonic-swss-common + url = https://github.com/Azure/sonic-swss-common +[submodule "sonic-linux-kernel"] + path = src/sonic-linux-kernel + url = https://github.com/Azure/sonic-linux-kernel +[submodule "sonic-sairedis"] + path = src/sonic-sairedis + url = https://github.com/Azure/sonic-sairedis +[submodule "sonic-swss"] + path = src/sonic-swss + url = https://github.com/Azure/sonic-swss diff --git a/Makefile b/Makefile new file mode 100644 index 000000000000..743cb4e7689d --- /dev/null +++ b/Makefile @@ -0,0 +1,111 @@ +## TODO: if install dev package really happens, rebuild the depending project + +## Arguments from make command line +USERNAME= +PASSWORD_ENCRYPTED= + +## Select bash for commands +SHELL := /bin/bash + +## Capture all the files in SDK directories +MLNX-SDK-DEBS=$(notdir $(wildcard src/mlnx-sdk/*.deb)) +BRCM-SDK-DEBS=$(notdir $(wildcard src/brcm-sdk/*.deb)) + +## Function: build_docker, image_name save_file +## build a docker image and save to a file +define build_docker + docker build --no-cache -t $(1) dockers/$(1) + mkdir -p `dirname $(2)` + docker save $(1) | gzip -c > $(2) +endef + +## Rules +.phony : brcm-all mlnx-all + +src/%: + $(MAKE) -C src $(subst src/,,$@) + +dockers/docker-fpm/deps/fpmsyncd: src/fpmsyncd + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-fpm/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-orchagent-mlnx/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-orchagent-mlnx/deps/%: src/mlnx/% + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-orchagent/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-orchagent/deps/%: src/brcm/% + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-%-mlnx/deps/syncd_1.0.0_amd64.deb: src/mlnx/syncd_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-%/deps/syncd_1.0.0_amd64.deb: src/brcm/syncd_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-%-mlnx/deps/libsairedis_1.0.0_amd64.deb: src/mlnx/syncd_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-%/deps/libsairedis_1.0.0_amd64.deb: src/brcm/syncd_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $@ + +$(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS)) : dockers/docker-syncd-mlnx/deps/%.deb : src/mlnx-sdk/%.deb + mkdir -p `dirname $@` && cp $< $@ + +$(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS)) : dockers/docker-syncd/deps/%.deb : src/brcm-sdk/%.deb + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-syncd-mlnx/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-syncd/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $@ + +deps/linux-image-3.16.0-4-amd64_%.deb: src/sonic-linux-kernel/linux-image-3.16.0-4-amd64_%.deb + mkdir -p `dirname $@` && cp $< $@ + +deps/initramfs-tools_%.deb: src/initramfs-tools/initramfs-tools_%.deb + mkdir -p `dirname $@` && cp $< $@ + +target/docker-base.gz: + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + +target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb syncd_1.0.0_amd64.deb) + ## TODO: remove placeholders for the dependencies + touch dockers/docker-syncd/deps/{dsserve,bcmcmd} + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + +target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + +target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb orchagent swssconfig portsyncd intfsyncd neighsyncd) + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + +target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb orchagent swssconfig portsyncd intfsyncd neighsyncd) + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + +target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb fpmsyncd) + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + +target/acs-generic.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb + ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=generic ./build_image.sh + +target/acs-aboot.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb + ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=aboot ./build_image.sh + +## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd +brcm-all: target/acs-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz) + +## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd +mlnx-all: target/acs-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz) diff --git a/README.md b/README.md index 27171d288cde..736990f11157 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,42 @@ -# Build Switch Images - buildimage +# Build SONiC Switch Images - buildimage # Description Build an [Open Network Install Environment (ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also build docker images running inside the NOS. # Prerequisite -## 1. Build environment -Preferably use [the Dockerfile](https://github.com/Azure/sonic-build-tools/blob/master/sonic-slave/Dockerfile), or use Debian Jessie and manually install packages appearing in the Dockerfile. -## 2. Linux kernel with switch drivers -Build the [Azure/sonic-linux-kernel](https://github.com/Azure/sonic-linux-kernel) project and copy the output .deb file into ./deps directory. +## 1. Clone or fetch the code repository with all git submodules +To clone the code repository recursively, assuming git version 1.9 or newer -## 3. initramfs-tools with loop device support -Run the script to build the .deb file into ./deps directory. + git clone --recursive https://github.com/Azure/sonic-buildimage.git - ./get_deps.sh - -## 4. Fetch the git submodule -If there is no files under ./docker-base, manually fetch them. +If it is already cloned, however there is no files under ./dockers/docker-base/ or ./src/sonic-linux-kernel/, manually fetch all the git submodules. git submodule update --init --recursive +## 2. Build environment +Build a docker image by [the Dockerfile](https://github.com/Azure/sonic-build-tools/blob/master/sonic-slave/Dockerfile) and build all remains in the docker container. + # Usage -## Build NOS installer image +## Build NOS installer image and docker images - ./build_debian USERNAME PASSWORD_ENCRYPTED && ./build_image.sh - -For example, the user name is 'admin' and the password is 'YourPaSsWoRd'. + make [VENDOR]-all USERNAME=[USERNAME] PASSWORD_ENCRYPTED=[PASSWORD_ENCRYPTED] - ./build_debian.sh "admin" "$(perl -e 'print crypt("YourPaSsWoRd", "salt"),"\n"')" && ./build_image.sh +Supported VENDOR are: +- brcm: Broadcom +- mlnx: Mellanox -The root is disabled, but the created user could sudo. +For example, the user name is 'admin' and the password is 'YourPaSsWoRd'. To build all the images for Broadcom platform, use the command: + make brcm-all USERNAME="admin" PASSWORD_ENCRYPTED="$(perl -e 'print crypt("YourPaSsWoRd", "salt"),"\n"')" -## Build docker images +The root is disabled, but the created user could sudo. - ./build_docker.sh docker-sswsyncd - ./build_docker.sh docker-database - ./build_docker.sh docker-bgp - ./build_docker.sh docker-snmp - ./build_docker.sh docker-lldp - ./build_docker.sh docker-basic_router +The target directory is ./target, containing the NOS installer image and docker images. +- acs-generic.bin: SONiC switch installer image (ONIE compatiable) +- docker-base.gz: base docker image where others are built from (gzip tar archive) +- docker-fpm.gz: docker image for quagga with fpm module enabled (gzip tar archive) +- docker-orchagent.gz: docker image for SWitch State Service (SWSS) +- docker-syncd.gz: docker image for the daemon to sync database and switch ASIC # Contribution guide diff --git a/build_debian.sh b/build_debian.sh index e283e5965ead..5ad7c7d46676 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -89,7 +89,7 @@ trap_push clean_sys sudo LANG=C chroot $FILESYSTEM_ROOT mount sysfs /sys -t sysfs ## Pointing apt to public apt mirrors and getting latest packages, needed for latest security updates -sudo cp docker-base/sources.list $FILESYSTEM_ROOT/etc/apt/ +sudo cp dockers/docker-base/sources.list $FILESYSTEM_ROOT/etc/apt/ sudo cp files/apt/apt.conf.d/81norecommends $FILESYSTEM_ROOT/etc/apt/apt.conf.d/ sudo LANG=C chroot $FILESYSTEM_ROOT bash -c 'apt-mark auto `apt-mark showmanual`' @@ -142,7 +142,7 @@ wget $docker_deb_url -qO $docker_deb_temp && { } sudo chroot $FILESYSTEM_ROOT docker version sudo chroot $FILESYSTEM_ROOT service docker stop -## Add docker config drop-in to select aufs, otherwise it may other storage driver +## Add docker config drop-in to select aufs, otherwise it may select other storage driver sudo mkdir -p $FILESYSTEM_ROOT/etc/systemd/system/docker.service.d/ ## Note: $_ means last argument of last command sudo cp files/docker/docker.service.conf $_ diff --git a/build_docker.sh b/build_docker.sh index 14a545bfc73b..0088a72e278f 100755 --- a/build_docker.sh +++ b/build_docker.sh @@ -42,19 +42,19 @@ done shift "$((OPTIND - 1))" ## Dockerfile directory -DOCKER_BUILD_DIR=$1 +DOCKER_BUILD_DIR=dockers/$1 REGISTRY_SERVER=$2 REGISTRY_PORT=$3 REGISTRY_USERNAME=$4 REGISTRY_PASSWD=$5 -[ -d "$DOCKER_BUILD_DIR" ] || { +[ -f "$DOCKER_BUILD_DIR"/Dockerfile ] || { echo "Invalid DOCKER_BUILD_DIR directory" >&2 exit 1 } [ -n "$docker_image_name" ] || { - docker_image_name=$DOCKER_BUILD_DIR + docker_image_name=$(basename $DOCKER_BUILD_DIR) } [ ${BUILD_NUMBER} ] || { @@ -93,10 +93,14 @@ image_id=$(docker inspect --format="{{json .Id}}" $docker_image_name | sed -e 's ## TODO: wait docker-squash supporting Docker 1.10+ ## ref: https://github.com/jwilder/docker-squash/issues/45 if [ "$docker_image_name" = "docker-base" ]; then + ## Run old image in a container tmp_container=$(docker run -d ${docker_image_name} /bin/bash) + ## Export the container's filesystem, then import as a new image docker export $tmp_container | docker import - ${docker_image_name} - trap_push "docker rmi $image_id" - trap_push "docker rm -f $tmp_container || true" + ## Remove the container + docker rm -f $tmp_container || true + ## Remove the old image + docker rmi -f $image_id || true fi image_sha='' @@ -113,8 +117,8 @@ if [ -n "$REGISTRY_SERVER" ] && [ -n "$REGISTRY_PORT" ]; then ## Push image to registry server ## And get the image digest SHA256 - trap_push "docker rmi $remote_image_name" - trap_push "docker rmi $build_remote_image_name" + trap_push "docker rmi $remote_image_name || true" + trap_push "docker rmi $build_remote_image_name || true" image_sha=$(docker push $remote_image_name | sed -n "s/.*: digest: sha256:\([0-9a-f]*\).*/\\1/p") docker push $build_remote_image_name fi diff --git a/build_image.sh b/build_image.sh index e4a93d8dfbf8..887d63ae049f 100755 --- a/build_image.sh +++ b/build_image.sh @@ -19,6 +19,7 @@ } GIT_REVISION=$(git rev-parse --short HEAD) +mkdir -p `dirname $OUTPUT_ONIE_IMAGE` sudo rm -f $OUTPUT_ONIE_IMAGE if [ "$TARGET_MACHINE" = "generic" ]; then ## Generate an ONIE installer image diff --git a/docker-ptf/Dockerfile b/docker-ptf/Dockerfile deleted file mode 100644 index 6c35e524a91d..000000000000 --- a/docker-ptf/Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -FROM debian:jessie - -MAINTAINER Pavel Shirshov - -## Copy dependencies -COPY deps /root/deps - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -## Set the apt source, update package cache and install necessary packages -RUN echo "deb http://ftp.us.debian.org/debian/ jessie main contrib non-free" > /etc/apt/sources.list \ - && apt-get update \ - && apt-get upgrade -y \ - && apt-get dist-upgrade -y \ - && apt-get install -y --no-install-recommends \ - openssh-server \ - vim-tiny \ - python \ - python-scapy \ - net-tools \ - python-setuptools \ - supervisor \ - traceroute \ - lsof \ - tcpdump \ - && dpkg -i /root/deps/python-ptf_*.deb \ - && dpkg -i --force-depends /root/deps/libthrift-0.9.2_*.deb \ - && dpkg -i --force-depends /root/deps/python-thrift_*.deb \ - && apt-get -y install -f \ - && rm -rf /root/deps \ - && apt-get -y autoclean \ - && apt-get -y autoremove \ - && rm -rf /var/lib/apt/lists/* - -## Adjust sshd settings -RUN mkdir /var/run/sshd \ - && echo 'root:root' | chpasswd \ - && sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config \ - && sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config \ - && sed -i '$aUseDNS no' /etc/ssh/sshd_config \ - && mkdir /root/deps - -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf - -EXPOSE 22 - -ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/docker-base b/dockers/docker-base similarity index 100% rename from docker-base rename to dockers/docker-base diff --git a/docker-basic_router/Dockerfile b/dockers/docker-basic_router/Dockerfile similarity index 100% rename from docker-basic_router/Dockerfile rename to dockers/docker-basic_router/Dockerfile diff --git a/docker-bgp/Dockerfile b/dockers/docker-bgp/Dockerfile similarity index 100% rename from docker-bgp/Dockerfile rename to dockers/docker-bgp/Dockerfile diff --git a/docker-bgp/daemons b/dockers/docker-bgp/daemons similarity index 100% rename from docker-bgp/daemons rename to dockers/docker-bgp/daemons diff --git a/docker-database/Dockerfile b/dockers/docker-database/Dockerfile similarity index 100% rename from docker-database/Dockerfile rename to dockers/docker-database/Dockerfile diff --git a/docker-fpm/Dockerfile b/dockers/docker-fpm/Dockerfile similarity index 100% rename from docker-fpm/Dockerfile rename to dockers/docker-fpm/Dockerfile diff --git a/docker-fpm/start.sh b/dockers/docker-fpm/start.sh similarity index 100% rename from docker-fpm/start.sh rename to dockers/docker-fpm/start.sh diff --git a/docker-lldp/Dockerfile b/dockers/docker-lldp/Dockerfile similarity index 87% rename from docker-lldp/Dockerfile rename to dockers/docker-lldp/Dockerfile index bcfd378a73da..aa66c24b659d 100644 --- a/docker-lldp/Dockerfile +++ b/dockers/docker-lldp/Dockerfile @@ -1,6 +1,6 @@ FROM docker-base -COPY deps/*py2*.whl deps/python-sswsdk_*.deb deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ +COPY deps/*py2*.whl deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ ## Pre-install the fundamental packages ## Install Python SSWSDK (lldpsyncd dependancy) @@ -10,8 +10,10 @@ COPY deps/*py2*.whl deps/python-sswsdk_*.deb deps/lldpsyncd_*.deb deps/lldpd_*.d RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ dpkg_apt /deps/lldpd_*.deb && \ dpkg_apt /deps/lldpsyncd_*.deb && \ + apt-get install -y python-pip && \ + pip install /deps/*.whl && \ + apt-get remove -y python-pip && \ apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ - pip install --no-cache-dir /deps/*.whl && \ rm -rf /deps ## There is a known bug: agetty processes at 100% cpu diff --git a/docker-mlnx-sswsyncd-rpc/Dockerfile b/dockers/docker-mlnx-sswsyncd-rpc/Dockerfile similarity index 100% rename from docker-mlnx-sswsyncd-rpc/Dockerfile rename to dockers/docker-mlnx-sswsyncd-rpc/Dockerfile diff --git a/docker-mlnx-sswsyncd/Dockerfile b/dockers/docker-mlnx-sswsyncd/Dockerfile similarity index 100% rename from docker-mlnx-sswsyncd/Dockerfile rename to dockers/docker-mlnx-sswsyncd/Dockerfile diff --git a/docker-orchagent-mlnx b/dockers/docker-orchagent-mlnx similarity index 100% rename from docker-orchagent-mlnx rename to dockers/docker-orchagent-mlnx diff --git a/docker-orchagent/Dockerfile b/dockers/docker-orchagent/Dockerfile similarity index 100% rename from docker-orchagent/Dockerfile rename to dockers/docker-orchagent/Dockerfile diff --git a/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh similarity index 88% rename from docker-orchagent/start.sh rename to dockers/docker-orchagent/start.sh index a5155e0513ad..5eca68ed4e5b 100755 --- a/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -12,7 +12,7 @@ if [ "$onie_platform" == "x86_64-dell_s6000_s1220-r0" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" PORTSYNCD_ARGS+="-p /etc/ssw/ACS-S6000/port_config.ini" elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ]; then - ORCHAGENT_ARGS+="-p /etc/ssw/ACS-MSN2700/port_config.ini" + PORTSYNCD_ARGS+="-p /etc/ssw/ACS-MSN2700/port_config.ini" fi service rsyslog start diff --git a/docker-platform-monitor/Dockerfile b/dockers/docker-platform-monitor/Dockerfile similarity index 100% rename from docker-platform-monitor/Dockerfile rename to dockers/docker-platform-monitor/Dockerfile diff --git a/dockers/docker-ptf/Dockerfile b/dockers/docker-ptf/Dockerfile new file mode 100644 index 000000000000..dff8f7196a6a --- /dev/null +++ b/dockers/docker-ptf/Dockerfile @@ -0,0 +1,75 @@ +FROM debian:jessie + +MAINTAINER Pavel Shirshov + +## Copy dependencies +COPY deps /root/deps + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +## Set the apt source, update package cache and install necessary packages +RUN echo "deb http://ftp.us.debian.org/debian/ jessie main contrib non-free" > /etc/apt/sources.list \ + && apt-get update \ + && apt-get upgrade -y \ + && apt-get dist-upgrade -y \ + && apt-get install -y --no-install-recommends \ + openssh-server \ + vim \ + python \ + python-scapy \ + net-tools \ + python-setuptools \ + supervisor \ + traceroute \ + lsof \ + tcpdump \ + unzip \ + pkg-config \ + binutils \ + net-tools \ + python-pip \ + build-essential \ + libssl-dev \ + libffi-dev \ + python-dev \ + wget \ + cmake \ + && dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ + && dpkg_apt /root/deps/python-ptf_*.deb \ + && dpkg_apt /root/deps/libthrift-0.9.2_*.deb \ + && dpkg_apt /root/deps/python-thrift_*.deb \ + && rm -rf /root/deps \ + && apt-get -y autoclean \ + && apt-get -y autoremove \ + && rm -rf /var/lib/apt/lists/* \ + && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ + && tar xvfz 1.0.0.tar.gz \ + && cd nanomsg-1.0.0 \ + && mkdir -p build \ + && cmake . \ + && make install \ + && ldconfig \ + && cd .. \ + && rm -fr nanomsg-1.0.0 \ + && rm -f 1.0.0.tar.gz \ + && pip install cffi \ + && pip install --upgrade cffi \ + && pip install nnpy \ + && mkdir -p /opt \ + && cd /opt \ + && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py + +## Adjust sshd settings +RUN mkdir /var/run/sshd \ + && echo 'root:root' | chpasswd \ + && sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config \ + && sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config \ + && sed -i '$aUseDNS no' /etc/ssh/sshd_config \ + && mkdir /root/deps + +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +EXPOSE 22 + +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/docker-ptf/supervisord.conf b/dockers/docker-ptf/supervisord.conf similarity index 100% rename from docker-ptf/supervisord.conf rename to dockers/docker-ptf/supervisord.conf diff --git a/docker-snmp/Dockerfile b/dockers/docker-snmp/Dockerfile similarity index 100% rename from docker-snmp/Dockerfile rename to dockers/docker-snmp/Dockerfile diff --git a/docker-sswsyncd/Dockerfile b/dockers/docker-sswsyncd/Dockerfile similarity index 100% rename from docker-sswsyncd/Dockerfile rename to dockers/docker-sswsyncd/Dockerfile diff --git a/docker-syncd-mlnx-rpc/Dockerfile b/dockers/docker-syncd-mlnx-rpc/Dockerfile similarity index 100% rename from docker-syncd-mlnx-rpc/Dockerfile rename to dockers/docker-syncd-mlnx-rpc/Dockerfile diff --git a/docker-syncd-mlnx/Dockerfile b/dockers/docker-syncd-mlnx/Dockerfile similarity index 100% rename from docker-syncd-mlnx/Dockerfile rename to dockers/docker-syncd-mlnx/Dockerfile diff --git a/docker-syncd/Dockerfile b/dockers/docker-syncd/Dockerfile similarity index 86% rename from docker-syncd/Dockerfile rename to dockers/docker-syncd/Dockerfile index a3d45eb71fe7..16b70961a497 100755 --- a/docker-syncd/Dockerfile +++ b/dockers/docker-syncd/Dockerfile @@ -15,11 +15,11 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return ## TODO: add kmod into Depends RUN apt-get install -f kmod -COPY ["deps/dsserve", "deps/bcmcmd", "start.sh", "/usr/local/bin/"] +COPY ["deps/dsserve", "deps/bcmcmd", "start.sh", "/usr/bin/"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /deps -ENTRYPOINT /usr/local/bin/start.sh \ +ENTRYPOINT /usr/bin/start.sh \ && /bin/bash diff --git a/docker-syncd/start.sh b/dockers/docker-syncd/start.sh similarity index 100% rename from docker-syncd/start.sh rename to dockers/docker-syncd/start.sh diff --git a/docker-vas/Dockerfile b/dockers/docker-vas/Dockerfile similarity index 100% rename from docker-vas/Dockerfile rename to dockers/docker-vas/Dockerfile diff --git a/docker-vas/user-override b/dockers/docker-vas/user-override similarity index 100% rename from docker-vas/user-override rename to dockers/docker-vas/user-override diff --git a/functions.sh b/functions.sh index 99dfcb9db3f1..b808f727278f 100644 --- a/functions.sh +++ b/functions.sh @@ -41,5 +41,11 @@ docker_try_rmi() { local image_name="$1" ## Note: inspect output has quotation characters, so sed to remove it as an argument local image_id=$(docker inspect --format="{{json .Id}}" $image_name | sed -e 's/^"//' -e 's/"$//') - [ -z "$image_id" ] || docker rmi $image_name + [ -z "$image_id" ] || { + ## Remove all the exited containers from this image + docker ps -a -q -f "status=exited" -f "ancestor=$1" | xargs --no-run-if-empty docker rm + ## Note: If there are running containers from this image, the build system is in an + ## unexpected state. The 'rmi' will fail and we need investigate the build environment. + docker rmi $image_name + } } diff --git a/get_deps.sh b/get_deps.sh deleted file mode 100755 index 145caf620af9..000000000000 --- a/get_deps.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -## This script is to build the dependencies of an ONIE installer image -## -## USAGE: -## ./get_deps.sh - -# Obtaining the initramfs-tools -rm -rf deps/initramfs-tools -git clone --branch v0.120 https://anonscm.debian.org/git/kernel/initramfs-tools.git deps/initramfs-tools - -# Patch -pushd deps/initramfs-tools -patch -p1 < $OLDPWD/patch/initramfs-tools/loopback-file-system-support.patch - -# Build the package -fakeroot debian/rules clean -fakeroot debian/rules binary - -popd diff --git a/onie-image.conf b/onie-image.conf index 25c631563cd9..b7e43b6a0a74 100644 --- a/onie-image.conf +++ b/onie-image.conf @@ -1,5 +1,5 @@ ## DESCRIPTION: -## partition related config +## config for ONIE image ## ## Partition size in MB @@ -19,4 +19,4 @@ FILESYSTEM_SQUASHFS=fs.squashfs ONIE_INSTALLER_PAYLOAD=fs.zip ## Output file name for onie installer -OUTPUT_ONIE_IMAGE=acs-$TARGET_MACHINE.bin +OUTPUT_ONIE_IMAGE=target/acs-$TARGET_MACHINE.bin diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 000000000000..09e1152dec48 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,67 @@ +## TODO: if install dev package really happens, rebuild the depending project + +.ONESHELL: +SHELL := /bin/bash + +## Function: build_project, directory +## Build the project and save the .deb target in the same directory +## TRICK: clean dh state so it will force recreating .deb later +define build_project + rm -f $(1)/debian/*.debhelper.log + pushd $(1) + [ ! -f ./autogen.sh ] || ./autogen.sh + dpkg-buildpackage -rfakeroot -b -us -uc + popd +endef + +## Function: install_deb, debfile +install_deb = \ + [ -f $(1) ] && { sudo dpkg -i $(1) || sudo apt-get -y install -f; } || return 1; + +## Rules +quagga_0.99.24.1-2_amd64.deb: + pushd quagga; ./build.sh; popd + +redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb redis-sentinel_3.0.7-2_amd64.deb: + pushd redis; ./build.sh; popd + +libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dbg_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb: redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb redis-sentinel_3.0.7-2_amd64.deb + pushd hiredis; ./build.sh; popd + +libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb: redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb + $(foreach dep, $^, $(call install_deb, $(dep))) + $(call build_project, sonic-swss-common) + +brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb brcm-sdk/libopennsl_*_amd64.deb brcm-sdk/libsaibcm_1.0.2*_amd64.deb brcm-sdk/libsaibcm-dev_1.0.2*_amd64.deb + $(foreach dep, $^, $(call install_deb, $(dep))) + $(call build_project, sonic-sairedis) + mkdir -p brcm + cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb brcm/ + +mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb mlnx-sdk/applibs_1.mlnx.4.2.2100_amd64.deb mlnx-sdk/*.deb + $(foreach dep, $^, $(call install_deb, $(dep))) + $(call build_project, sonic-sairedis) + mkdir -p mlnx + cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb mlnx/ + +## Note: fpmsyncd is one implicit target +brcm/swss_1.0.0_amd64.deb brcm/intfsyncd brcm/neighsyncd brcm/orchagent brcm/portsyncd brcm/routeresync brcm/swssconfig: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb + $(foreach dep, $^, $(call install_deb, $(dep))) + $(call build_project, sonic-swss) + cp swss_1.0.0_amd64.deb brcm/ + cp sonic-swss/debian/swss/usr/bin/* brcm/ + cp sonic-swss/debian/swss/usr/bin/fpmsyncd . + +## Note: fpmsyncd is one implicit target +mlnx/swss_1.0.0_amd64.deb mlnx/intfsyncd mlnx/neighsyncd mlnx/orchagent mlnx/portsyncd mlnx/routeresync mlnx/swssconfig: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb + $(foreach dep, $^, $(call install_deb, $(dep))) + $(call build_project, sonic-swss) + cp swss_1.0.0_amd64.deb mlnx/ + cp sonic-swss/debian/swss/usr/bin/* mlnx/ + cp sonic-swss/debian/swss/usr/bin/fpmsyncd . + +$(addprefix sonic-linux-kernel/,linux-headers-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb linux-headers-3.16.0-4-common_3.16.7-ckt11-2+acs8u2_amd64.deb linux-image-3.16.0-4-amd64-dbg_3.16.7-ckt11-2+acs8u2_amd64.deb linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb xen-linux-system-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb): + pushd sonic-linux-kernel; sudo ./build.sh; popd + +initramfs-tools/initramfs-tools_0.120_all.deb: + pushd initramfs-tools; ./build.sh; popd diff --git a/src/brcm-sdk/filelist.txt b/src/brcm-sdk/filelist.txt new file mode 100644 index 000000000000..211759436536 --- /dev/null +++ b/src/brcm-sdk/filelist.txt @@ -0,0 +1,4 @@ +libopennsl_6.4.11-1+0~20160719212144.23~1.gbp8ec2d1_amd64.deb +libsaibcm-dbg_1.0.2~20160727172452.52_amd64.deb +libsaibcm-dev_1.0.2~20160727172452.52_amd64.deb +libsaibcm_1.0.2~20160727172452.52_amd64.deb diff --git a/src/hiredis/build.sh b/src/hiredis/build.sh new file mode 100755 index 000000000000..de8ab036f06c --- /dev/null +++ b/src/hiredis/build.sh @@ -0,0 +1,14 @@ +#!/bin/bash -x + +sudo apt-get install -y libjemalloc-dev + +# Install redis-server +sudo dpkg -i redis/*.deb + +wget http://http.debian.net/debian/pool/main/h/hiredis/hiredis_0.13.3.orig.tar.gz +wget http://http.debian.net/debian/pool/main/h/hiredis/hiredis_0.13.3-2.debian.tar.xz +wget http://http.debian.net/debian/pool/main/h/hiredis/hiredis_0.13.3-2.dsc +dpkg-source -x hiredis_0.13.3-2.dsc +pushd hiredis-0.13.3; fakeroot debian/rules binary; popd + +cp *.deb .. diff --git a/src/initramfs-tools/build.sh b/src/initramfs-tools/build.sh new file mode 100755 index 000000000000..335b834a538b --- /dev/null +++ b/src/initramfs-tools/build.sh @@ -0,0 +1,19 @@ +#!/bin/bash +## This script is to build the initramfs-tools with patches +## +## USAGE: +## ./build.sh + +# Obtaining the initramfs-tools +rm -rf ./initramfs-tools +git clone --branch v0.120 https://anonscm.debian.org/git/kernel/initramfs-tools.git ./initramfs-tools + +# Patch +pushd ./initramfs-tools +patch -p1 < $OLDPWD/loopback-file-system-support.patch + +# Build the package +rm -f debian/*.debhelper.log +dpkg-buildpackage -rfakeroot -b -us -uc + +popd diff --git a/patch/initramfs-tools/loopback-file-system-support.patch b/src/initramfs-tools/loopback-file-system-support.patch similarity index 100% rename from patch/initramfs-tools/loopback-file-system-support.patch rename to src/initramfs-tools/loopback-file-system-support.patch diff --git a/src/mlnx-sdk/filelist.txt b/src/mlnx-sdk/filelist.txt new file mode 100644 index 000000000000..16f482f334e9 --- /dev/null +++ b/src/mlnx-sdk/filelist.txt @@ -0,0 +1,32 @@ +applibs-dev_1.mlnx.4.2.2100_amd64.deb +applibs_1.mlnx.4.2.2100_amd64.deb +iproute2-dev_1.mlnx.4.2.2100_amd64.deb +iproute2_1.mlnx.4.2.2100_amd64.deb +mft_4.1.0-28_amd64.deb +mlnx-sai_1.mlnx.160712_amd64.deb +python-sdk-api_1.mlnx.4.2.2100_amd64.deb +sx-acl-rm-dev_1.mlnx.4.2.2100_amd64.deb +sx-acl-rm_1.mlnx.4.2.2100_amd64.deb +sx-complib-dev-static_1.mlnx.4.2.2100_amd64.deb +sx-complib-dev_1.mlnx.4.2.2100_amd64.deb +sx-complib_1.mlnx.4.2.2100_amd64.deb +sx-examples-dev_1.mlnx.4.2.2100_amd64.deb +sx-examples_1.mlnx.4.2.2100_amd64.deb +sx-gen-utils-dev_1.mlnx.4.2.2100_amd64.deb +sx-gen-utils_1.mlnx.4.2.2100_amd64.deb +sx-kernel-dev_1.mlnx.4.2.2100_amd64.deb +sx-kernel_1.mlnx.4.2.2100_amd64.deb +sx-libnl-dev-static_1.mlnx.4.2.2100_amd64.deb +sx-libnl-dev_1.mlnx.4.2.2100_amd64.deb +sx-libnl_1.mlnx.4.2.2100_amd64.deb +sx-scew-dev-static_1.mlnx.4.2.2100_amd64.deb +sx-scew-dev_1.mlnx.4.2.2100_amd64.deb +sx-scew_1.mlnx.4.2.2100_amd64.deb +sx-sdn-hal-dev-static_1.mlnx.4.2.2100_amd64.deb +sx-sdn-hal-dev_1.mlnx.4.2.2100_amd64.deb +sx-sdn-hal_1.mlnx.4.2.2100_amd64.deb +sxd-libs-dev-static_1.mlnx.4.2.2100_amd64.deb +sxd-libs-dev_1.mlnx.4.2.2100_amd64.deb +sxd-libs_1.mlnx.4.2.2100_amd64.deb +testx-dev_1.mlnx.4.2.2100_amd64.deb +testx_1.mlnx.4.2.2100_amd64.deb diff --git a/src/quagga/build.sh b/src/quagga/build.sh new file mode 100755 index 000000000000..03ea3bf5cd5a --- /dev/null +++ b/src/quagga/build.sh @@ -0,0 +1,36 @@ +#!/bin/bash -x + +mkdir quagga + +# Get debian source for 0.9.24.1-2 +wget -O quagga_0.99.24.1.orig.tar.gz 'https://sonicstorage.blob.core.windows.net/packages/quagga_0.99.24.1.orig.tar.gz?sv=2015-04-05&sr=b&sig=7g3AC%2FkoX3wYztJYtXFt6Wl7zj%2BYwLkbXVNaSaRvUDU%3D&se=2026-07-21T00%3A07%3A31Z&sp=r' +tar -xzf quagga_0.99.24.1.orig.tar.gz --strip-components=1 -C quagga +ls -lrt + +# Get debian packaging for 0.99.24.1-2 +wget -O quagga_0.99.24.1-2.debian.tar.xz 'https://sonicstorage.blob.core.windows.net/packages/quagga_0.99.24.1-2.debian.tar.xz?sv=2015-04-05&sr=b&sig=VFEq4ec99OjVaypAx14DkO5I8N4CIBIPOuSw79qHUXg%3D&se=2026-07-21T00%3A03%3A10Z&sp=r' +tar -xJf quagga_0.99.24.1-2.debian.tar.xz -C quagga +ls -lrt + +cd quagga +ls -lrt + +# Enable FPM in debian/rules +awk '/--with-libpam/ { print; print " --enable-fpm \\"; next }1' debian/rules > tmp && mv tmp debian/rules + +# Update changelog +#echo 'quagga (0.99.24.1-2.1) unstable; urgency=medium +# +# * Non-maintainer upload. +# * enable fpm +# +# -- Guohan Lu Sat, 18 Jul 2015 16:10:47 -0700 +#' > tmp && cat debian/changelog >> tmp && mv tmp debian/changelog + +#./configure --enable-fpm +#make + +sudo chmod a+x debian/rules +dpkg-buildpackage -rfakeroot -b -us -uc +cd .. +cp *.deb .. diff --git a/src/redis/build.sh b/src/redis/build.sh new file mode 100755 index 000000000000..44f3e06018cb --- /dev/null +++ b/src/redis/build.sh @@ -0,0 +1,14 @@ +#!/bin/bash -x + +export REDIS_DOWNLOAD_URL=http://http.debian.net/debian/pool/main/r/redis/redis_3.0.7.orig.tar.gz +export REDIS_PACKAGING_URL=http://http.debian.net/debian/pool/main/r/redis/redis_3.0.7-2.debian.tar.xz + +wget -O redis_3.0.7-2.dsc 'https://sonicstorage.blob.core.windows.net/packages/redis_3.0.7-2.dsc?sv=2015-04-05&sr=b&sig=evQtsWTIUFlgWbzLLifS1lDgop%2BzlqIP8ehZl3p%2FCKI%3D&se=2026-07-24T01%3A48%3A19Z&sp=r' +wget -O redis_3.0.7.orig.tar.gz 'https://sonicstorage.blob.core.windows.net/packages/redis_3.0.7.orig.tar.gz?sv=2015-04-05&sr=b&sig=0ht16%2Fi8%2FPZQHp1PrDPYW0iRwcLfUPw1JpKUapizu8o%3D&se=2026-07-24T01%3A48%3A49Z&sp=r' +wget -O redis_3.0.7-2.debian.tar.xz 'https://sonicstorage.blob.core.windows.net/packages/redis_3.0.7-2.debian.tar.xz?sv=2015-04-05&sr=b&sig=4a33ECTvURfNUEDkS436ZlSsIpLIC9QdJrBBRIoWpW0%3D&se=2026-07-24T01%3A49%3A22Z&sp=r' + +dpkg-source -x redis_3.0.7-2.dsc + +pushd redis-3.0.7; fakeroot debian/rules binary; popd + +cp *.deb .. diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel new file mode 160000 index 000000000000..9794d29a08a4 --- /dev/null +++ b/src/sonic-linux-kernel @@ -0,0 +1 @@ +Subproject commit 9794d29a08a4f81fbcd900e03072561f42b81074 diff --git a/src/sonic-sairedis b/src/sonic-sairedis new file mode 160000 index 000000000000..68b0a9b914c3 --- /dev/null +++ b/src/sonic-sairedis @@ -0,0 +1 @@ +Subproject commit 68b0a9b914c3a3816c809d7951de70136d09dc27 diff --git a/src/sonic-swss b/src/sonic-swss new file mode 160000 index 000000000000..b56c9cc507cd --- /dev/null +++ b/src/sonic-swss @@ -0,0 +1 @@ +Subproject commit b56c9cc507cdfc473d6d0d1159f134dfd83a96df diff --git a/src/sonic-swss-common b/src/sonic-swss-common new file mode 160000 index 000000000000..38b461a168a6 --- /dev/null +++ b/src/sonic-swss-common @@ -0,0 +1 @@ +Subproject commit 38b461a168a6154aad978d3a97f08c2c933e943a From 47093642a26eec29fd8606cd80dfc9da6b09c0bd Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 5 Aug 2016 11:27:03 -0700 Subject: [PATCH 0011/1011] Update README: Get vendor SAI SDK --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 736990f11157..86a755ed86d0 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,15 @@ If it is already cloned, however there is no files under ./dockers/docker-base/ ## 2. Build environment Build a docker image by [the Dockerfile](https://github.com/Azure/sonic-build-tools/blob/master/sonic-slave/Dockerfile) and build all remains in the docker container. +## 3. Get vendor SAI SDK +Obtain Switch Abstraction Interface (SAI) SDK from one of supported vendors (see the list in [Usage](#usage) Section), and place it in the directory ./src/[VENDOR]-sdk/ as filelist.txt in that directory. + # Usage -## Build NOS installer image and docker images +To build NOS installer image and docker images, run command line make [VENDOR]-all USERNAME=[USERNAME] PASSWORD_ENCRYPTED=[PASSWORD_ENCRYPTED] -Supported VENDOR are: +Supported VENDORs are: - brcm: Broadcom - mlnx: Mellanox From b647bb59d441240bd50102476eced496a83b6f45 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 8 Aug 2016 10:38:36 -0700 Subject: [PATCH 0012/1011] (comment) --- README.md | 2 +- src/brcm-sdk/filelist.txt | 3 +++ src/mlnx-sdk/filelist.txt | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 86a755ed86d0..cd972cac71da 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ The target directory is ./target, containing the NOS installer image and docker # Contribution guide -All contributors must sign a contribution license agreement before contributions can be accepted. Contact daloher@microsoft.com. Later this will be automated. +All contributors must sign a contribution license agreement before contributions can be accepted. Contact sonic-cla-agreements@microsoft.com. ### GitHub Workflow diff --git a/src/brcm-sdk/filelist.txt b/src/brcm-sdk/filelist.txt index 211759436536..549d89f54567 100644 --- a/src/brcm-sdk/filelist.txt +++ b/src/brcm-sdk/filelist.txt @@ -1,3 +1,6 @@ +## Get vendor SAI SDK +## https://github.com/Azure/sonic-buildimage/blob/master/README.md#3-get-vendor-sai-sdk + libopennsl_6.4.11-1+0~20160719212144.23~1.gbp8ec2d1_amd64.deb libsaibcm-dbg_1.0.2~20160727172452.52_amd64.deb libsaibcm-dev_1.0.2~20160727172452.52_amd64.deb diff --git a/src/mlnx-sdk/filelist.txt b/src/mlnx-sdk/filelist.txt index 16f482f334e9..de603733b860 100644 --- a/src/mlnx-sdk/filelist.txt +++ b/src/mlnx-sdk/filelist.txt @@ -1,3 +1,6 @@ +## Get vendor SAI SDK +## https://github.com/Azure/sonic-buildimage/blob/master/README.md#3-get-vendor-sai-sdk + applibs-dev_1.mlnx.4.2.2100_amd64.deb applibs_1.mlnx.4.2.2100_amd64.deb iproute2-dev_1.mlnx.4.2.2100_amd64.deb From d5d7168f10da33b8e329f3597d98a8a873926614 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 29 Aug 2016 11:45:57 -0700 Subject: [PATCH 0013/1011] Top level Makefile will build docker-database --- Makefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 743cb4e7689d..990c42b54a85 100644 --- a/Makefile +++ b/Makefile @@ -97,6 +97,10 @@ target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docke target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb fpmsyncd) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + +target/docker-database.gz: target/docker-base.gz + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) target/acs-generic.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=generic ./build_image.sh @@ -105,7 +109,7 @@ target/acs-aboot.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd6 ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=aboot ./build_image.sh ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -brcm-all: target/acs-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz) +brcm-all: target/acs-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz docker-database.gz) ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -mlnx-all: target/acs-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz) +mlnx-all: target/acs-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz docker-database.gz) From 4843e0671f9adbee207c09f386bdbcfc4b27b34d Mon Sep 17 00:00:00 2001 From: "John Arnold (AZURE)" Date: Tue, 6 Sep 2016 13:15:10 -0700 Subject: [PATCH 0014/1011] Changed ACS references to SONiC in image, added timestamp to base image volume label --- Makefile | 8 ++++---- README.md | 2 +- build_debian.sh | 2 +- build_docker.sh | 2 +- installer/x86_64/install.sh | 13 ++++++++----- onie-image.conf | 2 +- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 990c42b54a85..7694de6a41d4 100644 --- a/Makefile +++ b/Makefile @@ -102,14 +102,14 @@ target/docker-database.gz: target/docker-base.gz docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/acs-generic.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb +target/sonic-generic.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=generic ./build_image.sh -target/acs-aboot.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb +target/sonic-aboot.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=aboot ./build_image.sh ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -brcm-all: target/acs-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz docker-database.gz) +brcm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz docker-database.gz) ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -mlnx-all: target/acs-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz docker-database.gz) +mlnx-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz docker-database.gz) diff --git a/README.md b/README.md index cd972cac71da..48cfd8bfde56 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ For example, the user name is 'admin' and the password is 'YourPaSsWoRd'. To bui The root is disabled, but the created user could sudo. The target directory is ./target, containing the NOS installer image and docker images. -- acs-generic.bin: SONiC switch installer image (ONIE compatiable) +- sonic-generic.bin: SONiC switch installer image (ONIE compatiable) - docker-base.gz: base docker image where others are built from (gzip tar archive) - docker-fpm.gz: docker image for quagga with fpm module enabled (gzip tar archive) - docker-orchagent.gz: docker image for SWitch State Service (SWSS) diff --git a/build_debian.sh b/build_debian.sh index 5ad7c7d46676..fee836538d6f 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -109,7 +109,7 @@ sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c 'cd /dev && MAKEDEV generic' ## However, 'dpkg -i' plus 'apt-get install -f' will ignore the recommended dependency. So ## we install busybox explicitly sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install busybox -echo '[INFO] Install ACS linux kernel image' +echo '[INFO] Install SONiC linux kernel image' ## Note: duplicate apt-get command to ensure every line return zero sudo dpkg --root=$FILESYSTEM_ROOT -i deps/initramfs-tools_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f diff --git a/build_docker.sh b/build_docker.sh index 0088a72e278f..f37e13334d2d 100755 --- a/build_docker.sh +++ b/build_docker.sh @@ -1,5 +1,5 @@ #!/bin/bash -## This script is to automate the preparation for docker images for ACS. +## This script is to automate the preparation for docker images for SONiC. ## If registry server and port provided, the images will be pushed there. set -e diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 58243be24283..555bfdde53c3 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -111,9 +111,10 @@ demo_type="%%DEMO_TYPE%%" # The build system prepares this script by replacing %%GIT_REVISION%% # with git revision hash as a version identifier git_revision="%%GIT_REVISION%%" +timestamp="$(date -u +%Y%m%d)" -demo_volume_label="ACS-${demo_type}" -demo_volume_revision_label="ACS-${demo_type}-${git_revision}" +demo_volume_label="SONiC-${demo_type}" +demo_volume_revision_label="SONiC-${demo_type}-${timestamp}-${git_revision}" # auto-detect whether BIOS or UEFI if [ -d "/sys/firmware/efi/efivars" ] ; then @@ -143,6 +144,8 @@ fi # # Returns the created partition number in $demo_part demo_part="" +# TODO: remove reference to "ACS-OS" after all baseimages are upgraded +legacy_volume_label="ACS_OS" create_demo_gpt_partition() { blk_dev="$1" @@ -153,7 +156,7 @@ create_demo_gpt_partition() mkfifo -m 600 "$tmpfifo" # See if demo partition already exists - demo_part=$(sgdisk -p $blk_dev | grep "$demo_volume_label" | awk '{print $1}') + demo_part=$(sgdisk -p $blk_dev | grep -e "$demo_volume_label" -e "$legacy_volume_label" | awk '{print $1}') if [ -n "$demo_part" ] ; then # delete existing partitions # if there are multiple partitions matched, we should delete each one, except the current OS's @@ -225,7 +228,7 @@ create_demo_msdos_partition() # See if demo partition already exists -- look for the filesystem # label. - part_info="$(blkid | grep $demo_volume_label | awk -F: '{print $1}')" + part_info="$(blkid | grep -e "$demo_volume_label" -e "$legacy_volume_label" | awk -F: '{print $1}')" if [ -n "$part_info" ] ; then # delete existing partition demo_part="$(echo -n $part_info | sed -e s#${blk_dev}##)" @@ -268,7 +271,7 @@ create_demo_uefi_partition() create_demo_gpt_partition "$1" # erase any related EFI BootOrder variables from NVRAM. - for b in $(efibootmgr | grep "$demo_volume_label" | awk '{ print $1 }') ; do + for b in $(efibootmgr | grep -e "$demo_volume_label" -e "$legacy_volume_label" | awk '{ print $1 }') ; do local num=${b#Boot} # Remove trailing '*' num=${num%\*} diff --git a/onie-image.conf b/onie-image.conf index b7e43b6a0a74..389c4dd50256 100644 --- a/onie-image.conf +++ b/onie-image.conf @@ -19,4 +19,4 @@ FILESYSTEM_SQUASHFS=fs.squashfs ONIE_INSTALLER_PAYLOAD=fs.zip ## Output file name for onie installer -OUTPUT_ONIE_IMAGE=target/acs-$TARGET_MACHINE.bin +OUTPUT_ONIE_IMAGE=target/sonic-$TARGET_MACHINE.bin From 06ed5f61f7b4f2ff453862dbc1c3a07f3da19838 Mon Sep 17 00:00:00 2001 From: Guohan Lu Date: Sat, 10 Sep 2016 00:19:12 +0000 Subject: [PATCH 0015/1011] PR 50374: bug fix: fix legacy partition name from ACS_OS to ACS-OS - bug fix: fix legacy partition name from ACS_OS to ACS-OS --- installer/x86_64/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 555bfdde53c3..3b585332af49 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -145,7 +145,7 @@ fi # Returns the created partition number in $demo_part demo_part="" # TODO: remove reference to "ACS-OS" after all baseimages are upgraded -legacy_volume_label="ACS_OS" +legacy_volume_label="ACS-OS" create_demo_gpt_partition() { blk_dev="$1" From cc7f15094cb0f07d9461e40eb69b66f3ddeac7ae Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 9 Sep 2016 17:53:41 -0700 Subject: [PATCH 0016/1011] Squashed merge master --- .gitignore | 14 +++++- README.md | 3 +- build_docker.sh | 5 +- dockers/docker-lldp/Dockerfile | 19 ++------ dockers/docker-lldp/supervisord.conf | 16 +++++++ dockers/docker-orchagent/Dockerfile | 6 +-- dockers/docker-orchagent/start.sh | 17 +++++++ dockers/docker-ptf/Dockerfile | 22 +++++---- dockers/docker-ptf/ptf_nn_agent.conf | 10 ++++ dockers/docker-ptf/sshd.conf | 10 ++++ dockers/docker-ptf/supervisord.conf | 11 ----- dockers/docker-snmp/Dockerfile | 23 ++------- dockers/docker-snmp/supervisord.conf | 11 +++++ dockers/docker-syncd-mlnx-rpc/Dockerfile | 26 +++++----- .../docker-syncd-mlnx-rpc/ptf_nn_agent.conf | 10 ++++ .../docker-syncd-mlnx-rpc/supervisord.conf | 2 + dockers/docker-syncd-mlnx/Dockerfile | 7 +-- dockers/docker-syncd-mlnx/start.sh | 14 ++++++ dockers/docker-syncd-rpc/Dockerfile | 48 +++++++++++++++++++ dockers/docker-syncd-rpc/ptf_nn_agent.conf | 10 ++++ dockers/docker-syncd-rpc/supervisord.conf | 2 + dockers/docker-syncd/Dockerfile | 4 +- dockers/docker-syncd/start.sh | 10 ++++ installer/x86_64/install.sh | 12 +---- .../platforms/x86_64-dell_s6000_s1220-r0 | 2 + .../platforms/x86_64-dell_s6100_c2538-r0 | 2 + .../platforms/x86_64-mlnx_x86-r5.0.1400 | 1 + onie-mk-demo.sh | 2 +- 28 files changed, 231 insertions(+), 88 deletions(-) create mode 100644 dockers/docker-lldp/supervisord.conf create mode 100644 dockers/docker-ptf/ptf_nn_agent.conf create mode 100644 dockers/docker-ptf/sshd.conf create mode 100644 dockers/docker-snmp/supervisord.conf create mode 100644 dockers/docker-syncd-mlnx-rpc/ptf_nn_agent.conf create mode 100644 dockers/docker-syncd-mlnx-rpc/supervisord.conf create mode 100755 dockers/docker-syncd-mlnx/start.sh create mode 100644 dockers/docker-syncd-rpc/Dockerfile create mode 100644 dockers/docker-syncd-rpc/ptf_nn_agent.conf create mode 100644 dockers/docker-syncd-rpc/supervisord.conf create mode 100644 installer/x86_64/platforms/x86_64-dell_s6000_s1220-r0 create mode 100644 installer/x86_64/platforms/x86_64-dell_s6100_c2538-r0 create mode 100644 installer/x86_64/platforms/x86_64-mlnx_x86-r5.0.1400 diff --git a/.gitignore b/.gitignore index 0288d69b6418..18225c156201 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,14 @@ deps/ - +dockers/*/files/ +*.bin +*.deb +*.zip +fsroot/ +fs.* +src/hiredis/hiredis_* +src/hiredis/hiredis-*/ +src/quagga/quagga_* +src/quagga/quagga/ +src/initramfs-tools/initramfs-tools/ +src/redis/redis_* +src/redis/redis-*/ diff --git a/README.md b/README.md index 48cfd8bfde56..c257b9334903 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,8 @@ The target directory is ./target, containing the NOS installer image and docker - docker-base.gz: base docker image where others are built from (gzip tar archive) - docker-fpm.gz: docker image for quagga with fpm module enabled (gzip tar archive) - docker-orchagent.gz: docker image for SWitch State Service (SWSS) -- docker-syncd.gz: docker image for the daemon to sync database and switch ASIC +- docker-syncd.gz: docker image for the daemon to sync database and Broadcom switch ASIC +- docker-syncd-mlnx.gz: docker image for the daemon to sync database and Mellanox switch ASIC # Contribution guide diff --git a/build_docker.sh b/build_docker.sh index f37e13334d2d..67c21ba4d6ce 100755 --- a/build_docker.sh +++ b/build_docker.sh @@ -9,7 +9,7 @@ set -e usage() { cat >&2 < target/$docker_image_name.$image_sha.gz +docker save $docker_image_name | gzip -c > target/$docker_image_name.$build_version.gz +echo "Image sha256: $image_sha" diff --git a/dockers/docker-lldp/Dockerfile b/dockers/docker-lldp/Dockerfile index aa66c24b659d..6167a735f7d0 100644 --- a/dockers/docker-lldp/Dockerfile +++ b/dockers/docker-lldp/Dockerfile @@ -10,23 +10,12 @@ COPY deps/*py2*.whl deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ dpkg_apt /deps/lldpd_*.deb && \ dpkg_apt /deps/lldpsyncd_*.deb && \ - apt-get install -y python-pip && \ + apt-get install -y python-pip supervisor && \ pip install /deps/*.whl && \ apt-get remove -y python-pip && \ - apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ + apt-get purge -y && apt-get autoclean -y && apt-get autoremove -y && \ rm -rf /deps -## There is a known bug: agetty processes at 100% cpu -## When: -## 1. running container in --privileged mode -## 2. container runs /sbin/init -## ref: https://github.com/docker/docker/issues/4040 -## Temporary solution: -## Disable tty services permanently -RUN systemctl --no-pager list-unit-files --type=service | grep getty | awk '{print $1}' | xargs systemctl mask -## Note: getty@.service in last grep output will not mask below cases -RUN systemctl mask getty@tty1.service +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -## Specify init as CMD to enable systemd -## Note: don't provide ENTRYPOINT at the same time -CMD ["/sbin/init"] +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-lldp/supervisord.conf b/dockers/docker-lldp/supervisord.conf new file mode 100644 index 000000000000..161c0ab38a2b --- /dev/null +++ b/dockers/docker-lldp/supervisord.conf @@ -0,0 +1,16 @@ +[supervisord] +nodaemon=true + +[program:lldpd] +## -d: Do not daemonize. If this option is specified, lldpd will run in +## the foreground and log to stderr. This option can be specified +## many times to increase verbosity +command=/usr/sbin/lldpd -dd +## route stderr to the syslog service instead of being saved to files +stderr_logfile=syslog + +[program:lldpsyncd] +command=/usr/sbin/lldpsyncd + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n diff --git a/dockers/docker-orchagent/Dockerfile b/dockers/docker-orchagent/Dockerfile index 17fbfe9e7274..9f677cd34cdc 100755 --- a/dockers/docker-orchagent/Dockerfile +++ b/dockers/docker-orchagent/Dockerfile @@ -11,7 +11,7 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return RUN apt-get install -f -y ifupdown bridge-utils ## Copy executable binaries -COPY ["deps/orchagent","deps/swssconfig","deps/portsyncd","deps/intfsyncd","deps/neighsyncd","/usr/local/bin/"] +COPY ["deps/orchagent","deps/swssconfig","deps/portsyncd","deps/intfsyncd","deps/neighsyncd","/usr/bin/"] COPY start.sh /usr/bin/start.sh @@ -19,5 +19,5 @@ COPY start.sh /usr/bin/start.sh RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /deps -ENTRYPOINT /usr/bin/start.sh \ - && /bin/bash +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 5eca68ed4e5b..2f29e98abdd1 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -1,5 +1,16 @@ #!/bin/bash +function clean_up { + kill -9 $ORCHAGENT_PID + kill -9 $PORTSYNCD_PID + kill -9 $INTFSYNCD_PID + kill -9 $NEIGHSYNCD_PID + service rsyslog stop + exit +} + +trap clean_up SIGTERM SIGKILL + . /host/machine.conf MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` @@ -17,9 +28,15 @@ fi service rsyslog start orchagent $ORCHAGENT_ARGS & +ORCHAGENT_PID=$! sleep 5 portsyncd $PORTSYNCD_ARGS & +PORTSYNCD_PID=$! sleep 5 intfsyncd & +INTFSYNCD_PID=$! sleep 5 neighsyncd & +NEIGHSYNCD_PID=$! + +read diff --git a/dockers/docker-ptf/Dockerfile b/dockers/docker-ptf/Dockerfile index dff8f7196a6a..cf458af61949 100644 --- a/dockers/docker-ptf/Dockerfile +++ b/dockers/docker-ptf/Dockerfile @@ -9,11 +9,11 @@ COPY deps /root/deps ENV DEBIAN_FRONTEND=noninteractive ## Set the apt source, update package cache and install necessary packages -RUN echo "deb http://ftp.us.debian.org/debian/ jessie main contrib non-free" > /etc/apt/sources.list \ - && apt-get update \ - && apt-get upgrade -y \ +RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' /etc/apt/sources.list \ + && apt-get update \ + && apt-get upgrade -y \ && apt-get dist-upgrade -y \ - && apt-get install -y --no-install-recommends \ + && apt-get install -y \ openssh-server \ vim \ python \ @@ -47,14 +47,15 @@ RUN echo "deb http://ftp.us.debian.org/debian/ jessie main contrib non-free" > / && tar xvfz 1.0.0.tar.gz \ && cd nanomsg-1.0.0 \ && mkdir -p build \ - && cmake . \ + && cd build \ + && cmake .. \ && make install \ && ldconfig \ - && cd .. \ + && cd ../.. \ && rm -fr nanomsg-1.0.0 \ && rm -f 1.0.0.tar.gz \ - && pip install cffi \ - && pip install --upgrade cffi \ + && pip install cffi==1.7.0 \ + && pip install --upgrade cffi==1.7.0 \ && pip install nnpy \ && mkdir -p /opt \ && cd /opt \ @@ -69,7 +70,10 @@ RUN mkdir /var/run/sshd \ && mkdir /root/deps COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY sshd.conf /etc/supervisor/conf.d/sshd.conf +COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf EXPOSE 22 -ENTRYPOINT ["/usr/bin/supervisord"] +ENTRYPOINT while [ "x$( ifconfig eth3 | grep RUNNING )" = 'x' ] ; do sleep 1 ; done \ + && /usr/bin/supervisord diff --git a/dockers/docker-ptf/ptf_nn_agent.conf b/dockers/docker-ptf/ptf_nn_agent.conf new file mode 100644 index 000000000000..6fb30d61d7c2 --- /dev/null +++ b/dockers/docker-ptf/ptf_nn_agent.conf @@ -0,0 +1,10 @@ +[program:ptf_nn_agent] +command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 0@tcp://127.0.0.1:10900 -i 0-3@eth3 +process_name=ptf_nn_agent +stdout_logfile=/tmp/ptf_nn_agent.out.log +stderr_logfile=/tmp/ptf_nn_agent.err.log +redirect_stderr=false +autostart=true +autorestart=true +startsecs=1 +numprocs=1 diff --git a/dockers/docker-ptf/sshd.conf b/dockers/docker-ptf/sshd.conf new file mode 100644 index 000000000000..8238e7762fbf --- /dev/null +++ b/dockers/docker-ptf/sshd.conf @@ -0,0 +1,10 @@ +[program:sshd] +command=/usr/sbin/sshd -D +process_name=sshd +stdout_logfile=/tmp/sshd.out.log +stderr_logfile=/tmp/sshd.err.log +redirect_stderr=false +autostart=true +autorestart=true +startsecs=1 +numprocs=1 diff --git a/dockers/docker-ptf/supervisord.conf b/dockers/docker-ptf/supervisord.conf index 94559fd0785c..54296b8b254e 100644 --- a/dockers/docker-ptf/supervisord.conf +++ b/dockers/docker-ptf/supervisord.conf @@ -1,13 +1,2 @@ [supervisord] nodaemon=true - -[program:sshd] -command=/usr/sbin/sshd -D -process_name=sshd -stdout_logfile=/tmp/sshd.out.log -stderr_logfile=/tmp/sshd.err.log -redirect_stderr=false -autostart=true -autorestart=true -startsecs=1 -numprocs=1 \ No newline at end of file diff --git a/dockers/docker-snmp/Dockerfile b/dockers/docker-snmp/Dockerfile index 7286b7fe570d..ad08f754a423 100644 --- a/dockers/docker-snmp/Dockerfile +++ b/dockers/docker-snmp/Dockerfile @@ -19,7 +19,7 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return rm -rf /deps # install subagent -RUN apt-get -y install build-essential wget libssl-dev openssl && \ +RUN apt-get -y install build-essential wget libssl-dev openssl supervisor && \ rm -rf /var/lib/apt/lists/* && \ wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz && \ tar xvf Python-3.5.2.tgz && cd Python-3.5.2 && \ @@ -36,27 +36,14 @@ RUN apt-get -y install build-essential wget libssl-dev openssl && \ rm -rf /usr/lib/python3.5/idlelib && \ rm -rf /usr/lib/python3.5/email && \ rm -rf /usr/lib/python3.5/test && \ - apt-get -y remove build-essential wget libssl-dev openssl && \ + apt-get -y purge build-essential wget libssl-dev openssl && \ apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ - python3 -m acs_ax_impl install && \ find / | grep -E "__pycache__" | xargs rm -rf && \ - rm -rf ~/.cache && \ - systemctl enable acs-snmp-subagent.service + rm -rf ~/.cache -## There is a known bug: agetty processes at 100% cpu -## When: -## 1. running container in --privileged mode -## 2. container runs /sbin/init -## ref: https://github.com/docker/docker/issues/4040 -## Temporary solution: -## Disable tty services permanently -RUN systemctl --no-pager list-unit-files --type=service | grep getty | awk '{print $1}' | xargs systemctl mask -## Note: getty@.service in last grep output will not mask below cases -RUN systemctl mask getty@tty1.service +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf ## Although exposing ports is not need for host net mode, keep it for possible bridge mode EXPOSE 161/udp 162/udp -## Specify init as CMD to enable systemd -## Note: don't provide ENTRYPOINT at the same time -CMD ["/sbin/init"] +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-snmp/supervisord.conf b/dockers/docker-snmp/supervisord.conf new file mode 100644 index 000000000000..f799d33d97aa --- /dev/null +++ b/dockers/docker-snmp/supervisord.conf @@ -0,0 +1,11 @@ +[supervisord] +nodaemon=true + +[program:snmpd] +command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable -p /run/snmpd.pid + +[program:acs-snmp-subagent] +command=/usr/bin/env python3 -m acs_ax_impl + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n diff --git a/dockers/docker-syncd-mlnx-rpc/Dockerfile b/dockers/docker-syncd-mlnx-rpc/Dockerfile index 3aed6f080506..0e13887adf43 100644 --- a/dockers/docker-syncd-mlnx-rpc/Dockerfile +++ b/dockers/docker-syncd-mlnx-rpc/Dockerfile @@ -3,6 +3,8 @@ FROM docker-syncd-mlnx ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive +COPY deps /deps + ## Pre-install the fundamental packages RUN apt-get update \ && apt-get -y install \ @@ -23,24 +25,24 @@ RUN apt-get update \ && ldconfig \ && cd .. \ && rm -fr nanomsg-1.0.0 \ + && rm -f 1.0.0.tar.gz \ && pip install cffi \ && pip install --upgrade cffi \ && pip install nnpy \ && mkdir -p /opt \ && cd /opt \ - && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py - -COPY deps /deps - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ - && dpkg -r syncd \ - && dpkg_apt /deps/syncd_*.deb \ - && dpkg_apt /deps/libthrift-0.9.2_*.deb + && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ + && dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ + && dpkg -r syncd \ + && dpkg_apt /deps/syncd_*.deb \ + && dpkg_apt /deps/libthrift-0.9.2_*.deb \ + && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ + && rm -rf /deps -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf ENTRYPOINT service rsyslog start \ && service syncd start \ - && /bin/bash + && while [ "x$( ifconfig Ethernet12 | grep RUNNING )" = 'x' ] ; do sleep 1 ; done \ + && /usr/bin/supervisord diff --git a/dockers/docker-syncd-mlnx-rpc/ptf_nn_agent.conf b/dockers/docker-syncd-mlnx-rpc/ptf_nn_agent.conf new file mode 100644 index 000000000000..b16159a996e8 --- /dev/null +++ b/dockers/docker-syncd-mlnx-rpc/ptf_nn_agent.conf @@ -0,0 +1,10 @@ +[program:ptf_nn_agent] +command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 +process_name=ptf_nn_agent +stdout_logfile=/tmp/ptf_nn_agent.out.log +stderr_logfile=/tmp/ptf_nn_agent.err.log +redirect_stderr=false +autostart=true +autorestart=true +startsecs=1 +numprocs=1 diff --git a/dockers/docker-syncd-mlnx-rpc/supervisord.conf b/dockers/docker-syncd-mlnx-rpc/supervisord.conf new file mode 100644 index 000000000000..54296b8b254e --- /dev/null +++ b/dockers/docker-syncd-mlnx-rpc/supervisord.conf @@ -0,0 +1,2 @@ +[supervisord] +nodaemon=true diff --git a/dockers/docker-syncd-mlnx/Dockerfile b/dockers/docker-syncd-mlnx/Dockerfile index d422374fc479..afed7dae38bb 100755 --- a/dockers/docker-syncd-mlnx/Dockerfile +++ b/dockers/docker-syncd-mlnx/Dockerfile @@ -24,10 +24,11 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb +COPY ["start.sh", "/usr/bin/"] + ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /deps -ENTRYPOINT service rsyslog start \ - && service syncd start \ - && /bin/bash +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-syncd-mlnx/start.sh b/dockers/docker-syncd-mlnx/start.sh new file mode 100755 index 000000000000..3e5b941a7658 --- /dev/null +++ b/dockers/docker-syncd-mlnx/start.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +function clean_up { + service syncd stop + service rsyslog stop + exit +} + +trap clean_up SIGTERM SIGKILL + +service rsyslog start +service syncd start + +read diff --git a/dockers/docker-syncd-rpc/Dockerfile b/dockers/docker-syncd-rpc/Dockerfile new file mode 100644 index 000000000000..7a34a46a1756 --- /dev/null +++ b/dockers/docker-syncd-rpc/Dockerfile @@ -0,0 +1,48 @@ +FROM docker-syncd + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +COPY deps /deps + +## Pre-install the fundamental packages +RUN apt-get update \ + && apt-get -y install \ + net-tools \ + python-pip \ + build-essential \ + libssl-dev \ + libffi-dev \ + python-dev \ + wget \ + cmake \ + && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ + && tar xvfz 1.0.0.tar.gz \ + && cd nanomsg-1.0.0 \ + && mkdir -p build \ + && cmake . \ + && make install \ + && ldconfig \ + && cd .. \ + && rm -fr nanomsg-1.0.0 \ + && rm -f 1.0.0.tar.gz \ + && pip install cffi \ + && pip install --upgrade cffi \ + && pip install nnpy \ + && mkdir -p /opt \ + && cd /opt \ + && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ + && dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ + && dpkg -r syncd \ + && dpkg_apt /deps/syncd_*.deb \ + && dpkg_apt /deps/libthrift-0.9.2_*.deb \ + && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ + && rm -rf /deps + +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf + +ENTRYPOINT service rsyslog start \ + && service syncd start \ + && while [ "x$( ifconfig Ethernet12 | grep RUNNING )" = 'x' ] ; do sleep 1 ; done \ + && /usr/bin/supervisord diff --git a/dockers/docker-syncd-rpc/ptf_nn_agent.conf b/dockers/docker-syncd-rpc/ptf_nn_agent.conf new file mode 100644 index 000000000000..b16159a996e8 --- /dev/null +++ b/dockers/docker-syncd-rpc/ptf_nn_agent.conf @@ -0,0 +1,10 @@ +[program:ptf_nn_agent] +command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 +process_name=ptf_nn_agent +stdout_logfile=/tmp/ptf_nn_agent.out.log +stderr_logfile=/tmp/ptf_nn_agent.err.log +redirect_stderr=false +autostart=true +autorestart=true +startsecs=1 +numprocs=1 diff --git a/dockers/docker-syncd-rpc/supervisord.conf b/dockers/docker-syncd-rpc/supervisord.conf new file mode 100644 index 000000000000..54296b8b254e --- /dev/null +++ b/dockers/docker-syncd-rpc/supervisord.conf @@ -0,0 +1,2 @@ +[supervisord] +nodaemon=true diff --git a/dockers/docker-syncd/Dockerfile b/dockers/docker-syncd/Dockerfile index 16b70961a497..63d9f3cbf113 100755 --- a/dockers/docker-syncd/Dockerfile +++ b/dockers/docker-syncd/Dockerfile @@ -21,5 +21,5 @@ COPY ["deps/dsserve", "deps/bcmcmd", "start.sh", "/usr/bin/"] RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /deps -ENTRYPOINT /usr/bin/start.sh \ - && /bin/bash +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-syncd/start.sh b/dockers/docker-syncd/start.sh index 346936ff2f59..3e5b941a7658 100755 --- a/dockers/docker-syncd/start.sh +++ b/dockers/docker-syncd/start.sh @@ -1,4 +1,14 @@ #!/bin/bash +function clean_up { + service syncd stop + service rsyslog stop + exit +} + +trap clean_up SIGTERM SIGKILL + service rsyslog start service syncd start + +read diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 3b585332af49..10fe63671438 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -51,15 +51,7 @@ CONSOLE_SPEED=9600 # Get platform specific linux kernel command line arguments ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="" -# platform specific configurations -if [ "$onie_platform" == "x86_64-dell_s6000_s1220-r0" ]; then - `pwd`/dell-s6000-replace-reboot.sh -elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ]; then - ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="acpi_enforce_resources=lax acpi=noirq" -elif [ "$onie_platform" == "x86_64-dell_s6100_c2538-r0" ]; then - CONSOLE_PORT=0x2f8 - CONSOLE_DEV=1 -fi +source platforms/$onie_platform # Install demo on same block device as ONIE onie_dev=$(blkid | grep ONIE-BOOT | head -n 1 | awk '{print $1}' | sed -e 's/:.*$//') @@ -362,7 +354,7 @@ demo_install_uefi_grub() grub_install_log=$(mktemp) grub-install \ --no-nvram \ - --bootloader-id="$onie_initrd_tmp/$demo_volume_label" \ + --bootloader-id="$demo_volume_label" \ --efi-directory="/boot/efi" \ --boot-directory="$demo_mnt" \ --recheck \ diff --git a/installer/x86_64/platforms/x86_64-dell_s6000_s1220-r0 b/installer/x86_64/platforms/x86_64-dell_s6000_s1220-r0 new file mode 100644 index 000000000000..f778372ded1e --- /dev/null +++ b/installer/x86_64/platforms/x86_64-dell_s6000_s1220-r0 @@ -0,0 +1,2 @@ +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="processor.max_cstate=1 intel_idle.max_cstate=0" +./dell-s6000-replace-reboot.sh diff --git a/installer/x86_64/platforms/x86_64-dell_s6100_c2538-r0 b/installer/x86_64/platforms/x86_64-dell_s6100_c2538-r0 new file mode 100644 index 000000000000..26ee5ef89de6 --- /dev/null +++ b/installer/x86_64/platforms/x86_64-dell_s6100_c2538-r0 @@ -0,0 +1,2 @@ +CONSOLE_PORT=0x2f8 +CONSOLE_DEV=1 diff --git a/installer/x86_64/platforms/x86_64-mlnx_x86-r5.0.1400 b/installer/x86_64/platforms/x86_64-mlnx_x86-r5.0.1400 new file mode 100644 index 000000000000..c9c9493a5404 --- /dev/null +++ b/installer/x86_64/platforms/x86_64-mlnx_x86-r5.0.1400 @@ -0,0 +1 @@ +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="acpi_enforce_resources=lax acpi=noirq" diff --git a/onie-mk-demo.sh b/onie-mk-demo.sh index 992558e23f3a..8997fa8c8317 100755 --- a/onie-mk-demo.sh +++ b/onie-mk-demo.sh @@ -76,7 +76,7 @@ tmp_dir=$(mktemp --directory) tmp_installdir="$tmp_dir/installer" mkdir $tmp_installdir || clean_up 1 -cp $installer_dir/$arch/* $tmp_installdir || clean_up 1 +cp -r $installer_dir/$arch/* $tmp_installdir || clean_up 1 cp onie-image.conf $tmp_installdir # Escape special chars in the user provide kernel cmdline string for use in From c14bfde3c0e5f6475fa0975a7a8bb31eddd99248 Mon Sep 17 00:00:00 2001 From: Guohan Lu Date: Sun, 11 Sep 2016 07:19:59 +0000 Subject: [PATCH 0017/1011] PR 50464: remove timestamp from sonic disk partition label - remove timestamp from sonic disk partition label Ext2 filesystem labels can be at most 16 characters long Related work items: #615372 --- installer/x86_64/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 10fe63671438..e49a6484e00c 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -106,7 +106,7 @@ git_revision="%%GIT_REVISION%%" timestamp="$(date -u +%Y%m%d)" demo_volume_label="SONiC-${demo_type}" -demo_volume_revision_label="SONiC-${demo_type}-${timestamp}-${git_revision}" +demo_volume_revision_label="SONiC-${demo_type}-${git_revision}" # auto-detect whether BIOS or UEFI if [ -d "/sys/firmware/efi/efivars" ] ; then From 20d1ed42d58d0ea200aeb17cad839912214248d5 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 12 Sep 2016 17:49:15 -0700 Subject: [PATCH 0018/1011] Manually sync disk to prevent hardware reboot lost --- installer/x86_64/dell-s6000-replace-reboot.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/installer/x86_64/dell-s6000-replace-reboot.sh b/installer/x86_64/dell-s6000-replace-reboot.sh index 48ac8a62f548..b77c33f70ee7 100755 --- a/installer/x86_64/dell-s6000-replace-reboot.sh +++ b/installer/x86_64/dell-s6000-replace-reboot.sh @@ -12,5 +12,10 @@ echo 0 > /sys/class/gpio/gpio2/value # replace the original reboot binary with the following command rm /sbin/reboot -echo 'i2cset -y 0 0x31 1 0xfd' > /sbin/reboot +cat <> /sbin/reboot +#!/bin/sh +sync +i2cset -y 0 0x31 1 0xfd +EOF + chmod a+x /sbin/reboot From 7b0b44ef122e8de8d3de2593e9d66f37e0839880 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 14 Sep 2016 17:08:05 -0700 Subject: [PATCH 0019/1011] (comment) --- installer/x86_64/dell-s6000-replace-reboot.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/installer/x86_64/dell-s6000-replace-reboot.sh b/installer/x86_64/dell-s6000-replace-reboot.sh index b77c33f70ee7..5854133cc4a4 100755 --- a/installer/x86_64/dell-s6000-replace-reboot.sh +++ b/installer/x86_64/dell-s6000-replace-reboot.sh @@ -11,6 +11,8 @@ echo 0 > /sys/class/gpio/gpio1/value echo 0 > /sys/class/gpio/gpio2/value # replace the original reboot binary with the following command +# sync flushes file system buffers +# i2cset command triggers a hard system reboot, required by ASIC to operate correctly rm /sbin/reboot cat <> /sbin/reboot #!/bin/sh From 83c48fe9fc7b735084d4d781d33b6b1084e25c5b Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 15 Sep 2016 15:22:29 -0700 Subject: [PATCH 0020/1011] Rename hostname (#6) --- build_debian.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index fee836538d6f..b1cf2e67d8d8 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -38,7 +38,7 @@ DOCKER_VERSION=1.11.1-0~jessie_amd64 ## Working directory to prepare the file system FILESYSTEM_ROOT=./fsroot ## Hostname for the linux image -HOSTNAME=acs +HOSTNAME=sonic DEFAULT_USERINFO="Default admin user,,," ## Read ONIE image related config file From f19d445d4feb36ab0d569af604d87a9af86dbb22 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 16 Sep 2016 17:00:37 -0700 Subject: [PATCH 0021/1011] Update readme on build targets (#8) --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c257b9334903..e6b4764d8972 100644 --- a/README.md +++ b/README.md @@ -36,11 +36,13 @@ The root is disabled, but the created user could sudo. The target directory is ./target, containing the NOS installer image and docker images. - sonic-generic.bin: SONiC switch installer image (ONIE compatiable) -- docker-base.gz: base docker image where others are built from (gzip tar archive) +- sonic-aboot.bin: SONiC switch installer image (Aboot compatiable) +- docker-base.gz: base docker image where other docker images are built from, only used in build process (gzip tar archive) +- docker-database.gz: docker image for in-memory key-value store, used as inter-process communication (gzip tar archive) - docker-fpm.gz: docker image for quagga with fpm module enabled (gzip tar archive) -- docker-orchagent.gz: docker image for SWitch State Service (SWSS) -- docker-syncd.gz: docker image for the daemon to sync database and Broadcom switch ASIC -- docker-syncd-mlnx.gz: docker image for the daemon to sync database and Mellanox switch ASIC +- docker-orchagent.gz: docker image for SWitch State Service (SWSS) (gzip tar archive) +- docker-syncd.gz: docker image for the daemon to sync database and Broadcom switch ASIC (gzip tar archive) +- docker-syncd-mlnx.gz: docker image for the daemon to sync database and Mellanox switch ASIC (gzip tar archive) # Contribution guide From 623fdbf7f61202087b7ab73d251874c9f9f7fd5c Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 22 Sep 2016 16:16:26 -0700 Subject: [PATCH 0022/1011] Updating docker-orchagent/syncd Dockerfile and start.sh (#9) --- dockers/docker-orchagent/Dockerfile | 22 ++++++++-------- dockers/docker-orchagent/start.sh | 38 +++++++++++++++------------- dockers/docker-syncd-mlnx/Dockerfile | 9 ++++--- dockers/docker-syncd/Dockerfile | 15 ++++++----- 4 files changed, 48 insertions(+), 36 deletions(-) diff --git a/dockers/docker-orchagent/Dockerfile b/dockers/docker-orchagent/Dockerfile index 9f677cd34cdc..dbdf01f3dd98 100755 --- a/dockers/docker-orchagent/Dockerfile +++ b/dockers/docker-orchagent/Dockerfile @@ -2,16 +2,18 @@ FROM docker-base RUN apt-get update -COPY ["deps/libhiredis0.13*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "/deps/"] - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libswsscommon_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsairedis_*.deb - -RUN apt-get install -f -y ifupdown bridge-utils - -## Copy executable binaries -COPY ["deps/orchagent","deps/swssconfig","deps/portsyncd","deps/intfsyncd","deps/neighsyncd","/usr/bin/"] +COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/swss_*.deb", "/deps/"] + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/libhiredis0.13*.deb \ + && dpkg_apt /deps/libnl-3-200_*.deb \ + && dpkg_apt /deps/libnl-genl-3-200_*.deb \ + && dpkg_apt /deps/libnl-route-3-200_*.deb \ + && dpkg_apt /deps/libswsscommon_*.deb \ + && dpkg_apt /deps/libsairedis_*.deb \ + && dpkg_apt /deps/swss_*.deb + +RUN apt-get install -f -y ifupdown bridge-utils redis-tools COPY start.sh /usr/bin/start.sh diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 2f29e98abdd1..1fdee5117f89 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -1,10 +1,18 @@ #!/bin/bash +function start_app { + orchagent $ORCHAGENT_ARGS & + portsyncd $PORTSYNCD_ARGS & + intfsyncd & + neighsyncd & + swssconfig & +} + function clean_up { - kill -9 $ORCHAGENT_PID - kill -9 $PORTSYNCD_PID - kill -9 $INTFSYNCD_PID - kill -9 $NEIGHSYNCD_PID + pkill -9 orchagent + pkill -9 portsyncd + pkill -9 intfsyncd + pkill -9 neighsyncd service rsyslog stop exit } @@ -27,16 +35,12 @@ elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ]; then fi service rsyslog start -orchagent $ORCHAGENT_ARGS & -ORCHAGENT_PID=$! -sleep 5 -portsyncd $PORTSYNCD_ARGS & -PORTSYNCD_PID=$! -sleep 5 -intfsyncd & -INTFSYNCD_PID=$! -sleep 5 -neighsyncd & -NEIGHSYNCD_PID=$! - -read +while true; do + # Check if syncd starts + result=`echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p` + if [ "$result" != "0" ]; then + start_app + read + fi + sleep 1 +done diff --git a/dockers/docker-syncd-mlnx/Dockerfile b/dockers/docker-syncd-mlnx/Dockerfile index afed7dae38bb..578782c1f15e 100755 --- a/dockers/docker-syncd-mlnx/Dockerfile +++ b/dockers/docker-syncd-mlnx/Dockerfile @@ -17,9 +17,12 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/iproute2_*.deb \ && dpkg_apt /deps/mft*.deb \ - && dpkg_apt /deps/libhiredis0.13*.deb \ - && dpkg_apt /deps/libswsscommon_*.deb \ - && dpkg_apt /deps/mlnx-sai_*.deb \ + && dpkg_apt /deps/libhiredis0.13*.deb \ + && dpkg_apt /deps/libnl-3-200_*.deb \ + && dpkg_apt /deps/libnl-genl-3-200_*.deb \ + && dpkg_apt /deps/libnl-route-3-200_*.deb \ + && dpkg_apt /deps/libswsscommon_*.deb \ + && dpkg_apt /deps/mlnx-sai_*.deb \ && dpkg_apt /deps/libsairedis_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb diff --git a/dockers/docker-syncd/Dockerfile b/dockers/docker-syncd/Dockerfile index 63d9f3cbf113..9ad7e432cef9 100755 --- a/dockers/docker-syncd/Dockerfile +++ b/dockers/docker-syncd/Dockerfile @@ -2,14 +2,17 @@ FROM docker-base RUN apt-get update -COPY ["deps/libhiredis0.13*.deb", "deps/libswsscommon_*.deb", "deps/libopennsl_*.deb", "deps/libsaibcm_*.deb", "deps/libsairedis_*.deb", "deps/syncd_*.deb", "/deps/"] +COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libopennsl_*.deb", "deps/libsaibcm_*.deb", "deps/libsairedis_*.deb", "deps/syncd_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/libhiredis0.13*.deb \ - && dpkg_apt /deps/libswsscommon_*.deb \ - && dpkg_apt /deps/libopennsl_*.deb \ - && dpkg_apt /deps/libsaibcm_*.deb \ - && dpkg_apt /deps/libsairedis_*.deb \ + dpkg_apt /deps/libhiredis0.13*.deb \ + && dpkg_apt /deps/libnl-3-200_*.deb \ + && dpkg_apt /deps/libnl-genl-3-200_*.deb \ + && dpkg_apt /deps/libnl-route-3-200_*.deb \ + && dpkg_apt /deps/libswsscommon_*.deb \ + && dpkg_apt /deps/libopennsl_*.deb \ + && dpkg_apt /deps/libsaibcm_*.deb \ + && dpkg_apt /deps/libsairedis_*.deb \ && dpkg_apt /deps/syncd_*.deb ## TODO: add kmod into Depends From 59d13d0feb0bc0ea77e9573746ceca670d431157 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 23 Sep 2016 11:57:16 -0700 Subject: [PATCH 0023/1011] Makefile: Use swss_*.deb file to for docker-orchagent (#10) --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 7694de6a41d4..4fec69a41699 100644 --- a/Makefile +++ b/Makefile @@ -86,11 +86,11 @@ target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-sy docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb orchagent swssconfig portsyncd intfsyncd neighsyncd) +target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb orchagent swssconfig portsyncd intfsyncd neighsyncd) +target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) From b4f27357858029c583ea95df6840c982216cba17 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 23 Sep 2016 14:11:35 -0700 Subject: [PATCH 0024/1011] src: Add libnl3 build.sh script (#11) --- src/libnl3/build.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100755 src/libnl3/build.sh diff --git a/src/libnl3/build.sh b/src/libnl3/build.sh new file mode 100755 index 000000000000..a23b8f7e3dc2 --- /dev/null +++ b/src/libnl3/build.sh @@ -0,0 +1,22 @@ +#!/bin/bash +## This script is to build the libnl3 3.2.27-1 +## +## USAGE: +## ./build.sh + +# Obtaining the libnl3 +rm -rf ./libnl3 +git clone https://anonscm.debian.org/git/collab-maint/libnl3.git +pushd ./libnl3 +git checkout -f b77c0e49cb + +# Patch +export QUILT_PATCHES=debian/patches +quilt push +quilt push +quilt push +quilt push +quilt push +dpkg-buildpackage -rfakeroot -b -us -uc + +popd From 146c88100b4f4c5b0178d73f7d203637a818aba4 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 23 Sep 2016 21:23:43 -0700 Subject: [PATCH 0025/1011] add saiserver docker for mlnx sn2700 platform (#12) * add saiserver docker for mlnx sn2700 platform --- dockers/docker-saiserver-mlnx/Dockerfile | 32 +++ dockers/docker-saiserver-mlnx/portmap.ini | 33 +++ dockers/docker-saiserver-mlnx/profile.ini | 1 + dockers/docker-saiserver-mlnx/sai_2700.xml | 243 +++++++++++++++++++++ dockers/docker-saiserver-mlnx/start.sh | 18 ++ 5 files changed, 327 insertions(+) create mode 100755 dockers/docker-saiserver-mlnx/Dockerfile create mode 100644 dockers/docker-saiserver-mlnx/portmap.ini create mode 100644 dockers/docker-saiserver-mlnx/profile.ini create mode 100644 dockers/docker-saiserver-mlnx/sai_2700.xml create mode 100755 dockers/docker-saiserver-mlnx/start.sh diff --git a/dockers/docker-saiserver-mlnx/Dockerfile b/dockers/docker-saiserver-mlnx/Dockerfile new file mode 100755 index 000000000000..bdeec7748332 --- /dev/null +++ b/dockers/docker-saiserver-mlnx/Dockerfile @@ -0,0 +1,32 @@ +FROM docker-base + +RUN apt-get update + +COPY ["deps/applibs_*.deb", "/deps/applibs-dev_*.deb", "/deps/sx-complib_*.deb", "/deps/sxd-libs_*.deb", "/deps/sx-scew_*.deb", "/deps/sx-examples_*.deb", "/deps/sx-gen-utils_*.deb", "/deps/python-sdk-api_*.deb", "/deps/sx-libnl_*.deb", "/deps/iproute2_*.deb", "/deps/mlnx-sai_*.deb", "/deps/libthrift-0.9.2_*.deb", "/deps/"] + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/applibs_*.deb \ + && dpkg_apt /deps/applibs-dev_*.deb \ + && dpkg_apt /deps/sx-complib_*.deb \ + && dpkg_apt /deps/sxd-libs_*.deb \ + && dpkg_apt /deps/sx-scew_*.deb \ + && dpkg_apt /deps/sx-examples_*.deb \ + && dpkg_apt /deps/sx-gen-utils_*.deb \ + && dpkg_apt /deps/python-sdk-api_*.deb \ + && dpkg_apt /deps/sx-libnl_*.deb \ + && dpkg_apt /deps/iproute2_*.deb \ + && dpkg_apt /deps/mlnx-sai_*.deb \ + && dpkg_apt /deps/libthrift-0.9.2_*.deb + +COPY ["deps/saiserver", "start.sh", "/usr/bin/"] + +COPY ["profile.ini", "portmap.ini", "/etc/sai/"] + +COPY ["sai_2700.xml", "/usr/share/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-saiserver-mlnx/portmap.ini b/dockers/docker-saiserver-mlnx/portmap.ini new file mode 100644 index 000000000000..4d3be08ce5f8 --- /dev/null +++ b/dockers/docker-saiserver-mlnx/portmap.ini @@ -0,0 +1,33 @@ +# alias lanes +Ethernet1 0,1,2,3 +Ethernet2 4,5,6,7 +Ethernet3 8,9,10,11 +Ethernet4 12,13,14,15 +Ethernet5 16,17,18,19 +Ethernet6 20,21,22,23 +Ethernet7 24,25,26,27 +Ethernet8 28,29,30,31 +Ethernet9 32,33,34,35 +Ethernet10 36,37,38,39 +Ethernet11 40,41,42,43 +Ethernet12 44,45,46,47 +Ethernet13 48,49,50,51 +Ethernet14 52,53,54,55 +Ethernet15 56,57,58,59 +Ethernet16 60,61,62,63 +Ethernet17 64,65,66,67 +Ethernet18 68,69,70,71 +Ethernet19 72,73,74,75 +Ethernet20 76,77,78,79 +Ethernet21 80,81,82,83 +Ethernet22 84,85,86,87 +Ethernet23 88,89,90,91 +Ethernet24 92,93,94,95 +Ethernet25 96,97,98,99 +Ethernet26 100,101,102,103 +Ethernet27 104,105,106,107 +Ethernet28 108,109,110,111 +Ethernet29 112,113,114,115 +Ethernet30 116,117,118,119 +Ethernet31 120,121,122,123 +Ethernet32 124,125,126,127 \ No newline at end of file diff --git a/dockers/docker-saiserver-mlnx/profile.ini b/dockers/docker-saiserver-mlnx/profile.ini new file mode 100644 index 000000000000..c67be49f3c45 --- /dev/null +++ b/dockers/docker-saiserver-mlnx/profile.ini @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sai_2700.xml \ No newline at end of file diff --git a/dockers/docker-saiserver-mlnx/sai_2700.xml b/dockers/docker-saiserver-mlnx/sai_2700.xml new file mode 100644 index 000000000000..42b576311453 --- /dev/null +++ b/dockers/docker-saiserver-mlnx/sai_2700.xml @@ -0,0 +1,243 @@ + + + + + + 00:77:66:55:44:00 + + + 32 + + + + + 1 + 4 + 16 + + + 3 + + + 98368 + + + 3 + 4 + 17 + 1 + 98368 + + + 5 + 4 + 18 + 3 + 98368 + + + 7 + 4 + 19 + 1 + 98368 + + + 9 + 4 + 20 + 3 + 98368 + + + 11 + 4 + 21 + 1 + 98368 + + + 13 + 4 + 22 + 3 + 98368 + + + 15 + 4 + 23 + 1 + 98368 + + + 17 + 4 + 24 + 3 + 98368 + + + 19 + 4 + 25 + 1 + 98368 + + + 21 + 4 + 26 + 3 + 98368 + + + 23 + 4 + 27 + 1 + 98368 + + + 25 + 4 + 28 + 3 + 98368 + + + 27 + 4 + 29 + 1 + 98368 + + + 29 + 4 + 30 + 3 + 98368 + + + 31 + 4 + 31 + 1 + 98368 + + + 33 + 4 + 14 + 3 + 98368 + + + 35 + 4 + 15 + 1 + 98368 + + + 37 + 4 + 12 + 3 + 98368 + + + 39 + 4 + 13 + 1 + 98368 + + + 41 + 4 + 10 + 3 + 98368 + + + 43 + 4 + 11 + 1 + 98368 + + + 45 + 4 + 8 + 3 + 98368 + + + 47 + 4 + 9 + 1 + 98368 + + + 49 + 4 + 6 + 3 + 98368 + + + 51 + 4 + 7 + 1 + 98368 + + + 53 + 4 + 4 + 3 + 98368 + + + 55 + 4 + 5 + 1 + 98368 + + + 57 + 4 + 2 + 3 + 98368 + + + 59 + 4 + 3 + 1 + 98368 + + + 61 + 4 + 0 + 3 + 98368 + + + 63 + 4 + 1 + 1 + 98368 + + + + diff --git a/dockers/docker-saiserver-mlnx/start.sh b/dockers/docker-saiserver-mlnx/start.sh new file mode 100755 index 000000000000..4e1aa752d3a5 --- /dev/null +++ b/dockers/docker-saiserver-mlnx/start.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +function clean_up { + service rsyslog stop +} + +start_mlnx() +{ + [ -e /dev/sxdevs/sxcdev ] || ( mkdir -p /dev/sxdevs && mknod /dev/sxdevs/sxcdev c 231 193 ) +} + +trap clean_up SIGTERM SIGKILL + +service rsyslog start + +start_mlnx + +/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini From 9c3b7ccaf762683b26222a861db026a394c546cf Mon Sep 17 00:00:00 2001 From: Denys Haryachyy Date: Mon, 26 Sep 2016 07:48:25 +0300 Subject: [PATCH 0026/1011] Add support for cavium SAI (#5) --- Makefile | 32 +++++++++++++++++++++++++++- build_debian.sh | 1 + dockers/docker-orchagent-cavm | 1 + dockers/docker-orchagent/start.sh | 8 +++++++ dockers/docker-syncd-cavm/Dockerfile | 26 ++++++++++++++++++++++ dockers/docker-syncd-cavm/start.sh | 6 ++++++ src/Makefile | 14 ++++++++++++ src/cavm-sdk/filelist.txt | 7 ++++++ src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 11 files changed, 97 insertions(+), 4 deletions(-) create mode 120000 dockers/docker-orchagent-cavm create mode 100755 dockers/docker-syncd-cavm/Dockerfile create mode 100755 dockers/docker-syncd-cavm/start.sh create mode 100644 src/cavm-sdk/filelist.txt diff --git a/Makefile b/Makefile index 4fec69a41699..80378a51ecbb 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ SHELL := /bin/bash ## Capture all the files in SDK directories MLNX-SDK-DEBS=$(notdir $(wildcard src/mlnx-sdk/*.deb)) BRCM-SDK-DEBS=$(notdir $(wildcard src/brcm-sdk/*.deb)) +CAVM-SDK-DEBS=$(notdir $(wildcard src/cavm-sdk/*.deb)) ## Function: build_docker, image_name save_file ## build a docker image and save to a file @@ -20,7 +21,7 @@ define build_docker endef ## Rules -.phony : brcm-all mlnx-all +.phony : brcm-all mlnx-all cavm-all src/%: $(MAKE) -C src $(subst src/,,$@) @@ -42,30 +43,48 @@ dockers/docker-orchagent/deps/%.deb: src/%.deb dockers/docker-orchagent/deps/%: src/brcm/% mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-orchagent-cavm/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-orchagent-cavm/deps/%: src/cavm/% + mkdir -p `dirname $@` && cp $< $@ dockers/docker-%-mlnx/deps/syncd_1.0.0_amd64.deb: src/mlnx/syncd_1.0.0_amd64.deb mkdir -p `dirname $@` && cp $< $@ dockers/docker-%/deps/syncd_1.0.0_amd64.deb: src/brcm/syncd_1.0.0_amd64.deb mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-%-cavm/deps/syncd_1.0.0_amd64.deb: src/cavm/syncd_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $@ dockers/docker-%-mlnx/deps/libsairedis_1.0.0_amd64.deb: src/mlnx/syncd_1.0.0_amd64.deb mkdir -p `dirname $@` && cp $< $@ dockers/docker-%/deps/libsairedis_1.0.0_amd64.deb: src/brcm/syncd_1.0.0_amd64.deb mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-%-cavm/deps/libsairedis_1.0.0_amd64.deb: src/cavm/libsairedis_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $@ $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS)) : dockers/docker-syncd-mlnx/deps/%.deb : src/mlnx-sdk/%.deb mkdir -p `dirname $@` && cp $< $@ $(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS)) : dockers/docker-syncd/deps/%.deb : src/brcm-sdk/%.deb mkdir -p `dirname $@` && cp $< $@ + +$(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS)) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm-sdk/%.deb + mkdir -p `dirname $@` && cp $< $@ dockers/docker-syncd-mlnx/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $@ dockers/docker-syncd/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $@ + +dockers/docker-syncd-cavm/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $@ deps/linux-image-3.16.0-4-amd64_%.deb: src/sonic-linux-kernel/linux-image-3.16.0-4-amd64_%.deb mkdir -p `dirname $@` && cp $< $@ @@ -85,6 +104,10 @@ target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/d target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + +target/docker-syncd-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb) docker load < $< @@ -93,6 +116,10 @@ target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orc target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + +target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-cavm/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb orchagent swssconfig portsyncd intfsyncd neighsyncd) + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb fpmsyncd) docker load < $< @@ -113,3 +140,6 @@ brcm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd.gz docker-or ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd mlnx-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz docker-database.gz) + +## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd +cavm-all: $(addprefix target/,docker-syncd-cavm.gz docker-orchagent-cavm.gz docker-fpm.gz docker-database.gz) diff --git a/build_debian.sh b/build_debian.sh index b1cf2e67d8d8..95d80f5a03d5 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -69,6 +69,7 @@ sudo debootstrap --variant=minbase --arch amd64 jessie $FILESYSTEM_ROOT http://f ## Config hostname and hosts, otherwise 'sudo ...' will complain 'sudo: unable to resolve host ...' sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo '$HOSTNAME' > /etc/hostname" sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo '127.0.0.1 $HOSTNAME' >> /etc/hosts" +sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo '127.0.0.1 localhost' >> /etc/hosts" ## Config basic fstab sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c 'echo "proc /proc proc defaults 0 0" >> /etc/fstab' diff --git a/dockers/docker-orchagent-cavm b/dockers/docker-orchagent-cavm new file mode 120000 index 000000000000..8d52609c56e5 --- /dev/null +++ b/dockers/docker-orchagent-cavm @@ -0,0 +1 @@ +docker-orchagent \ No newline at end of file diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 1fdee5117f89..46376c4ea55d 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -32,9 +32,17 @@ if [ "$onie_platform" == "x86_64-dell_s6000_s1220-r0" ]; then PORTSYNCD_ARGS+="-p /etc/ssw/ACS-S6000/port_config.ini" elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ]; then PORTSYNCD_ARGS+="-p /etc/ssw/ACS-MSN2700/port_config.ini" +elif [ "$onie_platform" == "x86_64-accton_as7512_32x-r0" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" + PORTSYNCD_ARGS+="-p /etc/ssw/AS7512/port_config.ini" fi service rsyslog start + +if [ "$onie_platform" == "x86_64-accton_as7512_32x-r0" ]; then + swssconfig /etc/ssw/AS7512/copp.json +fi + while true; do # Check if syncd starts result=`echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p` diff --git a/dockers/docker-syncd-cavm/Dockerfile b/dockers/docker-syncd-cavm/Dockerfile new file mode 100755 index 000000000000..bbb5195901b7 --- /dev/null +++ b/dockers/docker-syncd-cavm/Dockerfile @@ -0,0 +1,26 @@ +FROM docker-base + +RUN apt-get update + +COPY ["deps/libhiredis0.13*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/syncd_*.deb", "deps/sai*.deb", "deps/libsai*.deb", "deps/xp-tools*.deb", "deps/xpshell*.deb", "/deps/"] + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/libhiredis0.13*.deb \ + && dpkg_apt /deps/libswsscommon_*.deb \ + && dpkg_apt /deps/sai*.deb \ + && dpkg_apt /deps/libsai*.deb \ + && dpkg_apt /deps/xp-tools*.deb \ + && dpkg_apt /deps/xpshell*.deb \ + && dpkg_apt /deps/libsairedis_*.deb \ + && dpkg_apt /deps/syncd_*.deb + +RUN apt-get -y install libpcap-dev libxml2-dev python-dev swig libsensors4-dev + +COPY ["start.sh", "/usr/bin/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT /usr/bin/start.sh \ + && /bin/bash diff --git a/dockers/docker-syncd-cavm/start.sh b/dockers/docker-syncd-cavm/start.sh new file mode 100755 index 000000000000..04c5a3a1835f --- /dev/null +++ b/dockers/docker-syncd-cavm/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +export XP_ROOT=/usr/bin/ + +service rsyslog start +syncd -p /etc/ssw/AS7512/profile.ini -N diff --git a/src/Makefile b/src/Makefile index 09e1152dec48..d310f069d438 100644 --- a/src/Makefile +++ b/src/Makefile @@ -43,6 +43,12 @@ mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev $(call build_project, sonic-sairedis) mkdir -p mlnx cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb mlnx/ + +cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb cavm-sdk/libsai.deb cavm-sdk/xp-tools.deb cavm-sdk/xpshell.deb + $(foreach dep, $^, $(call install_deb, $(dep))) + $(call build_project, sonic-sairedis) + mkdir -p cavm + cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb cavm/ ## Note: fpmsyncd is one implicit target brcm/swss_1.0.0_amd64.deb brcm/intfsyncd brcm/neighsyncd brcm/orchagent brcm/portsyncd brcm/routeresync brcm/swssconfig: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb @@ -59,6 +65,14 @@ mlnx/swss_1.0.0_amd64.deb mlnx/intfsyncd mlnx/neighsyncd mlnx/orchagent mlnx/por cp swss_1.0.0_amd64.deb mlnx/ cp sonic-swss/debian/swss/usr/bin/* mlnx/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . + +## Note: fpmsyncd is one implicit target +cavm/swss_1.0.0_amd64.deb cavm/intfsyncd cavm/neighsyncd cavm/orchagent cavm/portsyncd cavm/routeresync cavm/swssconfig: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb + $(foreach dep, $^, $(call install_deb, $(dep))) + $(call build_project, sonic-swss) + cp swss_1.0.0_amd64.deb cavm/ + cp sonic-swss/debian/swss/usr/bin/* cavm/ + cp sonic-swss/debian/swss/usr/bin/fpmsyncd . $(addprefix sonic-linux-kernel/,linux-headers-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb linux-headers-3.16.0-4-common_3.16.7-ckt11-2+acs8u2_amd64.deb linux-image-3.16.0-4-amd64-dbg_3.16.7-ckt11-2+acs8u2_amd64.deb linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb xen-linux-system-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb): pushd sonic-linux-kernel; sudo ./build.sh; popd diff --git a/src/cavm-sdk/filelist.txt b/src/cavm-sdk/filelist.txt new file mode 100644 index 000000000000..bc40295dfbdc --- /dev/null +++ b/src/cavm-sdk/filelist.txt @@ -0,0 +1,7 @@ +## Get vendor SAI SDK +## https://github.com/Azure/sonic-buildimage/blob/master/README.md#3-get-vendor-sai-sdk + +libsai.deb +sai.deb +xp-tools.deb +xpshell.deb diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 68b0a9b914c3..74fa427ab6a7 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 68b0a9b914c3a3816c809d7951de70136d09dc27 +Subproject commit 74fa427ab6a70f293c0d487904bc06db3339fa84 diff --git a/src/sonic-swss b/src/sonic-swss index b56c9cc507cd..60b0fb279551 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit b56c9cc507cdfc473d6d0d1159f134dfd83a96df +Subproject commit 60b0fb279551ad3447b802ec602e28902245b4f2 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 38b461a168a6..efd594d51da6 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 38b461a168a6154aad978d3a97f08c2c933e943a +Subproject commit efd594d51da6d2dcc8a494bf43d3aadf3bdd71d2 From d3b3f63537d123401d16924f252787cbfce9b27b Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 25 Sep 2016 22:59:41 -0700 Subject: [PATCH 0027/1011] Sync submodules (linux-kernel, sairedis, swss, and swss-common to latest master) (#13) --- src/sonic-linux-kernel | 2 +- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 9794d29a08a4..206a8936a7af 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 9794d29a08a4f81fbcd900e03072561f42b81074 +Subproject commit 206a8936a7af2fdc30101c64be42dd2dadde0dad diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 74fa427ab6a7..59ec36035eb9 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 74fa427ab6a70f293c0d487904bc06db3339fa84 +Subproject commit 59ec36035eb9fd0ff64d4977a2553380367f97ce diff --git a/src/sonic-swss b/src/sonic-swss index 60b0fb279551..6784f7bf236a 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 60b0fb279551ad3447b802ec602e28902245b4f2 +Subproject commit 6784f7bf236ab0e90676d3ec9d0a771f232995ca diff --git a/src/sonic-swss-common b/src/sonic-swss-common index efd594d51da6..e612cefd8890 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit efd594d51da6d2dcc8a494bf43d3aadf3bdd71d2 +Subproject commit e612cefd889067f1cfa8c9a68a40a1abdac59433 From f09a554f9afbe93b01b21cee2dbfcb53e5e072a8 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 27 Sep 2016 11:42:35 -0700 Subject: [PATCH 0028/1011] Fix rules in Makefiles (#15) --- Makefile | 110 ++++++++++++++++++++------------------------ src/Makefile | 6 +-- src/libnl3/build.sh | 1 + 3 files changed, 55 insertions(+), 62 deletions(-) diff --git a/Makefile b/Makefile index 80378a51ecbb..6dab5d440311 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,8 @@ MLNX-SDK-DEBS=$(notdir $(wildcard src/mlnx-sdk/*.deb)) BRCM-SDK-DEBS=$(notdir $(wildcard src/brcm-sdk/*.deb)) CAVM-SDK-DEBS=$(notdir $(wildcard src/cavm-sdk/*.deb)) +LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb libnl-genl-3-200_3.2.27-1_amd64.deb libnl-route-3-200_3.2.27-1_amd64.deb + ## Function: build_docker, image_name save_file ## build a docker image and save to a file define build_docker @@ -20,88 +22,72 @@ define build_docker docker save $(1) | gzip -c > $(2) endef -## Rules +## Rules: phony targets .phony : brcm-all mlnx-all cavm-all +## Rules: redirect to sub directory src/%: $(MAKE) -C src $(subst src/,,$@) +## Rules: docker-fpm dockers/docker-fpm/deps/fpmsyncd: src/fpmsyncd - mkdir -p `dirname $@` && cp $< $@ - + mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-fpm/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $@ + mkdir -p `dirname $@` && cp $< $(dir $@) +## Rules: docker-orchagent-mlnx +dockers/docker-orchagent-mlnx/deps/libsairedis_1.0.0_amd64.deb: src/mlnx/libsairedis_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-orchagent-mlnx/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $@ - -dockers/docker-orchagent-mlnx/deps/%: src/mlnx/% - mkdir -p `dirname $@` && cp $< $@ - -dockers/docker-orchagent/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $@ + mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-orchagent/deps/%: src/brcm/% - mkdir -p `dirname $@` && cp $< $@ - +## Rules: docker-orchagent-cavm +dockers/docker-orchagent-cavm/deps/libsairedis_1.0.0_amd64.deb: src/cavm/libsairedis_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-orchagent-cavm/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $@ + mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-orchagent-cavm/deps/%: src/cavm/% - mkdir -p `dirname $@` && cp $< $@ - -dockers/docker-%-mlnx/deps/syncd_1.0.0_amd64.deb: src/mlnx/syncd_1.0.0_amd64.deb - mkdir -p `dirname $@` && cp $< $@ - -dockers/docker-%/deps/syncd_1.0.0_amd64.deb: src/brcm/syncd_1.0.0_amd64.deb - mkdir -p `dirname $@` && cp $< $@ - -dockers/docker-%-cavm/deps/syncd_1.0.0_amd64.deb: src/cavm/syncd_1.0.0_amd64.deb - mkdir -p `dirname $@` && cp $< $@ - -dockers/docker-%-mlnx/deps/libsairedis_1.0.0_amd64.deb: src/mlnx/syncd_1.0.0_amd64.deb - mkdir -p `dirname $@` && cp $< $@ - -dockers/docker-%/deps/libsairedis_1.0.0_amd64.deb: src/brcm/syncd_1.0.0_amd64.deb - mkdir -p `dirname $@` && cp $< $@ - -dockers/docker-%-cavm/deps/libsairedis_1.0.0_amd64.deb: src/cavm/libsairedis_1.0.0_amd64.deb - mkdir -p `dirname $@` && cp $< $@ +## Rules: docker-orchagent (brcm) +dockers/docker-orchagent/deps/libsairedis_1.0.0_amd64.deb: src/brcm/libsairedis_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $(dir $@) +dockers/docker-orchagent/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) +## Rules: docker-syncd-mlnx $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS)) : dockers/docker-syncd-mlnx/deps/%.deb : src/mlnx-sdk/%.deb - mkdir -p `dirname $@` && cp $< $@ - -$(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS)) : dockers/docker-syncd/deps/%.deb : src/brcm-sdk/%.deb - mkdir -p `dirname $@` && cp $< $@ - -$(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS)) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm-sdk/%.deb - mkdir -p `dirname $@` && cp $< $@ - + mkdir -p `dirname $@` && cp $< $(dir $@) +$(addprefix dockers/docker-syncd-mlnx/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) : dockers/docker-syncd-mlnx/deps/%.deb : src/mlnx/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-syncd-mlnx/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $@ + mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-syncd/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $@ - +## Rules: docker-syncd-cavm +$(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS)) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm-sdk/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) +$(addprefix dockers/docker-syncd-cavm/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-syncd-cavm/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $@ - -deps/linux-image-3.16.0-4-amd64_%.deb: src/sonic-linux-kernel/linux-image-3.16.0-4-amd64_%.deb - mkdir -p `dirname $@` && cp $< $@ + mkdir -p `dirname $@` && cp $< $(dir $@) -deps/initramfs-tools_%.deb: src/initramfs-tools/initramfs-tools_%.deb - mkdir -p `dirname $@` && cp $< $@ +## Rules: docker-syncd (brcm) +$(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS)) : dockers/docker-syncd/deps/%.deb : src/brcm-sdk/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) +$(addprefix dockers/docker-syncd/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb): dockers/docker-syncd/deps/%.deb : src/brcm/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) +dockers/docker-syncd/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) +## Rules: docker images target/docker-base.gz: $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb syncd_1.0.0_amd64.deb) +target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb syncd_1.0.0_amd64.deb $(LIBNL-DEBS)) ## TODO: remove placeholders for the dependencies touch dockers/docker-syncd/deps/{dsserve,bcmcmd} docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) +target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb $(LIBNL-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) @@ -109,15 +95,15 @@ target/docker-syncd-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-sy docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb) +target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb) +target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-cavm/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb orchagent swssconfig portsyncd intfsyncd neighsyncd) +target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-cavm/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) @@ -129,9 +115,15 @@ target/docker-database.gz: target/docker-base.gz docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) +## Rules: linux image content +deps/linux-image-3.16.0-4-amd64_%.deb: src/sonic-linux-kernel/linux-image-3.16.0-4-amd64_%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) +deps/initramfs-tools_%.deb: src/initramfs-tools/initramfs-tools_%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) + +## Rules: linux image target/sonic-generic.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=generic ./build_image.sh - target/sonic-aboot.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=aboot ./build_image.sh diff --git a/src/Makefile b/src/Makefile index d310f069d438..da9670a95f22 100644 --- a/src/Makefile +++ b/src/Makefile @@ -19,6 +19,9 @@ install_deb = \ [ -f $(1) ] && { sudo dpkg -i $(1) || sudo apt-get -y install -f; } || return 1; ## Rules +libnl-%.deb: + pushd libnl3; ./build.sh; popd + quagga_0.99.24.1-2_amd64.deb: pushd quagga; ./build.sh; popd @@ -55,7 +58,6 @@ brcm/swss_1.0.0_amd64.deb brcm/intfsyncd brcm/neighsyncd brcm/orchagent brcm/por $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb brcm/ - cp sonic-swss/debian/swss/usr/bin/* brcm/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . ## Note: fpmsyncd is one implicit target @@ -63,7 +65,6 @@ mlnx/swss_1.0.0_amd64.deb mlnx/intfsyncd mlnx/neighsyncd mlnx/orchagent mlnx/por $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb mlnx/ - cp sonic-swss/debian/swss/usr/bin/* mlnx/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . ## Note: fpmsyncd is one implicit target @@ -71,7 +72,6 @@ cavm/swss_1.0.0_amd64.deb cavm/intfsyncd cavm/neighsyncd cavm/orchagent cavm/por $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb cavm/ - cp sonic-swss/debian/swss/usr/bin/* cavm/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . $(addprefix sonic-linux-kernel/,linux-headers-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb linux-headers-3.16.0-4-common_3.16.7-ckt11-2+acs8u2_amd64.deb linux-image-3.16.0-4-amd64-dbg_3.16.7-ckt11-2+acs8u2_amd64.deb linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb xen-linux-system-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb): diff --git a/src/libnl3/build.sh b/src/libnl3/build.sh index a23b8f7e3dc2..47eb0048f45d 100755 --- a/src/libnl3/build.sh +++ b/src/libnl3/build.sh @@ -20,3 +20,4 @@ quilt push dpkg-buildpackage -rfakeroot -b -us -uc popd +cp *.deb .. From 10e403d7c4ccb6ba53c315498d877c15f7445c24 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 27 Sep 2016 17:25:48 -0700 Subject: [PATCH 0029/1011] Add platform dependency swss (#16) --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 6dab5d440311..f26ab0c29b98 100644 --- a/Makefile +++ b/Makefile @@ -38,18 +38,24 @@ dockers/docker-fpm/deps/%.deb: src/%.deb ## Rules: docker-orchagent-mlnx dockers/docker-orchagent-mlnx/deps/libsairedis_1.0.0_amd64.deb: src/mlnx/libsairedis_1.0.0_amd64.deb mkdir -p `dirname $@` && cp $< $(dir $@) +dockers/docker-orchagent-mlnx/deps/swss_1.0.0_amd64.deb: src/mlnx/swss_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-orchagent-mlnx/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) ## Rules: docker-orchagent-cavm dockers/docker-orchagent-cavm/deps/libsairedis_1.0.0_amd64.deb: src/cavm/libsairedis_1.0.0_amd64.deb mkdir -p `dirname $@` && cp $< $(dir $@) +dockers/docker-orchagent-cavm/deps/swss_1.0.0_amd64.deb: src/cavm/swss_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-orchagent-cavm/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) ## Rules: docker-orchagent (brcm) dockers/docker-orchagent/deps/libsairedis_1.0.0_amd64.deb: src/brcm/libsairedis_1.0.0_amd64.deb mkdir -p `dirname $@` && cp $< $(dir $@) +dockers/docker-orchagent/deps/swss_1.0.0_amd64.deb: src/brcm/swss_1.0.0_amd64.deb + mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-orchagent/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) From 7c0ff3e9e3db34457d62b9464522df1044209f3a Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 28 Sep 2016 11:15:02 -0700 Subject: [PATCH 0030/1011] build p4-based sonic docker (#14) * add docker-sonic for p4 switch * update build instructions --- .gitmodules | 12 +++++ Makefile | 17 +++++-- README.md | 10 +++- dockers/docker-sonic-p4/Dockerfile | 32 ++++++++++++ dockers/docker-sonic-p4/port_config.ini | 5 ++ dockers/docker-sonic-p4/rsyslog.conf | 68 +++++++++++++++++++++++++ dockers/docker-sonic-p4/startup.sh | 39 ++++++++++++++ src/Makefile | 31 +++++++++++ src/p4-bmv2/behavioral-model | 1 + src/p4-bmv2/build.sh | 5 ++ src/p4-hlir/build.sh | 7 +++ src/p4-hlir/p4-hlir | 1 + src/p4-switch/build.sh | 17 +++++++ src/p4-switch/switch | 1 + src/p4c-bm/build.sh | 7 +++ src/p4c-bm/p4c-bm | 1 + src/tenjin/build.sh | 8 +++ src/thrift/build.sh | 10 ++++ 18 files changed, 268 insertions(+), 4 deletions(-) create mode 100644 dockers/docker-sonic-p4/Dockerfile create mode 100644 dockers/docker-sonic-p4/port_config.ini create mode 100644 dockers/docker-sonic-p4/rsyslog.conf create mode 100755 dockers/docker-sonic-p4/startup.sh create mode 160000 src/p4-bmv2/behavioral-model create mode 100755 src/p4-bmv2/build.sh create mode 100755 src/p4-hlir/build.sh create mode 160000 src/p4-hlir/p4-hlir create mode 100755 src/p4-switch/build.sh create mode 160000 src/p4-switch/switch create mode 100755 src/p4c-bm/build.sh create mode 160000 src/p4c-bm/p4c-bm create mode 100755 src/tenjin/build.sh create mode 100755 src/thrift/build.sh diff --git a/.gitmodules b/.gitmodules index 88123322f032..a6a4a1a9f611 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,15 @@ [submodule "sonic-swss"] path = src/sonic-swss url = https://github.com/Azure/sonic-swss +[submodule "src/p4-switch/switch"] + path = src/p4-switch/switch + url = https://github.com/lguohan/switch +[submodule "src/p4-bmv2/behavioral-model"] + path = src/p4-bmv2/behavioral-model + url = https://github.com/lguohan/behavioral-model +[submodule "src/p4c-bm/p4c-bm"] + path = src/p4c-bm/p4c-bm + url = https://github.com/krambn/p4c-bm +[submodule "src/p4-hlir/p4-hlir"] + path = src/p4-hlir/p4-hlir + url = https://github.com/p4lang/p4-hlir diff --git a/Makefile b/Makefile index f26ab0c29b98..d71ed93fb449 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ define build_docker endef ## Rules: phony targets -.phony : brcm-all mlnx-all cavm-all +.phony : brcm-all mlnx-all cavm-all p4-all ## Rules: redirect to sub directory src/%: @@ -66,7 +66,7 @@ $(addprefix dockers/docker-syncd-mlnx/deps/,syncd_1.0.0_amd64.deb libsairedis_1. mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-syncd-mlnx/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) - + ## Rules: docker-syncd-cavm $(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS)) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm-sdk/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) @@ -83,6 +83,12 @@ $(addprefix dockers/docker-syncd/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_a dockers/docker-syncd/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) +## Rules: docker-sonic (p4) +$(addprefix dockers/docker-sonic-p4/deps/,swss_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) : dockers/docker-sonic-p4/deps/%.deb : src/p4/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) +dockers/docker-sonic-p4/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) + ## Rules: docker images target/docker-base.gz: $(call build_docker,$(patsubst target/%.gz,%,$@),$@) @@ -121,13 +127,16 @@ target/docker-database.gz: target/docker-base.gz docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) +target/docker-sonic-p4.gz: target/docker-base.gz $(addprefix dockers/docker-sonic-p4/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb syncd_1.0.0_amd64.deb swss_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb p4-bmv2_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb) + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + ## Rules: linux image content deps/linux-image-3.16.0-4-amd64_%.deb: src/sonic-linux-kernel/linux-image-3.16.0-4-amd64_%.deb mkdir -p `dirname $@` && cp $< $(dir $@) deps/initramfs-tools_%.deb: src/initramfs-tools/initramfs-tools_%.deb mkdir -p `dirname $@` && cp $< $(dir $@) -## Rules: linux image target/sonic-generic.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=generic ./build_image.sh target/sonic-aboot.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb @@ -141,3 +150,5 @@ mlnx-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-mlnx.gz dock ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd cavm-all: $(addprefix target/,docker-syncd-cavm.gz docker-orchagent-cavm.gz docker-fpm.gz docker-database.gz) + +p4-all: $(addprefix target/,docker-sonic-p4.gz) diff --git a/README.md b/README.md index e6b4764d8972..dd894887f0d9 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,13 @@ If it is already cloned, however there is no files under ./dockers/docker-base/ ## 2. Build environment Build a docker image by [the Dockerfile](https://github.com/Azure/sonic-build-tools/blob/master/sonic-slave/Dockerfile) and build all remains in the docker container. + git clone https://github.com/Azure/sonic-build-tools + cd sonic-build-tools + ./build.sh sonic-slave + docker run -v /var/run/docker.sock:/var/run/docker.sock -it local/sonic-slave bash + ## 3. Get vendor SAI SDK -Obtain Switch Abstraction Interface (SAI) SDK from one of supported vendors (see the list in [Usage](#usage) Section), and place it in the directory ./src/[VENDOR]-sdk/ as filelist.txt in that directory. +Obtain Switch Abstraction Interface (SAI) SDK from one of supported vendors (see the list in [Usage](#usage) Section), and place it in the directory ./src/[VENDOR]-sdk/ as filelist.txt in that directory. Skip this step for p4 since it is an open source software switch. # Usage To build NOS installer image and docker images, run command line @@ -27,6 +32,8 @@ To build NOS installer image and docker images, run command line Supported VENDORs are: - brcm: Broadcom - mlnx: Mellanox +- cavm: Cavium +- p4: barefoot For example, the user name is 'admin' and the password is 'YourPaSsWoRd'. To build all the images for Broadcom platform, use the command: @@ -43,6 +50,7 @@ The target directory is ./target, containing the NOS installer image and docker - docker-orchagent.gz: docker image for SWitch State Service (SWSS) (gzip tar archive) - docker-syncd.gz: docker image for the daemon to sync database and Broadcom switch ASIC (gzip tar archive) - docker-syncd-mlnx.gz: docker image for the daemon to sync database and Mellanox switch ASIC (gzip tar archive) +- docker-sonic-p4.gz: docker image for all-in-one for p4 software switch (gzip tar archive) # Contribution guide diff --git a/dockers/docker-sonic-p4/Dockerfile b/dockers/docker-sonic-p4/Dockerfile new file mode 100644 index 000000000000..d5470bbd8837 --- /dev/null +++ b/dockers/docker-sonic-p4/Dockerfile @@ -0,0 +1,32 @@ +FROM docker-base + +RUN apt-get update + +RUN apt-get install -y net-tools ethtool tcpdump ifupdown + +COPY ["deps/libthrift-0.9.3_*.deb", "deps/libhiredis0.13*.deb", "deps/redis-tools_*.deb", "deps/redis-server_*.deb", "deps/libswsscommon_*.deb", "deps/p4-bmv2_*.deb", "deps/p4-switch_*.deb", "deps/libsairedis_*.deb", "deps/syncd_*.deb", "deps/swss_*.deb", "deps/quagga_*.deb", "/deps/"] + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libthrift-0.9.3_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/redis-tools_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/redis-server_*.deb + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libswsscommon_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/p4-bmv2_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/p4-switch_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsairedis_*.deb + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/swss_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/quagga_*.deb + +ADD port_config.ini /port_config.ini +ADD startup.sh /scripts/startup.sh + +ADD rsyslog.conf /etc/rsyslog.conf + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT /bin/bash diff --git a/dockers/docker-sonic-p4/port_config.ini b/dockers/docker-sonic-p4/port_config.ini new file mode 100644 index 000000000000..574f8f976ef9 --- /dev/null +++ b/dockers/docker-sonic-p4/port_config.ini @@ -0,0 +1,5 @@ +# alias lanes +Ethernet0 1 +Ethernet1 2 +Ethernet2 3 +Ethernet3 4 diff --git a/dockers/docker-sonic-p4/rsyslog.conf b/dockers/docker-sonic-p4/rsyslog.conf new file mode 100644 index 000000000000..d82ea610d6a7 --- /dev/null +++ b/dockers/docker-sonic-p4/rsyslog.conf @@ -0,0 +1,68 @@ +############################################################################### +# Managed by Ansible +# file: ansible/roles/acs/templates/rsyslog.conf.j2 +############################################################################### +# +# /etc/rsyslog.conf Configuration file for rsyslog. +# +# For more information see +# /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html + + +################# +#### MODULES #### +################# + +$ModLoad imuxsock # provides support for local system logging +#$ModLoad imklog # provides kernel logging support +#$ModLoad immark # provides --MARK-- message capability + +# provides UDP syslog reception +#$ModLoad imudp +#$UDPServerRun 514 + +# provides TCP syslog reception +#$ModLoad imtcp +#$InputTCPServerRun 514 + + +########################### +#### GLOBAL DIRECTIVES #### +########################### +#Set remote syslog server +*.* @172.17.0.1:514 + +# +# Use traditional timestamp format. +# To enable high precision timestamps, comment out the following line. +# +#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat + +# Define a custom template +$template ACSFileFormat,"%TIMESTAMP% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" +$ActionFileDefaultTemplate ACSFileFormat + +# +# Set the default permissions for all log files. +# +$FileOwner root +$FileGroup adm +$FileCreateMode 0640 +$DirCreateMode 0755 +$Umask 0022 + +# +# Where to place spool and state files +# +$WorkDirectory /var/spool/rsyslog + +# +# Include all config files in /etc/rsyslog.d/ +# +$IncludeConfig /etc/rsyslog.d/*.conf + + +############### +#### RULES #### +############### + diff --git a/dockers/docker-sonic-p4/startup.sh b/dockers/docker-sonic-p4/startup.sh new file mode 100755 index 000000000000..319ac8e57850 --- /dev/null +++ b/dockers/docker-sonic-p4/startup.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +echo "Start rsyslog" +service rsyslog start + +echo "Start redis server" +service redis-server start + +echo "Veth setup" +/usr/share/bmpd/tools/veth_setup.sh > /tmp/veth_setup.log 2>&1 + +echo "Disable IPv6" +/usr/share/bmpd/tools/veth_disable_ipv6.sh > /tmp/veth_disable.log 2>&1 + +echo "Start BMV2" +/run_bm.sh > /tmp/run_bm.log 2>&1 & +sleep 15 + +redis-cli -n 1 set LOGLEVEL DEBUG + +echo "Start Syncd" +syncd -N > /tmp/syncd.log 2>&1 & +sleep 10 + +echo "Start Orchagent" +orchagent $* > /tmp/orchagent.log 2>&1 & +sleep 10 + +echo "Start Portsyncd" +portsyncd -p /port_config.ini > /tmp/portsyncd.log 2>&1 & + +echo "Start Intfsync" +intfsyncd > /tmp/intfsyncd.log 2>&1 & + +echo "Start Neighsyncd" +neighsyncd > /tmp/neighsyncd.log 2>&1 & + +echo "Start Fpmsyncd" +fpmsyncd > /tmp/fpmsyncd.log 2>&1 & diff --git a/src/Makefile b/src/Makefile index da9670a95f22..dc0d05decf59 100644 --- a/src/Makefile +++ b/src/Makefile @@ -31,6 +31,26 @@ redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb redis-sentinel_3.0. libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dbg_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb: redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb redis-sentinel_3.0.7-2_amd64.deb pushd hiredis; ./build.sh; popd +libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb thrift-compiler_0.9.3-2_amd64.deb: + pushd thrift; ./build.sh; popd + +p4-bmv2_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb + $(foreach dep, $^, $(call install_deb, $(dep))) + pushd p4-bmv2; ./build.sh; popd + +python-p4-hlir_0.9.36-1_all.deb: + pushd p4-hlir; ./build.sh; popd + +python-p4c-bm_1.0.0-5415c416-1_all.deb: + pushd p4c-bm; ./build.sh; popd + +python-tenjin_1.1.1-1_all.deb: + pushd tenjin; ./build.sh; popd + +p4-switch_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb python-p4-hlir_0.9.36-1_all.deb python-p4c-bm_1.0.0-5415c416-1_all.deb p4-bmv2_1.0.0_amd64.deb + $(foreach dep, $^, $(call install_deb, $(dep))) + pushd p4-switch; ./build.sh; popd + libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb: redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss-common) @@ -53,6 +73,12 @@ cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev mkdir -p cavm cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb cavm/ +p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb p4-bmv2_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb + $(foreach dep, $^, $(call install_deb, $(dep))) + $(call build_project, sonic-sairedis) + mkdir -p p4 + cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb p4/ + ## Note: fpmsyncd is one implicit target brcm/swss_1.0.0_amd64.deb brcm/intfsyncd brcm/neighsyncd brcm/orchagent brcm/portsyncd brcm/routeresync brcm/swssconfig: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) @@ -74,6 +100,11 @@ cavm/swss_1.0.0_amd64.deb cavm/intfsyncd cavm/neighsyncd cavm/orchagent cavm/por cp swss_1.0.0_amd64.deb cavm/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . +p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb + $(foreach dep, $^, $(call install_deb, $(dep))) + $(call build_project, sonic-swss) + cp swss_1.0.0_amd64.deb p4/ + $(addprefix sonic-linux-kernel/,linux-headers-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb linux-headers-3.16.0-4-common_3.16.7-ckt11-2+acs8u2_amd64.deb linux-image-3.16.0-4-amd64-dbg_3.16.7-ckt11-2+acs8u2_amd64.deb linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb xen-linux-system-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb): pushd sonic-linux-kernel; sudo ./build.sh; popd diff --git a/src/p4-bmv2/behavioral-model b/src/p4-bmv2/behavioral-model new file mode 160000 index 000000000000..0eb0d51736ee --- /dev/null +++ b/src/p4-bmv2/behavioral-model @@ -0,0 +1 @@ +Subproject commit 0eb0d51736eeadd75384edfa8589e43a9ba734f4 diff --git a/src/p4-bmv2/build.sh b/src/p4-bmv2/build.sh new file mode 100755 index 000000000000..779da0b3caf6 --- /dev/null +++ b/src/p4-bmv2/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash -x + +pushd behavioral-model; ./autogen.sh; dpkg-buildpackage -us -uc -b -j4; popd + +cp *.deb ../ diff --git a/src/p4-hlir/build.sh b/src/p4-hlir/build.sh new file mode 100755 index 000000000000..68c7807ad648 --- /dev/null +++ b/src/p4-hlir/build.sh @@ -0,0 +1,7 @@ +#!/bin/bash -x + +pushd p4-hlir +python setup.py --command-packages=stdeb.command bdist_deb +popd + +cp p4-hlir/deb_dist/*.deb ../ diff --git a/src/p4-hlir/p4-hlir b/src/p4-hlir/p4-hlir new file mode 160000 index 000000000000..0ab8e58f8a92 --- /dev/null +++ b/src/p4-hlir/p4-hlir @@ -0,0 +1 @@ +Subproject commit 0ab8e58f8a92ee469235028430795088af9cda77 diff --git a/src/p4-switch/build.sh b/src/p4-switch/build.sh new file mode 100755 index 000000000000..eb0f0bcc7676 --- /dev/null +++ b/src/p4-switch/build.sh @@ -0,0 +1,17 @@ +#!/bin/bash -x + +sudo pip install ctypesgen + +sudo pip install crc16 + +pushd switch + +mkdir -p p4-build/bmv2/switch +mkdir -p p4-build/bmv2/pd_thrift_gen + +./autogen.sh +dpkg-buildpackage -us -uc -b -j4 + +popd + +cp *.deb ../ diff --git a/src/p4-switch/switch b/src/p4-switch/switch new file mode 160000 index 000000000000..8c80a17cb884 --- /dev/null +++ b/src/p4-switch/switch @@ -0,0 +1 @@ +Subproject commit 8c80a17cb884db6d8eaebbc52cb8b6a99a0784bc diff --git a/src/p4c-bm/build.sh b/src/p4c-bm/build.sh new file mode 100755 index 000000000000..83fa649005eb --- /dev/null +++ b/src/p4c-bm/build.sh @@ -0,0 +1,7 @@ +#!/bin/bash -x + +pushd p4c-bm +python setup.py --command-packages=stdeb.command bdist_deb +popd + +cp p4c-bm/deb_dist/*.deb ../ diff --git a/src/p4c-bm/p4c-bm b/src/p4c-bm/p4c-bm new file mode 160000 index 000000000000..5415c4160aff --- /dev/null +++ b/src/p4c-bm/p4c-bm @@ -0,0 +1 @@ +Subproject commit 5415c4160aff025f27fe45301c62aa9aeb4bab40 diff --git a/src/tenjin/build.sh b/src/tenjin/build.sh new file mode 100755 index 000000000000..37b8f9051d5b --- /dev/null +++ b/src/tenjin/build.sh @@ -0,0 +1,8 @@ +#!/bin/bash -x + +wget -nc http://pypi.python.org/packages/source/T/Tenjin/Tenjin-1.1.1.tar.gz +tar xzf Tenjin-1.1.1.tar.gz +pushd Tenjin-1.1.1 +python setup.py --command-packages=stdeb.command bdist_deb +popd +cp Tenjin-1.1.1/deb_dist/*.deb ../ diff --git a/src/thrift/build.sh b/src/thrift/build.sh new file mode 100755 index 000000000000..12aa1479e9c2 --- /dev/null +++ b/src/thrift/build.sh @@ -0,0 +1,10 @@ +#!/bin/bash -x + +wget -nc http://http.debian.net/debian/pool/main/t/thrift/thrift_0.9.3.orig.tar.gz +wget -nc http://http.debian.net/debian/pool/main/t/thrift/thrift_0.9.3-2.debian.tar.xz +wget -nc http://http.debian.net/debian/pool/main/t/thrift/thrift_0.9.3-2.dsc +dpkg-source -x thrift_0.9.3-2.dsc +cd thrift-0.9.3 +dpkg-buildpackage -d -rfakeroot -b -us -uc +cd .. +cp *.deb ../ From 9fe462fefc99884858bbdc1240b03d4a6d98c6fd Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 28 Sep 2016 17:23:22 -0700 Subject: [PATCH 0031/1011] Update README.md (#17) Adjust the steps to make it clear everything is built inside builder container. --- README.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index dd894887f0d9..897c03c7b337 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,17 @@ Build an [Open Network Install Environment (ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also build docker images running inside the NOS. # Prerequisite -## 1. Clone or fetch the code repository with all git submodules +## 1. Build environment +Build a docker image by [the Dockerfile](https://github.com/Azure/sonic-build-tools/blob/master/sonic-slave/Dockerfile) and build all remains in the docker container. + + git clone https://github.com/Azure/sonic-build-tools + cd sonic-build-tools + ./build.sh sonic-slave + docker run -v /var/run/docker.sock:/var/run/docker.sock -it local/sonic-slave bash + +Note that all the below steps should be executed in the docker container, not in the host machine. + +## 2. Clone or fetch the code repository with all git submodules To clone the code repository recursively, assuming git version 1.9 or newer git clone --recursive https://github.com/Azure/sonic-buildimage.git @@ -13,14 +23,6 @@ If it is already cloned, however there is no files under ./dockers/docker-base/ git submodule update --init --recursive -## 2. Build environment -Build a docker image by [the Dockerfile](https://github.com/Azure/sonic-build-tools/blob/master/sonic-slave/Dockerfile) and build all remains in the docker container. - - git clone https://github.com/Azure/sonic-build-tools - cd sonic-build-tools - ./build.sh sonic-slave - docker run -v /var/run/docker.sock:/var/run/docker.sock -it local/sonic-slave bash - ## 3. Get vendor SAI SDK Obtain Switch Abstraction Interface (SAI) SDK from one of supported vendors (see the list in [Usage](#usage) Section), and place it in the directory ./src/[VENDOR]-sdk/ as filelist.txt in that directory. Skip this step for p4 since it is an open source software switch. From 8bf3ae9ae9a84479cec279619872960f465fe4de Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 29 Sep 2016 21:16:37 -0700 Subject: [PATCH 0032/1011] Chang port_config.ini directory for s6000 (#19) --- dockers/docker-orchagent/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 46376c4ea55d..384b9dbc74a8 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -29,7 +29,7 @@ PORTSYNCD_ARGS="" if [ "$onie_platform" == "x86_64-dell_s6000_s1220-r0" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - PORTSYNCD_ARGS+="-p /etc/ssw/ACS-S6000/port_config.ini" + PORTSYNCD_ARGS+="-p /etc/ssw/Force10-S6000/port_config.ini" elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ]; then PORTSYNCD_ARGS+="-p /etc/ssw/ACS-MSN2700/port_config.ini" elif [ "$onie_platform" == "x86_64-accton_as7512_32x-r0" ]; then From 35880cf30f5d63e2d32300ebda1ab75dc6b08ce6 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 29 Sep 2016 23:36:26 -0700 Subject: [PATCH 0033/1011] Makefile: add build dependency for python-p4c-bm (#20) --- src/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index dc0d05decf59..29e911baa31f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -41,7 +41,8 @@ p4-bmv2_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3-2 python-p4-hlir_0.9.36-1_all.deb: pushd p4-hlir; ./build.sh; popd -python-p4c-bm_1.0.0-5415c416-1_all.deb: +python-p4c-bm_1.0.0-5415c416-1_all.deb: python-tenjin_1.1.1-1_all.deb + $(foreach dep, $^, $(call install_deb, $(dep))) pushd p4c-bm; ./build.sh; popd python-tenjin_1.1.1-1_all.deb: From 70fc7ecd2f6ff2175e898b0680ed08bb61534dbc Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 30 Sep 2016 23:32:53 -0700 Subject: [PATCH 0034/1011] update sonic-swss and p4-switch submodule to fix docker sonic p4 bug (#21) --- src/p4-switch/switch | 2 +- src/sonic-swss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p4-switch/switch b/src/p4-switch/switch index 8c80a17cb884..d6346b9b3339 160000 --- a/src/p4-switch/switch +++ b/src/p4-switch/switch @@ -1 +1 @@ -Subproject commit 8c80a17cb884db6d8eaebbc52cb8b6a99a0784bc +Subproject commit d6346b9b3339a2a1243c1e7a1b00b71c66fa6cb5 diff --git a/src/sonic-swss b/src/sonic-swss index 6784f7bf236a..134a1d46b2eb 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 6784f7bf236ab0e90676d3ec9d0a771f232995ca +Subproject commit 134a1d46b2ebd0f5cd5338f368a86bb18bb63c17 From d667d13b9042784657e8303877ef81c4853ca3e8 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 2 Oct 2016 02:52:07 -0700 Subject: [PATCH 0035/1011] sonic-swss: update sonic-swss submodule reference (#23) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 134a1d46b2eb..bdbe77ce879d 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 134a1d46b2ebd0f5cd5338f368a86bb18bb63c17 +Subproject commit bdbe77ce879de16334fcc53bd2a749e627f2c76c From 21ba8a009af629f316214b8adac37361f64e7bdc Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 2 Oct 2016 09:33:15 -0700 Subject: [PATCH 0036/1011] add python-tenjin as build dependency for p4-switch (#22) --- src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index 29e911baa31f..b4f296967d1b 100644 --- a/src/Makefile +++ b/src/Makefile @@ -48,7 +48,7 @@ python-p4c-bm_1.0.0-5415c416-1_all.deb: python-tenjin_1.1.1-1_all.deb python-tenjin_1.1.1-1_all.deb: pushd tenjin; ./build.sh; popd -p4-switch_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb python-p4-hlir_0.9.36-1_all.deb python-p4c-bm_1.0.0-5415c416-1_all.deb p4-bmv2_1.0.0_amd64.deb +p4-switch_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb python-p4-hlir_0.9.36-1_all.deb python-tenjin_1.1.1-1_all.deb python-p4c-bm_1.0.0-5415c416-1_all.deb p4-bmv2_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) pushd p4-switch; ./build.sh; popd From 144114c301dfce0a852bd79ebbd362989662663a Mon Sep 17 00:00:00 2001 From: Denys Haryachyy Date: Mon, 3 Oct 2016 05:25:58 +0300 Subject: [PATCH 0037/1011] Makefile : Added swss and libnl into cavm orchagent dependencies (#24) * Makefile : Added swss and libnl into cavm orchagent dependencies * docker-orchagent/start.sh : Removed Cavium specific copp config --- Makefile | 2 +- dockers/docker-orchagent/start.sh | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Makefile b/Makefile index d71ed93fb449..660880ae718a 100644 --- a/Makefile +++ b/Makefile @@ -115,7 +115,7 @@ target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docke docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-cavm/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) +target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-cavm/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 384b9dbc74a8..8531125018d7 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -39,10 +39,6 @@ fi service rsyslog start -if [ "$onie_platform" == "x86_64-accton_as7512_32x-r0" ]; then - swssconfig /etc/ssw/AS7512/copp.json -fi - while true; do # Check if syncd starts result=`echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p` From 457591a3657967a79a78cd130b3ec3ce3eec20c8 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 2 Oct 2016 23:42:11 -0700 Subject: [PATCH 0038/1011] p4: fix build dependency for python-p4c-bm (#25) --- src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index b4f296967d1b..38bcaf7cfaf1 100644 --- a/src/Makefile +++ b/src/Makefile @@ -41,7 +41,7 @@ p4-bmv2_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3-2 python-p4-hlir_0.9.36-1_all.deb: pushd p4-hlir; ./build.sh; popd -python-p4c-bm_1.0.0-5415c416-1_all.deb: python-tenjin_1.1.1-1_all.deb +python-p4c-bm_1.0.0-5415c416-1_all.deb: python-tenjin_1.1.1-1_all.deb python-p4-hlir_0.9.36-1_all.deb $(foreach dep, $^, $(call install_deb, $(dep))) pushd p4c-bm; ./build.sh; popd From 94ae04d2a7195f14152be8f779ece3c2c3e034ac Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Thu, 15 Sep 2016 16:14:34 -0700 Subject: [PATCH 0039/1011] Use cffi version 1.7.0. Newest versions doesn't work with nanomsg --- dockers/docker-syncd-mlnx-rpc/Dockerfile | 4 ++-- dockers/docker-syncd-rpc/Dockerfile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dockers/docker-syncd-mlnx-rpc/Dockerfile b/dockers/docker-syncd-mlnx-rpc/Dockerfile index 0e13887adf43..ca68b8a29304 100644 --- a/dockers/docker-syncd-mlnx-rpc/Dockerfile +++ b/dockers/docker-syncd-mlnx-rpc/Dockerfile @@ -26,8 +26,8 @@ RUN apt-get update \ && cd .. \ && rm -fr nanomsg-1.0.0 \ && rm -f 1.0.0.tar.gz \ - && pip install cffi \ - && pip install --upgrade cffi \ + && pip install cffi==1.7.0 \ + && pip install --upgrade cffi==1.7.0 \ && pip install nnpy \ && mkdir -p /opt \ && cd /opt \ diff --git a/dockers/docker-syncd-rpc/Dockerfile b/dockers/docker-syncd-rpc/Dockerfile index 7a34a46a1756..e7f6912746fe 100644 --- a/dockers/docker-syncd-rpc/Dockerfile +++ b/dockers/docker-syncd-rpc/Dockerfile @@ -26,8 +26,8 @@ RUN apt-get update \ && cd .. \ && rm -fr nanomsg-1.0.0 \ && rm -f 1.0.0.tar.gz \ - && pip install cffi \ - && pip install --upgrade cffi \ + && pip install cffi==1.7.0 \ + && pip install --upgrade cffi==1.7.0 \ && pip install nnpy \ && mkdir -p /opt \ && cd /opt \ From 28fa109e426dcaaf4643641bc0bd38b715a62cc5 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Wed, 5 Oct 2016 21:18:37 +0300 Subject: [PATCH 0040/1011] Changed docker-syncd-mlnx docker-saiserver-mlnx dependencies to use libnl provided by build system instead of sx-libnl. (#26) --- dockers/docker-saiserver-mlnx/Dockerfile | 8 +++++--- dockers/docker-syncd-mlnx/Dockerfile | 1 - src/mlnx-sdk/filelist.txt | 3 --- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/dockers/docker-saiserver-mlnx/Dockerfile b/dockers/docker-saiserver-mlnx/Dockerfile index bdeec7748332..9390d19e88a0 100755 --- a/dockers/docker-saiserver-mlnx/Dockerfile +++ b/dockers/docker-saiserver-mlnx/Dockerfile @@ -2,7 +2,7 @@ FROM docker-base RUN apt-get update -COPY ["deps/applibs_*.deb", "/deps/applibs-dev_*.deb", "/deps/sx-complib_*.deb", "/deps/sxd-libs_*.deb", "/deps/sx-scew_*.deb", "/deps/sx-examples_*.deb", "/deps/sx-gen-utils_*.deb", "/deps/python-sdk-api_*.deb", "/deps/sx-libnl_*.deb", "/deps/iproute2_*.deb", "/deps/mlnx-sai_*.deb", "/deps/libthrift-0.9.2_*.deb", "/deps/"] +COPY ["deps/applibs_*.deb", "/deps/applibs-dev_*.deb", "/deps/sx-complib_*.deb", "/deps/sxd-libs_*.deb", "/deps/sx-scew_*.deb", "/deps/sx-examples_*.deb", "/deps/sx-gen-utils_*.deb", "/deps/python-sdk-api_*.deb", "/deps/iproute2_*.deb", "/deps/mlnx-sai_*.deb", "/deps/libthrift-0.9.2_*.deb", "/deps/libnl-3-200_*.deb", "/deps/libnl-genl-3-200_*.deb", "/deps/libnl-route-3-200_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ dpkg_apt /deps/applibs_*.deb \ @@ -13,10 +13,12 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/sx-examples_*.deb \ && dpkg_apt /deps/sx-gen-utils_*.deb \ && dpkg_apt /deps/python-sdk-api_*.deb \ - && dpkg_apt /deps/sx-libnl_*.deb \ && dpkg_apt /deps/iproute2_*.deb \ && dpkg_apt /deps/mlnx-sai_*.deb \ - && dpkg_apt /deps/libthrift-0.9.2_*.deb + && dpkg_apt /deps/libthrift-0.9.2_*.deb \ + && dpkg_apt /deps/libnl-3-200_*.deb \ + && dpkg_apt /deps/libnl-genl-3-200_*.deb \ + && dpkg_apt /deps/libnl-route-3-200_*.deb COPY ["deps/saiserver", "start.sh", "/usr/bin/"] diff --git a/dockers/docker-syncd-mlnx/Dockerfile b/dockers/docker-syncd-mlnx/Dockerfile index 578782c1f15e..5dcca1402a39 100755 --- a/dockers/docker-syncd-mlnx/Dockerfile +++ b/dockers/docker-syncd-mlnx/Dockerfile @@ -13,7 +13,6 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/sx-examples_*.deb \ && dpkg_apt /deps/sx-gen-utils_*.deb \ && dpkg_apt /deps/python-sdk-api_*.deb \ - && dpkg_apt /deps/sx-libnl_*.deb \ && dpkg_apt /deps/iproute2_*.deb \ && dpkg_apt /deps/mft*.deb \ diff --git a/src/mlnx-sdk/filelist.txt b/src/mlnx-sdk/filelist.txt index de603733b860..4426909780d1 100644 --- a/src/mlnx-sdk/filelist.txt +++ b/src/mlnx-sdk/filelist.txt @@ -19,9 +19,6 @@ sx-gen-utils-dev_1.mlnx.4.2.2100_amd64.deb sx-gen-utils_1.mlnx.4.2.2100_amd64.deb sx-kernel-dev_1.mlnx.4.2.2100_amd64.deb sx-kernel_1.mlnx.4.2.2100_amd64.deb -sx-libnl-dev-static_1.mlnx.4.2.2100_amd64.deb -sx-libnl-dev_1.mlnx.4.2.2100_amd64.deb -sx-libnl_1.mlnx.4.2.2100_amd64.deb sx-scew-dev-static_1.mlnx.4.2.2100_amd64.deb sx-scew-dev_1.mlnx.4.2.2100_amd64.deb sx-scew_1.mlnx.4.2.2100_amd64.deb From 4373c518cf0b12c39b0830bca53bf1562d077615 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 7 Oct 2016 10:41:44 -0700 Subject: [PATCH 0041/1011] libteam: Adding build.sh script and docker-team (#18) --- Makefile | 23 +++++++++++++++++------ dockers/docker-fpm/Dockerfile | 3 +-- dockers/docker-team/Dockerfile | 25 +++++++++++++++++++++++++ dockers/docker-team/start.sh | 24 ++++++++++++++++++++++++ src/Makefile | 18 ++++++++++++------ src/libteam/build.sh | 26 ++++++++++++++++++++++++++ 6 files changed, 105 insertions(+), 14 deletions(-) create mode 100644 dockers/docker-team/Dockerfile create mode 100755 dockers/docker-team/start.sh create mode 100755 src/libteam/build.sh diff --git a/Makefile b/Makefile index 660880ae718a..4241e856246e 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,7 @@ BRCM-SDK-DEBS=$(notdir $(wildcard src/brcm-sdk/*.deb)) CAVM-SDK-DEBS=$(notdir $(wildcard src/cavm-sdk/*.deb)) LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb libnl-genl-3-200_3.2.27-1_amd64.deb libnl-route-3-200_3.2.27-1_amd64.deb +LIBTEAM-DEBS=libteam5_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb ## Function: build_docker, image_name save_file ## build a docker image and save to a file @@ -34,6 +35,12 @@ dockers/docker-fpm/deps/fpmsyncd: src/fpmsyncd mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-fpm/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) + +## Rules: docker-team +dockers/docker-team/deps/teamsyncd: src/teamsyncd + mkdir -p `dirname $@` && cp $< $(dir $@) +dockers/docker-team/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) ## Rules: docker-orchagent-mlnx dockers/docker-orchagent-mlnx/deps/libsairedis_1.0.0_amd64.deb: src/mlnx/libsairedis_1.0.0_amd64.deb @@ -107,21 +114,25 @@ target/docker-syncd-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-sy docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS)) +target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS)) +target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-cavm/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS)) +target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-cavm/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb fpmsyncd) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + +target/docker-team.gz: target/docker-base.gz $(addprefix dockers/docker-team/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb $(LIBTEAM-DEBS)) + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) target/docker-database.gz: target/docker-base.gz docker load < $< @@ -143,12 +154,12 @@ target/sonic-aboot.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_am ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=aboot ./build_image.sh ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -brcm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz docker-database.gz) +brcm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz docker-team.gz docker-database.gz) ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -mlnx-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz docker-database.gz) +mlnx-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz docker-team.gz docker-database.gz) ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -cavm-all: $(addprefix target/,docker-syncd-cavm.gz docker-orchagent-cavm.gz docker-fpm.gz docker-database.gz) +cavm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-cavm.gz docker-orchagent-cavm.gz docker-fpm.gz docker-team.gz docker-database.gz) p4-all: $(addprefix target/,docker-sonic-p4.gz) diff --git a/dockers/docker-fpm/Dockerfile b/dockers/docker-fpm/Dockerfile index d877c408baab..287aba29ec82 100755 --- a/dockers/docker-fpm/Dockerfile +++ b/dockers/docker-fpm/Dockerfile @@ -7,12 +7,11 @@ COPY ["deps/libhiredis0.13*.deb", "deps/libswsscommon_*.deb", "deps/quagga_*", " ## Get fpmsyncd RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libswsscommon_*.deb -COPY deps/fpmsyncd /usr/local/bin/ ## Get Quagga RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/quagga_*.deb -COPY start.sh /usr/bin/start.sh +COPY ["deps/fpmsyncd", "start.sh", "/usr/bin/"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y diff --git a/dockers/docker-team/Dockerfile b/dockers/docker-team/Dockerfile new file mode 100644 index 000000000000..8ba298043be1 --- /dev/null +++ b/dockers/docker-team/Dockerfile @@ -0,0 +1,25 @@ +FROM docker-base + +COPY ["deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "libnl-route-3-200_*.deb", "deps/libnl-cli-3-200_*.deb", "deps/libteam5_*.deb", "deps/libteam-dev_*.deb", "deps/libteam-utils_*.deb", "deps/libteamdctl0_*.deb", "deps/libhiredis0.13_*.deb", "deps/libswsscommon_*.deb", "/deps/"] + + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/libnl-3-200_*.deb \ + && dpkg_apt /deps/libnl-genl-3-200_*.deb \ + && dpkg_apt /deps/libnl-route-3-200_*.deb \ + && dpkg_apt /deps/libnl-cli-3-200_*.deb \ + && dpkg_apt /deps/libteam5_*.deb \ + && dpkg_apt /deps/libteam-dev_*.deb \ + && dpkg_apt /deps/libteam-utils_*.deb \ + && dpkg_apt /deps/libteamdctl0_*.deb \ + && dpkg_apt /deps/libhiredis0.13_*.deb \ + && dpkg_apt /deps/libswsscommon_*.deb + +COPY ["deps/teamsyncd", "start.sh", "/usr/bin/"] + +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] + diff --git a/dockers/docker-team/start.sh b/dockers/docker-team/start.sh new file mode 100755 index 000000000000..61251cd82d86 --- /dev/null +++ b/dockers/docker-team/start.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +TEAMD_CONF_PATH=/etc/teamd + +function clean_up { + pkill -9 teamd + pkill -9 teamsyncd + service rsyslog stop + exit +} + +trap clean_up SIGTERM SIGKILL + +service rsyslog start + +if [ -d $TEAMD_CONF_PATH ]; then + for f in $TEAMD_CONF_PATH/*; do + teamd -f $f -d + done +fi + +teamsyncd & + +read diff --git a/src/Makefile b/src/Makefile index 38bcaf7cfaf1..9dd79d5b9bd6 100644 --- a/src/Makefile +++ b/src/Makefile @@ -22,6 +22,9 @@ install_deb = \ libnl-%.deb: pushd libnl3; ./build.sh; popd +libteam5_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb: libnl-%.deb + pushd libteam; ./build.sh; popd + quagga_0.99.24.1-2_amd64.deb: pushd quagga; ./build.sh; popd @@ -80,26 +83,29 @@ p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0 mkdir -p p4 cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb p4/ -## Note: fpmsyncd is one implicit target -brcm/swss_1.0.0_amd64.deb brcm/intfsyncd brcm/neighsyncd brcm/orchagent brcm/portsyncd brcm/routeresync brcm/swssconfig: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb +## Note: fpmsyncd and teamsyncd are two implicit targets +brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb brcm/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . + cp sonic-swss/debian/swss/usr/bin/teamsyncd . -## Note: fpmsyncd is one implicit target -mlnx/swss_1.0.0_amd64.deb mlnx/intfsyncd mlnx/neighsyncd mlnx/orchagent mlnx/portsyncd mlnx/routeresync mlnx/swssconfig: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb +## Note: fpmsyncd and teamsyncd are two implicit targets +mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb mlnx/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . + cp sonic-swss/debian/swss/usr/bin/teamsyncd . -## Note: fpmsyncd is one implicit target -cavm/swss_1.0.0_amd64.deb cavm/intfsyncd cavm/neighsyncd cavm/orchagent cavm/portsyncd cavm/routeresync cavm/swssconfig: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb +## Note: fpmsyncd and teamsyncd are two implicit targets +cavm/swss_1.0.0_amd64.deb: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb cavm/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . + cp sonic-swss/debian/swss/usr/bin/teamsyncd . p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) diff --git a/src/libteam/build.sh b/src/libteam/build.sh new file mode 100755 index 000000000000..8a7e69cfb1a2 --- /dev/null +++ b/src/libteam/build.sh @@ -0,0 +1,26 @@ +#!/bin/bash +## This script is to build libteam +## +## USAGE: +## ./build.sh + +# Obtain libteam +rm -rf ./libteam +git clone https://github.com/jpirko/libteam.git +pushd ./libteam +git checkout -f v1.26 +popd + +git clone https://anonscm.debian.org/git/collab-maint/libteam.git tmp +pushd ./tmp +git checkout -f da006f2 # v1.26 +popd +mv tmp/debian libteam/ +rm -rf tmp + +pushd ./libteam +dpkg-buildpackage -rfakeroot -b -us -uc + +popd +cp *.deb .. + From dcf691ecaa7eef66b34a942e09d3ed27d4a87c33 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Sun, 9 Oct 2016 14:40:55 -0700 Subject: [PATCH 0042/1011] Add libnl-nf-3-200 to docker-team (#28) --- dockers/docker-team/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-team/Dockerfile b/dockers/docker-team/Dockerfile index 8ba298043be1..885b99674b85 100644 --- a/dockers/docker-team/Dockerfile +++ b/dockers/docker-team/Dockerfile @@ -1,12 +1,13 @@ FROM docker-base -COPY ["deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "libnl-route-3-200_*.deb", "deps/libnl-cli-3-200_*.deb", "deps/libteam5_*.deb", "deps/libteam-dev_*.deb", "deps/libteam-utils_*.deb", "deps/libteamdctl0_*.deb", "deps/libhiredis0.13_*.deb", "deps/libswsscommon_*.deb", "/deps/"] +COPY ["deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libnl-nf-3-200_*.deb", "deps/libnl-cli-3-200_*.deb", "deps/libteam5_*.deb", "deps/libteam-dev_*.deb", "deps/libteam-utils_*.deb", "deps/libteamdctl0_*.deb", "deps/libhiredis0.13_*.deb", "deps/libswsscommon_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ dpkg_apt /deps/libnl-3-200_*.deb \ && dpkg_apt /deps/libnl-genl-3-200_*.deb \ && dpkg_apt /deps/libnl-route-3-200_*.deb \ + && dpkg_apt /deps/libnl-nf-3-200_*.deb \ && dpkg_apt /deps/libnl-cli-3-200_*.deb \ && dpkg_apt /deps/libteam5_*.deb \ && dpkg_apt /deps/libteam-dev_*.deb \ From d5696f742dca12f690c5a68b85dec5da7f5d3be8 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 9 Oct 2016 18:05:24 -0700 Subject: [PATCH 0043/1011] Add support for Arista a7050 qx32 platform (#30) --- dockers/docker-orchagent/start.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 8531125018d7..fe9528d99b65 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -30,6 +30,9 @@ PORTSYNCD_ARGS="" if [ "$onie_platform" == "x86_64-dell_s6000_s1220-r0" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" PORTSYNCD_ARGS+="-p /etc/ssw/Force10-S6000/port_config.ini" +elif [ "$aboot_platform" == "x86_64-arista_7050_qx32" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" + PORTSYNCD_ARGS+="-p /etc/ssw/Arista-7050-QX32/port_config.ini" elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ]; then PORTSYNCD_ARGS+="-p /etc/ssw/ACS-MSN2700/port_config.ini" elif [ "$onie_platform" == "x86_64-accton_as7512_32x-r0" ]; then From 6042f526f2903e5131c8a52b40f307070c0de7c6 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 12 Oct 2016 10:29:14 -0700 Subject: [PATCH 0044/1011] Update README.md Run the sonic-slave container with --privileged. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 897c03c7b337..f79e78746776 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Build a docker image by [the Dockerfile](https://github.com/Azure/sonic-build-to git clone https://github.com/Azure/sonic-build-tools cd sonic-build-tools ./build.sh sonic-slave - docker run -v /var/run/docker.sock:/var/run/docker.sock -it local/sonic-slave bash + docker run -v /var/run/docker.sock:/var/run/docker.sock -it --privileged local/sonic-slave bash Note that all the below steps should be executed in the docker container, not in the host machine. From e5d8289f0b51469dc1ea4ca2e1adafeba5bbb095 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 14 Oct 2016 14:12:54 -0700 Subject: [PATCH 0045/1011] Use quagga sources as a git submodule (#32) --- .gitmodules | 4 ++++ src/Makefile | 6 +++--- src/quagga/build.sh | 36 ------------------------------------ src/sonic-quagga | 1 + 4 files changed, 8 insertions(+), 39 deletions(-) delete mode 100755 src/quagga/build.sh create mode 160000 src/sonic-quagga diff --git a/.gitmodules b/.gitmodules index a6a4a1a9f611..8b5f020f356e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -25,3 +25,7 @@ [submodule "src/p4-hlir/p4-hlir"] path = src/p4-hlir/p4-hlir url = https://github.com/p4lang/p4-hlir +[submodule "quagga"] + path = src/sonic-quagga + url = https://github.com/Azure/sonic-quagga + branch = debian/0.99.24.1 diff --git a/src/Makefile b/src/Makefile index 9dd79d5b9bd6..9b7cc582a59d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -25,9 +25,6 @@ libnl-%.deb: libteam5_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb: libnl-%.deb pushd libteam; ./build.sh; popd -quagga_0.99.24.1-2_amd64.deb: - pushd quagga; ./build.sh; popd - redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb redis-sentinel_3.0.7-2_amd64.deb: pushd redis; ./build.sh; popd @@ -55,6 +52,9 @@ p4-switch_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3 $(foreach dep, $^, $(call install_deb, $(dep))) pushd p4-switch; ./build.sh; popd +quagga_0.99.24.1-2.1_amd64.deb: + $(call build_project, sonic-quagga) + libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb: redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss-common) diff --git a/src/quagga/build.sh b/src/quagga/build.sh deleted file mode 100755 index 03ea3bf5cd5a..000000000000 --- a/src/quagga/build.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -x - -mkdir quagga - -# Get debian source for 0.9.24.1-2 -wget -O quagga_0.99.24.1.orig.tar.gz 'https://sonicstorage.blob.core.windows.net/packages/quagga_0.99.24.1.orig.tar.gz?sv=2015-04-05&sr=b&sig=7g3AC%2FkoX3wYztJYtXFt6Wl7zj%2BYwLkbXVNaSaRvUDU%3D&se=2026-07-21T00%3A07%3A31Z&sp=r' -tar -xzf quagga_0.99.24.1.orig.tar.gz --strip-components=1 -C quagga -ls -lrt - -# Get debian packaging for 0.99.24.1-2 -wget -O quagga_0.99.24.1-2.debian.tar.xz 'https://sonicstorage.blob.core.windows.net/packages/quagga_0.99.24.1-2.debian.tar.xz?sv=2015-04-05&sr=b&sig=VFEq4ec99OjVaypAx14DkO5I8N4CIBIPOuSw79qHUXg%3D&se=2026-07-21T00%3A03%3A10Z&sp=r' -tar -xJf quagga_0.99.24.1-2.debian.tar.xz -C quagga -ls -lrt - -cd quagga -ls -lrt - -# Enable FPM in debian/rules -awk '/--with-libpam/ { print; print " --enable-fpm \\"; next }1' debian/rules > tmp && mv tmp debian/rules - -# Update changelog -#echo 'quagga (0.99.24.1-2.1) unstable; urgency=medium -# -# * Non-maintainer upload. -# * enable fpm -# -# -- Guohan Lu Sat, 18 Jul 2015 16:10:47 -0700 -#' > tmp && cat debian/changelog >> tmp && mv tmp debian/changelog - -#./configure --enable-fpm -#make - -sudo chmod a+x debian/rules -dpkg-buildpackage -rfakeroot -b -us -uc -cd .. -cp *.deb .. diff --git a/src/sonic-quagga b/src/sonic-quagga new file mode 160000 index 000000000000..1997fb28efe4 --- /dev/null +++ b/src/sonic-quagga @@ -0,0 +1 @@ +Subproject commit 1997fb28efe441a761b16559775006a2e37913e0 From 51fa77fa8dfec25f9f8cdaf43f87daaad2744d75 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 18 Oct 2016 21:22:29 +0300 Subject: [PATCH 0046/1011] Automatic fw upgrade for mlnx platform (#31) * Automatic fw upgrade for mlnx platform Implement script for firmware upgrade to required version Add firmware binary and script to ops-syncd-mlnx container Add pciutils and usbutils to sonic-generic.bin * Update firmware installation message It is possible to do both upgrade and downgrade Change "Upgrading" to "Installing compatible version" Signed-off-by: marian-pritsak --- Makefile | 4 +- build_debian.sh | 4 +- dockers/docker-syncd-mlnx/Dockerfile | 2 + dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh | 53 ++++++++++++++++++++ dockers/docker-syncd-mlnx/start.sh | 4 ++ 5 files changed, 65 insertions(+), 2 deletions(-) create mode 100755 dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh diff --git a/Makefile b/Makefile index 4241e856246e..81c1b3e9a084 100644 --- a/Makefile +++ b/Makefile @@ -73,6 +73,8 @@ $(addprefix dockers/docker-syncd-mlnx/deps/,syncd_1.0.0_amd64.deb libsairedis_1. mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-syncd-mlnx/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) +dockers/docker-syncd-mlnx/deps/fw-SPC.mfa: src/mlnx-sdk/fw-SPC.mfa + mkdir -p `dirname $@` && cp $< $(dir $@) ## Rules: docker-syncd-cavm $(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS)) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm-sdk/%.deb @@ -106,7 +108,7 @@ target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/d docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb $(LIBNL-DEBS)) +target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb $(LIBNL-DEBS)) dockers/docker-syncd-mlnx/deps/fw-SPC.mfa docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) diff --git a/build_debian.sh b/build_debian.sh index 95d80f5a03d5..304b474e9a60 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -183,7 +183,9 @@ sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install \ bsdmainutils \ ca-certificates \ i2c-tools \ - efibootmgr + efibootmgr \ + usbutils \ + pciutils ## Remove sshd host keys, and will regenerate on first sshd start sudo rm -f $FILESYSTEM_ROOT/etc/ssh/ssh_host_*_key* diff --git a/dockers/docker-syncd-mlnx/Dockerfile b/dockers/docker-syncd-mlnx/Dockerfile index 5dcca1402a39..fb7a5fcad01e 100755 --- a/dockers/docker-syncd-mlnx/Dockerfile +++ b/dockers/docker-syncd-mlnx/Dockerfile @@ -27,6 +27,8 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb COPY ["start.sh", "/usr/bin/"] +COPY ["mlnx-fw-upgrade.sh", "/usr/bin/"] +COPY ["/deps/fw-SPC.mfa", "/etc/mlnx/"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y diff --git a/dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh b/dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh new file mode 100755 index 000000000000..2ef46685f801 --- /dev/null +++ b/dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +query_retry_count_max="10" +required_fw_version="13.1130.0010" +fw_file=/etc/mlnx/fw-SPC.mfa + +run_or_fail() { + $1 + if [[ $? != 0 ]]; then + echo $1 failed + exit 1 + fi +} + +# wait until devices will be available +query_retry_count="0" +mlxfwmanager --query > /dev/null + +while [[ (${query_retry_count} -lt ${query_retry_count_max}) && ($? -ne "0") ]]; do + sleep 1 + query_retry_count=$[${query_retry_count}+1] + mlxfwmanager --query > /dev/null +done + +run_or_fail "mlxfwmanager --query" > /tmp/mlnxfwmanager-query.txt + +# get current firmware version +found_fw=false +for word in `cat /tmp/mlnxfwmanager-query.txt` +do + if [[ ${found_fw} == true ]]; then + fw_version=${word} + break + fi + if [[ ${word} == FW ]]; then + found_fw=true + fi +done + +if [[ -z ${fw_version} ]]; then + echo "Could not retreive current FW version." + exit 1 +fi + +if [[ ${required_fw_version} == ${fw_version} ]]; then + echo "Mellanox firmware is up to date." +else + echo "Mellanox firmware required version is ${required_fw_version}. Installing compatible version..." + run_or_fail "mlxfwmanager -i ${fw_file} -u -f -y" + + # exit from here so that syncd service will restart + exit 0 +fi diff --git a/dockers/docker-syncd-mlnx/start.sh b/dockers/docker-syncd-mlnx/start.sh index 3e5b941a7658..63dbc8bfb2c4 100755 --- a/dockers/docker-syncd-mlnx/start.sh +++ b/dockers/docker-syncd-mlnx/start.sh @@ -8,6 +8,10 @@ function clean_up { trap clean_up SIGTERM SIGKILL +# fw-upgrade will exit if firmware was actually upgraded or if some error +# occures +. mlnx-fw-upgrade.sh + service rsyslog start service syncd start From 93852194eb9bcda6810ae556b5e757b32631371b Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 19 Oct 2016 14:39:44 -0700 Subject: [PATCH 0047/1011] start.sh: Remove rsyslogd.pid file on mlnx syncd docker (#35) --- dockers/docker-syncd-mlnx/start.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dockers/docker-syncd-mlnx/start.sh b/dockers/docker-syncd-mlnx/start.sh index 63dbc8bfb2c4..3c07069ba26e 100755 --- a/dockers/docker-syncd-mlnx/start.sh +++ b/dockers/docker-syncd-mlnx/start.sh @@ -12,6 +12,9 @@ trap clean_up SIGTERM SIGKILL # occures . mlnx-fw-upgrade.sh +# FIXME: the script cannot trap SIGTERM signal and it exits without clean_up +# Remove rsyslogd.pid file manually so that to start the rsyslog instantly +[ -e /var/run/rsyslogd.pid ] && rm /var/run/rsyslogd.pid service rsyslog start service syncd start From d45ff354e21ea86b001659a15e5b7a87c514b071 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 21 Oct 2016 00:29:27 -0700 Subject: [PATCH 0048/1011] check the existence of platforms/ before including it (#37) --- installer/x86_64/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index e49a6484e00c..90253e56f26e 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -51,7 +51,7 @@ CONSOLE_SPEED=9600 # Get platform specific linux kernel command line arguments ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="" -source platforms/$onie_platform +[ -r platforms/$onie_platform ] && source platforms/$onie_platform # Install demo on same block device as ONIE onie_dev=$(blkid | grep ONIE-BOOT | head -n 1 | awk '{print $1}' | sed -e 's/:.*$//') From 7d9fd3c4f8501c6f8d9cd0a271d145ea1e8b9ddd Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 22 Oct 2016 00:56:50 -0700 Subject: [PATCH 0049/1011] build mft-kernel binary debian package (#36) --- src/Makefile | 3 +++ src/mft/build.sh | 22 ++++++++++++++++++++++ src/mlnx-sdk/filelist.txt | 1 - 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100755 src/mft/build.sh diff --git a/src/Makefile b/src/Makefile index 9b7cc582a59d..c1bfb78bf839 100644 --- a/src/Makefile +++ b/src/Makefile @@ -38,6 +38,9 @@ p4-bmv2_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3-2 $(foreach dep, $^, $(call install_deb, $(dep))) pushd p4-bmv2; ./build.sh; popd +kernel-mft-dkms_4.5.0-3.16.0-4-amd64_all.deb mft-4.5.0-31.amd64.deb: + pushd mft; ./build.sh; popd + python-p4-hlir_0.9.36-1_all.deb: pushd p4-hlir; ./build.sh; popd diff --git a/src/mft/build.sh b/src/mft/build.sh new file mode 100755 index 000000000000..44aa233a3124 --- /dev/null +++ b/src/mft/build.sh @@ -0,0 +1,22 @@ +#!/bin/bash +## This script is to build the kernel-mft-dkms_4.5.0-3.16.0-4-amd64 kernel modules +## +## USAGE: +## ./build.sh + +MFT_NAME=mft-4.5.0-31-x86_64-deb +MFT_TGZ=${MFT_NAME}.tgz +MFT_KERNEL_DEB=kernel-mft-dkms_4.5.0-31_all.deb +KERNELVER=3.16.0-4-amd64 + +wget -N http://www.mellanox.com/downloads/MFT/${MFT_TGZ} +tar xzf $MFT_TGZ +pushd $MFT_NAME/SDEBS +dpkg -i $MFT_KERNEL_DEB +TARBALL_PATH=$(dkms mkdriverdisk kernel-mft-dkms/4.5.0 -a all -d ubuntu -k ${KERNELVER} --media tar | grep "Disk image location" | cut -d':' -f2) +echo $TARBALL_PATH +tar xvf $TARBALL_PATH +popd + +cp $MFT_NAME/SDEBS/ubuntu-drivers/3.16.0/kernel-mft-dkms_4.5.0-3.16.0-4-amd64_all.deb ../ +cp $MFT_NAME/DEBS/mft-4.5.0-31.amd64.deb ../ diff --git a/src/mlnx-sdk/filelist.txt b/src/mlnx-sdk/filelist.txt index 4426909780d1..52583c7f79c7 100644 --- a/src/mlnx-sdk/filelist.txt +++ b/src/mlnx-sdk/filelist.txt @@ -5,7 +5,6 @@ applibs-dev_1.mlnx.4.2.2100_amd64.deb applibs_1.mlnx.4.2.2100_amd64.deb iproute2-dev_1.mlnx.4.2.2100_amd64.deb iproute2_1.mlnx.4.2.2100_amd64.deb -mft_4.1.0-28_amd64.deb mlnx-sai_1.mlnx.160712_amd64.deb python-sdk-api_1.mlnx.4.2.2100_amd64.deb sx-acl-rm-dev_1.mlnx.4.2.2100_amd64.deb From 293db925506f5bdf873f1a82fad32c2cd29a9377 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 24 Oct 2016 14:05:56 -0700 Subject: [PATCH 0050/1011] Apply swss configuration in a deterministic way (#39) * Apply swss configuration in determine way * Apply configs in small chunks * Add qos settings for Arista --- dockers/docker-orchagent/start.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index fe9528d99b65..0cea8e4de988 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -5,7 +5,11 @@ function start_app { portsyncd $PORTSYNCD_ARGS & intfsyncd & neighsyncd & - swssconfig & + for file in $SWSSCONFIG_ARGS + do + swssconfig /etc/swss/config.d/$file + sleep 1 + done } function clean_up { @@ -27,12 +31,18 @@ ORCHAGENT_ARGS="" PORTSYNCD_ARGS="" +SWSSCONFIG_ARGS="00-copp.config.json " + if [ "$onie_platform" == "x86_64-dell_s6000_s1220-r0" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" PORTSYNCD_ARGS+="-p /etc/ssw/Force10-S6000/port_config.ini" + SWSSCONFIG_ARGS+="td2.32ports.qos.1.json td2.32ports.qos.2.json td2.32ports.qos.3.json td2.32ports.qos.4.json td2.32ports.qos.5.json td2.32ports.qos.6.json " + SWSSCONFIG_ARGS+="td2.32ports.buffers.1.json td2.32ports.buffers.2.json td2.32ports.buffers.3.json " elif [ "$aboot_platform" == "x86_64-arista_7050_qx32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" PORTSYNCD_ARGS+="-p /etc/ssw/Arista-7050-QX32/port_config.ini" + SWSSCONFIG_ARGS+="td2.32ports.qos.1.json td2.32ports.qos.2.json td2.32ports.qos.3.json td2.32ports.qos.4.json td2.32ports.qos.5.json td2.32ports.qos.6.json " + SWSSCONFIG_ARGS+="td2.32ports.buffers.1.json td2.32ports.buffers.2.json td2.32ports.buffers.3.json " elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ]; then PORTSYNCD_ARGS+="-p /etc/ssw/ACS-MSN2700/port_config.ini" elif [ "$onie_platform" == "x86_64-accton_as7512_32x-r0" ]; then From 42f1b55ec7559ac84f2b628b7dda0c3c0f54e6a0 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 26 Oct 2016 13:19:50 -0700 Subject: [PATCH 0051/1011] add get docker base script to download pre-compiled docker base image (#40) --- get_docker-base.sh | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100755 get_docker-base.sh diff --git a/get_docker-base.sh b/get_docker-base.sh new file mode 100755 index 000000000000..088b6bf46b29 --- /dev/null +++ b/get_docker-base.sh @@ -0,0 +1,17 @@ +#!/bin/bash +## This script is to retrieve and import the docker-base image from +## local folder where the image is built on the local machine +## +## USAGE: +## ./get_docker-base.sh + +set -x -e + +. ./functions.sh + +## [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Read-only link of Azure Blob storage with shared access signature (SAS)")] +BASE_URL="https://sonicstorage.blob.core.windows.net/packages/docker-base.ea507753d98b0769e2a15be13003331f8ad38d1c15b40a683e05fc53b1463b10.gz?sv=2015-04-05&sr=b&sig=DjbdpLaslHeiaZLwFuauhPA2wR0v7kOH5yPHiAbzgBc%3D&se=2016-10-28T13%3A04%3A23Z&sp=r" + +base_image_name=docker-base +docker_try_rmi $base_image_name +curl "$BASE_URL" | docker load From 515346abf48c258ed9802dcdbe9c3bdfe7c0d99f Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 26 Oct 2016 15:19:41 -0700 Subject: [PATCH 0052/1011] Dockerfile: Add libsaimetadata dependency (#42) * Dockerfile: Add libsaimetadata dependency * Makefile: Add saimetadata --- Makefile | 34 ++++++++++++---------------- dockers/docker-orchagent/Dockerfile | 3 ++- dockers/docker-sonic-p4/Dockerfile | 3 ++- dockers/docker-syncd-cavm/Dockerfile | 3 ++- dockers/docker-syncd-mlnx/Dockerfile | 3 ++- dockers/docker-syncd/Dockerfile | 3 ++- src/Makefile | 24 ++++++++++---------- src/sonic-swss | 2 +- 8 files changed, 37 insertions(+), 38 deletions(-) diff --git a/Makefile b/Makefile index 81c1b3e9a084..03a67bde0937 100644 --- a/Makefile +++ b/Makefile @@ -43,25 +43,19 @@ dockers/docker-team/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) ## Rules: docker-orchagent-mlnx -dockers/docker-orchagent-mlnx/deps/libsairedis_1.0.0_amd64.deb: src/mlnx/libsairedis_1.0.0_amd64.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-orchagent-mlnx/deps/swss_1.0.0_amd64.deb: src/mlnx/swss_1.0.0_amd64.deb +$(addprefix dockers/docker-orchagent-mlnx/deps/,libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb) : dockers/docker-orchagent-mlnx/deps/%.deb : src/mlnx/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-orchagent-mlnx/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) ## Rules: docker-orchagent-cavm -dockers/docker-orchagent-cavm/deps/libsairedis_1.0.0_amd64.deb: src/cavm/libsairedis_1.0.0_amd64.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-orchagent-cavm/deps/swss_1.0.0_amd64.deb: src/cavm/swss_1.0.0_amd64.deb +$(addprefix dockers/docker-orchagent-cavm/deps/,libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb) : dockers/docker-orchagent-cavm/deps/%.deb : src/cavm/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-orchagent-cavm/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) ## Rules: docker-orchagent (brcm) -dockers/docker-orchagent/deps/libsairedis_1.0.0_amd64.deb: src/brcm/libsairedis_1.0.0_amd64.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-orchagent/deps/swss_1.0.0_amd64.deb: src/brcm/swss_1.0.0_amd64.deb +$(addprefix dockers/docker-orchagent/deps/,libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb) : dockers/docker-orchagent/deps/%.deb : src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-orchagent/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) @@ -69,7 +63,7 @@ dockers/docker-orchagent/deps/%.deb: src/%.deb ## Rules: docker-syncd-mlnx $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS)) : dockers/docker-syncd-mlnx/deps/%.deb : src/mlnx-sdk/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) -$(addprefix dockers/docker-syncd-mlnx/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) : dockers/docker-syncd-mlnx/deps/%.deb : src/mlnx/%.deb +$(addprefix dockers/docker-syncd-mlnx/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb) : dockers/docker-syncd-mlnx/deps/%.deb : src/mlnx/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-syncd-mlnx/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) @@ -79,7 +73,7 @@ dockers/docker-syncd-mlnx/deps/fw-SPC.mfa: src/mlnx-sdk/fw-SPC.mfa ## Rules: docker-syncd-cavm $(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS)) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm-sdk/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) -$(addprefix dockers/docker-syncd-cavm/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm/%.deb +$(addprefix dockers/docker-syncd-cavm/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-syncd-cavm/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) @@ -87,13 +81,13 @@ dockers/docker-syncd-cavm/deps/%.deb: src/%.deb ## Rules: docker-syncd (brcm) $(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS)) : dockers/docker-syncd/deps/%.deb : src/brcm-sdk/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) -$(addprefix dockers/docker-syncd/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb): dockers/docker-syncd/deps/%.deb : src/brcm/%.deb +$(addprefix dockers/docker-syncd/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb): dockers/docker-syncd/deps/%.deb : src/brcm/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-syncd/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) ## Rules: docker-sonic (p4) -$(addprefix dockers/docker-sonic-p4/deps/,swss_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) : dockers/docker-sonic-p4/deps/%.deb : src/p4/%.deb +$(addprefix dockers/docker-sonic-p4/deps/,swss_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb) : dockers/docker-sonic-p4/deps/%.deb : src/p4/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-sonic-p4/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) @@ -102,29 +96,29 @@ dockers/docker-sonic-p4/deps/%.deb: src/%.deb target/docker-base.gz: $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb syncd_1.0.0_amd64.deb $(LIBNL-DEBS)) +target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb $(LIBNL-DEBS)) ## TODO: remove placeholders for the dependencies touch dockers/docker-syncd/deps/{dsserve,bcmcmd} docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb $(LIBNL-DEBS)) dockers/docker-syncd-mlnx/deps/fw-SPC.mfa +target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb $(LIBNL-DEBS)) dockers/docker-syncd-mlnx/deps/fw-SPC.mfa docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-syncd-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb) +target/docker-syncd-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb $(LIBNL-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) +target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) +target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-cavm/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) +target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-cavm/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) @@ -140,7 +134,7 @@ target/docker-database.gz: target/docker-base.gz docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-sonic-p4.gz: target/docker-base.gz $(addprefix dockers/docker-sonic-p4/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb syncd_1.0.0_amd64.deb swss_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb p4-bmv2_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb) +target/docker-sonic-p4.gz: target/docker-base.gz $(addprefix dockers/docker-sonic-p4/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb syncd_1.0.0_amd64.deb swss_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb p4-bmv2_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) diff --git a/dockers/docker-orchagent/Dockerfile b/dockers/docker-orchagent/Dockerfile index dbdf01f3dd98..311fba152a64 100755 --- a/dockers/docker-orchagent/Dockerfile +++ b/dockers/docker-orchagent/Dockerfile @@ -2,7 +2,7 @@ FROM docker-base RUN apt-get update -COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/swss_*.deb", "/deps/"] +COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/swss_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ dpkg_apt /deps/libhiredis0.13*.deb \ @@ -11,6 +11,7 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/libnl-route-3-200_*.deb \ && dpkg_apt /deps/libswsscommon_*.deb \ && dpkg_apt /deps/libsairedis_*.deb \ + && dpkg_apt /deps/libsaimetadata_*.deb \ && dpkg_apt /deps/swss_*.deb RUN apt-get install -f -y ifupdown bridge-utils redis-tools diff --git a/dockers/docker-sonic-p4/Dockerfile b/dockers/docker-sonic-p4/Dockerfile index d5470bbd8837..163aa46296e5 100644 --- a/dockers/docker-sonic-p4/Dockerfile +++ b/dockers/docker-sonic-p4/Dockerfile @@ -4,7 +4,7 @@ RUN apt-get update RUN apt-get install -y net-tools ethtool tcpdump ifupdown -COPY ["deps/libthrift-0.9.3_*.deb", "deps/libhiredis0.13*.deb", "deps/redis-tools_*.deb", "deps/redis-server_*.deb", "deps/libswsscommon_*.deb", "deps/p4-bmv2_*.deb", "deps/p4-switch_*.deb", "deps/libsairedis_*.deb", "deps/syncd_*.deb", "deps/swss_*.deb", "deps/quagga_*.deb", "/deps/"] +COPY ["deps/libthrift-0.9.3_*.deb", "deps/libhiredis0.13*.deb", "deps/redis-tools_*.deb", "deps/redis-server_*.deb", "deps/libswsscommon_*.deb", "deps/p4-bmv2_*.deb", "deps/p4-switch_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/syncd_*.deb", "deps/swss_*.deb", "deps/quagga_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libthrift-0.9.3_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb @@ -15,6 +15,7 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/p4-bmv2_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/p4-switch_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsairedis_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsaimetadata_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/swss_*.deb diff --git a/dockers/docker-syncd-cavm/Dockerfile b/dockers/docker-syncd-cavm/Dockerfile index bbb5195901b7..3fdbf1f516b8 100755 --- a/dockers/docker-syncd-cavm/Dockerfile +++ b/dockers/docker-syncd-cavm/Dockerfile @@ -2,7 +2,7 @@ FROM docker-base RUN apt-get update -COPY ["deps/libhiredis0.13*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/syncd_*.deb", "deps/sai*.deb", "deps/libsai*.deb", "deps/xp-tools*.deb", "deps/xpshell*.deb", "/deps/"] +COPY ["deps/libhiredis0.13*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/syncd_*.deb", "deps/sai*.deb", "deps/libsai*.deb", "deps/xp-tools*.deb", "deps/xpshell*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ dpkg_apt /deps/libhiredis0.13*.deb \ @@ -12,6 +12,7 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/xp-tools*.deb \ && dpkg_apt /deps/xpshell*.deb \ && dpkg_apt /deps/libsairedis_*.deb \ + && dpkg_apt /deps/libsaimetadata_*.deb\ && dpkg_apt /deps/syncd_*.deb RUN apt-get -y install libpcap-dev libxml2-dev python-dev swig libsensors4-dev diff --git a/dockers/docker-syncd-mlnx/Dockerfile b/dockers/docker-syncd-mlnx/Dockerfile index fb7a5fcad01e..77229a333d11 100755 --- a/dockers/docker-syncd-mlnx/Dockerfile +++ b/dockers/docker-syncd-mlnx/Dockerfile @@ -22,7 +22,8 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/libnl-route-3-200_*.deb \ && dpkg_apt /deps/libswsscommon_*.deb \ && dpkg_apt /deps/mlnx-sai_*.deb \ - && dpkg_apt /deps/libsairedis_*.deb + && dpkg_apt /deps/libsairedis_*.deb \ + && dpkg_apt /deps/libsaimetadata_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb diff --git a/dockers/docker-syncd/Dockerfile b/dockers/docker-syncd/Dockerfile index 9ad7e432cef9..88c521ffef68 100755 --- a/dockers/docker-syncd/Dockerfile +++ b/dockers/docker-syncd/Dockerfile @@ -2,7 +2,7 @@ FROM docker-base RUN apt-get update -COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libopennsl_*.deb", "deps/libsaibcm_*.deb", "deps/libsairedis_*.deb", "deps/syncd_*.deb", "/deps/"] +COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libopennsl_*.deb", "deps/libsaibcm_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/syncd_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ dpkg_apt /deps/libhiredis0.13*.deb \ @@ -13,6 +13,7 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/libopennsl_*.deb \ && dpkg_apt /deps/libsaibcm_*.deb \ && dpkg_apt /deps/libsairedis_*.deb \ + && dpkg_apt /deps/libsaimetadata_*.deb \ && dpkg_apt /deps/syncd_*.deb ## TODO: add kmod into Depends diff --git a/src/Makefile b/src/Makefile index c1bfb78bf839..0fc5aff8c3c2 100644 --- a/src/Makefile +++ b/src/Makefile @@ -62,32 +62,32 @@ libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb: redis-server_3. $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss-common) -brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb brcm-sdk/libopennsl_*_amd64.deb brcm-sdk/libsaibcm_1.0.2*_amd64.deb brcm-sdk/libsaibcm-dev_1.0.2*_amd64.deb +brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb brcm/libsaimetadata_1.0.0_amd64.deb brcm/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb brcm-sdk/libopennsl_*_amd64.deb brcm-sdk/libsaibcm_1.0.2*_amd64.deb brcm-sdk/libsaibcm-dev_1.0.2*_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-sairedis) mkdir -p brcm - cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb brcm/ + cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb brcm/ -mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb mlnx-sdk/applibs_1.mlnx.4.2.2100_amd64.deb mlnx-sdk/*.deb +mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb mlnx-sdk/applibs_1.mlnx.4.2.2100_amd64.deb mlnx-sdk/*.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-sairedis) mkdir -p mlnx - cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb mlnx/ + cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb mlnx/ -cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb cavm-sdk/libsai.deb cavm-sdk/xp-tools.deb cavm-sdk/xpshell.deb +cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb cavm/libsaimetadata_1.0.0_amd64.deb cavm/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb cavm-sdk/libsai.deb cavm-sdk/xp-tools.deb cavm-sdk/xpshell.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-sairedis) mkdir -p cavm - cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb cavm/ + cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb cavm/ -p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb p4-bmv2_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb +p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb p4/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb p4-bmv2_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-sairedis) mkdir -p p4 - cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb p4/ + cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb p4/ ## Note: fpmsyncd and teamsyncd are two implicit targets -brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb +brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb brcm/libsaimetadata_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb brcm/ @@ -95,7 +95,7 @@ brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd cp sonic-swss/debian/swss/usr/bin/teamsyncd . ## Note: fpmsyncd and teamsyncd are two implicit targets -mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb +mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb mlnx/ @@ -103,14 +103,14 @@ mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd cp sonic-swss/debian/swss/usr/bin/teamsyncd . ## Note: fpmsyncd and teamsyncd are two implicit targets -cavm/swss_1.0.0_amd64.deb: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb +cavm/swss_1.0.0_amd64.deb: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb cavm/libsaimetadata_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb cavm/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . cp sonic-swss/debian/swss/usr/bin/teamsyncd . -p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb +p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb p4/ diff --git a/src/sonic-swss b/src/sonic-swss index bdbe77ce879d..a025ab0019e7 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit bdbe77ce879de16334fcc53bd2a749e627f2c76c +Subproject commit a025ab0019e7c24bf4a22a0165a9d5b1ddecd528 From c4630f54c7390c880277cbf99956bc5f9a1647f8 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 26 Oct 2016 21:27:31 -0700 Subject: [PATCH 0053/1011] Dockerfile: Add bridge-utils to p4 docker (#43) --- dockers/docker-sonic-p4/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-sonic-p4/Dockerfile b/dockers/docker-sonic-p4/Dockerfile index 163aa46296e5..a0c7cc99219e 100644 --- a/dockers/docker-sonic-p4/Dockerfile +++ b/dockers/docker-sonic-p4/Dockerfile @@ -2,7 +2,7 @@ FROM docker-base RUN apt-get update -RUN apt-get install -y net-tools ethtool tcpdump ifupdown +RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils COPY ["deps/libthrift-0.9.3_*.deb", "deps/libhiredis0.13*.deb", "deps/redis-tools_*.deb", "deps/redis-server_*.deb", "deps/libswsscommon_*.deb", "deps/p4-bmv2_*.deb", "deps/p4-switch_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/syncd_*.deb", "deps/swss_*.deb", "deps/quagga_*.deb", "/deps/"] From 23542f3e024c15ade1ef6c0321ffda21084a4dd4 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 27 Oct 2016 18:02:32 -0700 Subject: [PATCH 0054/1011] Add docker configuration for saiserver-brcm (#44) --- dockers/docker-saiserver-brcm/Dockerfile | 24 +++++++++++++++++ dockers/docker-saiserver-brcm/portmap.ini | 33 +++++++++++++++++++++++ dockers/docker-saiserver-brcm/profile.ini | 1 + dockers/docker-saiserver-brcm/start.sh | 20 ++++++++++++++ 4 files changed, 78 insertions(+) create mode 100755 dockers/docker-saiserver-brcm/Dockerfile create mode 100644 dockers/docker-saiserver-brcm/portmap.ini create mode 100644 dockers/docker-saiserver-brcm/profile.ini create mode 100755 dockers/docker-saiserver-brcm/start.sh diff --git a/dockers/docker-saiserver-brcm/Dockerfile b/dockers/docker-saiserver-brcm/Dockerfile new file mode 100755 index 000000000000..a85e7023204e --- /dev/null +++ b/dockers/docker-saiserver-brcm/Dockerfile @@ -0,0 +1,24 @@ +FROM docker-base + +RUN apt-get update + +COPY ["/deps/libsaibcm*.deb","/deps/libopennsl_*.deb","/deps/python-sdk-api_*.deb", "/deps/iproute2_*.deb", "/deps/libthrift-0.9.3_*.deb", "/deps/libnl-3-200_*.deb", "/deps/libnl-genl-3-200_*.deb", "/deps/libnl-route-3-200_*.deb", "/deps/"] + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/libopennsl_*.deb \ + && dpkg_apt /deps/libsaibcm_*.deb \ + && dpkg_apt /deps/libthrift-0.9.3_*.deb \ + && dpkg_apt /deps/libnl-3-200_*.deb \ + && dpkg_apt /deps/libnl-genl-3-200_*.deb \ + && dpkg_apt /deps/libnl-route-3-200_*.deb + +COPY ["deps/saiserver", "start.sh", "/usr/bin/"] + +COPY ["profile.ini", "portmap.ini", "/etc/sai/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-saiserver-brcm/portmap.ini b/dockers/docker-saiserver-brcm/portmap.ini new file mode 100644 index 000000000000..7161416e4d4c --- /dev/null +++ b/dockers/docker-saiserver-brcm/portmap.ini @@ -0,0 +1,33 @@ +# alias lanes +Ethernet0 29,30,31,32 +Ethernet4 25,26,27,28 +Ethernet8 37,38,39,40 +Ethernet12 33,34,35,36 +Ethernet16 41,42,43,44 +Ethernet20 45,46,47,48 +Ethernet24 5,6,7,8 +Ethernet28 1,2,3,4 +Ethernet32 9,10,11,12 +Ethernet36 13,14,15,16 +Ethernet40 21,22,23,24 +Ethernet44 17,18,19,20 +Ethernet48 49,50,51,52 +Ethernet52 53,54,55,56 +Ethernet56 61,62,63,64 +Ethernet60 57,58,59,60 +Ethernet64 65,66,67,68 +Ethernet68 69,70,71,72 +Ethernet72 77,78,79,80 +Ethernet76 73,74,75,76 +Ethernet80 105,106,107,108 +Ethernet84 109,110,111,112 +Ethernet88 117,118,119,120 +Ethernet92 113,114,115,116 +Ethernet96 121,122,123,124 +Ethernet100 125,126,127,128 +Ethernet104 85,86,87,88 +Ethernet108 81,82,83,84 +Ethernet112 89,90,91,92 +Ethernet116 93,94,95,96 +Ethernet120 97,98,99,100 +Ethernet124 101,102,103,104 diff --git a/dockers/docker-saiserver-brcm/profile.ini b/dockers/docker-saiserver-brcm/profile.ini new file mode 100644 index 000000000000..b64d997fb451 --- /dev/null +++ b/dockers/docker-saiserver-brcm/profile.ini @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/td2-s6000-32x40G.config.bcm diff --git a/dockers/docker-saiserver-brcm/start.sh b/dockers/docker-saiserver-brcm/start.sh new file mode 100755 index 000000000000..07d03b41a9ba --- /dev/null +++ b/dockers/docker-saiserver-brcm/start.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +function clean_up { + service rsyslog stop +} + +start_bcm() +{ + [ -e /dev/linux-bcm-knet ] || mknod /dev/linux-bcm-knet c 122 0 + [ -e /dev/linux-user-bde ] || mknod /dev/linux-user-bde c 126 0 + [ -e /dev/linux-kernel-bde ] || mknod /dev/linux-kernel-bde c 127 0 +} + +trap clean_up SIGTERM SIGKILL + +service rsyslog start + +start_bcm + +/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini From 135ba232ca8d52d52ceead67783fc3e3850c0e74 Mon Sep 17 00:00:00 2001 From: thomasbo Date: Tue, 25 Oct 2016 18:52:13 -0700 Subject: [PATCH 0055/1011] SNMP/LLDP Containers: Sonic V2 Support (#41) * Adding support for V2 in SNMP/LLDP (-sv2 postfix) * Fixes for V1 containers: logging * Fixes for V1 LLDP: limit LLDP to Front-panel or MGMT interfaces. --- dockers/docker-lldp-sv2/Dockerfile | 22 ++++++++++++ dockers/docker-lldp-sv2/supervisord.conf | 19 ++++++++++ dockers/docker-lldp/Dockerfile | 17 ++++----- dockers/docker-lldp/supervisord.conf | 15 ++++---- dockers/docker-snmp-sv2/Dockerfile | 46 ++++++++++++++++++++++++ dockers/docker-snmp-sv2/supervisord.conf | 14 ++++++++ dockers/docker-snmp/Dockerfile | 15 ++++---- dockers/docker-snmp/supervisord.conf | 3 ++ 8 files changed, 128 insertions(+), 23 deletions(-) create mode 100644 dockers/docker-lldp-sv2/Dockerfile create mode 100644 dockers/docker-lldp-sv2/supervisord.conf create mode 100644 dockers/docker-snmp-sv2/Dockerfile create mode 100644 dockers/docker-snmp-sv2/supervisord.conf diff --git a/dockers/docker-lldp-sv2/Dockerfile b/dockers/docker-lldp-sv2/Dockerfile new file mode 100644 index 000000000000..4933e6414993 --- /dev/null +++ b/dockers/docker-lldp-sv2/Dockerfile @@ -0,0 +1,22 @@ +FROM docker-base + +COPY deps/sswsdk*.whl deps/sonic_d*.whl deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ + +## Pre-install the fundamental packages +## Install Python SSWSDK (lldpsyncd dependency) +## Install LLDP Sync Daemon +## Note: dpkg_apt function has the benefit to detect missing .deb file +## Clean up +RUN apt-get update && \ + dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ + dpkg_apt /deps/lldpd_*.deb && \ + apt-get install -y python-pip supervisor && \ + pip install /deps/sswsdk*.whl && \ + pip install /deps/sonic_d*.whl && \ + apt-get remove -y python-pip && \ + apt-get purge -y && apt-get autoclean -y && apt-get autoremove -y && \ + rm -rf /deps ~/.cache + +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-lldp-sv2/supervisord.conf b/dockers/docker-lldp-sv2/supervisord.conf new file mode 100644 index 000000000000..4ed43f02b9bb --- /dev/null +++ b/dockers/docker-lldp-sv2/supervisord.conf @@ -0,0 +1,19 @@ +[supervisord] +nodaemon=true + +[program:lldpd] +# https://github.com/vincentbernat/lldpd/commit/9856f2792c301116cc4a3fcfba91b9672ee5db1f +# - `-d` means to stay in foreground, log to syslog +# - `-dd` means to stay in foreground, log warnings to console +# - `-ddd` means to stay in foreground, log warnings and info to console +# - `-dddd` means to stay in foreground, log all to console +command=/usr/sbin/lldpd -d -I Ethernet*,eth* +priority=100 + +[program:lldp-syncd] +command=/usr/bin/env python2 -m lldp_syncd +priority=200 + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=1 diff --git a/dockers/docker-lldp/Dockerfile b/dockers/docker-lldp/Dockerfile index 6167a735f7d0..528ac65a4080 100644 --- a/dockers/docker-lldp/Dockerfile +++ b/dockers/docker-lldp/Dockerfile @@ -1,20 +1,21 @@ FROM docker-base -COPY deps/*py2*.whl deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ +COPY deps/sswsdk*.whl deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ ## Pre-install the fundamental packages -## Install Python SSWSDK (lldpsyncd dependancy) +## Install Python SSWSDK (lldpsyncd dependency) ## Install LLDP Sync Daemon ## Note: dpkg_apt function has the benefit to detect missing .deb file ## Clean up -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ - dpkg_apt /deps/lldpd_*.deb && \ - dpkg_apt /deps/lldpsyncd_*.deb && \ +RUN apt-get update && \ + dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ + dpkg_apt /deps/lldpd_*.deb && \ + dpkg_apt /deps/lldpsyncd_*.deb && \ apt-get install -y python-pip supervisor && \ - pip install /deps/*.whl && \ + pip install /deps/sswsdk*.whl && \ apt-get remove -y python-pip && \ - apt-get purge -y && apt-get autoclean -y && apt-get autoremove -y && \ - rm -rf /deps + apt-get purge -y && apt-get autoclean -y && apt-get autoremove -y && \ + rm -rf /deps ~/.cache COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf diff --git a/dockers/docker-lldp/supervisord.conf b/dockers/docker-lldp/supervisord.conf index 161c0ab38a2b..faff70ed06fa 100644 --- a/dockers/docker-lldp/supervisord.conf +++ b/dockers/docker-lldp/supervisord.conf @@ -2,15 +2,18 @@ nodaemon=true [program:lldpd] -## -d: Do not daemonize. If this option is specified, lldpd will run in -## the foreground and log to stderr. This option can be specified -## many times to increase verbosity -command=/usr/sbin/lldpd -dd -## route stderr to the syslog service instead of being saved to files -stderr_logfile=syslog +# https://github.com/vincentbernat/lldpd/commit/9856f2792c301116cc4a3fcfba91b9672ee5db1f +# - `-d` means to stay in foreground, log to syslog +# - `-dd` means to stay in foreground, log warnings to console +# - `-ddd` means to stay in foreground, log warnings and info to console +# - `-dddd` means to stay in foreground, log all to console +command=/usr/sbin/lldpd -d -I Ethernet*,eth* +priority=100 [program:lldpsyncd] command=/usr/sbin/lldpsyncd +priority=200 [program:rsyslogd] command=/usr/sbin/rsyslogd -n +priority=1 diff --git a/dockers/docker-snmp-sv2/Dockerfile b/dockers/docker-snmp-sv2/Dockerfile new file mode 100644 index 000000000000..68a2ae0e7f25 --- /dev/null +++ b/dockers/docker-snmp-sv2/Dockerfile @@ -0,0 +1,46 @@ +FROM docker-base + +COPY deps/snmp_*.deb deps/snmpd_*.deb deps/libsnmp-base_*.deb deps/libsnmp30_*.deb /deps/ +COPY deps/python3/*.whl /python3/ + +# enable -O for all Python calls +ENV PYTHONOPTIMIZE 1 + +## Pre-install the fundamental packages +## Install Python SSWSDK (SNMP subagent dependency) +## Install SNMP subagent +## Note: dpkg_apt function has the benefit to detect missing .deb file +## Clean up +RUN apt-get update && \ + dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ + dpkg_apt /deps/libsnmp-base_*.deb && \ + dpkg_apt /deps/libsnmp30_*.deb && \ + dpkg_apt /deps/snmp_*.deb && \ + dpkg_apt /deps/snmpd_*.deb && \ + rm -rf /deps + +# install subagent +RUN apt-get -y install build-essential wget libssl-dev openssl supervisor && \ + rm -rf /var/lib/apt/lists/* && \ + wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz && \ + tar xvf Python-3.5.2.tgz && cd Python-3.5.2 && \ + ./configure --without-doc-strings --prefix=/usr --without-pymalloc --enable-shared && \ + make && make install && \ + ldconfig && \ + cd .. && rm -rf Python-3.5.2 && rm Python-3.5.2.tgz && \ + pip3 install --no-cache-dir /python3/*py3*.whl hiredis && \ + rm -rf /python3 && \ + python3 -m sonic_ax_impl install && \ + python3 -m pip uninstall -y pip setuptools && \ + /bin/bash -c "rm -rf /usr/lib/python3.5/{unittest,lib2to3,tkinter,idlelib,email,test}" && \ + apt-get -y purge build-essential wget libssl-dev openssl && \ + apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ + find / | grep -E "__pycache__" | xargs rm -rf && \ + rm -rf ~/.cache + +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +## Although exposing ports is not need for host net mode, keep it for possible bridge mode +EXPOSE 161/udp 162/udp + +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-snmp-sv2/supervisord.conf b/dockers/docker-snmp-sv2/supervisord.conf new file mode 100644 index 000000000000..50b510063d75 --- /dev/null +++ b/dockers/docker-snmp-sv2/supervisord.conf @@ -0,0 +1,14 @@ +[supervisord] +nodaemon=true + +[program:snmpd] +command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable -p /run/snmpd.pid +priority=100 + +[program:snmp-subagent] +command=/usr/bin/env python3 -m sonic_ax_impl +priority=200 + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=1 diff --git a/dockers/docker-snmp/Dockerfile b/dockers/docker-snmp/Dockerfile index ad08f754a423..29bad3d746b4 100644 --- a/dockers/docker-snmp/Dockerfile +++ b/dockers/docker-snmp/Dockerfile @@ -7,15 +7,16 @@ COPY deps/python3/*.whl /python3/ ENV PYTHONOPTIMIZE 1 ## Pre-install the fundamental packages -## Install Python SSWSDK (SNMP subagent dependancy) +## Install Python SSWSDK (SNMP subagent dependency) ## Install SNMP subagent ## Note: dpkg_apt function has the benefit to detect missing .deb file ## Clean up -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ +RUN apt-get update && \ + dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ dpkg_apt /deps/libsnmp-base_*.deb && \ dpkg_apt /deps/libsnmp30_*.deb && \ dpkg_apt /deps/snmp_*.deb && \ - dpkg_apt /deps/snmpd_*.deb && \ + dpkg_apt /deps/snmpd_*.deb && \ rm -rf /deps # install subagent @@ -29,13 +30,9 @@ RUN apt-get -y install build-essential wget libssl-dev openssl supervisor && \ cd .. && rm -rf Python-3.5.2 && rm Python-3.5.2.tgz && \ pip3 install --no-cache-dir /python3/*py3*.whl hiredis && \ rm -rf /python3 && \ + python3 -m acs_ax_impl install && \ python3 -m pip uninstall -y pip setuptools && \ - rm -rf /usr/lib/python3.5/unittest && \ - rm -rf /usr/lib/python3.5/lib2to3 && \ - rm -rf /usr/lib/python3.5/tkinter && \ - rm -rf /usr/lib/python3.5/idlelib && \ - rm -rf /usr/lib/python3.5/email && \ - rm -rf /usr/lib/python3.5/test && \ + /bin/bash -c "rm -rf /usr/lib/python3.5/{unittest,lib2to3,tkinter,idlelib,email,test}" && \ apt-get -y purge build-essential wget libssl-dev openssl && \ apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ find / | grep -E "__pycache__" | xargs rm -rf && \ diff --git a/dockers/docker-snmp/supervisord.conf b/dockers/docker-snmp/supervisord.conf index f799d33d97aa..c954add628d0 100644 --- a/dockers/docker-snmp/supervisord.conf +++ b/dockers/docker-snmp/supervisord.conf @@ -3,9 +3,12 @@ nodaemon=true [program:snmpd] command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable -p /run/snmpd.pid +priority=100 [program:acs-snmp-subagent] command=/usr/bin/env python3 -m acs_ax_impl +priority=200 [program:rsyslogd] command=/usr/sbin/rsyslogd -n +priority=1 From b2322d17485e5a5eb09677615af0921644ea9efb Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 28 Oct 2016 15:16:08 -0700 Subject: [PATCH 0056/1011] Modification to saiserver-brcm/Dockerfile (#45) --- dockers/docker-saiserver-brcm/Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dockers/docker-saiserver-brcm/Dockerfile b/dockers/docker-saiserver-brcm/Dockerfile index a85e7023204e..054da7866fbf 100755 --- a/dockers/docker-saiserver-brcm/Dockerfile +++ b/dockers/docker-saiserver-brcm/Dockerfile @@ -2,7 +2,7 @@ FROM docker-base RUN apt-get update -COPY ["/deps/libsaibcm*.deb","/deps/libopennsl_*.deb","/deps/python-sdk-api_*.deb", "/deps/iproute2_*.deb", "/deps/libthrift-0.9.3_*.deb", "/deps/libnl-3-200_*.deb", "/deps/libnl-genl-3-200_*.deb", "/deps/libnl-route-3-200_*.deb", "/deps/"] +COPY ["deps/libsaibcm_*.deb","deps/libopennsl_*.deb","deps/python-sdk-api_*.deb", "deps/iproute2_*.deb", "deps/libthrift-0.9.3_*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ dpkg_apt /deps/libopennsl_*.deb \ @@ -17,8 +17,7 @@ COPY ["deps/saiserver", "start.sh", "/usr/bin/"] COPY ["profile.ini", "portmap.ini", "/etc/sai/"] ## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y; rm -rf /deps ENTRYPOINT ["/bin/bash"] CMD ["/usr/bin/start.sh"] From 076c847bf89bcf7eab7d3fd2ce5c754c89ed8f92 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Sat, 29 Oct 2016 19:38:31 -0700 Subject: [PATCH 0057/1011] Update get_docker-base.sh (#47) --- get_docker-base.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/get_docker-base.sh b/get_docker-base.sh index 088b6bf46b29..b85ab4166104 100755 --- a/get_docker-base.sh +++ b/get_docker-base.sh @@ -10,7 +10,7 @@ set -x -e . ./functions.sh ## [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Read-only link of Azure Blob storage with shared access signature (SAS)")] -BASE_URL="https://sonicstorage.blob.core.windows.net/packages/docker-base.ea507753d98b0769e2a15be13003331f8ad38d1c15b40a683e05fc53b1463b10.gz?sv=2015-04-05&sr=b&sig=DjbdpLaslHeiaZLwFuauhPA2wR0v7kOH5yPHiAbzgBc%3D&se=2016-10-28T13%3A04%3A23Z&sp=r" +BASE_URL="https://sonicstorage.blob.core.windows.net/packages/docker-base.ea507753d98b0769e2a15be13003331f8ad38d1c15b40a683e05fc53b1463b10.gz?sv=2015-04-05&sr=b&sig=YNN6eYVMEFndUaiHIRnqcZFdDZwIG%2BaAuVj0IoyDWPw%3D&se=2026-10-27T20%3A46%3A18Z&sp=r" base_image_name=docker-base docker_try_rmi $base_image_name From 73cbf6ccb243e007f9a8cf2f0ac1073321ce7209 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 31 Oct 2016 12:03:54 -0700 Subject: [PATCH 0058/1011] update swss, sairedis and swss-common submodules (#48) --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 59ec36035eb9..494b231a6658 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 59ec36035eb9fd0ff64d4977a2553380367f97ce +Subproject commit 494b231a6658a5b21b71e35ab0f078701e938742 diff --git a/src/sonic-swss b/src/sonic-swss index a025ab0019e7..02621bcdb568 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit a025ab0019e7c24bf4a22a0165a9d5b1ddecd528 +Subproject commit 02621bcdb5689450446ea0d618a879a110af86c7 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index e612cefd8890..947fa0733965 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit e612cefd889067f1cfa8c9a68a40a1abdac59433 +Subproject commit 947fa0733965450ad5b108cfd17a251ae3b7b709 From 30438bb9877fb8f374203446fad62dad4630a88d Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Mon, 31 Oct 2016 12:25:09 -0700 Subject: [PATCH 0059/1011] update port configurations in lldpd as soon as port created --- dockers/docker-lldp-sv2/Dockerfile | 1 + dockers/docker-lldp-sv2/reconfigure.sh | 58 ++++++++++++++++++++++++ dockers/docker-lldp-sv2/supervisord.conf | 4 ++ 3 files changed, 63 insertions(+) create mode 100755 dockers/docker-lldp-sv2/reconfigure.sh diff --git a/dockers/docker-lldp-sv2/Dockerfile b/dockers/docker-lldp-sv2/Dockerfile index 4933e6414993..0ad91cf70518 100644 --- a/dockers/docker-lldp-sv2/Dockerfile +++ b/dockers/docker-lldp-sv2/Dockerfile @@ -18,5 +18,6 @@ RUN apt-get update && \ rm -rf /deps ~/.cache COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY reconfigure.sh /opt/reconfigure.sh ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-lldp-sv2/reconfigure.sh b/dockers/docker-lldp-sv2/reconfigure.sh new file mode 100755 index 000000000000..e91c1c017534 --- /dev/null +++ b/dockers/docker-lldp-sv2/reconfigure.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +set -e + +num_of_interfaces=32 +if_step=4 +last_if_idx=$((num_of_interfaces*if_step - if_step)) + +function wait_until_if_exists +{ + while /bin/true ; + do + if [ -L /sys/class/net/"$if" ]; + then + break + fi + sleep 1 + done + echo interface "$if" is up +} + + +function wait_until_if_not_exists +{ + while /bin/true ; + do + if [ ! -L /sys/class/net/"$if" ]; + then + break + fi + sleep 1 + done + echo interface "$if" is down +} + + +while /bin/true ; +do + # wait until all interfaces are up + echo Wait until all ifaces are up + for i in $(seq 0 $if_step $last_if_idx) + do + if=Ethernet${i} + wait_until_if_exists + done + + # apply lldpd configuration + echo apply lldpd configuration + lldpcli -c /etc/lldpd.conf + + # wait until all interfaces are down + echo Wait until all ifaces are down + for i in $(seq 0 $if_step $last_if_idx) + do + if=Ethernet${i} + wait_until_if_not_exists + done +done diff --git a/dockers/docker-lldp-sv2/supervisord.conf b/dockers/docker-lldp-sv2/supervisord.conf index 4ed43f02b9bb..844348b471b6 100644 --- a/dockers/docker-lldp-sv2/supervisord.conf +++ b/dockers/docker-lldp-sv2/supervisord.conf @@ -10,6 +10,10 @@ nodaemon=true command=/usr/sbin/lldpd -d -I Ethernet*,eth* priority=100 +[program:lldpd-conf-reload] +command=/opt/reconfigure.sh +priority=150 + [program:lldp-syncd] command=/usr/bin/env python2 -m lldp_syncd priority=200 From 62af66a1f0bbc44c362fb7a6d917991aeab9d471 Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Mon, 31 Oct 2016 12:54:53 -0700 Subject: [PATCH 0060/1011] Add a pause before pushing port configuration --- dockers/docker-lldp-sv2/reconfigure.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dockers/docker-lldp-sv2/reconfigure.sh b/dockers/docker-lldp-sv2/reconfigure.sh index e91c1c017534..11c83bad079f 100755 --- a/dockers/docker-lldp-sv2/reconfigure.sh +++ b/dockers/docker-lldp-sv2/reconfigure.sh @@ -44,6 +44,9 @@ do wait_until_if_exists done + echo Wait 10 seconds + sleep 10 + # apply lldpd configuration echo apply lldpd configuration lldpcli -c /etc/lldpd.conf From ac64c1c29b86c6068377078d5033d070ddee9c5a Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Mon, 31 Oct 2016 13:56:45 -0700 Subject: [PATCH 0061/1011] Address CR suggestions --- dockers/docker-lldp-sv2/reconfigure.sh | 34 ++++++++++---------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/dockers/docker-lldp-sv2/reconfigure.sh b/dockers/docker-lldp-sv2/reconfigure.sh index 11c83bad079f..9f42a33a24b4 100755 --- a/dockers/docker-lldp-sv2/reconfigure.sh +++ b/dockers/docker-lldp-sv2/reconfigure.sh @@ -8,54 +8,46 @@ last_if_idx=$((num_of_interfaces*if_step - if_step)) function wait_until_if_exists { - while /bin/true ; + if=$1 + while [ ! -L /sys/class/net/"$if" ] ; do - if [ -L /sys/class/net/"$if" ]; - then - break - fi sleep 1 done - echo interface "$if" is up + echo interface "$if" is created } function wait_until_if_not_exists { - while /bin/true ; + if=$1 + while [ -L /sys/class/net/"$if" ] ; do - if [ ! -L /sys/class/net/"$if" ]; - then - break - fi sleep 1 done - echo interface "$if" is down + echo interface "$if" is destroyed } while /bin/true ; do - # wait until all interfaces are up - echo Wait until all ifaces are up + # wait until all interfaces are created + echo Wait until all ifaces are created for i in $(seq 0 $if_step $last_if_idx) do - if=Ethernet${i} - wait_until_if_exists + wait_until_if_exists "Ethernet$i" done - echo Wait 10 seconds + echo Wait 10 seconds while lldpd finds new interfaces sleep 10 # apply lldpd configuration echo apply lldpd configuration lldpcli -c /etc/lldpd.conf - # wait until all interfaces are down - echo Wait until all ifaces are down + # wait until all interfaces are destroyed + echo Wait until all ifaces are destroyed for i in $(seq 0 $if_step $last_if_idx) do - if=Ethernet${i} - wait_until_if_not_exists + wait_until_if_not_exists "Ethernet$i" done done From e89c7be76ded4ff694eb0ed41df96cacbc76c1fd Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 31 Oct 2016 21:50:59 -0700 Subject: [PATCH 0062/1011] Install redis-server>=3.2.4 in docker-database image (#46) * Install redis-server>=3.2.4 * Reformat * Build redis from source code * Add Makefile var: REDIS_VERSION --- Makefile | 33 ++++++++++++++++++------------ dockers/docker-database/Dockerfile | 11 ++++++---- src/Makefile | 8 +++++--- src/redis/build.sh | 13 +++++------- 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index 03a67bde0937..fc48ee3294e5 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,9 @@ USERNAME= PASSWORD_ENCRYPTED= +## Redis server/tools version +REDIS_VERSION=3.2.4-1~bpo8+1_amd64 + ## Select bash for commands SHELL := /bin/bash @@ -22,14 +25,14 @@ define build_docker mkdir -p `dirname $(2)` docker save $(1) | gzip -c > $(2) endef - + ## Rules: phony targets .phony : brcm-all mlnx-all cavm-all p4-all ## Rules: redirect to sub directory src/%: - $(MAKE) -C src $(subst src/,,$@) - + $(MAKE) REDIS_VERSION=$(REDIS_VERSION) -C src $(subst src/,,$@) + ## Rules: docker-fpm dockers/docker-fpm/deps/fpmsyncd: src/fpmsyncd mkdir -p `dirname $@` && cp $< $(dir $@) @@ -41,13 +44,13 @@ dockers/docker-team/deps/teamsyncd: src/teamsyncd mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-team/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) - + ## Rules: docker-orchagent-mlnx $(addprefix dockers/docker-orchagent-mlnx/deps/,libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb) : dockers/docker-orchagent-mlnx/deps/%.deb : src/mlnx/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-orchagent-mlnx/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) - + ## Rules: docker-orchagent-cavm $(addprefix dockers/docker-orchagent-cavm/deps/,libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb) : dockers/docker-orchagent-cavm/deps/%.deb : src/cavm/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) @@ -59,7 +62,7 @@ $(addprefix dockers/docker-orchagent/deps/,libsairedis_1.0.0_amd64.deb libsaimet mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-orchagent/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) - + ## Rules: docker-syncd-mlnx $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS)) : dockers/docker-syncd-mlnx/deps/%.deb : src/mlnx-sdk/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) @@ -86,6 +89,10 @@ $(addprefix dockers/docker-syncd/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_a dockers/docker-syncd/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) +## Rules: docker-database +dockers/docker-database/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) + ## Rules: docker-sonic (p4) $(addprefix dockers/docker-sonic-p4/deps/,swss_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb) : dockers/docker-sonic-p4/deps/%.deb : src/p4/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) @@ -101,7 +108,7 @@ target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/d touch dockers/docker-syncd/deps/{dsserve,bcmcmd} docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - + target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb $(LIBNL-DEBS)) dockers/docker-syncd-mlnx/deps/fw-SPC.mfa docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) @@ -109,11 +116,11 @@ target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-sy target/docker-syncd-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb $(LIBNL-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - + target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - + target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) @@ -121,7 +128,7 @@ target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docke target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-cavm/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - + target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb fpmsyncd) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) @@ -129,12 +136,12 @@ target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/ target/docker-team.gz: target/docker-base.gz $(addprefix dockers/docker-team/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb $(LIBTEAM-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-database.gz: target/docker-base.gz + +target/docker-database.gz: target/docker-base.gz $(addprefix dockers/docker-database/deps/,redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-sonic-p4.gz: target/docker-base.gz $(addprefix dockers/docker-sonic-p4/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb syncd_1.0.0_amd64.deb swss_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb p4-bmv2_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb) +target/docker-sonic-p4.gz: target/docker-base.gz $(addprefix dockers/docker-sonic-p4/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb syncd_1.0.0_amd64.deb swss_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb p4-bmv2_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) diff --git a/dockers/docker-database/Dockerfile b/dockers/docker-database/Dockerfile index 4499f4a8f8fa..2014cd8919f0 100755 --- a/dockers/docker-database/Dockerfile +++ b/dockers/docker-database/Dockerfile @@ -1,10 +1,13 @@ FROM docker-base -## Pre-install the fundamental packages +COPY ["deps/redis-tools_*.deb", "deps/redis-server_*.deb", "/deps/"] + +## Install packages ## Clean up -RUN apt-get -y install \ - redis-server \ - && \ +RUN apt-get update && \ + dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/redis-tools_*.deb && \ + dpkg_apt /deps/redis-server_*.deb && \ apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y RUN sed -ri 's/^daemonize yes$/daemonize no/' /etc/redis/redis.conf \ diff --git a/src/Makefile b/src/Makefile index 0fc5aff8c3c2..e9f415e272ac 100644 --- a/src/Makefile +++ b/src/Makefile @@ -3,6 +3,8 @@ .ONESHELL: SHELL := /bin/bash +REDIS_VERSION=3.2.4-1~bpo8+1_amd64 + ## Function: build_project, directory ## Build the project and save the .deb target in the same directory ## TRICK: clean dh state so it will force recreating .deb later @@ -25,10 +27,10 @@ libnl-%.deb: libteam5_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb: libnl-%.deb pushd libteam; ./build.sh; popd -redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb redis-sentinel_3.0.7-2_amd64.deb: +redis-sentinel_$(REDIS_VERSION).deb redis-$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb: pushd redis; ./build.sh; popd -libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dbg_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb: redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb redis-sentinel_3.0.7-2_amd64.deb +libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dbg_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb: redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb redis-sentinel_$(REDIS_VERSION).deb pushd hiredis; ./build.sh; popd libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb thrift-compiler_0.9.3-2_amd64.deb: @@ -58,7 +60,7 @@ p4-switch_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3 quagga_0.99.24.1-2.1_amd64.deb: $(call build_project, sonic-quagga) -libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb: redis-server_3.0.7-2_amd64.deb redis-tools_3.0.7-2_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb +libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb: redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss-common) diff --git a/src/redis/build.sh b/src/redis/build.sh index 44f3e06018cb..9ff33de6d137 100755 --- a/src/redis/build.sh +++ b/src/redis/build.sh @@ -1,14 +1,11 @@ #!/bin/bash -x -export REDIS_DOWNLOAD_URL=http://http.debian.net/debian/pool/main/r/redis/redis_3.0.7.orig.tar.gz -export REDIS_PACKAGING_URL=http://http.debian.net/debian/pool/main/r/redis/redis_3.0.7-2.debian.tar.xz +wget -N 'http://mirrors.accretive-networks.net/debian/pool/main/r/redis/redis_3.2.4.orig.tar.gz' +wget -N 'http://mirrors.accretive-networks.net/debian/pool/main/r/redis/redis_3.2.4-1~bpo8+1.dsc' +wget -N 'http://mirrors.accretive-networks.net/debian/pool/main/r/redis/redis_3.2.4-1~bpo8+1.debian.tar.xz' -wget -O redis_3.0.7-2.dsc 'https://sonicstorage.blob.core.windows.net/packages/redis_3.0.7-2.dsc?sv=2015-04-05&sr=b&sig=evQtsWTIUFlgWbzLLifS1lDgop%2BzlqIP8ehZl3p%2FCKI%3D&se=2026-07-24T01%3A48%3A19Z&sp=r' -wget -O redis_3.0.7.orig.tar.gz 'https://sonicstorage.blob.core.windows.net/packages/redis_3.0.7.orig.tar.gz?sv=2015-04-05&sr=b&sig=0ht16%2Fi8%2FPZQHp1PrDPYW0iRwcLfUPw1JpKUapizu8o%3D&se=2026-07-24T01%3A48%3A49Z&sp=r' -wget -O redis_3.0.7-2.debian.tar.xz 'https://sonicstorage.blob.core.windows.net/packages/redis_3.0.7-2.debian.tar.xz?sv=2015-04-05&sr=b&sig=4a33ECTvURfNUEDkS436ZlSsIpLIC9QdJrBBRIoWpW0%3D&se=2026-07-24T01%3A49%3A22Z&sp=r' +dpkg-source -x redis_3.2.4-1~bpo8+1.dsc -dpkg-source -x redis_3.0.7-2.dsc - -pushd redis-3.0.7; fakeroot debian/rules binary; popd +pushd redis-3.2.4; fakeroot debian/rules binary; popd cp *.deb .. From 68363e17a012f66ec05f1e45bf69211d487ec00b Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 1 Nov 2016 07:39:08 -0700 Subject: [PATCH 0063/1011] bug fix: fix the redis-server deb package name (#50) --- src/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index e9f415e272ac..f44691d3899c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -27,7 +27,7 @@ libnl-%.deb: libteam5_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb: libnl-%.deb pushd libteam; ./build.sh; popd -redis-sentinel_$(REDIS_VERSION).deb redis-$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb: +redis-sentinel_$(REDIS_VERSION).deb redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb: pushd redis; ./build.sh; popd libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dbg_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb: redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb redis-sentinel_$(REDIS_VERSION).deb From 530d2ac202cc0277d99a629cdd29ae08ca802d38 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 2 Nov 2016 16:26:24 +0200 Subject: [PATCH 0064/1011] update sonic-linux-kernel submodule (#52) Signed-off-by: marian-pritsak --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 206a8936a7af..fbd5604bf748 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 206a8936a7af2fdc30101c64be42dd2dadde0dad +Subproject commit fbd5604bf7480bd6f861ad35acd5ec41bb4dd067 From afab1ae4eec955dbd90936fa774307bad763d9a9 Mon Sep 17 00:00:00 2001 From: jiacao Date: Wed, 2 Nov 2016 12:05:31 -0700 Subject: [PATCH 0065/1011] Fix Quagga build name inconsistency (#53) --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index fc48ee3294e5..01ac0f96942e 100644 --- a/Makefile +++ b/Makefile @@ -129,7 +129,7 @@ target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docke docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb fpmsyncd) +target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2.1_amd64.deb fpmsyncd) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) @@ -141,7 +141,7 @@ target/docker-database.gz: target/docker-base.gz $(addprefix dockers/docker-data docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-sonic-p4.gz: target/docker-base.gz $(addprefix dockers/docker-sonic-p4/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2_amd64.deb syncd_1.0.0_amd64.deb swss_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb p4-bmv2_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb) +target/docker-sonic-p4.gz: target/docker-base.gz $(addprefix dockers/docker-sonic-p4/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2.1_amd64.deb syncd_1.0.0_amd64.deb swss_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb p4-bmv2_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) From aed2ab5b7af738fdea5df804ced10510dba38e08 Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Tue, 1 Nov 2016 17:00:54 -0700 Subject: [PATCH 0066/1011] Install supervisor to docker-ptf --- dockers/docker-syncd-mlnx-rpc/Dockerfile | 2 +- dockers/docker-syncd-rpc/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-syncd-mlnx-rpc/Dockerfile b/dockers/docker-syncd-mlnx-rpc/Dockerfile index ca68b8a29304..734171ffb3e0 100644 --- a/dockers/docker-syncd-mlnx-rpc/Dockerfile +++ b/dockers/docker-syncd-mlnx-rpc/Dockerfile @@ -16,6 +16,7 @@ RUN apt-get update \ python-dev \ wget \ cmake \ + supervisor \ && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ && tar xvfz 1.0.0.tar.gz \ && cd nanomsg-1.0.0 \ @@ -44,5 +45,4 @@ COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf ENTRYPOINT service rsyslog start \ && service syncd start \ - && while [ "x$( ifconfig Ethernet12 | grep RUNNING )" = 'x' ] ; do sleep 1 ; done \ && /usr/bin/supervisord diff --git a/dockers/docker-syncd-rpc/Dockerfile b/dockers/docker-syncd-rpc/Dockerfile index e7f6912746fe..28108a82582c 100644 --- a/dockers/docker-syncd-rpc/Dockerfile +++ b/dockers/docker-syncd-rpc/Dockerfile @@ -16,6 +16,7 @@ RUN apt-get update \ python-dev \ wget \ cmake \ + supervisor \ && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ && tar xvfz 1.0.0.tar.gz \ && cd nanomsg-1.0.0 \ @@ -44,5 +45,4 @@ COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf ENTRYPOINT service rsyslog start \ && service syncd start \ - && while [ "x$( ifconfig Ethernet12 | grep RUNNING )" = 'x' ] ; do sleep 1 ; done \ && /usr/bin/supervisord From 2456860cd2d87f6817e9600fac86366662875ca4 Mon Sep 17 00:00:00 2001 From: jiacao Date: Wed, 2 Nov 2016 15:33:16 -0700 Subject: [PATCH 0067/1011] Add saimetadata-dev dependency (#55) --- src/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Makefile b/src/Makefile index f44691d3899c..cd33142ac829 100644 --- a/src/Makefile +++ b/src/Makefile @@ -89,7 +89,7 @@ p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0 cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb p4/ ## Note: fpmsyncd and teamsyncd are two implicit targets -brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb brcm/libsaimetadata_1.0.0_amd64.deb +brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb brcm/libsaimetadata_1.0.0_amd64.deb brcm/libsaimetadata-dev_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb brcm/ @@ -97,7 +97,7 @@ brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd cp sonic-swss/debian/swss/usr/bin/teamsyncd . ## Note: fpmsyncd and teamsyncd are two implicit targets -mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb +mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb mlnx/ @@ -105,14 +105,14 @@ mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd cp sonic-swss/debian/swss/usr/bin/teamsyncd . ## Note: fpmsyncd and teamsyncd are two implicit targets -cavm/swss_1.0.0_amd64.deb: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb cavm/libsaimetadata_1.0.0_amd64.deb +cavm/swss_1.0.0_amd64.deb: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb cavm/libsaimetadata_1.0.0_amd64.deb cavm/libsaimetadata-dev_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb cavm/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . cp sonic-swss/debian/swss/usr/bin/teamsyncd . -p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb +p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb p4/libsaimetadata-dev_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb p4/ From 0f10cd4a4d7700a3cacac3e4be1e4b759d01a93c Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Thu, 3 Nov 2016 19:22:59 +0200 Subject: [PATCH 0068/1011] Update Makefile to fix to swss package compilation (#57) Add dependency to libteam for swss package to fix compilation issue. --- src/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Makefile b/src/Makefile index cd33142ac829..1f277fbaeb36 100644 --- a/src/Makefile +++ b/src/Makefile @@ -89,7 +89,7 @@ p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0 cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb p4/ ## Note: fpmsyncd and teamsyncd are two implicit targets -brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb brcm/libsaimetadata_1.0.0_amd64.deb brcm/libsaimetadata-dev_1.0.0_amd64.deb +brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb brcm/libsaimetadata_1.0.0_amd64.deb brcm/libsaimetadata-dev_1.0.0_amd64.deb libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb brcm/ @@ -97,7 +97,7 @@ brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd cp sonic-swss/debian/swss/usr/bin/teamsyncd . ## Note: fpmsyncd and teamsyncd are two implicit targets -mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb +mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb mlnx/ @@ -105,14 +105,14 @@ mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd cp sonic-swss/debian/swss/usr/bin/teamsyncd . ## Note: fpmsyncd and teamsyncd are two implicit targets -cavm/swss_1.0.0_amd64.deb: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb cavm/libsaimetadata_1.0.0_amd64.deb cavm/libsaimetadata-dev_1.0.0_amd64.deb +cavm/swss_1.0.0_amd64.deb: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb cavm/libsaimetadata_1.0.0_amd64.deb cavm/libsaimetadata-dev_1.0.0_amd64.deb libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb cavm/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . cp sonic-swss/debian/swss/usr/bin/teamsyncd . -p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb p4/libsaimetadata-dev_1.0.0_amd64.deb +p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb p4/libsaimetadata-dev_1.0.0_amd64.deb libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb p4/ From 5405b576e61a1cce0cc1b048a6385fd291c73482 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 3 Nov 2016 12:15:00 -0700 Subject: [PATCH 0069/1011] build_debian: Disable IPv6 DAD (#56) This change disables DAD (IPv6's Duplicate Address Detection). DAD protects against IP address conflicts. The way it works is that after an address is added to an interface, the operating system uses the Neighbor Discovery Protocol to check if any other host on the network has the same address. If it finds a neighbor with the same address, the address is removed from the interface. The problem here is that the time waiting for DAD to be done is fairly long and because that we set the host interface operating status to be down at first, the port cannot exchange the Neighbor Discovery Protocol and DAD will time out. The host interface is only brought up after we have received the port admin status up notification from the kernel, which happens only after the DAD is done or times out. This makes the whole host interfaces bringing up procedure very slow. This the DAD is disabled. When it is disabled, addresses are immediately usable. Without DAD, we need to make sure that the IPv6 addresses don't have conflicts. For now, we have two IPv6 addresses. One is assigned manually, which prevents conflicts at first. Another one is the IPv6 link-local address. It is derived from the MAC address and thus all the link-local addresses are the same on one box. Because link-local addresses are not used, it will not trigger issues even if they are the same. --- build_debian.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build_debian.sh b/build_debian.sh index 304b474e9a60..e231242ce489 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -203,11 +203,13 @@ set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_announce 0 set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_filter 0 set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_notify 0 set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_ignore 0 +set /files/etc/sysctl.conf/net.ipv6.conf.default.accept_dad 0 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_accept 0 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_announce 1 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_filter 0 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_notify 1 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_ignore 2 +set /files/etc/sysctl.conf/net.ipv6.conf.all.accept_dad 0 " -r $FILESYSTEM_ROOT ## docker-py is needed by Ansible docker module From ce895ee22844df7c658b8acf09937559b413a189 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 3 Nov 2016 14:11:11 -0700 Subject: [PATCH 0070/1011] Add ptf docker with saithrift installed (#58) --- dockers/docker-ptf-saithrift/Dockerfile | 12 +++++++ .../brcm_interface_to_front_map.ini | 33 +++++++++++++++++++ .../msn_2700_interface_to_front_map.ini | 33 +++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 dockers/docker-ptf-saithrift/Dockerfile create mode 100644 dockers/docker-ptf-saithrift/brcm_interface_to_front_map.ini create mode 100644 dockers/docker-ptf-saithrift/msn_2700_interface_to_front_map.ini diff --git a/dockers/docker-ptf-saithrift/Dockerfile b/dockers/docker-ptf-saithrift/Dockerfile new file mode 100644 index 000000000000..88176faffb5f --- /dev/null +++ b/dockers/docker-ptf-saithrift/Dockerfile @@ -0,0 +1,12 @@ +FROM docker-ptf + +RUN apt-get update + +COPY ["deps/saithrift-0.9.tar.gz", "/deps/"] +COPY ["*.ini", "/etc/ptf/"] +COPY ["deps/SAI/test/saithrift/tests/*", "/usr/share/ptf-tests/"] + +RUN tar xzf /deps/saithrift-0.9.tar.gz -C /usr/share/; \ + cd usr/share/saithrift-0.9; \ + python setup.py install; \ + rm -rf /deps diff --git a/dockers/docker-ptf-saithrift/brcm_interface_to_front_map.ini b/dockers/docker-ptf-saithrift/brcm_interface_to_front_map.ini new file mode 100644 index 000000000000..0db110025b8a --- /dev/null +++ b/dockers/docker-ptf-saithrift/brcm_interface_to_front_map.ini @@ -0,0 +1,33 @@ +# ptf host interface @ switch front port name +0@Ethernet0 +1@Ethernet4 +2@Ethernet8 +3@Ethernet12 +4@Ethernet16 +5@Ethernet20 +6@Ethernet24 +7@Ethernet28 +8@Ethernet32 +9@Ethernet36 +10@Ethernet40 +11@Ethernet44 +12@Ethernet48 +13@Ethernet52 +14@Ethernet56 +15@Ethernet60 +16@Ethernet64 +17@Ethernet68 +18@Ethernet72 +19@Ethernet76 +20@Ethernet80 +21@Ethernet84 +22@Ethernet88 +23@Ethernet92 +24@Ethernet96 +25@Ethernet100 +26@Ethernet104 +27@Ethernet108 +28@Ethernet112 +29@Ethernet116 +30@Ethernet120 +31@Ethernet124 diff --git a/dockers/docker-ptf-saithrift/msn_2700_interface_to_front_map.ini b/dockers/docker-ptf-saithrift/msn_2700_interface_to_front_map.ini new file mode 100644 index 000000000000..4421812aeef9 --- /dev/null +++ b/dockers/docker-ptf-saithrift/msn_2700_interface_to_front_map.ini @@ -0,0 +1,33 @@ +# ptf host interface @ switch front port name +0@Ethernet1 +1@Ethernet2 +2@Ethernet3 +3@Ethernet4 +4@Ethernet5 +5@Ethernet6 +6@Ethernet7 +7@Ethernet8 +8@Ethernet9 +9@Ethernet10 +10@Ethernet11 +11@Ethernet12 +12@Ethernet13 +13@Ethernet14 +14@Ethernet15 +15@Ethernet16 +16@Ethernet17 +17@Ethernet18 +18@Ethernet19 +19@Ethernet20 +20@Ethernet21 +21@Ethernet22 +22@Ethernet23 +23@Ethernet24 +24@Ethernet25 +25@Ethernet26 +26@Ethernet27 +27@Ethernet28 +28@Ethernet29 +29@Ethernet30 +30@Ethernet31 +31@Ethernet32 From 0b80c625c42e66e4ea4164a513e5d4a663dcb7c6 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Fri, 4 Nov 2016 19:17:12 +0200 Subject: [PATCH 0071/1011] Fix issue with team docker build (#59) Added required docker-team dependency to Makefile to copy dep packages to dockers/docker-team/deps/ directory. Changed order of deb packages installation to fix dependency issue. --- Makefile | 2 +- dockers/docker-team/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 01ac0f96942e..3af2d859096c 100644 --- a/Makefile +++ b/Makefile @@ -133,7 +133,7 @@ target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/ docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-team.gz: target/docker-base.gz $(addprefix dockers/docker-team/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb $(LIBTEAM-DEBS)) +target/docker-team.gz: target/docker-base.gz $(addprefix dockers/docker-team/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb $(LIBNL-DEBS) libnl-cli-3-200_3.2.27-1_amd64.deb libnl-nf-3-200_3.2.27-1_amd64.deb $(LIBTEAM-DEBS) teamsyncd) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) diff --git a/dockers/docker-team/Dockerfile b/dockers/docker-team/Dockerfile index 885b99674b85..345b671c7d56 100644 --- a/dockers/docker-team/Dockerfile +++ b/dockers/docker-team/Dockerfile @@ -10,9 +10,9 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/libnl-nf-3-200_*.deb \ && dpkg_apt /deps/libnl-cli-3-200_*.deb \ && dpkg_apt /deps/libteam5_*.deb \ - && dpkg_apt /deps/libteam-dev_*.deb \ && dpkg_apt /deps/libteam-utils_*.deb \ && dpkg_apt /deps/libteamdctl0_*.deb \ + && dpkg_apt /deps/libteam-dev_*.deb \ && dpkg_apt /deps/libhiredis0.13_*.deb \ && dpkg_apt /deps/libswsscommon_*.deb From 27cddbcb62258b02cbf49be8b877da9a2ad1f995 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 4 Nov 2016 19:47:36 -0700 Subject: [PATCH 0072/1011] build_debian: Enable IPv6 forwarding (#60) Router behavior is assumed. 1. IsRouter flag is set in Neighbor Advertisements 2. Router Solicitations are not sent. 3. Router Advertisements are ignored. 4. Redirects are ignored. ref: http://mirrors.deepspace6.net/Linux+IPv6-HOWTO/proc-sys-net-ipv6..html --- build_debian.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index e231242ce489..1027a00b2437 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -198,17 +198,27 @@ sudo augtool --autosave "set /files/etc/ssh/sshd_config/UseDNS no" -r $FILESYSTE sudo mkdir -p $FILESYSTEM_ROOT/var/core sudo augtool --autosave " set /files/etc/sysctl.conf/kernel.core_pattern '|/usr/bin/coredump-compress %e %p' + +set /files/etc/sysctl.conf/net.ipv4.conf.default.forwarding 1 +set /files/etc/sysctl.conf/net.ipv4.conf.all.forwarding 1 +set /files/etc/sysctl.conf/net.ipv4.conf.eth0.forwarding 0 + set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_accept 0 set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_announce 0 set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_filter 0 set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_notify 0 set /files/etc/sysctl.conf/net.ipv4.conf.default.arp_ignore 0 -set /files/etc/sysctl.conf/net.ipv6.conf.default.accept_dad 0 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_accept 0 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_announce 1 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_filter 0 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_notify 1 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_ignore 2 + +set /files/etc/sysctl.conf/net.ipv6.conf.default.forwarding 1 +set /files/etc/sysctl.conf/net.ipv6.conf.all.forwarding 1 +set /files/etc/sysctl.conf/net.ipv6.conf.eth0.forwarding 0 + +set /files/etc/sysctl.conf/net.ipv6.conf.default.accept_dad 0 set /files/etc/sysctl.conf/net.ipv6.conf.all.accept_dad 0 " -r $FILESYSTEM_ROOT From 0d10feca1163b663cb87dd0ec23f9cb5091cf9c4 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Mon, 7 Nov 2016 18:57:59 +0200 Subject: [PATCH 0073/1011] Added libteam5 package to orchagent docker to resolve instalation dependencies. (#62) --- Makefile | 4 ++-- dockers/docker-orchagent/Dockerfile | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 3af2d859096c..87465c04562a 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ MLNX-SDK-DEBS=$(notdir $(wildcard src/mlnx-sdk/*.deb)) BRCM-SDK-DEBS=$(notdir $(wildcard src/brcm-sdk/*.deb)) CAVM-SDK-DEBS=$(notdir $(wildcard src/cavm-sdk/*.deb)) -LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb libnl-genl-3-200_3.2.27-1_amd64.deb libnl-route-3-200_3.2.27-1_amd64.deb +LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb libnl-genl-3-200_3.2.27-1_amd64.deb libnl-route-3-200_3.2.27-1_amd64.deb libnl-cli-3-200_3.2.27-1_amd64.deb libnl-nf-3-200_3.2.27-1_amd64.deb LIBTEAM-DEBS=libteam5_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb ## Function: build_docker, image_name save_file @@ -133,7 +133,7 @@ target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/ docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-team.gz: target/docker-base.gz $(addprefix dockers/docker-team/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb $(LIBNL-DEBS) libnl-cli-3-200_3.2.27-1_amd64.deb libnl-nf-3-200_3.2.27-1_amd64.deb $(LIBTEAM-DEBS) teamsyncd) +target/docker-team.gz: target/docker-base.gz $(addprefix dockers/docker-team/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS) teamsyncd) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) diff --git a/dockers/docker-orchagent/Dockerfile b/dockers/docker-orchagent/Dockerfile index 311fba152a64..cc95cf0f7f0b 100755 --- a/dockers/docker-orchagent/Dockerfile +++ b/dockers/docker-orchagent/Dockerfile @@ -2,16 +2,19 @@ FROM docker-base RUN apt-get update -COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/swss_*.deb", "/deps/"] +COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libnl-cli-3-200_*.deb", "deps/libnl-nf-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/libteam5_*.deb", "deps/swss_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ dpkg_apt /deps/libhiredis0.13*.deb \ && dpkg_apt /deps/libnl-3-200_*.deb \ && dpkg_apt /deps/libnl-genl-3-200_*.deb \ && dpkg_apt /deps/libnl-route-3-200_*.deb \ + && dpkg_apt /deps/libnl-nf-3-200_*.deb \ + && dpkg_apt /deps/libnl-cli-3-200_*.deb \ && dpkg_apt /deps/libswsscommon_*.deb \ && dpkg_apt /deps/libsairedis_*.deb \ - && dpkg_apt /deps/libsaimetadata_*.deb \ + && dpkg_apt /deps/libsaimetadata_*.deb \ + && dpkg_apt /deps/libteam5_*.deb \ && dpkg_apt /deps/swss_*.deb RUN apt-get install -f -y ifupdown bridge-utils redis-tools From 81d6382321ad7bbe21f4590c7a77c20388f375a3 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 8 Nov 2016 03:04:52 -0800 Subject: [PATCH 0074/1011] use seperate sources.list for debian base image build (#61) --- build_debian.sh | 2 +- files/apt/sources.list | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 files/apt/sources.list diff --git a/build_debian.sh b/build_debian.sh index 1027a00b2437..367c5814fefb 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -90,7 +90,7 @@ trap_push clean_sys sudo LANG=C chroot $FILESYSTEM_ROOT mount sysfs /sys -t sysfs ## Pointing apt to public apt mirrors and getting latest packages, needed for latest security updates -sudo cp dockers/docker-base/sources.list $FILESYSTEM_ROOT/etc/apt/ +sudo cp files/apt/sources.list $FILESYSTEM_ROOT/etc/apt/ sudo cp files/apt/apt.conf.d/81norecommends $FILESYSTEM_ROOT/etc/apt/apt.conf.d/ sudo LANG=C chroot $FILESYSTEM_ROOT bash -c 'apt-mark auto `apt-mark showmanual`' diff --git a/files/apt/sources.list b/files/apt/sources.list new file mode 100644 index 000000000000..2ed195cff416 --- /dev/null +++ b/files/apt/sources.list @@ -0,0 +1,7 @@ +## Debian mirror on Microsoft Azure +## Ref: http://debian-archive.trafficmanager.net/ + +deb http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free +deb-src http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free +deb http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free +deb-src http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free From 5c44521c5f5a6205379b52f9a290e69eb33e6945 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 9 Nov 2016 19:50:53 -0800 Subject: [PATCH 0075/1011] update asic firmware version to 13.1200.0116 --- dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh b/dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh index 2ef46685f801..81514f77b062 100755 --- a/dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh +++ b/dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh @@ -1,7 +1,7 @@ #!/bin/bash query_retry_count_max="10" -required_fw_version="13.1130.0010" +required_fw_version="13.1200.0116" fw_file=/etc/mlnx/fw-SPC.mfa run_or_fail() { From 75d7987dda21cc74789eb27747dc59b90c16a792 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 10 Nov 2016 14:41:29 -0800 Subject: [PATCH 0076/1011] Fix build: Makefile (#63) * Fix Makefile: libnl and libteam dependencies * Fix rule for docker-orchagent deps (brcm) * Install libteam libs by the right order --- Makefile | 12 ++++++++---- src/Makefile | 18 +++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 87465c04562a..528d483ddc35 100644 --- a/Makefile +++ b/Makefile @@ -15,8 +15,8 @@ MLNX-SDK-DEBS=$(notdir $(wildcard src/mlnx-sdk/*.deb)) BRCM-SDK-DEBS=$(notdir $(wildcard src/brcm-sdk/*.deb)) CAVM-SDK-DEBS=$(notdir $(wildcard src/cavm-sdk/*.deb)) -LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb libnl-genl-3-200_3.2.27-1_amd64.deb libnl-route-3-200_3.2.27-1_amd64.deb libnl-cli-3-200_3.2.27-1_amd64.deb libnl-nf-3-200_3.2.27-1_amd64.deb -LIBTEAM-DEBS=libteam5_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb +LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb libnl-3-dev_3.2.27-1_amd64.deb libnl-genl-3-200_3.2.27-1_amd64.deb libnl-genl-3-dev_3.2.27-1_amd64.deb libnl-route-3-200_3.2.27-1_amd64.deb libnl-route-3-dev_3.2.27-1_amd64.deb libnl-nf-3-200_3.2.27-1_amd64.deb libnl-nf-3-dev_3.2.27-1_amd64.deb libnl-cli-3-200_3.2.27-1_amd64.deb libnl-cli-3-dev_3.2.27-1_amd64.deb +LIBTEAM-DEBS=libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb ## Function: build_docker, image_name save_file ## build a docker image and save to a file @@ -31,7 +31,11 @@ endef ## Rules: redirect to sub directory src/%: - $(MAKE) REDIS_VERSION=$(REDIS_VERSION) -C src $(subst src/,,$@) + $(MAKE) \ + REDIS_VERSION=$(REDIS_VERSION) \ + LIBNL-DEBS="$(LIBNL-DEBS)" \ + LIBTEAM-DEBS="$(LIBTEAM-DEBS)" \ + -C src $(subst src/,,$@) ## Rules: docker-fpm dockers/docker-fpm/deps/fpmsyncd: src/fpmsyncd @@ -58,7 +62,7 @@ dockers/docker-orchagent-cavm/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) ## Rules: docker-orchagent (brcm) -$(addprefix dockers/docker-orchagent/deps/,libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb) : dockers/docker-orchagent/deps/%.deb : src/%.deb +$(addprefix dockers/docker-orchagent/deps/,libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb) : dockers/docker-orchagent/deps/%.deb : src/brcm/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) dockers/docker-orchagent/deps/%.deb: src/%.deb mkdir -p `dirname $@` && cp $< $(dir $@) diff --git a/src/Makefile b/src/Makefile index 1f277fbaeb36..0dabdfcf617d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,6 +4,8 @@ SHELL := /bin/bash REDIS_VERSION=3.2.4-1~bpo8+1_amd64 +LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb libnl-3-dev_3.2.27-1_amd64.deb libnl-genl-3-200_3.2.27-1_amd64.deb libnl-genl-3-dev_3.2.27-1_amd64.deb libnl-route-3-200_3.2.27-1_amd64.deb libnl-route-3-dev_3.2.27-1_amd64.deb libnl-nf-3-200_3.2.27-1_amd64.deb libnl-nf-3-dev_3.2.27-1_amd64.deb libnl-cli-3-200_3.2.27-1_amd64.deb libnl-cli-3-dev_3.2.27-1_amd64.deb +LIBTEAM-DEBS=libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb ## Function: build_project, directory ## Build the project and save the .deb target in the same directory @@ -21,16 +23,18 @@ install_deb = \ [ -f $(1) ] && { sudo dpkg -i $(1) || sudo apt-get -y install -f; } || return 1; ## Rules -libnl-%.deb: +$(LIBNL-DEBS): pushd libnl3; ./build.sh; popd -libteam5_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb: libnl-%.deb +$(LIBTEAM-DEBS): $(LIBNL-DEBS) + $(foreach dep, $^, $(call install_deb, $(dep))) pushd libteam; ./build.sh; popd redis-sentinel_$(REDIS_VERSION).deb redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb: pushd redis; ./build.sh; popd libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dbg_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb: redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb redis-sentinel_$(REDIS_VERSION).deb + $(foreach dep, $^, $(call install_deb, $(dep))) pushd hiredis; ./build.sh; popd libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb thrift-compiler_0.9.3-2_amd64.deb: @@ -60,7 +64,7 @@ p4-switch_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3 quagga_0.99.24.1-2.1_amd64.deb: $(call build_project, sonic-quagga) -libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb: redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb +libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb: redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb $(LIBNL-DEBS) $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss-common) @@ -89,7 +93,7 @@ p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0 cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb p4/ ## Note: fpmsyncd and teamsyncd are two implicit targets -brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb brcm/libsaimetadata_1.0.0_amd64.deb brcm/libsaimetadata-dev_1.0.0_amd64.deb libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb +brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb brcm/libsaimetadata_1.0.0_amd64.deb brcm/libsaimetadata-dev_1.0.0_amd64.deb $(LIBTEAM-DEBS) $(LIBNL-DEBS) $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb brcm/ @@ -97,7 +101,7 @@ brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd cp sonic-swss/debian/swss/usr/bin/teamsyncd . ## Note: fpmsyncd and teamsyncd are two implicit targets -mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb +mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb $(LIBTEAM-DEBS) $(LIBNL-DEBS) $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb mlnx/ @@ -105,14 +109,14 @@ mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd cp sonic-swss/debian/swss/usr/bin/teamsyncd . ## Note: fpmsyncd and teamsyncd are two implicit targets -cavm/swss_1.0.0_amd64.deb: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb cavm/libsaimetadata_1.0.0_amd64.deb cavm/libsaimetadata-dev_1.0.0_amd64.deb libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb +cavm/swss_1.0.0_amd64.deb: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb cavm/libsaimetadata_1.0.0_amd64.deb cavm/libsaimetadata-dev_1.0.0_amd64.deb $(LIBTEAM-DEBS) $(LIBNL-DEBS) $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb cavm/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . cp sonic-swss/debian/swss/usr/bin/teamsyncd . -p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb p4/libsaimetadata-dev_1.0.0_amd64.deb libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb +p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb p4/libsaimetadata-dev_1.0.0_amd64.deb $(LIBTEAM-DEBS) $(LIBNL-DEBS) $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) cp swss_1.0.0_amd64.deb p4/ From f8524e74f5a582455d5fdfbb88776a2276a00e37 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 11 Nov 2016 12:09:25 -0800 Subject: [PATCH 0077/1011] Fix dependencies in Dockerfiles (#65) --- Makefile | 2 +- dockers/docker-fpm/Dockerfile | 13 ++++++++----- dockers/docker-syncd-cavm/Dockerfile | 21 ++++++++++++--------- dockers/docker-team/Dockerfile | 5 +---- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/Makefile b/Makefile index 528d483ddc35..f106a96137e9 100644 --- a/Makefile +++ b/Makefile @@ -133,7 +133,7 @@ target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docke docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2.1_amd64.deb fpmsyncd) +target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2.1_amd64.deb fpmsyncd $(LIBNL-DEBS)) docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) diff --git a/dockers/docker-fpm/Dockerfile b/dockers/docker-fpm/Dockerfile index 287aba29ec82..ca5b811f1949 100755 --- a/dockers/docker-fpm/Dockerfile +++ b/dockers/docker-fpm/Dockerfile @@ -2,14 +2,17 @@ FROM docker-base RUN apt-get update -COPY ["deps/libhiredis0.13*.deb", "deps/libswsscommon_*.deb", "deps/quagga_*", "/deps/"] +COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/quagga_*", "/deps/"] ## Get fpmsyncd -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libswsscommon_*.deb - ## Get Quagga -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/quagga_*.deb +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /deps/libhiredis0.13*.deb \ + && dpkg_apt /deps/libnl-3-200_*.deb \ + && dpkg_apt /deps/libnl-genl-3-200_*.deb \ + && dpkg_apt /deps/libnl-route-3-200_*.deb \ + && dpkg_apt /deps/libswsscommon_*.deb \ + && dpkg_apt /deps/quagga_*.deb COPY ["deps/fpmsyncd", "start.sh", "/usr/bin/"] diff --git a/dockers/docker-syncd-cavm/Dockerfile b/dockers/docker-syncd-cavm/Dockerfile index 3fdbf1f516b8..e8025011bb70 100755 --- a/dockers/docker-syncd-cavm/Dockerfile +++ b/dockers/docker-syncd-cavm/Dockerfile @@ -2,17 +2,20 @@ FROM docker-base RUN apt-get update -COPY ["deps/libhiredis0.13*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/syncd_*.deb", "deps/sai*.deb", "deps/libsai*.deb", "deps/xp-tools*.deb", "deps/xpshell*.deb", "/deps/"] +COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/syncd_*.deb", "deps/sai*.deb", "deps/libsai*.deb", "deps/xp-tools*.deb", "deps/xpshell*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/libhiredis0.13*.deb \ - && dpkg_apt /deps/libswsscommon_*.deb \ - && dpkg_apt /deps/sai*.deb \ - && dpkg_apt /deps/libsai*.deb \ - && dpkg_apt /deps/xp-tools*.deb \ - && dpkg_apt /deps/xpshell*.deb \ - && dpkg_apt /deps/libsairedis_*.deb \ - && dpkg_apt /deps/libsaimetadata_*.deb\ + dpkg_apt /deps/libhiredis0.13*.deb \ + && dpkg_apt /deps/libnl-3-200_*.deb \ + && dpkg_apt /deps/libnl-genl-3-200_*.deb \ + && dpkg_apt /deps/libnl-route-3-200_*.deb \ + && dpkg_apt /deps/libswsscommon_*.deb \ + && dpkg_apt /deps/sai*.deb \ + && dpkg_apt /deps/libsai*.deb \ + && dpkg_apt /deps/xp-tools*.deb \ + && dpkg_apt /deps/xpshell*.deb \ + && dpkg_apt /deps/libsairedis_*.deb \ + && dpkg_apt /deps/libsaimetadata_*.deb \ && dpkg_apt /deps/syncd_*.deb RUN apt-get -y install libpcap-dev libxml2-dev python-dev swig libsensors4-dev diff --git a/dockers/docker-team/Dockerfile b/dockers/docker-team/Dockerfile index 345b671c7d56..607a990b4f23 100644 --- a/dockers/docker-team/Dockerfile +++ b/dockers/docker-team/Dockerfile @@ -1,7 +1,6 @@ FROM docker-base -COPY ["deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libnl-nf-3-200_*.deb", "deps/libnl-cli-3-200_*.deb", "deps/libteam5_*.deb", "deps/libteam-dev_*.deb", "deps/libteam-utils_*.deb", "deps/libteamdctl0_*.deb", "deps/libhiredis0.13_*.deb", "deps/libswsscommon_*.deb", "/deps/"] - +COPY ["deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libnl-nf-3-200_*.deb", "deps/libnl-cli-3-200_*.deb", "deps/libteam5_*.deb", "deps/libteam-utils_*.deb", "deps/libteamdctl0_*.deb", "deps/libhiredis0.13_*.deb", "deps/libswsscommon_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ dpkg_apt /deps/libnl-3-200_*.deb \ @@ -12,7 +11,6 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/libteam5_*.deb \ && dpkg_apt /deps/libteam-utils_*.deb \ && dpkg_apt /deps/libteamdctl0_*.deb \ - && dpkg_apt /deps/libteam-dev_*.deb \ && dpkg_apt /deps/libhiredis0.13_*.deb \ && dpkg_apt /deps/libswsscommon_*.deb @@ -23,4 +21,3 @@ RUN rm -rf /deps ENTRYPOINT ["/bin/bash"] CMD ["/usr/bin/start.sh"] - From 21c8322055fc445abaf7110abc222f088b08f79d Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Sat, 12 Nov 2016 01:14:41 +0000 Subject: [PATCH 0078/1011] Change redis conf: listen on unix socket (#66) By default, redis-server is listening on localhost TCP port. This change will make it also listen to the domain socket (unix socket), which will have better client-server performance. --- dockers/docker-database/Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dockers/docker-database/Dockerfile b/dockers/docker-database/Dockerfile index 2014cd8919f0..445ac44b12b0 100755 --- a/dockers/docker-database/Dockerfile +++ b/dockers/docker-database/Dockerfile @@ -10,8 +10,10 @@ RUN apt-get update && dpkg_apt /deps/redis-server_*.deb && \ apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y -RUN sed -ri 's/^daemonize yes$/daemonize no/' /etc/redis/redis.conf \ - && sed -ri 's/^logfile .*$/logfile ""/' /etc/redis/redis.conf \ - && sed -ri 's/^# syslog-enabled no$/syslog-enabled no/' /etc/redis/redis.conf +RUN sed -ri 's/^daemonize yes$/daemonize no/; \ + s/^logfile .*$/logfile ""/; \ + s/^# syslog-enabled no$/syslog-enabled no/; \ + s/^# unixsocket/unixsocket/ \ + ' /etc/redis/redis.conf ENTRYPOINT service redis-server start From 31420370b07997f7f2b6c35f3a134f28b82ec939 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 14 Nov 2016 13:52:12 +0200 Subject: [PATCH 0079/1011] Remove packages that are not required for SONiC (#67) Remove mlnx sx-sdn-hal, sx-acl-rm and testx. They are neither used nor installed in SONiC. --- src/mlnx-sdk/filelist.txt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/mlnx-sdk/filelist.txt b/src/mlnx-sdk/filelist.txt index 52583c7f79c7..f901164e9fd6 100644 --- a/src/mlnx-sdk/filelist.txt +++ b/src/mlnx-sdk/filelist.txt @@ -7,8 +7,6 @@ iproute2-dev_1.mlnx.4.2.2100_amd64.deb iproute2_1.mlnx.4.2.2100_amd64.deb mlnx-sai_1.mlnx.160712_amd64.deb python-sdk-api_1.mlnx.4.2.2100_amd64.deb -sx-acl-rm-dev_1.mlnx.4.2.2100_amd64.deb -sx-acl-rm_1.mlnx.4.2.2100_amd64.deb sx-complib-dev-static_1.mlnx.4.2.2100_amd64.deb sx-complib-dev_1.mlnx.4.2.2100_amd64.deb sx-complib_1.mlnx.4.2.2100_amd64.deb @@ -21,11 +19,6 @@ sx-kernel_1.mlnx.4.2.2100_amd64.deb sx-scew-dev-static_1.mlnx.4.2.2100_amd64.deb sx-scew-dev_1.mlnx.4.2.2100_amd64.deb sx-scew_1.mlnx.4.2.2100_amd64.deb -sx-sdn-hal-dev-static_1.mlnx.4.2.2100_amd64.deb -sx-sdn-hal-dev_1.mlnx.4.2.2100_amd64.deb -sx-sdn-hal_1.mlnx.4.2.2100_amd64.deb sxd-libs-dev-static_1.mlnx.4.2.2100_amd64.deb sxd-libs-dev_1.mlnx.4.2.2100_amd64.deb sxd-libs_1.mlnx.4.2.2100_amd64.deb -testx-dev_1.mlnx.4.2.2100_amd64.deb -testx_1.mlnx.4.2.2100_amd64.deb From af5c61c73aa7c8288967b58761ba7a84f9236e78 Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Thu, 10 Nov 2016 18:29:44 -0800 Subject: [PATCH 0080/1011] Add set rcv buffer for syncd rpc (#64) --- dockers/docker-syncd-mlnx-rpc/Dockerfile | 1 + dockers/docker-syncd-mlnx-rpc/ptf_nn_agent.conf | 2 +- dockers/docker-syncd-rpc/Dockerfile | 1 + dockers/docker-syncd-rpc/ptf_nn_agent.conf | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dockers/docker-syncd-mlnx-rpc/Dockerfile b/dockers/docker-syncd-mlnx-rpc/Dockerfile index 734171ffb3e0..c22145d1d69c 100644 --- a/dockers/docker-syncd-mlnx-rpc/Dockerfile +++ b/dockers/docker-syncd-mlnx-rpc/Dockerfile @@ -44,5 +44,6 @@ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf ENTRYPOINT service rsyslog start \ + && sysctl -w net.core.rmem_max=509430500 \ && service syncd start \ && /usr/bin/supervisord diff --git a/dockers/docker-syncd-mlnx-rpc/ptf_nn_agent.conf b/dockers/docker-syncd-mlnx-rpc/ptf_nn_agent.conf index b16159a996e8..fa1ed0eb1622 100644 --- a/dockers/docker-syncd-mlnx-rpc/ptf_nn_agent.conf +++ b/dockers/docker-syncd-mlnx-rpc/ptf_nn_agent.conf @@ -1,5 +1,5 @@ [program:ptf_nn_agent] -command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 +command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-iface-rcv-buffer=109430400 process_name=ptf_nn_agent stdout_logfile=/tmp/ptf_nn_agent.out.log stderr_logfile=/tmp/ptf_nn_agent.err.log diff --git a/dockers/docker-syncd-rpc/Dockerfile b/dockers/docker-syncd-rpc/Dockerfile index 28108a82582c..214230491e34 100644 --- a/dockers/docker-syncd-rpc/Dockerfile +++ b/dockers/docker-syncd-rpc/Dockerfile @@ -44,5 +44,6 @@ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf ENTRYPOINT service rsyslog start \ + && sysctl -w net.core.rmem_max=509430500 \ && service syncd start \ && /usr/bin/supervisord diff --git a/dockers/docker-syncd-rpc/ptf_nn_agent.conf b/dockers/docker-syncd-rpc/ptf_nn_agent.conf index b16159a996e8..fa1ed0eb1622 100644 --- a/dockers/docker-syncd-rpc/ptf_nn_agent.conf +++ b/dockers/docker-syncd-rpc/ptf_nn_agent.conf @@ -1,5 +1,5 @@ [program:ptf_nn_agent] -command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 +command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-iface-rcv-buffer=109430400 process_name=ptf_nn_agent stdout_logfile=/tmp/ptf_nn_agent.out.log stderr_logfile=/tmp/ptf_nn_agent.err.log From dc84c4130a32f3c48769e7edc1ed757fdcd59528 Mon Sep 17 00:00:00 2001 From: Guohan Lu Date: Tue, 15 Nov 2016 03:57:44 +0000 Subject: [PATCH 0081/1011] update mlnx sdk to 4.2.3002 and remove mlnx sai package --- src/mlnx-sdk/filelist.txt | 41 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/mlnx-sdk/filelist.txt b/src/mlnx-sdk/filelist.txt index f901164e9fd6..521de44de76a 100644 --- a/src/mlnx-sdk/filelist.txt +++ b/src/mlnx-sdk/filelist.txt @@ -1,24 +1,23 @@ ## Get vendor SAI SDK ## https://github.com/Azure/sonic-buildimage/blob/master/README.md#3-get-vendor-sai-sdk -applibs-dev_1.mlnx.4.2.2100_amd64.deb -applibs_1.mlnx.4.2.2100_amd64.deb -iproute2-dev_1.mlnx.4.2.2100_amd64.deb -iproute2_1.mlnx.4.2.2100_amd64.deb -mlnx-sai_1.mlnx.160712_amd64.deb -python-sdk-api_1.mlnx.4.2.2100_amd64.deb -sx-complib-dev-static_1.mlnx.4.2.2100_amd64.deb -sx-complib-dev_1.mlnx.4.2.2100_amd64.deb -sx-complib_1.mlnx.4.2.2100_amd64.deb -sx-examples-dev_1.mlnx.4.2.2100_amd64.deb -sx-examples_1.mlnx.4.2.2100_amd64.deb -sx-gen-utils-dev_1.mlnx.4.2.2100_amd64.deb -sx-gen-utils_1.mlnx.4.2.2100_amd64.deb -sx-kernel-dev_1.mlnx.4.2.2100_amd64.deb -sx-kernel_1.mlnx.4.2.2100_amd64.deb -sx-scew-dev-static_1.mlnx.4.2.2100_amd64.deb -sx-scew-dev_1.mlnx.4.2.2100_amd64.deb -sx-scew_1.mlnx.4.2.2100_amd64.deb -sxd-libs-dev-static_1.mlnx.4.2.2100_amd64.deb -sxd-libs-dev_1.mlnx.4.2.2100_amd64.deb -sxd-libs_1.mlnx.4.2.2100_amd64.deb +applibs-dev_1.mlnx.4.2.3002_amd64.deb +applibs_1.mlnx.4.2.3002_amd64.deb +iproute2-dev_1.mlnx.4.2.3002_amd64.deb +iproute2_1.mlnx.4.2.3002_amd64.deb +python-sdk-api_1.mlnx.4.2.3002_amd64.deb +sx-complib-dev-static_1.mlnx.4.2.3002_amd64.deb +sx-complib-dev_1.mlnx.4.2.3002_amd64.deb +sx-complib_1.mlnx.4.2.3002_amd64.deb +sx-examples-dev_1.mlnx.4.2.3002_amd64.deb +sx-examples_1.mlnx.4.2.3002_amd64.deb +sx-gen-utils-dev_1.mlnx.4.2.3002_amd64.deb +sx-gen-utils_1.mlnx.4.2.3002_amd64.deb +sx-kernel-dev_1.mlnx.4.2.3002_amd64.deb +sx-kernel_1.mlnx.4.2.3002_amd64.deb +sx-scew-dev-static_1.mlnx.4.2.3002_amd64.deb +sx-scew-dev_1.mlnx.4.2.3002_amd64.deb +sx-scew_1.mlnx.4.2.3002_amd64.deb +sxd-libs-dev-static_1.mlnx.4.2.3002_amd64.deb +sxd-libs-dev_1.mlnx.4.2.3002_amd64.deb +sxd-libs_1.mlnx.4.2.3002_amd64.deb From 0f0f9926c778bb634e78bf955506998d716d6d87 Mon Sep 17 00:00:00 2001 From: Guohan Lu Date: Tue, 15 Nov 2016 14:09:38 +0000 Subject: [PATCH 0082/1011] reformat deb file list to make it more readable --- src/Makefile | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Makefile b/src/Makefile index 0dabdfcf617d..6dd92c6ff0d0 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,8 +4,22 @@ SHELL := /bin/bash REDIS_VERSION=3.2.4-1~bpo8+1_amd64 -LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb libnl-3-dev_3.2.27-1_amd64.deb libnl-genl-3-200_3.2.27-1_amd64.deb libnl-genl-3-dev_3.2.27-1_amd64.deb libnl-route-3-200_3.2.27-1_amd64.deb libnl-route-3-dev_3.2.27-1_amd64.deb libnl-nf-3-200_3.2.27-1_amd64.deb libnl-nf-3-dev_3.2.27-1_amd64.deb libnl-cli-3-200_3.2.27-1_amd64.deb libnl-cli-3-dev_3.2.27-1_amd64.deb -LIBTEAM-DEBS=libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb + +LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb \ + libnl-3-dev_3.2.27-1_amd64.deb \ + libnl-genl-3-200_3.2.27-1_amd64.deb \ + libnl-genl-3-dev_3.2.27-1_amd64.deb \ + libnl-route-3-200_3.2.27-1_amd64.deb \ + libnl-route-3-dev_3.2.27-1_amd64.deb \ + libnl-nf-3-200_3.2.27-1_amd64.deb \ + libnl-nf-3-dev_3.2.27-1_amd64.deb \ + libnl-cli-3-200_3.2.27-1_amd64.deb \ + libnl-cli-3-dev_3.2.27-1_amd64.deb + +LIBTEAM-DEBS=libteam5_1.26-1_amd64.deb \ + libteamdctl0_1.26-1_amd64.deb \ + libteam-dev_1.26-1_amd64.deb \ + libteam-utils_1.26-1_amd64.deb ## Function: build_project, directory ## Build the project and save the .deb target in the same directory From af38c0e77df4581eb9825c94fa9a5792f8282dd3 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 16 Nov 2016 12:46:15 -0800 Subject: [PATCH 0083/1011] Config apt inside docker images to save disk space: auto clean, gz, no trans (#69) --- ThirdPartyLicenses.txt | 194 ++++++++++++++++++++++++++ build_debian.sh | 2 +- files/apt/apt.conf.d/apt-clean | 19 +++ files/apt/apt.conf.d/apt-gzip-indexes | 11 ++ files/apt/apt.conf.d/apt-no-languages | 5 + 5 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 files/apt/apt.conf.d/apt-clean create mode 100644 files/apt/apt.conf.d/apt-gzip-indexes create mode 100644 files/apt/apt.conf.d/apt-no-languages diff --git a/ThirdPartyLicenses.txt b/ThirdPartyLicenses.txt index 99bc267e11f9..376506337e79 100644 --- a/ThirdPartyLicenses.txt +++ b/ThirdPartyLicenses.txt @@ -976,3 +976,197 @@ Microsoft is offering you a license to use the following components, to the exte * Public License instead of this License. But first, please read * . */ + +4. apt-clean, apt-gzip-indexes, apt-no-languages imported from docker v1.11.1 +/* + * Apache License + * Version 2.0, January 2004 + * https://www.apache.org/licenses/ + * + * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + * + * 1. Definitions. + * + * "License" shall mean the terms and conditions for use, reproduction, + * and distribution as defined by Sections 1 through 9 of this document. + * + * "Licensor" shall mean the copyright owner or entity authorized by + * the copyright owner that is granting the License. + * + * "Legal Entity" shall mean the union of the acting entity and all + * other entities that control, are controlled by, or are under common + * control with that entity. For the purposes of this definition, + * "control" means (i) the power, direct or indirect, to cause the + * direction or management of such entity, whether by contract or + * otherwise, or (ii) ownership of fifty percent (50%) or more of the + * outstanding shares, or (iii) beneficial ownership of such entity. + * + * "You" (or "Your") shall mean an individual or Legal Entity + * exercising permissions granted by this License. + * + * "Source" form shall mean the preferred form for making modifications, + * including but not limited to software source code, documentation + * source, and configuration files. + * + * "Object" form shall mean any form resulting from mechanical + * transformation or translation of a Source form, including but + * not limited to compiled object code, generated documentation, + * and conversions to other media types. + * + * "Work" shall mean the work of authorship, whether in Source or + * Object form, made available under the License, as indicated by a + * copyright notice that is included in or attached to the work + * (an example is provided in the Appendix below). + * + * "Derivative Works" shall mean any work, whether in Source or Object + * form, that is based on (or derived from) the Work and for which the + * editorial revisions, annotations, elaborations, or other modifications + * represent, as a whole, an original work of authorship. For the purposes + * of this License, Derivative Works shall not include works that remain + * separable from, or merely link (or bind by name) to the interfaces of, + * the Work and Derivative Works thereof. + * + * "Contribution" shall mean any work of authorship, including + * the original version of the Work and any modifications or additions + * to that Work or Derivative Works thereof, that is intentionally + * submitted to Licensor for inclusion in the Work by the copyright owner + * or by an individual or Legal Entity authorized to submit on behalf of + * the copyright owner. For the purposes of this definition, "submitted" + * means any form of electronic, verbal, or written communication sent + * to the Licensor or its representatives, including but not limited to + * communication on electronic mailing lists, source code control systems, + * and issue tracking systems that are managed by, or on behalf of, the + * Licensor for the purpose of discussing and improving the Work, but + * excluding communication that is conspicuously marked or otherwise + * designated in writing by the copyright owner as "Not a Contribution." + * + * "Contributor" shall mean Licensor and any individual or Legal Entity + * on behalf of whom a Contribution has been received by Licensor and + * subsequently incorporated within the Work. + * + * 2. Grant of Copyright License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * copyright license to reproduce, prepare Derivative Works of, + * publicly display, publicly perform, sublicense, and distribute the + * Work and such Derivative Works in Source or Object form. + * + * 3. Grant of Patent License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * (except as stated in this section) patent license to make, have made, + * use, offer to sell, sell, import, and otherwise transfer the Work, + * where such license applies only to those patent claims licensable + * by such Contributor that are necessarily infringed by their + * Contribution(s) alone or by combination of their Contribution(s) + * with the Work to which such Contribution(s) was submitted. If You + * institute patent litigation against any entity (including a + * cross-claim or counterclaim in a lawsuit) alleging that the Work + * or a Contribution incorporated within the Work constitutes direct + * or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate + * as of the date such litigation is filed. + * + * 4. Redistribution. You may reproduce and distribute copies of the + * Work or Derivative Works thereof in any medium, with or without + * modifications, and in Source or Object form, provided that You + * meet the following conditions: + * + * (a) You must give any other recipients of the Work or + * Derivative Works a copy of this License; and + * + * (b) You must cause any modified files to carry prominent notices + * stating that You changed the files; and + * + * (c) You must retain, in the Source form of any Derivative Works + * that You distribute, all copyright, patent, trademark, and + * attribution notices from the Source form of the Work, + * excluding those notices that do not pertain to any part of + * the Derivative Works; and + * + * (d) If the Work includes a "NOTICE" text file as part of its + * distribution, then any Derivative Works that You distribute must + * include a readable copy of the attribution notices contained + * within such NOTICE file, excluding those notices that do not + * pertain to any part of the Derivative Works, in at least one + * of the following places: within a NOTICE text file distributed + * as part of the Derivative Works; within the Source form or + * documentation, if provided along with the Derivative Works; or, + * within a display generated by the Derivative Works, if and + * wherever such third-party notices normally appear. The contents + * of the NOTICE file are for informational purposes only and + * do not modify the License. You may add Your own attribution + * notices within Derivative Works that You distribute, alongside + * or as an addendum to the NOTICE text from the Work, provided + * that such additional attribution notices cannot be construed + * as modifying the License. + * + * You may add Your own copyright statement to Your modifications and + * may provide additional or different license terms and conditions + * for use, reproduction, or distribution of Your modifications, or + * for any such Derivative Works as a whole, provided Your use, + * reproduction, and distribution of the Work otherwise complies with + * the conditions stated in this License. + * + * 5. Submission of Contributions. Unless You explicitly state otherwise, + * any Contribution intentionally submitted for inclusion in the Work + * by You to the Licensor shall be under the terms and conditions of + * this License, without any additional terms or conditions. + * Notwithstanding the above, nothing herein shall supersede or modify + * the terms of any separate license agreement you may have executed + * with Licensor regarding such Contributions. + * + * 6. Trademarks. This License does not grant permission to use the trade + * names, trademarks, service marks, or product names of the Licensor, + * except as required for reasonable and customary use in describing the + * origin of the Work and reproducing the content of the NOTICE file. + * + * 7. Disclaimer of Warranty. Unless required by applicable law or + * agreed to in writing, Licensor provides the Work (and each + * Contributor provides its Contributions) on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied, including, without limitation, any warranties or conditions + * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + * PARTICULAR PURPOSE. You are solely responsible for determining the + * appropriateness of using or redistributing the Work and assume any + * risks associated with Your exercise of permissions under this License. + * + * 8. Limitation of Liability. In no event and under no legal theory, + * whether in tort (including negligence), contract, or otherwise, + * unless required by applicable law (such as deliberate and grossly + * negligent acts) or agreed to in writing, shall any Contributor be + * liable to You for damages, including any direct, indirect, special, + * incidental, or consequential damages of any character arising as a + * result of this License or out of the use or inability to use the + * Work (including but not limited to damages for loss of goodwill, + * work stoppage, computer failure or malfunction, or any and all + * other commercial damages or losses), even if such Contributor + * has been advised of the possibility of such damages. + * + * 9. Accepting Warranty or Additional Liability. While redistributing + * the Work or Derivative Works thereof, You may choose to offer, + * and charge a fee for, acceptance of support, warranty, indemnity, + * or other liability obligations and/or rights consistent with this + * License. However, in accepting such obligations, You may act only + * on Your own behalf and on Your sole responsibility, not on behalf + * of any other Contributor, and only if You agree to indemnify, + * defend, and hold each Contributor harmless for any liability + * incurred by, or claims asserted against, such Contributor by reason + * of your accepting any such warranty or additional liability. + * + * END OF TERMS AND CONDITIONS + * + * Copyright 2013-2016 Docker, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/build_debian.sh b/build_debian.sh index 367c5814fefb..9252646dff4b 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -91,7 +91,7 @@ sudo LANG=C chroot $FILESYSTEM_ROOT mount sysfs /sys -t sysfs ## Pointing apt to public apt mirrors and getting latest packages, needed for latest security updates sudo cp files/apt/sources.list $FILESYSTEM_ROOT/etc/apt/ -sudo cp files/apt/apt.conf.d/81norecommends $FILESYSTEM_ROOT/etc/apt/apt.conf.d/ +sudo cp files/apt/apt.conf.d/{81norecommends,apt-{clean,gzip-indexes,no-languages}} $FILESYSTEM_ROOT/etc/apt/apt.conf.d/ sudo LANG=C chroot $FILESYSTEM_ROOT bash -c 'apt-mark auto `apt-mark showmanual`' ## Note: set lang to prevent locale warnings in your chroot diff --git a/files/apt/apt.conf.d/apt-clean b/files/apt/apt.conf.d/apt-clean new file mode 100644 index 000000000000..886c6d829a3b --- /dev/null +++ b/files/apt/apt.conf.d/apt-clean @@ -0,0 +1,19 @@ +# Since for most Docker users, package installs happen in "docker build" steps, +# they essentially become individual layers due to the way Docker handles +# layering, especially using CoW filesystems. What this means for us is that +# the caches that APT keeps end up just wasting space in those layers, making +# our layers unnecessarily large (especially since we'll normally never use +# these caches again and will instead just "docker build" again and make a brand +# new image). + +# Ideally, these would just be invoking "apt-get clean", but in our testing, +# that ended up being cyclic and we got stuck on APT's lock, so we get this fun +# creation that's essentially just "apt-get clean". +DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; }; +APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; }; + +Dir::Cache::pkgcache ""; +Dir::Cache::srcpkgcache ""; + +# Note that we do realize this isn't the ideal way to do this, and are always +# open to better suggestions (https://github.com/docker/docker/issues). diff --git a/files/apt/apt.conf.d/apt-gzip-indexes b/files/apt/apt.conf.d/apt-gzip-indexes new file mode 100644 index 000000000000..6d29ac4474de --- /dev/null +++ b/files/apt/apt.conf.d/apt-gzip-indexes @@ -0,0 +1,11 @@ +# Since Docker users using "RUN apt-get update && apt-get install -y ..." in +# their Dockerfiles don't go delete the lists files afterwards, we want them to +# be as small as possible on-disk, so we explicitly request "gz" versions and +# tell Apt to keep them gzipped on-disk. + +# For comparison, an "apt-get update" layer without this on a pristine +# "debian:wheezy" base image was "29.88 MB", where with this it was only +# "8.273 MB". + +Acquire::GzipIndexes "true"; +Acquire::CompressionTypes::Order:: "gz"; diff --git a/files/apt/apt.conf.d/apt-no-languages b/files/apt/apt.conf.d/apt-no-languages new file mode 100644 index 000000000000..964d83d6c5b9 --- /dev/null +++ b/files/apt/apt.conf.d/apt-no-languages @@ -0,0 +1,5 @@ +# In Docker, we don't often need the "Translations" files, so we're just wasting +# time and space by downloading them, and this inhibits that. For users that do +# need them, it's a simple matter to delete this file and "apt-get update". :) + +Acquire::Languages "none"; From e8b96abb6381bb279c93e4eb2e7ac63b1f45865a Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 16 Nov 2016 18:40:19 -0800 Subject: [PATCH 0084/1011] add build badge for mellnaox --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f79e78746776..11171ecefe96 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +Mellanox[![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) + # Build SONiC Switch Images - buildimage # Description From 590f2cb0b985f32fba25b9a56216cb037606c9b7 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 21 Nov 2016 10:27:23 -0800 Subject: [PATCH 0085/1011] add fw-SPC.mfa in the filelist.txt (#71) --- src/mlnx-sdk/filelist.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mlnx-sdk/filelist.txt b/src/mlnx-sdk/filelist.txt index 521de44de76a..354c84140927 100644 --- a/src/mlnx-sdk/filelist.txt +++ b/src/mlnx-sdk/filelist.txt @@ -1,6 +1,7 @@ ## Get vendor SAI SDK ## https://github.com/Azure/sonic-buildimage/blob/master/README.md#3-get-vendor-sai-sdk +fw-SPC.mfa applibs-dev_1.mlnx.4.2.3002_amd64.deb applibs_1.mlnx.4.2.3002_amd64.deb iproute2-dev_1.mlnx.4.2.3002_amd64.deb From 14c86bbd25d7df9c0a5b4ab29b32e7f1969c1e75 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 21 Nov 2016 17:25:45 -0800 Subject: [PATCH 0086/1011] remove applibs_*.deb to fix mlnx build (#70) --- Makefile | 2 +- src/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index f106a96137e9..2e4e17080430 100644 --- a/Makefile +++ b/Makefile @@ -113,7 +113,7 @@ target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/d docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) -target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) applibs_1.mlnx.4.2.2100_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb $(LIBNL-DEBS)) dockers/docker-syncd-mlnx/deps/fw-SPC.mfa +target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb $(LIBNL-DEBS)) dockers/docker-syncd-mlnx/deps/fw-SPC.mfa docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) diff --git a/src/Makefile b/src/Makefile index 6dd92c6ff0d0..f84aec1f32fb 100644 --- a/src/Makefile +++ b/src/Makefile @@ -88,7 +88,7 @@ brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev mkdir -p brcm cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb brcm/ -mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb mlnx-sdk/applibs_1.mlnx.4.2.2100_amd64.deb mlnx-sdk/*.deb +mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb mlnx-sdk/*.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-sairedis) mkdir -p mlnx From 5621082dbb8463c3ae9332d1234f2373fa6eef09 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 21 Nov 2016 17:44:16 -0800 Subject: [PATCH 0087/1011] LLDP docker: Remove outdated dependency (#73) --- dockers/docker-lldp-sv2/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-lldp-sv2/Dockerfile b/dockers/docker-lldp-sv2/Dockerfile index 0ad91cf70518..727d4ce38c56 100644 --- a/dockers/docker-lldp-sv2/Dockerfile +++ b/dockers/docker-lldp-sv2/Dockerfile @@ -1,9 +1,9 @@ FROM docker-base -COPY deps/sswsdk*.whl deps/sonic_d*.whl deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ +COPY deps/sswsdk*.whl deps/sonic_d*.whl deps/lldpd_*.deb /deps/ ## Pre-install the fundamental packages -## Install Python SSWSDK (lldpsyncd dependency) +## Install Python SSWSDK ## Install LLDP Sync Daemon ## Note: dpkg_apt function has the benefit to detect missing .deb file ## Clean up From f25188e3a46d3b06e3998066160e6d584ab8f327 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 22 Nov 2016 21:08:55 -0800 Subject: [PATCH 0088/1011] Add python3 build script (#76) * build python 3.5 * update to 3.5.2-8 * add python3.5 and mpdecimal to Makefile --- src/Makefile | 19 +++++++++++++++++++ src/mpdecimal/build.sh | 20 ++++++++++++++++++++ src/python3.5/build.sh | 18 ++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100755 src/mpdecimal/build.sh create mode 100755 src/python3.5/build.sh diff --git a/src/Makefile b/src/Makefile index f84aec1f32fb..f8cb2889d877 100644 --- a/src/Makefile +++ b/src/Makefile @@ -21,6 +21,18 @@ LIBTEAM-DEBS=libteam5_1.26-1_amd64.deb \ libteam-dev_1.26-1_amd64.deb \ libteam-utils_1.26-1_amd64.deb +MPDECIMAL_VER=2.4.2-1 + +MPDECIMAL-DEBS=libmpdec2_$(MPDECIMAL_VER)_amd64.deb \ + libmpdec-dev_$(MPDECIMAL_VER)_amd64.deb + +PYTHON3_5_VER=3.5.2-8 + +PYTHON3_5-DEBS=libpython3.5-minimal_$(PYTHON3_5_VER)_amd64.deb \ + python3.5-minimal_$(PYTHON3_5_VER)_amd64.deb \ + libpython3.5-stdlib_$(PYTHON3_5_VER)_amd64.deb \ + python3.5_$(PYTHON3_5_VER)_amd64.deb + ## Function: build_project, directory ## Build the project and save the .deb target in the same directory ## TRICK: clean dh state so it will force recreating .deb later @@ -44,6 +56,13 @@ $(LIBTEAM-DEBS): $(LIBNL-DEBS) $(foreach dep, $^, $(call install_deb, $(dep))) pushd libteam; ./build.sh; popd +$(MPDECIMAL-DEBS): + pushd mpdecimal; ./build.sh; popd + +$(PYTHON3_5-DEBS): $(MPDECIMAL-DEBS) + $(foreach dep, $^, $(call install_deb, $(dep))) + pushd python3.5; ./build.sh; popd + redis-sentinel_$(REDIS_VERSION).deb redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb: pushd redis; ./build.sh; popd diff --git a/src/mpdecimal/build.sh b/src/mpdecimal/build.sh new file mode 100755 index 000000000000..be06c35766cf --- /dev/null +++ b/src/mpdecimal/build.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +MPDECIMAL_VER=2.4.2 +MPDECIMAL_DEB_VER=1 + +wget -N http://http.debian.net/debian/pool/main/m/mpdecimal/mpdecimal_${MPDECIMAL_VER}.orig.tar.gz +wget -N http://http.debian.net/debian/pool/main/m/mpdecimal/mpdecimal_${MPDECIMAL_VER}-${MPDECIMAL_DEB_VER}.debian.tar.xz +wget -N http://http.debian.net/debian/pool/main/m/mpdecimal/mpdecimal_${MPDECIMAL_VER}-${MPDECIMAL_DEB_VER}.dsc + +dpkg-source -x mpdecimal_${MPDECIMAL_VER}-${MPDECIMAL_DEB_VER}.dsc + +pushd mpdecimal-${MPDECIMAL_VER} + +sudo apt-get -y build-dep mpdecimal + +dpkg-buildpackage -us -uc -b + +popd + +cp *.deb ../ diff --git a/src/python3.5/build.sh b/src/python3.5/build.sh new file mode 100755 index 000000000000..ebada5397e1b --- /dev/null +++ b/src/python3.5/build.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +PYTHON_VER=3.5.2 +PYTHON_DEB_VER=8 + +wget -N http://http.debian.net/debian/pool/main/p/python3.5/python3.5_${PYTHON_VER}.orig.tar.xz +wget -N http://http.debian.net/debian/pool/main/p/python3.5/python3.5_${PYTHON_VER}-${PYTHON_DEB_VER}.debian.tar.xz +wget -N http://http.debian.net/debian/pool/main/p/python3.5/python3.5_${PYTHON_VER}-${PYTHON_DEB_VER}.dsc + +dpkg-source -x python3.5_${PYTHON_VER}-${PYTHON_DEB_VER}.dsc + +pushd python3.5-${PYTHON_VER} + +dpkg-buildpackage -us -uc -b + +popd + +cp *.deb ../ From ff14e9c72404cd6cedb7e4a7263b09d77c3a1b85 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 23 Nov 2016 12:59:47 -0800 Subject: [PATCH 0089/1011] build_docker.sh: Tag docker image before pushed to registry (#75) --- build_docker.sh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/build_docker.sh b/build_docker.sh index 67c21ba4d6ce..a7b6c0511801 100755 --- a/build_docker.sh +++ b/build_docker.sh @@ -9,11 +9,13 @@ set -e usage() { cat >&2 <&2 usage @@ -62,7 +68,7 @@ REGISTRY_PASSWD=$5 BUILD_NUMBER="0" } -remote_image_name=$REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name:latest +remote_image_name=$REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name:$docker_image_tag timestamp="$(date -u +%Y%m%d)" build_version="${timestamp}.${BUILD_NUMBER}" build_remote_image_name=$REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name:$build_version From 0532ee4ed6f47b59cfd225575c3328cd483e27d2 Mon Sep 17 00:00:00 2001 From: Nadiya Date: Wed, 23 Nov 2016 23:47:19 +0200 Subject: [PATCH 0090/1011] platform: Cavium serial settings change (#72) Signed-off-by: Nadiya.Stetskovych --- installer/x86_64/platforms/x86_64-accton_as7512_32x-r0 | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 installer/x86_64/platforms/x86_64-accton_as7512_32x-r0 diff --git a/installer/x86_64/platforms/x86_64-accton_as7512_32x-r0 b/installer/x86_64/platforms/x86_64-accton_as7512_32x-r0 new file mode 100644 index 000000000000..9b49af780817 --- /dev/null +++ b/installer/x86_64/platforms/x86_64-accton_as7512_32x-r0 @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x2f8 +CONSOLE_DEV=1 +CONSOLE_SPEED=9600 From 691b787811873144cdb04e6ae6dc9ec6710bdf0b Mon Sep 17 00:00:00 2001 From: mbrar Date: Wed, 23 Nov 2016 16:09:43 -0800 Subject: [PATCH 0091/1011] dockers: Add DHCP Relay docker (#38) --- dockers/docker-dhcp-relay/Dockerfile | 17 +++++++++++++++++ dockers/docker-dhcp-relay/isc-dhcp-relay | 6 ++++++ 2 files changed, 23 insertions(+) create mode 100644 dockers/docker-dhcp-relay/Dockerfile create mode 100644 dockers/docker-dhcp-relay/isc-dhcp-relay diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile new file mode 100644 index 000000000000..efc1f7f5c317 --- /dev/null +++ b/dockers/docker-dhcp-relay/Dockerfile @@ -0,0 +1,17 @@ +FROM docker-base + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +## Install isc-dhcp-relay +## Clean up +RUN apt-get update && apt-get -y install \ + isc-dhcp-relay && \ + apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y + +COPY isc-dhcp-relay /etc/default/isc-dhcp-relay + +ENTRYPOINT service rsyslog start \ + && service isc-dhcp-relay start \ + && /bin/bash + diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay b/dockers/docker-dhcp-relay/isc-dhcp-relay new file mode 100644 index 000000000000..8aef56c7e19f --- /dev/null +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay @@ -0,0 +1,6 @@ +SERVERS="" + +INTERFACES="" + +#-a provides option 82 circuit id information +OPTIONS="-a" From f45e7817825c85c3b20dd686dca70ee7144e2f2f Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 23 Nov 2016 16:10:35 -0800 Subject: [PATCH 0092/1011] update sonic-linux-kernel submodule (#77) --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index fbd5604bf748..db5ba1485acd 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit fbd5604bf7480bd6f861ad35acd5ec41bb4dd067 +Subproject commit db5ba1485acd7dd9620bf3216c21bb4c3efebfb5 From f83460bdb7e951fa99c96a2d9f83e78f343edcba Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 23 Nov 2016 16:18:35 -0800 Subject: [PATCH 0093/1011] Add Makefile target: lldp/snmp docker images (#74) * Add sonic-dbsyncd submodule * Add sonic-py-swsssdk submodule * Add lldpd submodule * Add sonic-snmpagent submodule * Add Makefile target: lldp/snmp docker images * Fix docker-snmp-sv2.gz dependency * Add lldp/snmp sources to the top level targets --- .gitmodules | 12 +++++++++ Makefile | 27 ++++++++++++++++--- src/Makefile | 62 +++++++++++++++++++++++++++++++++++++++----- src/lldpd | 1 + src/snmpd/build.sh | 19 ++++++++++++++ src/sonic-dbsyncd | 1 + src/sonic-py-swsssdk | 1 + src/sonic-snmpagent | 1 + 8 files changed, 114 insertions(+), 10 deletions(-) create mode 160000 src/lldpd create mode 100755 src/snmpd/build.sh create mode 160000 src/sonic-dbsyncd create mode 160000 src/sonic-py-swsssdk create mode 160000 src/sonic-snmpagent diff --git a/.gitmodules b/.gitmodules index 8b5f020f356e..54f3671effee 100644 --- a/.gitmodules +++ b/.gitmodules @@ -29,3 +29,15 @@ path = src/sonic-quagga url = https://github.com/Azure/sonic-quagga branch = debian/0.99.24.1 +[submodule "sonic-dbsyncd"] + path = src/sonic-dbsyncd + url = https://github.com/Azure/sonic-dbsyncd +[submodule "src/sonic-py-swsssdk"] + path = src/sonic-py-swsssdk + url = https://github.com/Azure/sonic-py-swsssdk.git +[submodule "src/lldpd"] + path = src/lldpd + url = https://github.com/vincentbernat/lldpd.git +[submodule "src/sonic-snmpagent"] + path = src/sonic-snmpagent + url = https://github.com/Azure/sonic-snmpagent diff --git a/Makefile b/Makefile index 2e4e17080430..1f572c987756 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ BRCM-SDK-DEBS=$(notdir $(wildcard src/brcm-sdk/*.deb)) CAVM-SDK-DEBS=$(notdir $(wildcard src/cavm-sdk/*.deb)) LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb libnl-3-dev_3.2.27-1_amd64.deb libnl-genl-3-200_3.2.27-1_amd64.deb libnl-genl-3-dev_3.2.27-1_amd64.deb libnl-route-3-200_3.2.27-1_amd64.deb libnl-route-3-dev_3.2.27-1_amd64.deb libnl-nf-3-200_3.2.27-1_amd64.deb libnl-nf-3-dev_3.2.27-1_amd64.deb libnl-cli-3-200_3.2.27-1_amd64.deb libnl-cli-3-dev_3.2.27-1_amd64.deb + LIBTEAM-DEBS=libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb ## Function: build_docker, image_name save_file @@ -37,6 +38,18 @@ src/%: LIBTEAM-DEBS="$(LIBTEAM-DEBS)" \ -C src $(subst src/,,$@) +## Rules: docker-snmp-sv2 +dockers/docker-snmp-sv2/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) +dockers/docker-snmp-sv2/deps/python3/%.whl: src/%.whl + mkdir -p `dirname $@` && cp $< $(dir $@) + +## Rules: docker-lldp-sv2 +dockers/docker-lldp-sv2/deps/%.deb: src/%.deb + mkdir -p `dirname $@` && cp $< $(dir $@) +dockers/docker-lldp-sv2/deps/%.whl: src/%.whl + mkdir -p `dirname $@` && cp $< $(dir $@) + ## Rules: docker-fpm dockers/docker-fpm/deps/fpmsyncd: src/fpmsyncd mkdir -p `dirname $@` && cp $< $(dir $@) @@ -107,6 +120,14 @@ dockers/docker-sonic-p4/deps/%.deb: src/%.deb target/docker-base.gz: $(call build_docker,$(patsubst target/%.gz,%,$@),$@) +target/docker-snmp-sv2.gz: target/docker-base.gz $(addprefix dockers/docker-snmp-sv2/deps/,python3/sswsdk-2.0.1-py3-none-any.whl python3/asyncsnmp-2.1.0-py3-none-any.whl libsnmp-base_5.7.3+dfsg-1.5_all.deb libsnmp30_5.7.3+dfsg-1.5_amd64.deb snmp_5.7.3+dfsg-1.5_amd64.deb snmpd_5.7.3+dfsg-1.5_amd64.deb) + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + +target/docker-lldp-sv2.gz: target/docker-base.gz $(addprefix dockers/docker-lldp-sv2/deps/,sswsdk-2.0.1-py2-none-any.whl sonic_d-2.0.0-py2-none-any.whl lldpd_0.9.5-0_amd64.deb) + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb $(LIBNL-DEBS)) ## TODO: remove placeholders for the dependencies touch dockers/docker-syncd/deps/{dsserve,bcmcmd} @@ -161,12 +182,12 @@ target/sonic-aboot.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_am ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=aboot ./build_image.sh ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -brcm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz docker-team.gz docker-database.gz) +brcm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz) ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -mlnx-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz docker-team.gz docker-database.gz) +mlnx-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz) ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -cavm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-cavm.gz docker-orchagent-cavm.gz docker-fpm.gz docker-team.gz docker-database.gz) +cavm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-cavm.gz docker-orchagent-cavm.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz) p4-all: $(addprefix target/,docker-sonic-p4.gz) diff --git a/src/Makefile b/src/Makefile index f8cb2889d877..0ac9d491b331 100644 --- a/src/Makefile +++ b/src/Makefile @@ -44,10 +44,34 @@ define build_project popd endef +## Function: build_project_py2, directory +## Build the project and save the .deb target in the same directory +define build_project_py2 + pushd $(1) + python2 setup.py bdist_wheel + popd +endef + +## Function: build_project_py3, directory +## Build the project and save the .deb target in the same directory +define build_project_py3 + pushd $(1) + python3 setup.py bdist_wheel + popd +endef + ## Function: install_deb, debfile install_deb = \ [ -f $(1) ] && { sudo dpkg -i $(1) || sudo apt-get -y install -f; } || return 1; +## Function: install_py2, whlfile +install_py2 = \ + sudo pip install $(1) + +## Function: install_py3, whlfile +install_py3 = \ + sudo pip3 install $(1) + ## Rules $(LIBNL-DEBS): pushd libnl3; ./build.sh; popd @@ -65,7 +89,7 @@ $(PYTHON3_5-DEBS): $(MPDECIMAL-DEBS) redis-sentinel_$(REDIS_VERSION).deb redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb: pushd redis; ./build.sh; popd - + libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dbg_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb: redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb redis-sentinel_$(REDIS_VERSION).deb $(foreach dep, $^, $(call install_deb, $(dep))) pushd hiredis; ./build.sh; popd @@ -90,13 +114,37 @@ python-p4c-bm_1.0.0-5415c416-1_all.deb: python-tenjin_1.1.1-1_all.deb python-p4- python-tenjin_1.1.1-1_all.deb: pushd tenjin; ./build.sh; popd -p4-switch_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb python-p4-hlir_0.9.36-1_all.deb python-tenjin_1.1.1-1_all.deb python-p4c-bm_1.0.0-5415c416-1_all.deb p4-bmv2_1.0.0_amd64.deb +snmpd_5.7.3+dfsg-1.5_amd64.deb snmptrapd_5.7.3+dfsg-1.5_amd64.deb snmp_5.7.3+dfsg-1.5_amd64.deb libsnmp-base_5.7.3+dfsg-1.5_all.deb libsnmp30_5.7.3+dfsg-1.5_amd64.deb libsnmp30-dbg_5.7.3+dfsg-1.5_amd64.deb libsnmp-dev_5.7.3+dfsg-1.5_amd64.deb libsnmp-perl_5.7.3+dfsg-1.5_amd64.deb python-netsnmp_5.7.3+dfsg-1.5_amd64.deb tkmib_5.7.3+dfsg-1.5_all.deb: + pushd snmpd; ./build.sh; popd + +sswsdk-2.0.1-py2-none-any.whl: + $(call build_project_py2, sonic-py-swsssdk) + cp sonic-py-swsssdk/dist/$@ . + +sswsdk-2.0.1-py3-none-any.whl: + $(call build_project_py3, sonic-py-swsssdk) + cp sonic-py-swsssdk/dist/$@ . + +sonic_d-2.0.0-py2-none-any.whl: sswsdk-2.0.1-py2-none-any.whl + $(foreach dep, $^, $(call install_py2, $(dep))) + $(call build_project_py2, sonic-dbsyncd) + cp sonic-dbsyncd/dist/$@ . + +asyncsnmp-2.1.0-py3-none-any.whl: sswsdk-2.0.1-py3-none-any.whl + $(foreach dep, $^, $(call install_py3, $(dep))) + $(call build_project_py3, sonic-snmpagent) + cp sonic-snmpagent/dist/$@ . + +p4-switch_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb python-p4-hlir_0.9.36-1_all.deb python-tenjin_1.1.1-1_all.deb python-p4c-bm_1.0.0-5415c416-1_all.deb p4-bmv2_1.0.0_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) pushd p4-switch; ./build.sh; popd - + +lldpd_0.9.5-0_amd64.deb liblldpctl-dev_0.9.5-0_amd64.deb: + $(call build_project, lldpd) + quagga_0.99.24.1-2.1_amd64.deb: $(call build_project, sonic-quagga) - + libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb: redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb $(LIBNL-DEBS) $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss-common) @@ -106,7 +154,7 @@ brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev $(call build_project, sonic-sairedis) mkdir -p brcm cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb brcm/ - + mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb mlnx-sdk/*.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-sairedis) @@ -118,7 +166,7 @@ cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev $(call build_project, sonic-sairedis) mkdir -p cavm cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb cavm/ - + p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb p4/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb p4-bmv2_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-sairedis) @@ -148,7 +196,7 @@ cavm/swss_1.0.0_amd64.deb: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd cp swss_1.0.0_amd64.deb cavm/ cp sonic-swss/debian/swss/usr/bin/fpmsyncd . cp sonic-swss/debian/swss/usr/bin/teamsyncd . - + p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb p4/libsaimetadata-dev_1.0.0_amd64.deb $(LIBTEAM-DEBS) $(LIBNL-DEBS) $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-swss) diff --git a/src/lldpd b/src/lldpd new file mode 160000 index 000000000000..396961a038a3 --- /dev/null +++ b/src/lldpd @@ -0,0 +1 @@ +Subproject commit 396961a038a38675d46f96eaa7b430b2a1f8701b diff --git a/src/snmpd/build.sh b/src/snmpd/build.sh new file mode 100755 index 000000000000..65d47d9def81 --- /dev/null +++ b/src/snmpd/build.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Install build dependency for snmpd +sudo apt-get -y build-dep snmpd + +# download debian net-snmp 5.7.3 +wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_5.7.3+dfsg-1.5.dsc +wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_5.7.3+dfsg.orig.tar.xz +wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_5.7.3+dfsg-1.5.debian.tar.xz + +dpkg-source -x net-snmp_5.7.3+dfsg-1.5.dsc + +pushd net-snmp-5.7.3+dfsg + +fakeroot debian/rules binary + +popd + +cp *.deb ../ diff --git a/src/sonic-dbsyncd b/src/sonic-dbsyncd new file mode 160000 index 000000000000..3d30cfc9318d --- /dev/null +++ b/src/sonic-dbsyncd @@ -0,0 +1 @@ +Subproject commit 3d30cfc9318d03652df01c0871090f5ef6c8ccb2 diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk new file mode 160000 index 000000000000..7bbe8419f719 --- /dev/null +++ b/src/sonic-py-swsssdk @@ -0,0 +1 @@ +Subproject commit 7bbe8419f719f577fdf923c8eadd0d462a9ce72a diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent new file mode 160000 index 000000000000..2e7fe1b2a9c3 --- /dev/null +++ b/src/sonic-snmpagent @@ -0,0 +1 @@ +Subproject commit 2e7fe1b2a9c3fafdc49d0063d1fb9e5396fd3649 From 96c2834cad93c5e80555871a3e8cfc59e252576f Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 28 Nov 2016 12:03:12 -0800 Subject: [PATCH 0094/1011] Refine installation order of mlnx-sdk debs (#78) --- src/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Makefile b/src/Makefile index 0ac9d491b331..f47dc99dd668 100644 --- a/src/Makefile +++ b/src/Makefile @@ -156,6 +156,8 @@ brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb brcm/ mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb mlnx-sdk/*.deb + ## Install applibs first for late depending packages + $(call install_deb, mlnx-sdk/applibs_1.mlnx.*.deb) $(foreach dep, $^, $(call install_deb, $(dep))) $(call build_project, sonic-sairedis) mkdir -p mlnx From 57ff53ea605bc5823661580d8d07f75993956c10 Mon Sep 17 00:00:00 2001 From: Denys Haryachyy Date: Mon, 28 Nov 2016 22:14:27 +0200 Subject: [PATCH 0095/1011] docker-syncd-cavm : Added synchronization between syncd and redis (#79) --- dockers/docker-syncd-cavm/Dockerfile | 2 +- dockers/docker-syncd-cavm/start.sh | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/dockers/docker-syncd-cavm/Dockerfile b/dockers/docker-syncd-cavm/Dockerfile index e8025011bb70..41298a29ede4 100755 --- a/dockers/docker-syncd-cavm/Dockerfile +++ b/dockers/docker-syncd-cavm/Dockerfile @@ -18,7 +18,7 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/libsaimetadata_*.deb \ && dpkg_apt /deps/syncd_*.deb -RUN apt-get -y install libpcap-dev libxml2-dev python-dev swig libsensors4-dev +RUN apt-get -y install libpcap-dev libxml2-dev python-dev swig libsensors4-dev redis-tools COPY ["start.sh", "/usr/bin/"] diff --git a/dockers/docker-syncd-cavm/start.sh b/dockers/docker-syncd-cavm/start.sh index 04c5a3a1835f..21d61e707344 100755 --- a/dockers/docker-syncd-cavm/start.sh +++ b/dockers/docker-syncd-cavm/start.sh @@ -3,4 +3,21 @@ export XP_ROOT=/usr/bin/ service rsyslog start -syncd -p /etc/ssw/AS7512/profile.ini -N + +while true; do + + # Check if redis-server starts + + result=$(redis-cli ping) + + if [ "$result" == "PONG" ]; then + + redis-cli FLUSHALL + syncd -p /etc/ssw/AS7512/profile.ini -N + break + + fi + + sleep 1 + +done From 543def350b23e7d936255cdf30f44eca2c46cf4c Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 28 Nov 2016 12:15:39 -0800 Subject: [PATCH 0096/1011] Install lldpd Build-Depends (#81) --- src/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Makefile b/src/Makefile index f47dc99dd668..5aea155cc43c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -140,6 +140,9 @@ p4-switch_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3 pushd p4-switch; ./build.sh; popd lldpd_0.9.5-0_amd64.deb liblldpctl-dev_0.9.5-0_amd64.deb: + ## Install build dependency for lldpd + ## Note: lldpd and snmpd conflict on Build-Depends, so install before build + sudo apt-get -y build-dep lldpd $(call build_project, lldpd) quagga_0.99.24.1-2.1_amd64.deb: From 7cf0f31a7dafa45e7c7a43c7008abd19d0411976 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 28 Nov 2016 13:49:06 -0800 Subject: [PATCH 0097/1011] Fix getopts option-string (#82) --- build_docker.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build_docker.sh b/build_docker.sh index a7b6c0511801..18402a2e51f9 100755 --- a/build_docker.sh +++ b/build_docker.sh @@ -30,7 +30,10 @@ EOF docker_image_name='' docker_image_tag=latest -while getopts ":it:" opt; do +## The option-string tells getopts which options to expect and which of them must have an argument +## When you want getopts to expect an argument for an option, just place a : (colon) after the proper option flag +## If the very first character of the option-string is a :, getopts switches to "silent error reporting mode". +while getopts "i:t:" opt; do case $opt in i) docker_image_name=$OPTARG From 6665c6ad2cfdf94e7a2d12089c2f48d6ac1118f2 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 28 Nov 2016 15:30:06 -0800 Subject: [PATCH 0098/1011] Fetch redis source packages from mirror links (#83) * Fetch redis source packages from mirror links * Replace more version strings with macros --- src/redis/build.sh | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/redis/build.sh b/src/redis/build.sh index 9ff33de6d137..b69a707d3cad 100755 --- a/src/redis/build.sh +++ b/src/redis/build.sh @@ -1,11 +1,15 @@ #!/bin/bash -x -wget -N 'http://mirrors.accretive-networks.net/debian/pool/main/r/redis/redis_3.2.4.orig.tar.gz' -wget -N 'http://mirrors.accretive-networks.net/debian/pool/main/r/redis/redis_3.2.4-1~bpo8+1.dsc' -wget -N 'http://mirrors.accretive-networks.net/debian/pool/main/r/redis/redis_3.2.4-1~bpo8+1.debian.tar.xz' +REDIS_VERION=3.2.4 +REDIS_VERION_FULL=$REDIS_VERION-1~bpo8+1 -dpkg-source -x redis_3.2.4-1~bpo8+1.dsc +wget -O redis_$REDIS_VERION.orig.tar.gz -N "https://sonicstorage.blob.core.windows.net/packages/redis_$REDIS_VERION.orig.tar.gz?sv=2015-04-05&sr=b&sig=B3qGEoSHe%2FBh5rVwvXHpKijgBtKF7dHeuJWp1p17UnU%3D&se=2026-11-26T22%3A31%3A31Z&sp=r" +wget -O redis_$REDIS_VERION_FULL.dsc -N "https://sonicstorage.blob.core.windows.net/packages/redis_$REDIS_VERION_FULL.dsc?sv=2015-04-05&sr=b&sig=LoUtjLXa%2BCcoM%2BsPewRLkY7YPRvSJTbsvQoW%2BL%2B3QWM%3D&se=2026-11-26T22%3A32%3A11Z&sp=r" -pushd redis-3.2.4; fakeroot debian/rules binary; popd +wget -O redis_$REDIS_VERION_FULL.debian.tar.xz -N "https://sonicstorage.blob.core.windows.net/packages/redis_$REDIS_VERION_FULL.debian.tar.xz?sv=2015-04-05&sr=b&sig=I33UsbDHiffEkQRndpFwY9y3I%2FrKTu0wmG%2FMXB98kys%3D&se=2026-11-26T22%3A32%3A34Z&sp=r" + +dpkg-source -x redis_$REDIS_VERION_FULL.dsc + +pushd redis-$REDIS_VERION; fakeroot debian/rules binary; popd cp *.deb .. From c3257e1a9c8896b3a4a40c1f96b065912570427d Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 29 Nov 2016 11:34:46 -0800 Subject: [PATCH 0099/1011] Modify docker_ptf and docker_saiserver_mlnx to use libthrift0.9.3 (#84) --- dockers/docker-ptf/Dockerfile | 2 +- dockers/docker-saiserver-mlnx/Dockerfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dockers/docker-ptf/Dockerfile b/dockers/docker-ptf/Dockerfile index cf458af61949..d72391a7ba43 100644 --- a/dockers/docker-ptf/Dockerfile +++ b/dockers/docker-ptf/Dockerfile @@ -37,7 +37,7 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / cmake \ && dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ && dpkg_apt /root/deps/python-ptf_*.deb \ - && dpkg_apt /root/deps/libthrift-0.9.2_*.deb \ + && dpkg_apt /root/deps/libthrift-0.9.3_*.deb \ && dpkg_apt /root/deps/python-thrift_*.deb \ && rm -rf /root/deps \ && apt-get -y autoclean \ diff --git a/dockers/docker-saiserver-mlnx/Dockerfile b/dockers/docker-saiserver-mlnx/Dockerfile index 9390d19e88a0..49f7842c7a41 100755 --- a/dockers/docker-saiserver-mlnx/Dockerfile +++ b/dockers/docker-saiserver-mlnx/Dockerfile @@ -2,7 +2,7 @@ FROM docker-base RUN apt-get update -COPY ["deps/applibs_*.deb", "/deps/applibs-dev_*.deb", "/deps/sx-complib_*.deb", "/deps/sxd-libs_*.deb", "/deps/sx-scew_*.deb", "/deps/sx-examples_*.deb", "/deps/sx-gen-utils_*.deb", "/deps/python-sdk-api_*.deb", "/deps/iproute2_*.deb", "/deps/mlnx-sai_*.deb", "/deps/libthrift-0.9.2_*.deb", "/deps/libnl-3-200_*.deb", "/deps/libnl-genl-3-200_*.deb", "/deps/libnl-route-3-200_*.deb", "/deps/"] +COPY ["deps/applibs_*.deb", "/deps/applibs-dev_*.deb", "/deps/sx-complib_*.deb", "/deps/sxd-libs_*.deb", "/deps/sx-scew_*.deb", "/deps/sx-examples_*.deb", "/deps/sx-gen-utils_*.deb", "/deps/python-sdk-api_*.deb", "/deps/iproute2_*.deb", "/deps/mlnx-sai_*.deb", "/deps/libthrift-0.9.3_*.deb", "/deps/libnl-3-200_*.deb", "/deps/libnl-genl-3-200_*.deb", "/deps/libnl-route-3-200_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ dpkg_apt /deps/applibs_*.deb \ @@ -15,7 +15,7 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/python-sdk-api_*.deb \ && dpkg_apt /deps/iproute2_*.deb \ && dpkg_apt /deps/mlnx-sai_*.deb \ - && dpkg_apt /deps/libthrift-0.9.2_*.deb \ + && dpkg_apt /deps/libthrift-0.9.3_*.deb \ && dpkg_apt /deps/libnl-3-200_*.deb \ && dpkg_apt /deps/libnl-genl-3-200_*.deb \ && dpkg_apt /deps/libnl-route-3-200_*.deb From 55ee247f0269089d9ba6934c8650f716d8bc338a Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 29 Nov 2016 17:07:50 -0800 Subject: [PATCH 0100/1011] Change to thrift 0.9.3 for docker-mlnx-sswstncd-rpc, docker-syncd-mlnx-rpc, and docker-syncd-rpc (#86) --- dockers/docker-mlnx-sswsyncd-rpc/Dockerfile | 2 +- dockers/docker-syncd-mlnx-rpc/Dockerfile | 2 +- dockers/docker-syncd-rpc/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dockers/docker-mlnx-sswsyncd-rpc/Dockerfile b/dockers/docker-mlnx-sswsyncd-rpc/Dockerfile index 2e53ab64f752..4d1b3e49bcda 100644 --- a/dockers/docker-mlnx-sswsyncd-rpc/Dockerfile +++ b/dockers/docker-mlnx-sswsyncd-rpc/Dockerfile @@ -22,7 +22,7 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return && dpkg_apt /deps/sx-libnl_*.deb \ && dpkg_apt /deps/iproute2_*.deb \ && dpkg_apt /deps/libsswsdk_*.deb \ - && dpkg_apt /deps/libthrift-0.9.2_*.deb \ + && dpkg_apt /deps/libthrift-0.9.3_*.deb \ && dpkg_apt /deps/libthrift-dev_*.deb RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ diff --git a/dockers/docker-syncd-mlnx-rpc/Dockerfile b/dockers/docker-syncd-mlnx-rpc/Dockerfile index c22145d1d69c..3b891784b226 100644 --- a/dockers/docker-syncd-mlnx-rpc/Dockerfile +++ b/dockers/docker-syncd-mlnx-rpc/Dockerfile @@ -36,7 +36,7 @@ RUN apt-get update \ && dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ && dpkg -r syncd \ && dpkg_apt /deps/syncd_*.deb \ - && dpkg_apt /deps/libthrift-0.9.2_*.deb \ + && dpkg_apt /deps/libthrift-0.9.3_*.deb \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ && rm -rf /deps diff --git a/dockers/docker-syncd-rpc/Dockerfile b/dockers/docker-syncd-rpc/Dockerfile index 214230491e34..ed75d1a1f0ec 100644 --- a/dockers/docker-syncd-rpc/Dockerfile +++ b/dockers/docker-syncd-rpc/Dockerfile @@ -36,7 +36,7 @@ RUN apt-get update \ && dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ && dpkg -r syncd \ && dpkg_apt /deps/syncd_*.deb \ - && dpkg_apt /deps/libthrift-0.9.2_*.deb \ + && dpkg_apt /deps/libthrift-0.9.3_*.deb \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ && rm -rf /deps From 6888eb74b27632a689b85c8fc6c9518b662780a8 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 30 Nov 2016 15:44:54 -0800 Subject: [PATCH 0101/1011] dockers: Add docker-platform-monitor to make all (#87) --- Makefile | 10 +++++++--- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 1f572c987756..44fde4de25ca 100644 --- a/Makefile +++ b/Makefile @@ -170,6 +170,10 @@ target/docker-sonic-p4.gz: target/docker-base.gz $(addprefix dockers/docker-soni docker load < $< $(call build_docker,$(patsubst target/%.gz,%,$@),$@) +target/docker-platform-monitor.gz: target/docker-base.gz + docker load < $< + $(call build_docker,$(patsubst target/%.gz,%,$@),$@) + ## Rules: linux image content deps/linux-image-3.16.0-4-amd64_%.deb: src/sonic-linux-kernel/linux-image-3.16.0-4-amd64_%.deb mkdir -p `dirname $@` && cp $< $(dir $@) @@ -182,12 +186,12 @@ target/sonic-aboot.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_am ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=aboot ./build_image.sh ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -brcm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz) +brcm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz docker-platform-monitor.gz) ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -mlnx-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz) +mlnx-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz docker-platform-monitor.gz) ## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -cavm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-cavm.gz docker-orchagent-cavm.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz) +cavm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-cavm.gz docker-orchagent-cavm.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz docker-platform-monitor.gz) p4-all: $(addprefix target/,docker-sonic-p4.gz) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 494b231a6658..96bcb6382a12 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 494b231a6658a5b21b71e35ab0f078701e938742 +Subproject commit 96bcb6382a12d789830d848fe05681ee75238162 diff --git a/src/sonic-swss b/src/sonic-swss index 02621bcdb568..05bac483585d 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 02621bcdb5689450446ea0d618a879a110af86c7 +Subproject commit 05bac483585dd5e564ed5db43efb1020fa25c703 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 947fa0733965..136aca5ff74d 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 947fa0733965450ad5b108cfd17a251ae3b7b709 +Subproject commit 136aca5ff74d7082d0a1def8b02032689ce3507e From 923b13afb4894fc8ec65b465be8e55789aba8f19 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 30 Nov 2016 17:03:09 -0800 Subject: [PATCH 0102/1011] src: Remove libjemalloc-dev from hiredis build.sh (#88) libjemalloc-dev is installed in sonic-slave --- src/hiredis/build.sh | 2 -- src/redis/build.sh | 1 - 2 files changed, 3 deletions(-) diff --git a/src/hiredis/build.sh b/src/hiredis/build.sh index de8ab036f06c..fbaed5f15028 100755 --- a/src/hiredis/build.sh +++ b/src/hiredis/build.sh @@ -1,7 +1,5 @@ #!/bin/bash -x -sudo apt-get install -y libjemalloc-dev - # Install redis-server sudo dpkg -i redis/*.deb diff --git a/src/redis/build.sh b/src/redis/build.sh index b69a707d3cad..b0727c03a1f6 100755 --- a/src/redis/build.sh +++ b/src/redis/build.sh @@ -5,7 +5,6 @@ REDIS_VERION_FULL=$REDIS_VERION-1~bpo8+1 wget -O redis_$REDIS_VERION.orig.tar.gz -N "https://sonicstorage.blob.core.windows.net/packages/redis_$REDIS_VERION.orig.tar.gz?sv=2015-04-05&sr=b&sig=B3qGEoSHe%2FBh5rVwvXHpKijgBtKF7dHeuJWp1p17UnU%3D&se=2026-11-26T22%3A31%3A31Z&sp=r" wget -O redis_$REDIS_VERION_FULL.dsc -N "https://sonicstorage.blob.core.windows.net/packages/redis_$REDIS_VERION_FULL.dsc?sv=2015-04-05&sr=b&sig=LoUtjLXa%2BCcoM%2BsPewRLkY7YPRvSJTbsvQoW%2BL%2B3QWM%3D&se=2026-11-26T22%3A32%3A11Z&sp=r" - wget -O redis_$REDIS_VERION_FULL.debian.tar.xz -N "https://sonicstorage.blob.core.windows.net/packages/redis_$REDIS_VERION_FULL.debian.tar.xz?sv=2015-04-05&sr=b&sig=I33UsbDHiffEkQRndpFwY9y3I%2FrKTu0wmG%2FMXB98kys%3D&se=2026-11-26T22%3A32%3A34Z&sp=r" dpkg-source -x redis_$REDIS_VERION_FULL.dsc From b68ec0eee86d2a50dbf845ec52ce6903387d949b Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 1 Dec 2016 02:18:59 -0800 Subject: [PATCH 0103/1011] Split script: push_docker.sh (#89) --- build_docker.sh | 42 ++++++------------------------------------ push_docker.sh | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 36 deletions(-) create mode 100755 push_docker.sh diff --git a/build_docker.sh b/build_docker.sh index 18402a2e51f9..ec07698d6615 100755 --- a/build_docker.sh +++ b/build_docker.sh @@ -52,10 +52,7 @@ shift "$((OPTIND - 1))" ## Dockerfile directory DOCKER_BUILD_DIR=dockers/$1 -REGISTRY_SERVER=$2 -REGISTRY_PORT=$3 -REGISTRY_USERNAME=$4 -REGISTRY_PASSWD=$5 +shift 1 [ -f "$DOCKER_BUILD_DIR"/Dockerfile ] || { echo "Invalid DOCKER_BUILD_DIR directory" >&2 @@ -66,16 +63,6 @@ REGISTRY_PASSWD=$5 docker_image_name=$(basename $DOCKER_BUILD_DIR) } -[ ${BUILD_NUMBER} ] || { - echo "No BUILD_NUMBER found, setting to 0." - BUILD_NUMBER="0" -} - -remote_image_name=$REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name:$docker_image_tag -timestamp="$(date -u +%Y%m%d)" -build_version="${timestamp}.${BUILD_NUMBER}" -build_remote_image_name=$REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name:$build_version - ## Copy dependencies ## Note: Dockerfile ADD doesn't support reference files outside the folder, so copy it locally if ls deps/* 1>/dev/null 2>&1; then @@ -112,27 +99,10 @@ if [ "$docker_image_name" = "docker-base" ]; then docker rmi -f $image_id || true fi -image_sha='' -if [ -n "$REGISTRY_SERVER" ] && [ -n "$REGISTRY_PORT" ]; then - ## Add registry information as tag, so will push as latest - ## Add additional tag with build information - ## Temporarily add -f option to prevent error message of Docker engine version < 1.10.0 - docker tag $docker_image_name $remote_image_name - docker tag $docker_image_name $build_remote_image_name +## Save the docker image in a gz file +mkdir -p target +docker save $docker_image_name | gzip -c > target/$docker_image_name.gz - ## Login the docker image registry server - ## Note: user name and password are passed from command line - docker login -u $REGISTRY_USERNAME -p "$REGISTRY_PASSWD" $REGISTRY_SERVER:$REGISTRY_PORT - - ## Push image to registry server - ## And get the image digest SHA256 - trap_push "docker rmi $remote_image_name || true" - trap_push "docker rmi $build_remote_image_name || true" - image_sha=$(docker push $remote_image_name | sed -n "s/.*: digest: sha256:\([0-9a-f]*\).*/\\1/p") - docker push $build_remote_image_name +if [ -n "$1" ]; then + ./push_docker.sh target/$docker_image_name.gz $@ $docker_image_tag fi - -mkdir -p target -rm -f target/$docker_image_name.*.gz -docker save $docker_image_name | gzip -c > target/$docker_image_name.$build_version.gz -echo "Image sha256: $image_sha" diff --git a/push_docker.sh b/push_docker.sh new file mode 100755 index 000000000000..154a64739b83 --- /dev/null +++ b/push_docker.sh @@ -0,0 +1,42 @@ +DOCKER_IMAGE_FILE=$1 +REGISTRY_SERVER=$2 +REGISTRY_PORT=$3 +REGISTRY_USERNAME=$4 +REGISTRY_PASSWD=$5 +DOCKER_IMAGE_TAG=$6 + +set -e +docker load < $DOCKER_IMAGE_FILE + +## Fetch the Jenkins build number if inside it +[ ${BUILD_NUMBER} ] || { + echo "No BUILD_NUMBER found, setting to 0." + BUILD_NUMBER="0" +} + +## Prepare tag +docker_image_name=$(basename $DOCKER_IMAGE_FILE | cut -d. -f1) +remote_image_name=$REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name:$DOCKER_IMAGE_TAG +timestamp="$(date -u +%Y%m%d)" +build_version="${timestamp}.${BUILD_NUMBER}" +build_remote_image_name=$REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name:$build_version + +## Add registry information as tag, so will push as latest +## Add additional tag with build information +## Temporarily add -f option to prevent error message of Docker engine version < 1.10.0 +docker tag $docker_image_name $remote_image_name +docker tag $docker_image_name $build_remote_image_name + +## Login the docker image registry server +## Note: user name and password are passed from command line +docker login -u $REGISTRY_USERNAME -p "$REGISTRY_PASSWD" $REGISTRY_SERVER:$REGISTRY_PORT + +## Push image to registry server +## And get the image digest SHA256 +echo "Pushing $remote_image_name" +image_sha=$(docker push $remote_image_name | sed -n "s/.*: digest: sha256:\([0-9a-f]*\).*/\\1/p") +docker rmi $remote_image_name || true +echo "Image sha256: $image_sha" +echo "Pushing $build_remote_image_name" +docker push $build_remote_image_name +docker rmi $build_remote_image_name || true From c4f0833dac48c3ca15b2d50e1bafac63e58340aa Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 1 Dec 2016 10:41:29 -0800 Subject: [PATCH 0104/1011] push_docker.sh: Remove deprecated comments (#90) --- push_docker.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/push_docker.sh b/push_docker.sh index 154a64739b83..156502ddfb7e 100755 --- a/push_docker.sh +++ b/push_docker.sh @@ -23,7 +23,6 @@ build_remote_image_name=$REGISTRY_SERVER:$REGISTRY_PORT/$docker_image_name:$buil ## Add registry information as tag, so will push as latest ## Add additional tag with build information -## Temporarily add -f option to prevent error message of Docker engine version < 1.10.0 docker tag $docker_image_name $remote_image_name docker tag $docker_image_name $build_remote_image_name From 154b281cfba60eef1aa932c3be7177f5e31d3118 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 1 Dec 2016 13:50:46 -0800 Subject: [PATCH 0105/1011] add instruction to pull sonic-slave image from docker registry --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 11171ecefe96..37be054f15c2 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,13 @@ Build a docker image by [the Dockerfile](https://github.com/Azure/sonic-build-to cd sonic-build-tools ./build.sh sonic-slave docker run -v /var/run/docker.sock:/var/run/docker.sock -it --privileged local/sonic-slave bash - + +You can also download sonic-slave docker from sonicdev docker registry using following command: + + docker login -u 1dafc8d7-d19c-4f58-8653-e8d904f30dab -p sonic sonicdev-microsoft.azurecr.io:443 + docker pull sonicdev-microsoft.azurecr.io:443/sonic-slave + docker run -v /var/run/docker.sock:/var/run/docker.sock -it --privileged sonicdev-microsoft.azurecr.io:443/sonic-slave bash + Note that all the below steps should be executed in the docker container, not in the host machine. ## 2. Clone or fetch the code repository with all git submodules From e9098b99fb0f39924a6de13167f6d95f8bd61fb8 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 5 Dec 2016 21:12:19 +0200 Subject: [PATCH 0106/1011] Build improvements (#80) * Build improvements Fix dependencies Add configuration options Automatically build sonic-slave * Set default number of jobs to 1 * Auto generate target/debs directory Signed-off-by: marian-pritsak * Automatically remove sonic-slave container after exit * Silence clean-logs * Add SONIC_CLEAN_TARGETS to clean * Use second expansion for clean dependencies * Avoid creating empty log files Remove log file on flush instead of writing empty string * Put dpkg install inside lock Use same lock as debian install targets do to avoid race condition in dpkg installation * Remove redirect to log from docker save * Add .platform dependency to all and clean targets * Remove header and footer from clean targets * Disable messages for SONIC_CLEAN_TARGETS * Exit with error if dpkg-buildpackage fails * Set new location for debs in build_debian.sh * Add recipe for docker-database * Update redis version to 3.2.4 * Add support for p4 platform * Add recipe for snmpd * Add slave targets to phony and make all target default * Remove build.sh from thrift * Add versioning to team, nl, hiredis and initramfs * Change sonic-slave to support snmpd build from sources * Remove src/tenjin * Add recipe for lldpd * Add recipe for mpdecimal * Remove hiredis directory on rebuild * Add recipe for Mellanox hw management * Remove generic image from all targets for Mellanox * Add support for python wheels * Add lldp and snmp dockers * Sync docker-database to include libjemalloc * Fix asyncsnmp variable name * Change default build configuration Redirect output to log files by default Set number of jobs to nproc value Do not print dependencies Fix logging to print log of failed job into console * Use docker inspect to check if sonic-slave image exists * Use config in slave.mk directly * Disable color output by default * Remove sswsdk dependency from lldp and snmp dockers * Fix comment in py wheels install targets * Add dependency between two versions of sswsdk * Add containers to mellanox platform lldp, snmp and database containers * Add recipe for team docker * Add team docker to mellanox platform * Encrypt password passed to build_debian.sh * Update mellanox SAI version Make version and revision setting only in main recipe * Fix error handling in makefiles As makefiles use .ONESHELL we should add -e option to shell options in order to exit after any command fails * Add recipe for platform monitor image * Add platfotm monitor to mellanox targets * Ignore submodules when building base image --- .gitmodules | 8 +- Makefile | 216 ++---------- build_debian.sh | 4 +- build_image.sh | 2 +- dockers/docker-base | 2 +- dockers/docker-database/Dockerfile | 19 -- dockers/docker-database/Dockerfile.template | 19 ++ dockers/docker-fpm/Dockerfile | 24 -- dockers/docker-fpm/Dockerfile.template | 16 + dockers/docker-lldp-sv2/Dockerfile | 23 -- dockers/docker-lldp-sv2/Dockerfile.template | 23 ++ dockers/docker-orchagent/Dockerfile | 29 -- dockers/docker-orchagent/Dockerfile.template | 18 + .../{Dockerfile => Dockerfile.template} | 21 +- dockers/docker-sonic-p4/Dockerfile | 33 -- dockers/docker-team/Dockerfile | 23 -- dockers/docker-team/Dockerfile.template | 15 + platform/broadcom/rules.mk | 20 ++ platform/cavium/rules.mk | 21 ++ platform/mellanox/docker-syncd-mlnx.mk | 8 + .../docker-syncd-mlnx/Dockerfile.template | 20 ++ .../docker-syncd-mlnx/mlnx-fw-upgrade.sh | 53 +++ platform/mellanox/docker-syncd-mlnx/start.sh | 21 ++ platform/mellanox/fw.mk | 5 + platform/mellanox/hw-management.mk | 9 + platform/mellanox/hw-management/Makefile | 17 + platform/mellanox/mft.mk | 8 + platform/mellanox/mft/Makefile | 32 ++ platform/mellanox/mlnx-sai.mk | 12 + platform/mellanox/mlnx-sai/Makefile | 21 ++ platform/mellanox/rules.mk | 21 ++ platform/mellanox/sdk.mk | 49 +++ platform/p4/docker-sonic-p4.mk | 7 + .../p4/docker-sonic-p4/Dockerfile.template | 20 ++ .../p4}/docker-sonic-p4/port_config.ini | 0 .../p4}/docker-sonic-p4/rsyslog.conf | 0 .../p4}/docker-sonic-p4/startup.sh | 0 platform/p4/p4-bmv.mk | 7 + .../p4/p4-bmv}/behavioral-model | 0 platform/p4/p4-hlir.mk | 5 + {src => platform/p4}/p4-hlir/p4-hlir | 0 platform/p4/p4-switch.mk | 7 + platform/p4/p4-switch/Makefile | 17 + {src => platform/p4}/p4-switch/switch | 0 platform/p4/p4c-bm.mk | 7 + {src => platform/p4}/p4c-bm/p4c-bm | 0 platform/p4/rules.mk | 6 + platform/p4/tenjin.mk | 5 + platform/p4/tenjin/Makefile | 19 ++ rules/asyncsnmp-py3.mk | 7 + rules/config | 33 ++ rules/dbsyncd-py2.mk | 7 + rules/docker-base.mk | 6 + rules/docker-database.mk | 7 + rules/docker-fpm.mk | 7 + rules/docker-lldp-sv2.mk | 8 + rules/docker-orchagent.mk | 7 + rules/docker-platform-monitor.mk | 7 + rules/docker-snmp-sv2.mk | 8 + rules/docker-team.mk | 7 + rules/functions | 103 ++++++ rules/hiredis.mk | 18 + rules/initramfs-tools.mk | 8 + rules/libnl3.mk | 44 +++ rules/libteam.mk | 21 ++ rules/linux-kernel.mk | 9 + rules/lldpd.mk | 12 + rules/mpdecimal.mk | 13 + rules/quagga.mk | 6 + rules/redis.mk | 15 + rules/sairedis.mk | 20 ++ rules/snmpd.mk | 53 +++ rules/sonic-aboot.mk | 6 + rules/sonic-generic.mk | 6 + rules/sswsdk-py2.mk | 6 + rules/sswsdk-py3.mk | 8 + rules/swss-common.mk | 13 + rules/swss.mk | 9 + rules/thrift.mk | 17 + slave.mk | 311 ++++++++++++++++++ sonic-slave/Dockerfile | 105 ++++++ sonic-slave/sonic-jenkins-id_rsa.pub | 1 + src/Makefile | 214 ------------ src/brcm-sdk/filelist.txt | 7 - src/cavm-sdk/filelist.txt | 7 - src/hiredis/Makefile | 22 ++ src/hiredis/build.sh | 12 - src/initramfs-tools/Makefile | 21 ++ src/initramfs-tools/build.sh | 19 -- src/libnl3/Makefile | 35 ++ src/libnl3/build.sh | 23 -- src/libteam/Makefile | 31 ++ src/libteam/build.sh | 26 -- src/mft/build.sh | 22 -- src/mlnx-sdk/filelist.txt | 24 -- src/mpdecimal/Makefile | 22 ++ src/mpdecimal/build.sh | 20 -- src/p4-bmv2/build.sh | 5 - src/p4-hlir/build.sh | 7 - src/p4-switch/build.sh | 17 - src/p4c-bm/build.sh | 7 - src/redis/Makefile | 24 ++ src/redis/build.sh | 14 - src/snmpd/Makefile | 31 ++ src/snmpd/build.sh | 19 -- src/tenjin/build.sh | 8 - src/thrift/Makefile | 27 ++ src/thrift/build.sh | 10 - 108 files changed, 1675 insertions(+), 819 deletions(-) delete mode 100755 dockers/docker-database/Dockerfile create mode 100644 dockers/docker-database/Dockerfile.template delete mode 100755 dockers/docker-fpm/Dockerfile create mode 100644 dockers/docker-fpm/Dockerfile.template delete mode 100644 dockers/docker-lldp-sv2/Dockerfile create mode 100644 dockers/docker-lldp-sv2/Dockerfile.template delete mode 100755 dockers/docker-orchagent/Dockerfile create mode 100755 dockers/docker-orchagent/Dockerfile.template rename dockers/docker-snmp-sv2/{Dockerfile => Dockerfile.template} (61%) delete mode 100644 dockers/docker-sonic-p4/Dockerfile delete mode 100644 dockers/docker-team/Dockerfile create mode 100644 dockers/docker-team/Dockerfile.template create mode 100644 platform/broadcom/rules.mk create mode 100644 platform/cavium/rules.mk create mode 100644 platform/mellanox/docker-syncd-mlnx.mk create mode 100755 platform/mellanox/docker-syncd-mlnx/Dockerfile.template create mode 100755 platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh create mode 100755 platform/mellanox/docker-syncd-mlnx/start.sh create mode 100644 platform/mellanox/fw.mk create mode 100644 platform/mellanox/hw-management.mk create mode 100644 platform/mellanox/hw-management/Makefile create mode 100644 platform/mellanox/mft.mk create mode 100644 platform/mellanox/mft/Makefile create mode 100644 platform/mellanox/mlnx-sai.mk create mode 100644 platform/mellanox/mlnx-sai/Makefile create mode 100644 platform/mellanox/rules.mk create mode 100644 platform/mellanox/sdk.mk create mode 100644 platform/p4/docker-sonic-p4.mk create mode 100644 platform/p4/docker-sonic-p4/Dockerfile.template rename {dockers => platform/p4}/docker-sonic-p4/port_config.ini (100%) rename {dockers => platform/p4}/docker-sonic-p4/rsyslog.conf (100%) rename {dockers => platform/p4}/docker-sonic-p4/startup.sh (100%) create mode 100644 platform/p4/p4-bmv.mk rename {src/p4-bmv2 => platform/p4/p4-bmv}/behavioral-model (100%) create mode 100644 platform/p4/p4-hlir.mk rename {src => platform/p4}/p4-hlir/p4-hlir (100%) create mode 100644 platform/p4/p4-switch.mk create mode 100644 platform/p4/p4-switch/Makefile rename {src => platform/p4}/p4-switch/switch (100%) create mode 100644 platform/p4/p4c-bm.mk rename {src => platform/p4}/p4c-bm/p4c-bm (100%) create mode 100644 platform/p4/rules.mk create mode 100644 platform/p4/tenjin.mk create mode 100644 platform/p4/tenjin/Makefile create mode 100644 rules/asyncsnmp-py3.mk create mode 100644 rules/config create mode 100644 rules/dbsyncd-py2.mk create mode 100644 rules/docker-base.mk create mode 100644 rules/docker-database.mk create mode 100644 rules/docker-fpm.mk create mode 100644 rules/docker-lldp-sv2.mk create mode 100644 rules/docker-orchagent.mk create mode 100644 rules/docker-platform-monitor.mk create mode 100644 rules/docker-snmp-sv2.mk create mode 100644 rules/docker-team.mk create mode 100644 rules/functions create mode 100644 rules/hiredis.mk create mode 100644 rules/initramfs-tools.mk create mode 100644 rules/libnl3.mk create mode 100644 rules/libteam.mk create mode 100644 rules/linux-kernel.mk create mode 100644 rules/lldpd.mk create mode 100644 rules/mpdecimal.mk create mode 100644 rules/quagga.mk create mode 100644 rules/redis.mk create mode 100644 rules/sairedis.mk create mode 100644 rules/snmpd.mk create mode 100644 rules/sonic-aboot.mk create mode 100644 rules/sonic-generic.mk create mode 100644 rules/sswsdk-py2.mk create mode 100644 rules/sswsdk-py3.mk create mode 100644 rules/swss-common.mk create mode 100644 rules/swss.mk create mode 100644 rules/thrift.mk create mode 100644 slave.mk create mode 100644 sonic-slave/Dockerfile create mode 100644 sonic-slave/sonic-jenkins-id_rsa.pub delete mode 100644 src/Makefile delete mode 100644 src/brcm-sdk/filelist.txt delete mode 100644 src/cavm-sdk/filelist.txt create mode 100644 src/hiredis/Makefile delete mode 100755 src/hiredis/build.sh create mode 100644 src/initramfs-tools/Makefile delete mode 100755 src/initramfs-tools/build.sh create mode 100644 src/libnl3/Makefile delete mode 100755 src/libnl3/build.sh create mode 100644 src/libteam/Makefile delete mode 100755 src/libteam/build.sh delete mode 100755 src/mft/build.sh delete mode 100644 src/mlnx-sdk/filelist.txt create mode 100644 src/mpdecimal/Makefile delete mode 100755 src/mpdecimal/build.sh delete mode 100755 src/p4-bmv2/build.sh delete mode 100755 src/p4-hlir/build.sh delete mode 100755 src/p4-switch/build.sh delete mode 100755 src/p4c-bm/build.sh create mode 100644 src/redis/Makefile delete mode 100755 src/redis/build.sh create mode 100644 src/snmpd/Makefile delete mode 100755 src/snmpd/build.sh delete mode 100755 src/tenjin/build.sh create mode 100644 src/thrift/Makefile delete mode 100755 src/thrift/build.sh diff --git a/.gitmodules b/.gitmodules index 54f3671effee..8db0758ed28c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,16 +14,16 @@ path = src/sonic-swss url = https://github.com/Azure/sonic-swss [submodule "src/p4-switch/switch"] - path = src/p4-switch/switch + path = platform/p4/p4-switch/switch url = https://github.com/lguohan/switch [submodule "src/p4-bmv2/behavioral-model"] - path = src/p4-bmv2/behavioral-model + path = platform/p4/p4-bmv/behavioral-model url = https://github.com/lguohan/behavioral-model [submodule "src/p4c-bm/p4c-bm"] - path = src/p4c-bm/p4c-bm + path = platform/p4/p4c-bm/p4c-bm url = https://github.com/krambn/p4c-bm [submodule "src/p4-hlir/p4-hlir"] - path = src/p4-hlir/p4-hlir + path = platform/p4/p4-hlir/p4-hlir url = https://github.com/p4lang/p4-hlir [submodule "quagga"] path = src/sonic-quagga diff --git a/Makefile b/Makefile index 44fde4de25ca..f68e8de4bbca 100644 --- a/Makefile +++ b/Makefile @@ -1,197 +1,39 @@ -## TODO: if install dev package really happens, rebuild the depending project +############################################################################### +## Wrapper for starting make inside sonic-slave container +############################################################################### -## Arguments from make command line -USERNAME= -PASSWORD_ENCRYPTED= +SHELL = /bin/bash -## Redis server/tools version -REDIS_VERSION=3.2.4-1~bpo8+1_amd64 +USER := $(shell id -un) +PWD := $(shell pwd) -## Select bash for commands -SHELL := /bin/bash +MAKEFLAGS += -B -## Capture all the files in SDK directories -MLNX-SDK-DEBS=$(notdir $(wildcard src/mlnx-sdk/*.deb)) -BRCM-SDK-DEBS=$(notdir $(wildcard src/brcm-sdk/*.deb)) -CAVM-SDK-DEBS=$(notdir $(wildcard src/cavm-sdk/*.deb)) +DOCKER_RUN := docker run --rm=true --privileged \ + -v $(PWD):/sonic \ + -it sonic-slave-$(USER) -LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb libnl-3-dev_3.2.27-1_amd64.deb libnl-genl-3-200_3.2.27-1_amd64.deb libnl-genl-3-dev_3.2.27-1_amd64.deb libnl-route-3-200_3.2.27-1_amd64.deb libnl-route-3-dev_3.2.27-1_amd64.deb libnl-nf-3-200_3.2.27-1_amd64.deb libnl-nf-3-dev_3.2.27-1_amd64.deb libnl-cli-3-200_3.2.27-1_amd64.deb libnl-cli-3-dev_3.2.27-1_amd64.deb +DOCKER_BUILD = docker build --no-cache \ + --build-arg user=$(USER) \ + --build-arg uid=$(shell id -u) \ + --build-arg guid=$(shell id -g) \ + -t sonic-slave-$(USER) \ + sonic-slave -LIBTEAM-DEBS=libteam5_1.26-1_amd64.deb libteamdctl0_1.26-1_amd64.deb libteam-dev_1.26-1_amd64.deb libteam-utils_1.26-1_amd64.deb +.PHONY: sonic-slave-build sonic-slave-bash -## Function: build_docker, image_name save_file -## build a docker image and save to a file -define build_docker - docker build --no-cache -t $(1) dockers/$(1) - mkdir -p `dirname $(2)` - docker save $(1) | gzip -c > $(2) -endef +.DEFAULT_GOAL := all -## Rules: phony targets -.phony : brcm-all mlnx-all cavm-all p4-all +%:: + @docker inspect --type image sonic-slave-$(USER) &> /dev/null || $(DOCKER_BUILD) + @$(DOCKER_RUN) make \ + -C sonic \ + -f slave.mk \ + PLATFORM=$(PLATFORM) \ + $@ -## Rules: redirect to sub directory -src/%: - $(MAKE) \ - REDIS_VERSION=$(REDIS_VERSION) \ - LIBNL-DEBS="$(LIBNL-DEBS)" \ - LIBTEAM-DEBS="$(LIBTEAM-DEBS)" \ - -C src $(subst src/,,$@) +sonic-slave-build : + @$(DOCKER_BUILD) -## Rules: docker-snmp-sv2 -dockers/docker-snmp-sv2/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-snmp-sv2/deps/python3/%.whl: src/%.whl - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker-lldp-sv2 -dockers/docker-lldp-sv2/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-lldp-sv2/deps/%.whl: src/%.whl - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker-fpm -dockers/docker-fpm/deps/fpmsyncd: src/fpmsyncd - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-fpm/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker-team -dockers/docker-team/deps/teamsyncd: src/teamsyncd - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-team/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker-orchagent-mlnx -$(addprefix dockers/docker-orchagent-mlnx/deps/,libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb) : dockers/docker-orchagent-mlnx/deps/%.deb : src/mlnx/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-orchagent-mlnx/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker-orchagent-cavm -$(addprefix dockers/docker-orchagent-cavm/deps/,libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb) : dockers/docker-orchagent-cavm/deps/%.deb : src/cavm/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-orchagent-cavm/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker-orchagent (brcm) -$(addprefix dockers/docker-orchagent/deps/,libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb) : dockers/docker-orchagent/deps/%.deb : src/brcm/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-orchagent/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker-syncd-mlnx -$(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS)) : dockers/docker-syncd-mlnx/deps/%.deb : src/mlnx-sdk/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -$(addprefix dockers/docker-syncd-mlnx/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb) : dockers/docker-syncd-mlnx/deps/%.deb : src/mlnx/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-syncd-mlnx/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-syncd-mlnx/deps/fw-SPC.mfa: src/mlnx-sdk/fw-SPC.mfa - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker-syncd-cavm -$(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS)) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm-sdk/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -$(addprefix dockers/docker-syncd-cavm/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb) : dockers/docker-syncd-cavm/deps/%.deb : src/cavm/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-syncd-cavm/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker-syncd (brcm) -$(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS)) : dockers/docker-syncd/deps/%.deb : src/brcm-sdk/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -$(addprefix dockers/docker-syncd/deps/,syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb): dockers/docker-syncd/deps/%.deb : src/brcm/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-syncd/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker-database -dockers/docker-database/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker-sonic (p4) -$(addprefix dockers/docker-sonic-p4/deps/,swss_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb) : dockers/docker-sonic-p4/deps/%.deb : src/p4/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -dockers/docker-sonic-p4/deps/%.deb: src/%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) - -## Rules: docker images -target/docker-base.gz: - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-snmp-sv2.gz: target/docker-base.gz $(addprefix dockers/docker-snmp-sv2/deps/,python3/sswsdk-2.0.1-py3-none-any.whl python3/asyncsnmp-2.1.0-py3-none-any.whl libsnmp-base_5.7.3+dfsg-1.5_all.deb libsnmp30_5.7.3+dfsg-1.5_amd64.deb snmp_5.7.3+dfsg-1.5_amd64.deb snmpd_5.7.3+dfsg-1.5_amd64.deb) - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-lldp-sv2.gz: target/docker-base.gz $(addprefix dockers/docker-lldp-sv2/deps/,sswsdk-2.0.1-py2-none-any.whl sonic_d-2.0.0-py2-none-any.whl lldpd_0.9.5-0_amd64.deb) - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-syncd.gz: target/docker-base.gz $(addprefix dockers/docker-syncd/deps/,$(BRCM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb $(LIBNL-DEBS)) - ## TODO: remove placeholders for the dependencies - touch dockers/docker-syncd/deps/{dsserve,bcmcmd} - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-syncd-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-mlnx/deps/,$(MLNX-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb $(LIBNL-DEBS)) dockers/docker-syncd-mlnx/deps/fw-SPC.mfa - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-syncd-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-syncd-cavm/deps/,$(CAVM-SDK-DEBS) libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb $(LIBNL-DEBS)) - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-orchagent.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-orchagent-mlnx.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-mlnx/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-orchagent-cavm.gz: target/docker-base.gz $(addprefix dockers/docker-orchagent-cavm/deps/,libhiredis0.13_0.13.3-2_amd64.deb libswsscommon_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb swss_1.0.0_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS)) - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-fpm.gz: target/docker-base.gz $(addprefix dockers/docker-fpm/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2.1_amd64.deb fpmsyncd $(LIBNL-DEBS)) - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-team.gz: target/docker-base.gz $(addprefix dockers/docker-team/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb $(LIBNL-DEBS) $(LIBTEAM-DEBS) teamsyncd) - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-database.gz: target/docker-base.gz $(addprefix dockers/docker-database/deps/,redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb) - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-sonic-p4.gz: target/docker-base.gz $(addprefix dockers/docker-sonic-p4/deps/,libswsscommon_1.0.0_amd64.deb libhiredis0.13_0.13.3-2_amd64.deb quagga_0.99.24.1-2.1_amd64.deb syncd_1.0.0_amd64.deb swss_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb p4-bmv2_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb) - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -target/docker-platform-monitor.gz: target/docker-base.gz - docker load < $< - $(call build_docker,$(patsubst target/%.gz,%,$@),$@) - -## Rules: linux image content -deps/linux-image-3.16.0-4-amd64_%.deb: src/sonic-linux-kernel/linux-image-3.16.0-4-amd64_%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) -deps/initramfs-tools_%.deb: src/initramfs-tools/initramfs-tools_%.deb - mkdir -p `dirname $@` && cp $< $(dir $@) - -target/sonic-generic.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb - ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=generic ./build_image.sh -target/sonic-aboot.bin: deps/linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb deps/initramfs-tools_0.120_all.deb - ./build_debian.sh "$(USERNAME)" "$(PASSWORD_ENCRYPTED)" && TARGET_MACHINE=aboot ./build_image.sh - -## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -brcm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd.gz docker-orchagent.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz docker-platform-monitor.gz) - -## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -mlnx-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-mlnx.gz docker-orchagent-mlnx.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz docker-platform-monitor.gz) - -## Note: docker-fpm.gz must be the last to build the implicit dependency fpmsyncd -cavm-all: target/sonic-generic.bin $(addprefix target/,docker-syncd-cavm.gz docker-orchagent-cavm.gz docker-fpm.gz docker-team.gz docker-database.gz docker-snmp-sv2.gz docker-lldp-sv2.gz docker-platform-monitor.gz) - -p4-all: $(addprefix target/,docker-sonic-p4.gz) +sonic-slave-bash : + @$(DOCKER_RUN) bash diff --git a/build_debian.sh b/build_debian.sh index 9252646dff4b..185825cf34b7 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -112,9 +112,9 @@ sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c 'cd /dev && MAKEDEV generic' sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install busybox echo '[INFO] Install SONiC linux kernel image' ## Note: duplicate apt-get command to ensure every line return zero -sudo dpkg --root=$FILESYSTEM_ROOT -i deps/initramfs-tools_*.deb || \ +sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/initramfs-tools_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f -sudo dpkg --root=$FILESYSTEM_ROOT -i deps/linux-image-3.16.0-4-amd64_*.deb || \ +sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/linux-image-3.16.0-4-amd64_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f ## Update initramfs for booting with squashfs+aufs diff --git a/build_image.sh b/build_image.sh index 887d63ae049f..fd189ab9a38e 100755 --- a/build_image.sh +++ b/build_image.sh @@ -13,7 +13,7 @@ } ## Retrieval short version of Git revision hash for partition metadata -[ -z "$(git status --untracked-files=no -s)" ] || { +[ -z "$(git status --untracked-files=no -s --ignore-submodules)" ] || { echo "Error: There is local changes not committed to git repo. Cannot get a revision hash for partition metadata." exit 1 } diff --git a/dockers/docker-base b/dockers/docker-base index dfb5c2f46bf9..73b5fcee2840 160000 --- a/dockers/docker-base +++ b/dockers/docker-base @@ -1 +1 @@ -Subproject commit dfb5c2f46bf982207c8dbc2c5af589a0ba1b3ddc +Subproject commit 73b5fcee2840adcc64bee5e6ffb226a9928959e4 diff --git a/dockers/docker-database/Dockerfile b/dockers/docker-database/Dockerfile deleted file mode 100755 index 445ac44b12b0..000000000000 --- a/dockers/docker-database/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM docker-base - -COPY ["deps/redis-tools_*.deb", "deps/redis-server_*.deb", "/deps/"] - -## Install packages -## Clean up -RUN apt-get update && \ - dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/redis-tools_*.deb && \ - dpkg_apt /deps/redis-server_*.deb && \ - apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y - -RUN sed -ri 's/^daemonize yes$/daemonize no/; \ - s/^logfile .*$/logfile ""/; \ - s/^# syslog-enabled no$/syslog-enabled no/; \ - s/^# unixsocket/unixsocket/ \ - ' /etc/redis/redis.conf - -ENTRYPOINT service redis-server start diff --git a/dockers/docker-database/Dockerfile.template b/dockers/docker-database/Dockerfile.template new file mode 100644 index 000000000000..adc6dad9330d --- /dev/null +++ b/dockers/docker-database/Dockerfile.template @@ -0,0 +1,19 @@ +FROM docker-base + +RUN apt-get update + +COPY deps/ deps + +SED_DPKG + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +RUN sed -ri 's/^daemonize yes$/daemonize no/; \ + s/^logfile .*$/logfile ""/; \ + s/^# syslog-enabled no$/syslog-enabled no/; \ + s/^# unixsocket/unixsocket/ \ + ' /etc/redis/redis.conf + +ENTRYPOINT service redis-server start diff --git a/dockers/docker-fpm/Dockerfile b/dockers/docker-fpm/Dockerfile deleted file mode 100755 index ca5b811f1949..000000000000 --- a/dockers/docker-fpm/Dockerfile +++ /dev/null @@ -1,24 +0,0 @@ -FROM docker-base - -RUN apt-get update - -COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/quagga_*", "/deps/"] - -## Get fpmsyncd -## Get Quagga -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/libhiredis0.13*.deb \ - && dpkg_apt /deps/libnl-3-200_*.deb \ - && dpkg_apt /deps/libnl-genl-3-200_*.deb \ - && dpkg_apt /deps/libnl-route-3-200_*.deb \ - && dpkg_apt /deps/libswsscommon_*.deb \ - && dpkg_apt /deps/quagga_*.deb - -COPY ["deps/fpmsyncd", "start.sh", "/usr/bin/"] - -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps - -ENTRYPOINT /usr/bin/start.sh \ - && /bin/bash diff --git a/dockers/docker-fpm/Dockerfile.template b/dockers/docker-fpm/Dockerfile.template new file mode 100644 index 000000000000..d09a81a25155 --- /dev/null +++ b/dockers/docker-fpm/Dockerfile.template @@ -0,0 +1,16 @@ +FROM docker-base + +RUN apt-get update + +RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4 + +COPY deps/ deps + +SED_DPKG + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT /usr/bin/start.sh \ + && /bin/bash diff --git a/dockers/docker-lldp-sv2/Dockerfile b/dockers/docker-lldp-sv2/Dockerfile deleted file mode 100644 index 727d4ce38c56..000000000000 --- a/dockers/docker-lldp-sv2/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM docker-base - -COPY deps/sswsdk*.whl deps/sonic_d*.whl deps/lldpd_*.deb /deps/ - -## Pre-install the fundamental packages -## Install Python SSWSDK -## Install LLDP Sync Daemon -## Note: dpkg_apt function has the benefit to detect missing .deb file -## Clean up -RUN apt-get update && \ - dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ - dpkg_apt /deps/lldpd_*.deb && \ - apt-get install -y python-pip supervisor && \ - pip install /deps/sswsdk*.whl && \ - pip install /deps/sonic_d*.whl && \ - apt-get remove -y python-pip && \ - apt-get purge -y && apt-get autoclean -y && apt-get autoremove -y && \ - rm -rf /deps ~/.cache - -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY reconfigure.sh /opt/reconfigure.sh - -ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-lldp-sv2/Dockerfile.template b/dockers/docker-lldp-sv2/Dockerfile.template new file mode 100644 index 000000000000..da1717f81918 --- /dev/null +++ b/dockers/docker-lldp-sv2/Dockerfile.template @@ -0,0 +1,23 @@ +FROM docker-base + +COPY deps /deps +COPY python-wheels /python-wheels + +RUN apt-get update && apt-get install -y python-pip supervisor libbsd0 libevent-2.0-5 libjansson4 libwrap0 libxml2 libpci3 libperl5.20 + +## Pre-install the fundamental packages +## Install Python SSWSDK +## Install LLDP Sync Daemon + +SED_DPKG + +RUN pip install /python-wheels/sswsdk-2.0.1-py2-none-any.whl && \ + pip install /python-wheels/sonic_d-2.0.0-py2-none-any.whl && \ + apt-get remove -y python-pip && \ + apt-get purge -y && apt-get autoclean -y && apt-get autoremove -y && \ + rm -rf /deps /python-wheels ~/.cache + +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY reconfigure.sh /opt/reconfigure.sh + +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-orchagent/Dockerfile b/dockers/docker-orchagent/Dockerfile deleted file mode 100755 index cc95cf0f7f0b..000000000000 --- a/dockers/docker-orchagent/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM docker-base - -RUN apt-get update - -COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libnl-cli-3-200_*.deb", "deps/libnl-nf-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/libteam5_*.deb", "deps/swss_*.deb", "/deps/"] - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/libhiredis0.13*.deb \ - && dpkg_apt /deps/libnl-3-200_*.deb \ - && dpkg_apt /deps/libnl-genl-3-200_*.deb \ - && dpkg_apt /deps/libnl-route-3-200_*.deb \ - && dpkg_apt /deps/libnl-nf-3-200_*.deb \ - && dpkg_apt /deps/libnl-cli-3-200_*.deb \ - && dpkg_apt /deps/libswsscommon_*.deb \ - && dpkg_apt /deps/libsairedis_*.deb \ - && dpkg_apt /deps/libsaimetadata_*.deb \ - && dpkg_apt /deps/libteam5_*.deb \ - && dpkg_apt /deps/swss_*.deb - -RUN apt-get install -f -y ifupdown bridge-utils redis-tools - -COPY start.sh /usr/bin/start.sh - -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps - -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-orchagent/Dockerfile.template b/dockers/docker-orchagent/Dockerfile.template new file mode 100755 index 000000000000..04979db4d9d6 --- /dev/null +++ b/dockers/docker-orchagent/Dockerfile.template @@ -0,0 +1,18 @@ +FROM docker-base + +RUN apt-get update + +RUN apt-get install -f -y ifupdown bridge-utils libdbus-1-3 libdaemon0 libjansson4 + +COPY deps /deps + +SED_DPKG + +COPY start.sh /usr/bin/start.sh + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-snmp-sv2/Dockerfile b/dockers/docker-snmp-sv2/Dockerfile.template similarity index 61% rename from dockers/docker-snmp-sv2/Dockerfile rename to dockers/docker-snmp-sv2/Dockerfile.template index 68a2ae0e7f25..876a7aca3445 100644 --- a/dockers/docker-snmp-sv2/Dockerfile +++ b/dockers/docker-snmp-sv2/Dockerfile.template @@ -1,7 +1,7 @@ FROM docker-base -COPY deps/snmp_*.deb deps/snmpd_*.deb deps/libsnmp-base_*.deb deps/libsnmp30_*.deb /deps/ -COPY deps/python3/*.whl /python3/ +COPY deps /deps +COPY python-wheels /python-wheels # enable -O for all Python calls ENV PYTHONOPTIMIZE 1 @@ -9,15 +9,12 @@ ENV PYTHONOPTIMIZE 1 ## Pre-install the fundamental packages ## Install Python SSWSDK (SNMP subagent dependency) ## Install SNMP subagent -## Note: dpkg_apt function has the benefit to detect missing .deb file ## Clean up -RUN apt-get update && \ - dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ - dpkg_apt /deps/libsnmp-base_*.deb && \ - dpkg_apt /deps/libsnmp30_*.deb && \ - dpkg_apt /deps/snmp_*.deb && \ - dpkg_apt /deps/snmpd_*.deb && \ - rm -rf /deps +RUN apt-get update && apt-get install -y libmysqlclient-dev libmysqld-dev libperl-dev libpci-dev libpci3 libsensors4 libsensors4-dev libwrap0-dev + +SED_DPKG + +RUN rm -rf /deps # install subagent RUN apt-get -y install build-essential wget libssl-dev openssl supervisor && \ @@ -28,8 +25,8 @@ RUN apt-get -y install build-essential wget libssl-dev openssl supervisor && \ make && make install && \ ldconfig && \ cd .. && rm -rf Python-3.5.2 && rm Python-3.5.2.tgz && \ - pip3 install --no-cache-dir /python3/*py3*.whl hiredis && \ - rm -rf /python3 && \ + pip3 install --no-cache-dir /python-wheels/*py3*.whl hiredis && \ + rm -rf /python-wheels && \ python3 -m sonic_ax_impl install && \ python3 -m pip uninstall -y pip setuptools && \ /bin/bash -c "rm -rf /usr/lib/python3.5/{unittest,lib2to3,tkinter,idlelib,email,test}" && \ diff --git a/dockers/docker-sonic-p4/Dockerfile b/dockers/docker-sonic-p4/Dockerfile deleted file mode 100644 index a0c7cc99219e..000000000000 --- a/dockers/docker-sonic-p4/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM docker-base - -RUN apt-get update - -RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils - -COPY ["deps/libthrift-0.9.3_*.deb", "deps/libhiredis0.13*.deb", "deps/redis-tools_*.deb", "deps/redis-server_*.deb", "deps/libswsscommon_*.deb", "deps/p4-bmv2_*.deb", "deps/p4-switch_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/syncd_*.deb", "deps/swss_*.deb", "deps/quagga_*.deb", "/deps/"] - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libthrift-0.9.3_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libhiredis0.13*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/redis-tools_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/redis-server_*.deb - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libswsscommon_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/p4-bmv2_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/p4-switch_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsairedis_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsaimetadata_*.deb - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/swss_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/quagga_*.deb - -ADD port_config.ini /port_config.ini -ADD startup.sh /scripts/startup.sh - -ADD rsyslog.conf /etc/rsyslog.conf - -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps - -ENTRYPOINT /bin/bash diff --git a/dockers/docker-team/Dockerfile b/dockers/docker-team/Dockerfile deleted file mode 100644 index 607a990b4f23..000000000000 --- a/dockers/docker-team/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM docker-base - -COPY ["deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libnl-nf-3-200_*.deb", "deps/libnl-cli-3-200_*.deb", "deps/libteam5_*.deb", "deps/libteam-utils_*.deb", "deps/libteamdctl0_*.deb", "deps/libhiredis0.13_*.deb", "deps/libswsscommon_*.deb", "/deps/"] - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/libnl-3-200_*.deb \ - && dpkg_apt /deps/libnl-genl-3-200_*.deb \ - && dpkg_apt /deps/libnl-route-3-200_*.deb \ - && dpkg_apt /deps/libnl-nf-3-200_*.deb \ - && dpkg_apt /deps/libnl-cli-3-200_*.deb \ - && dpkg_apt /deps/libteam5_*.deb \ - && dpkg_apt /deps/libteam-utils_*.deb \ - && dpkg_apt /deps/libteamdctl0_*.deb \ - && dpkg_apt /deps/libhiredis0.13_*.deb \ - && dpkg_apt /deps/libswsscommon_*.deb - -COPY ["deps/teamsyncd", "start.sh", "/usr/bin/"] - -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps - -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-team/Dockerfile.template b/dockers/docker-team/Dockerfile.template new file mode 100644 index 000000000000..487ff3d0434e --- /dev/null +++ b/dockers/docker-team/Dockerfile.template @@ -0,0 +1,15 @@ +FROM docker-base + +RUN apt-get update && apt-get install -f -y libdbus-1-3 libdaemon0 libjansson4 + +COPY deps /deps + +SED_DPKG + +COPY start.sh /usr/bin/start.sh + +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk new file mode 100644 index 000000000000..aa5570082911 --- /dev/null +++ b/platform/broadcom/rules.mk @@ -0,0 +1,20 @@ +OPENNSL = libopennsl_6.4.11-1+0~20160719212144.23~1.gbp8ec2d1_amd64.deb +$(OPENNSL)_PATH = $(PLATFORM_PATH)/brcm_sdk +BRCM_SAI = libsaibcm_1.0.2~20160727172452.52_amd64.deb +$(BRCM_SAI)_PATH = $(PLATFORM_PATH)/brcm_sdk +BRCM_SAI_DBG = libsaibcm-dbg_1.0.2~20160727172452.52_amd64.deb +$(BRCM_SAI_DEV)_PATH = $(PLATFORM_PATH)/brcm_sdk +BRCM_SAI_DEV = libsaibcm-dev_1.0.2~20160727172452.52_amd64.deb +$(BRCM_SAI_DBG)_PATH = $(PLATFORM_PATH)/brcm_sdk + +SONIC_COPY_DEBS += $(OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DBG) $(BRCM_SAI_DEV) + +# TODO: Put dependencies for SDK packages + +SONIC_ALL += $(SONIC_GENERIC) $(DOCKER_SYNCD) $(DOCKER_ORCHAGENT) $(DOCKER_FPM) + +# Inject brcm sai into sairedis +$(LIBSAIREDIS)_DEPENDS += $(BRCM_LIBSAI) + +# Runtime dependency on brcm sai is set only for syncd +$(SYNCD)_RDEPENDS += $(BRCM_LIBSAI) diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk new file mode 100644 index 000000000000..7d8ef49177d3 --- /dev/null +++ b/platform/cavium/rules.mk @@ -0,0 +1,21 @@ +CAVM_LIBSAI = libsai.deb +$(CAVM_LIBSAI)_PATH = $(PLATFORM_PATH)/cavm_sdk +CAVM_SAI = sai.deb +$(CAVM_SAI)_PATH = $(PLATFORM_PATH)/cavm_sdk +XP_TOOLS = xp-tools.deb +$(XP_TOOLS)_PATH = $(PLATFORM_PATH)/cavm_sdk +XPSHELL = xpshell.deb +$(XPSHELL)_PATH = $(PLATFORM_PATH)/cavm_sdk + +SONIC_COPY_DEBS += $(CAVM_LIBSAI) $(CAVM_SAI) $(XP_TOOLS) $(XPSHELL) + +# TODO: Put dependencies for SDK packages + +SONIC_ALL += $(SONIC_GENERIC) $(DOCKER_SYNCD_CAVM) $(DOCKER_ORCHAGENT) \ + $(DOCKER_FPM) + +# Inject cavm sai into sairedis +$(LIBSAIREDIS)_DEPENDS += $(CAVM_LIBSAI) + +# Runtime dependency on cavm sai is set only for syncd +$(SYNCD)_RDEPENDS += $(CAVM_LIBSAI) diff --git a/platform/mellanox/docker-syncd-mlnx.mk b/platform/mellanox/docker-syncd-mlnx.mk new file mode 100644 index 000000000000..990ec0f7a4cb --- /dev/null +++ b/platform/mellanox/docker-syncd-mlnx.mk @@ -0,0 +1,8 @@ +# docker image for mlnx syncd + +DOCKER_SYNCD_MLNX = docker-syncd-mlnx.gz +$(DOCKER_SYNCD_MLNX)_PATH = $(PLATFORM_PATH)/docker-syncd-mlnx +$(DOCKER_SYNCD_MLNX)_DEPENDS += $(SYNCD) $(MFT) +$(DOCKER_SYNCD_MLNX)_FILES += $(MLNX_FW) +$(DOCKER_SYNCD_MLNX)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX) diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.template b/platform/mellanox/docker-syncd-mlnx/Dockerfile.template new file mode 100755 index 000000000000..d71245dcd8e3 --- /dev/null +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.template @@ -0,0 +1,20 @@ +FROM docker-base + +RUN apt-get update + +COPY deps /deps + +RUN apt-get install -y libxml2 + +SED_DPKG + +COPY ["start.sh", "/usr/bin/"] +COPY ["mlnx-fw-upgrade.sh", "/usr/bin/"] +COPY ["/deps/fw-SPC.mfa", "/etc/mlnx/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh b/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh new file mode 100755 index 000000000000..2ef46685f801 --- /dev/null +++ b/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +query_retry_count_max="10" +required_fw_version="13.1130.0010" +fw_file=/etc/mlnx/fw-SPC.mfa + +run_or_fail() { + $1 + if [[ $? != 0 ]]; then + echo $1 failed + exit 1 + fi +} + +# wait until devices will be available +query_retry_count="0" +mlxfwmanager --query > /dev/null + +while [[ (${query_retry_count} -lt ${query_retry_count_max}) && ($? -ne "0") ]]; do + sleep 1 + query_retry_count=$[${query_retry_count}+1] + mlxfwmanager --query > /dev/null +done + +run_or_fail "mlxfwmanager --query" > /tmp/mlnxfwmanager-query.txt + +# get current firmware version +found_fw=false +for word in `cat /tmp/mlnxfwmanager-query.txt` +do + if [[ ${found_fw} == true ]]; then + fw_version=${word} + break + fi + if [[ ${word} == FW ]]; then + found_fw=true + fi +done + +if [[ -z ${fw_version} ]]; then + echo "Could not retreive current FW version." + exit 1 +fi + +if [[ ${required_fw_version} == ${fw_version} ]]; then + echo "Mellanox firmware is up to date." +else + echo "Mellanox firmware required version is ${required_fw_version}. Installing compatible version..." + run_or_fail "mlxfwmanager -i ${fw_file} -u -f -y" + + # exit from here so that syncd service will restart + exit 0 +fi diff --git a/platform/mellanox/docker-syncd-mlnx/start.sh b/platform/mellanox/docker-syncd-mlnx/start.sh new file mode 100755 index 000000000000..3c07069ba26e --- /dev/null +++ b/platform/mellanox/docker-syncd-mlnx/start.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +function clean_up { + service syncd stop + service rsyslog stop + exit +} + +trap clean_up SIGTERM SIGKILL + +# fw-upgrade will exit if firmware was actually upgraded or if some error +# occures +. mlnx-fw-upgrade.sh + +# FIXME: the script cannot trap SIGTERM signal and it exits without clean_up +# Remove rsyslogd.pid file manually so that to start the rsyslog instantly +[ -e /var/run/rsyslogd.pid ] && rm /var/run/rsyslogd.pid +service rsyslog start +service syncd start + +read diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk new file mode 100644 index 000000000000..b1e418e697e9 --- /dev/null +++ b/platform/mellanox/fw.mk @@ -0,0 +1,5 @@ +# mellanox firmware + +MLNX_FW = fw-SPC.mfa +$(MLNX_FW)_URL = https://github.com/Mellanox/SAI-Implementation/raw/sonic/sdk/fw-SPC.mfa +SONIC_ONLINE_FILES += $(MLNX_FW) diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk new file mode 100644 index 000000000000..6c6ae480db4d --- /dev/null +++ b/platform/mellanox/hw-management.mk @@ -0,0 +1,9 @@ +# Mellanox HW Management + +MLNX_HW_MANAGEMENT_VERSION = 20.7.2016 + +export MLNX_HW_MANAGEMENT_VERSION + +MLNX_HW_MANAGEMENT = hw-management_1.mlnx.$(MLNX_HW_MANAGEMENT_VERSION)_amd64.deb +$(MLNX_HW_MANAGEMENT)_SRC_PATH = $(PLATFORM_PATH)/hw-management +SONIC_MAKE_DEBS += $(MLNX_HW_MANAGEMENT) diff --git a/platform/mellanox/hw-management/Makefile b/platform/mellanox/hw-management/Makefile new file mode 100644 index 000000000000..8d1dbcb79d0f --- /dev/null +++ b/platform/mellanox/hw-management/Makefile @@ -0,0 +1,17 @@ +.ONESHELL: +SHELL = /bin/bash + +MAIN_TARGET = hw-management_1.mlnx.$(MLNX_HW_MANAGEMENT_VERSION)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # get sources + sudo rm -rf hw-management + wget -N -O mlnx-hw-mgmt-$(MLNX_HW_MANAGEMENT_VERSION).tar.gz https://github.com/Mellanox/mellanox-openswitch/raw/master/hw-mgmt/mlnx-hw-mgmt-$(MLNX_HW_MANAGEMENT_VERSION).tar.gz + tar xzf mlnx-hw-mgmt-$(MLNX_HW_MANAGEMENT_VERSION).tar.gz + + # build + pushd hw-management + sudo debian/rules binary KVERSION=$(KVERSION) + popd + + mv $* $(DEST)/ diff --git a/platform/mellanox/mft.mk b/platform/mellanox/mft.mk new file mode 100644 index 000000000000..7dea01789af2 --- /dev/null +++ b/platform/mellanox/mft.mk @@ -0,0 +1,8 @@ +# Mellanox SAI + +MFT = mft-4.5.0-31.amd64.deb +$(MFT)_SRC_PATH = $(PLATFORM_PATH)/mft +SONIC_MAKE_DEBS += $(MFT) + +KERNEL_MFT = kernel-mft-dkms_4.5.0-3.16.0-4-amd64_all.deb +$(eval $(call add_derived_package,$(MFT),$(KERNEL_MFT))) diff --git a/platform/mellanox/mft/Makefile b/platform/mellanox/mft/Makefile new file mode 100644 index 000000000000..a5b1e8609b70 --- /dev/null +++ b/platform/mellanox/mft/Makefile @@ -0,0 +1,32 @@ +.ONESHELL: +SHELL = /bin/bash + +MFT_NAME = mft-4.5.0-31-x86_64-deb +MFT_TGZ = $(MFT_NAME).tgz +KERNELVER = 3.16.0-4-amd64 +SRC_DEB = kernel-mft-dkms_4.5.0-31_all.deb + +MAIN_TARGET = mft-4.5.0-31.amd64.deb +DERIVED_TARGETS = kernel-mft-dkms_4.5.0-3.16.0-4-amd64_all.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + rm -rf $(MFT_NAME) + wget -O $(MFT_TGZ) http://www.mellanox.com/downloads/MFT/$(MFT_TGZ) + tar xzf $(MFT_TGZ) + pushd $(MFT_NAME)/SDEBS + + # put a lock here because dpkg does not allow installing packages in parallel + while true; do + if mkdir $(DEST)/dpkg_lock &> /dev/null; then + { echo here && sudo dpkg -i $(SRC_DEB) && rm -d $(DEST)/dpkg_lock && break; } || { rm -d $(DEST)/dpkg_lock && exit 1 ; } + fi + done + + tar xvf `sudo dkms mkdriverdisk kernel-mft-dkms/4.5.0 -a all -d ubuntu -k $(KERNELVER) --media tar | grep "Disk image location" | cut -d':' -f2` + popd + + # fix timestamp because we do not actually build tools, only kernel + touch $(MFT_NAME)/DEBS/$* + mv $(MFT_NAME)/SDEBS/ubuntu-drivers/3.16.0/$(DERIVED_TARGETS) $(MFT_NAME)/DEBS/$* $(DEST) + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk new file mode 100644 index 000000000000..917fc8c4dae2 --- /dev/null +++ b/platform/mellanox/mlnx-sai.mk @@ -0,0 +1,12 @@ +# Mellanox SAI + +MLNX_SAI_VERSION = 161120 +MLNX_SAI_REVISION = c7ccc8a8ba9864b62b0c038ad57d6dd94771f5ee + +export MLNX_SAI_VERSION MLNX_SAI_REVISION + +MLNX_SAI = mlnx-sai_1.mlnx.$(MLNX_SAI_VERSION)_amd64.deb +$(MLNX_SAI)_SRC_PATH = $(PLATFORM_PATH)/mlnx-sai +$(MLNX_SAI)_DEPENDS += $(MLNX_SDK_DEBS) +$(MLNX_SAI)_RDEPENDS += $(MLNX_SDK_RDEBS) +SONIC_MAKE_DEBS += $(MLNX_SAI) diff --git a/platform/mellanox/mlnx-sai/Makefile b/platform/mellanox/mlnx-sai/Makefile new file mode 100644 index 000000000000..9a8005e5461f --- /dev/null +++ b/platform/mellanox/mlnx-sai/Makefile @@ -0,0 +1,21 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = mlnx-sai_1.mlnx.$(MLNX_SAI_VERSION)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # get sources + rm -rf SAI-Implementation + git clone https://github.com/Mellanox/SAI-Implementation.git + + # build + pushd SAI-Implementation + git checkout $(MLNX_SAI_REVISION) + pushd mlnx_sai + chmod a+x autogen.sh + debuild -e 'make_extra_flags="DEFS=-DACS_OS"' -us -uc -d -b + popd + + mv $* $(DEST)/ + popd diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk new file mode 100644 index 000000000000..d24b3e3a2e82 --- /dev/null +++ b/platform/mellanox/rules.mk @@ -0,0 +1,21 @@ +include $(PLATFORM_PATH)/sdk.mk +include $(PLATFORM_PATH)/fw.mk +include $(PLATFORM_PATH)/mft.mk +include $(PLATFORM_PATH)/mlnx-sai.mk +include $(PLATFORM_PATH)/hw-management.mk +include $(PLATFORM_PATH)/docker-syncd-mlnx.mk + +SONIC_ALL += $(DOCKER_SYNCD_MLNX) \ + $(DOCKER_ORCHAGENT) \ + $(DOCKER_FPM) \ + $(DOCKER_DATABASE) \ + $(DOCKER_LLDP_SV2) \ + $(DOCKER_SNMP_SV2) \ + $(DOCKER_TEAM) \ + $(DOCKER_PLATFORM_MONITOR) + +# Inject mlnx sai into sairedis +$(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) + +# Runtime dependency on mlnx sai is set only for syncd +$(SYNCD)_RDEPENDS += $(MLNX_SAI) diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk new file mode 100644 index 000000000000..b8a8e1bbc0ba --- /dev/null +++ b/platform/mellanox/sdk.mk @@ -0,0 +1,49 @@ +MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/sonic/sdk +MLNX_SDK_VERSION = 4.2.3002 +MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2) $(SX_ACL_RM) $(SX_COMPLIB) \ + $(SX_EXAMPLES) $(SX_GEN_UTILS) $(SX_SCEW) $(SX_SDN_HAL) \ + $(SXD_LIBS) $(TESTX) + +MLNX_SDK_DEBS += $(APPLIBS_DEV) $(IPROUTE2_DEV) $(SX_ACL_RM_DEV) \ + $(SX_COMPLIB_DEV) $(SX_COMPLIB_DEV_STATIC) $(SX_EXAMPLES_DEV) \ + $(SX_GEN_UTILS_DEV) $(SX_SCEW_DEV) $(SX_SCEW_DEV_STATIC) \ + $(SX_SDN_HAL_DEV) $(SX_SDN_HAL_DEV_STATIC) $(SXD_LIBS_DEV) \ + $(SXD_LIBS_DEV_STATIC) $(TESTX_DEV) + +APPLIBS = applibs_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +APPLIBS_DEV = applibs-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(APPLIBS),$(APPLIBS_DEV))) +IPROUTE2 = iproute2_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +IPROUTE2_DEV = iproute2-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(IPROUTE2),$(IPROUTE2_DEV))) +SX_COMPLIB = sx-complib_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +SX_COMPLIB_DEV = sx-complib-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(SX_COMPLIB),$(SX_COMPLIB_DEV))) +SX_COMPLIB_DEV_STATIC = sx-complib-dev-static_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(SX_COMPLIB),$(SX_COMPLIB_DEV_STATIC))) +SX_EXAMPLES = sx-examples_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +SX_EXAMPLES_DEV = sx-examples-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(SX_EXAMPLES),$(SX_EXAMPLES_DEV))) +SX_GEN_UTILS = sx-gen-utils_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +SX_GEN_UTILS_DEV = sx-gen-utils-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(SX_GEN_UTILS),$(SX_GEN_UTILS_DEV))) +SX_SCEW = sx-scew_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +SX_SCEW_DEV = sx-scew-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(SX_SCEW),$(SX_SCEW_DEV))) +SX_SCEW_DEV_STATIC = sx-scew-dev-static_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(SX_SCEW),$(SX_SCEW_DEV_STATIC))) +SXD_LIBS = sxd-libs_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +SXD_LIBS_DEV = sxd-libs-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(SXD_LIBS),$(SXD_LIBS_DEV))) +SXD_LIBS_DEV_STATIC = sxd-libs-dev-static_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(SXD_LIBS),$(SXD_LIBS_DEV_STATIC))) + +define make_url + $(1)_URL = $(MLNX_SDK_BASE_URL)/$(1) + +endef + +$(eval $(foreach deb,$(MLNX_SDK_DEBS),$(call make_url,$(deb)))) +$(eval $(foreach deb,$(MLNX_SDK_RDEBS),$(call make_url,$(deb)))) + +SONIC_ONLINE_DEBS += $(MLNX_SDK_RDEBS) diff --git a/platform/p4/docker-sonic-p4.mk b/platform/p4/docker-sonic-p4.mk new file mode 100644 index 000000000000..3204f1d50f97 --- /dev/null +++ b/platform/p4/docker-sonic-p4.mk @@ -0,0 +1,7 @@ +# docker image for p4 sonic docker image + +DOCKER_SONIC_P4 = docker-sonic-p4.gz +$(DOCKER_SONIC_P4)_PATH = $(PLATFORM_PATH)/docker-sonic-p4 +$(DOCKER_SONIC_P4)_DEPENDS += $(SWSS) $(SYNCD) $(P4_SWITCH) +$(DOCKER_SONIC_P4)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_SONIC_P4) diff --git a/platform/p4/docker-sonic-p4/Dockerfile.template b/platform/p4/docker-sonic-p4/Dockerfile.template new file mode 100644 index 000000000000..bb790950b211 --- /dev/null +++ b/platform/p4/docker-sonic-p4/Dockerfile.template @@ -0,0 +1,20 @@ +FROM docker-base + +RUN apt-get update + +RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils + +COPY deps /deps + +SED_DPKG + +ADD port_config.ini /port_config.ini +ADD startup.sh /scripts/startup.sh + +ADD rsyslog.conf /etc/rsyslog.conf + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT /bin/bash diff --git a/dockers/docker-sonic-p4/port_config.ini b/platform/p4/docker-sonic-p4/port_config.ini similarity index 100% rename from dockers/docker-sonic-p4/port_config.ini rename to platform/p4/docker-sonic-p4/port_config.ini diff --git a/dockers/docker-sonic-p4/rsyslog.conf b/platform/p4/docker-sonic-p4/rsyslog.conf similarity index 100% rename from dockers/docker-sonic-p4/rsyslog.conf rename to platform/p4/docker-sonic-p4/rsyslog.conf diff --git a/dockers/docker-sonic-p4/startup.sh b/platform/p4/docker-sonic-p4/startup.sh similarity index 100% rename from dockers/docker-sonic-p4/startup.sh rename to platform/p4/docker-sonic-p4/startup.sh diff --git a/platform/p4/p4-bmv.mk b/platform/p4/p4-bmv.mk new file mode 100644 index 000000000000..6fe00d189eb7 --- /dev/null +++ b/platform/p4/p4-bmv.mk @@ -0,0 +1,7 @@ +# p4 bmv package + +P4_BMV = p4-bmv2_1.0.0_amd64.deb +$(P4_BMV)_DEPENDS += $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) +$(P4_BMV)_RDEPENDS += $(LIBTHRIFT) $(PYTHON_THRIFT) $(THRIFT_COMPILER) +$(P4_BMV)_SRC_PATH = $(PLATFORM_PATH)/p4-bmv/behavioral-model +SONIC_DPKG_DEBS += $(P4_BMV) diff --git a/src/p4-bmv2/behavioral-model b/platform/p4/p4-bmv/behavioral-model similarity index 100% rename from src/p4-bmv2/behavioral-model rename to platform/p4/p4-bmv/behavioral-model diff --git a/platform/p4/p4-hlir.mk b/platform/p4/p4-hlir.mk new file mode 100644 index 000000000000..2873275983a9 --- /dev/null +++ b/platform/p4/p4-hlir.mk @@ -0,0 +1,5 @@ +# p4 bmv package + +P4_HLIR = python-p4-hlir_0.9.36-1_all.deb +$(P4_HLIR)_SRC_PATH = $(PLATFORM_PATH)/p4-hlir/p4-hlir +SONIC_PYTHON_STDEB_DEBS += $(P4_HLIR) diff --git a/src/p4-hlir/p4-hlir b/platform/p4/p4-hlir/p4-hlir similarity index 100% rename from src/p4-hlir/p4-hlir rename to platform/p4/p4-hlir/p4-hlir diff --git a/platform/p4/p4-switch.mk b/platform/p4/p4-switch.mk new file mode 100644 index 000000000000..6fc07f908779 --- /dev/null +++ b/platform/p4/p4-switch.mk @@ -0,0 +1,7 @@ +# p4 switch package + +P4_SWITCH = p4-switch_1.0.0_amd64.deb +$(P4_SWITCH)_DEPENDS += $(P4C_BM) $(P4_BMV) +$(P4_SWITCH)_RDEPENDS += $(P4C_BM) $(P4_BMV) +$(P4_SWITCH)_SRC_PATH = $(PLATFORM_PATH)/p4-switch +SONIC_MAKE_DEBS += $(P4_SWITCH) diff --git a/platform/p4/p4-switch/Makefile b/platform/p4/p4-switch/Makefile new file mode 100644 index 000000000000..57f6a05999a1 --- /dev/null +++ b/platform/p4/p4-switch/Makefile @@ -0,0 +1,17 @@ +SHELL = /bin/bash +.ONESHELL: + +MAIN_TARGET = p4-switch_1.0.0_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + pushd switch + + mkdir -p p4-build/bmv2/switch + mkdir -p p4-build/bmv2/pd_thrift_gen + + ./autogen.sh + dpkg-buildpackage -us -uc -b -j4 + + popd + + mv $* $(DEST)/ diff --git a/src/p4-switch/switch b/platform/p4/p4-switch/switch similarity index 100% rename from src/p4-switch/switch rename to platform/p4/p4-switch/switch diff --git a/platform/p4/p4c-bm.mk b/platform/p4/p4c-bm.mk new file mode 100644 index 000000000000..f51595772c3a --- /dev/null +++ b/platform/p4/p4c-bm.mk @@ -0,0 +1,7 @@ +# p4c bm package + +P4C_BM = python-p4c-bm_1.0.0-5415c416-1_all.deb +$(P4C_BM)_SRC_PATH = $(PLATFORM_PATH)/p4c-bm/p4c-bm +$(P4C_BM)_DEPENDS += $(TENJIN) $(P4_HLIR) +$(P4C_BM)_RDEPENDS += $(TENJIN) $(P4_HLIR) +SONIC_PYTHON_STDEB_DEBS += $(P4C_BM) diff --git a/src/p4c-bm/p4c-bm b/platform/p4/p4c-bm/p4c-bm similarity index 100% rename from src/p4c-bm/p4c-bm rename to platform/p4/p4c-bm/p4c-bm diff --git a/platform/p4/rules.mk b/platform/p4/rules.mk new file mode 100644 index 000000000000..07ef1618f6df --- /dev/null +++ b/platform/p4/rules.mk @@ -0,0 +1,6 @@ +include $(PLATFORM_PATH)/p4-switch.mk +include $(PLATFORM_PATH)/p4-bmv.mk +include $(PLATFORM_PATH)/p4-hlir.mk +include $(PLATFORM_PATH)/p4c-bm.mk +include $(PLATFORM_PATH)/tenjin.mk +include $(PLATFORM_PATH)/docker-sonic-p4.mk diff --git a/platform/p4/tenjin.mk b/platform/p4/tenjin.mk new file mode 100644 index 000000000000..a9f38437d972 --- /dev/null +++ b/platform/p4/tenjin.mk @@ -0,0 +1,5 @@ +# tenjin package + +TENJIN = python-tenjin_1.1.1-1_all.deb +$(TENJIN)_SRC_PATH = $(PLATFORM_PATH)/tenjin +SONIC_MAKE_DEBS += $(TENJIN) diff --git a/platform/p4/tenjin/Makefile b/platform/p4/tenjin/Makefile new file mode 100644 index 000000000000..3f36866fe0de --- /dev/null +++ b/platform/p4/tenjin/Makefile @@ -0,0 +1,19 @@ +SHELL = /bin/bash +.ONESHELL: + +TENJIN_VERSION = 1.1.1 +TENJIN_VERSION_FULL = $(TENJIN_VERSION)-1 + +MAIN_TARGET = python-tenjin_$(TENJIN_VERSION_FULL)_all.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + rm -rf Tenjin-$(TENJIN_VERSION) + + wget -nc http://pypi.python.org/packages/source/T/Tenjin/Tenjin-$(TENJIN_VERSION).tar.gz + tar xzf Tenjin-$(TENJIN_VERSION).tar.gz + + pushd Tenjin-$(TENJIN_VERSION) + python setup.py --command-packages=stdeb.command bdist_deb + popd + + mv Tenjin-$(TENJIN_VERSION)/deb_dist/$* $(DEST)/ diff --git a/rules/asyncsnmp-py3.mk b/rules/asyncsnmp-py3.mk new file mode 100644 index 000000000000..68566b1fa49d --- /dev/null +++ b/rules/asyncsnmp-py3.mk @@ -0,0 +1,7 @@ +# asyncsnmp python2 wheel + +ASYNCSNMP_PY3 = asyncsnmp-2.1.0-py3-none-any.whl +$(ASYNCSNMP_PY3)_SRC_PATH = $(SRC_PATH)/sonic-snmpagent +$(ASYNCSNMP_PY3)_PYTHON_VERSION = 3 +$(ASYNCSNMP_PY3)_DEPENDS += $(SSWSDK_PY3) +SONIC_PYTHON_WHEELS += $(ASYNCSNMP_PY3) diff --git a/rules/config b/rules/config new file mode 100644 index 000000000000..111772136429 --- /dev/null +++ b/rules/config @@ -0,0 +1,33 @@ +############################################################################### +## Configuration parameters for SONiC build system +############################################################################### + +# SONIC_CONFIG_VERBOSE - enable echoing for rules commands. +# Uncomment next line to enable: +# SONIC_CONFIG_VERBOSE = y + +# SONIC_CONFIG_PRINT_DEPENDENCIES - show dependencies for each invoked target. +# Before executing rule for each target its dependencies are printed to console. +# Uncomment next line to enable: +# SONIC_CONFIG_PRINT_DEPENDENCIES = y + +# SONIC_CONFIG_BUILD_JOBS - set number of jobs for parallel build. +# Corresponding -j argument will be passed to make command inside docker +# container. +SONIC_CONFIG_BUILD_JOBS = $(shell nproc) + +# SONIC_CONFIG_LOG_TO_FILES - print output from execution of rule for each +# target into separate log file under target/log/. +# Useful when executing parallel build +# Uncomment next line to enable: +SONIC_CONFIG_LOG_TO_FILES = y + +# SONIC_CONFIG_ENABLE_COLORS - enable colored output in build system. +# Comment next line to disable: +# SONIC_CONFIG_ENABLE_COLORS = y + +# USERNAME - username for installer build +USERNAME = admin + +# PASSWORD - password for installer build +PASSWORD = admin diff --git a/rules/dbsyncd-py2.mk b/rules/dbsyncd-py2.mk new file mode 100644 index 000000000000..cd85b9ed7f60 --- /dev/null +++ b/rules/dbsyncd-py2.mk @@ -0,0 +1,7 @@ +# sonic-dbsyncd python2 wheel + +DBSYNCD_PY2 = sonic_d-2.0.0-py2-none-any.whl +$(DBSYNCD_PY2)_SRC_PATH = $(SRC_PATH)/sonic-dbsyncd +$(DBSYNCD_PY2)_PYTHON_VERSION = 2 +$(DBSYNCD_PY2)_DEPENDS += $(SSWSDK_PY2) +SONIC_PYTHON_WHEELS += $(DBSYNCD_PY2) diff --git a/rules/docker-base.mk b/rules/docker-base.mk new file mode 100644 index 000000000000..56e42ac97b45 --- /dev/null +++ b/rules/docker-base.mk @@ -0,0 +1,6 @@ +# docker base image + +DOCKER_BASE = docker-base.gz +$(DOCKER_BASE)_PATH = $(DOCKERS_PATH)/docker-base + +SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_BASE) diff --git a/rules/docker-database.mk b/rules/docker-database.mk new file mode 100644 index 000000000000..0bd7233acdc4 --- /dev/null +++ b/rules/docker-database.mk @@ -0,0 +1,7 @@ +# docker image for database + +DOCKER_DATABASE = docker-database.gz +$(DOCKER_DATABASE)_PATH = $(DOCKERS_PATH)/docker-database +$(DOCKER_DATABASE)_DEPENDS += $(REDIS_SERVER) $(REDIS_TOOLS) +$(DOCKER_DATABASE)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_DATABASE) diff --git a/rules/docker-fpm.mk b/rules/docker-fpm.mk new file mode 100644 index 000000000000..d9fa51f0eeca --- /dev/null +++ b/rules/docker-fpm.mk @@ -0,0 +1,7 @@ +# docker image for fpm + +DOCKER_FPM = docker-fpm.gz +$(DOCKER_FPM)_PATH = $(DOCKERS_PATH)/docker-fpm +$(DOCKER_FPM)_DEPENDS += $(QUAGGA) $(SWSS) +$(DOCKER_FPM)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_FPM) diff --git a/rules/docker-lldp-sv2.mk b/rules/docker-lldp-sv2.mk new file mode 100644 index 000000000000..17347fa79ed7 --- /dev/null +++ b/rules/docker-lldp-sv2.mk @@ -0,0 +1,8 @@ +# docker image for lldp agent + +DOCKER_LLDP_SV2 = docker-lldp-sv2.gz +$(DOCKER_LLDP_SV2)_PATH = $(DOCKERS_PATH)/docker-lldp-sv2 +$(DOCKER_LLDP_SV2)_DEPENDS += $(LLDPD) +$(DOCKER_LLDP_SV2)_PYTHON_WHEELS += $(DBSYNCD_PY2) +$(DOCKER_LLDP_SV2)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_LLDP_SV2) diff --git a/rules/docker-orchagent.mk b/rules/docker-orchagent.mk new file mode 100644 index 000000000000..c4bd99fac08e --- /dev/null +++ b/rules/docker-orchagent.mk @@ -0,0 +1,7 @@ +# docker image for orchagent + +DOCKER_ORCHAGENT = docker-orchagent.gz +$(DOCKER_ORCHAGENT)_PATH = $(DOCKERS_PATH)/docker-orchagent +$(DOCKER_ORCHAGENT)_DEPENDS += $(SWSS) +$(DOCKER_ORCHAGENT)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT) diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk new file mode 100644 index 000000000000..1a48e4c2234a --- /dev/null +++ b/rules/docker-platform-monitor.mk @@ -0,0 +1,7 @@ +# docker platform monitor image + +DOCKER_PLATFORM_MONITOR = docker-platform-monitor.gz +$(DOCKER_PLATFORM_MONITOR)_PATH = $(DOCKERS_PATH)/docker-platform-monitor +$(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_BASE) + +SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) diff --git a/rules/docker-snmp-sv2.mk b/rules/docker-snmp-sv2.mk new file mode 100644 index 000000000000..038c3fb7f002 --- /dev/null +++ b/rules/docker-snmp-sv2.mk @@ -0,0 +1,8 @@ +# docker image for snmp agent + +DOCKER_SNMP_SV2 = docker-snmp-sv2.gz +$(DOCKER_SNMP_SV2)_PATH = $(DOCKERS_PATH)/docker-snmp-sv2 +$(DOCKER_SNMP_SV2)_DEPENDS += $(SNMP) $(SNMPD) +$(DOCKER_SNMP_SV2)_PYTHON_WHEELS += $(ASYNCSNMP_PY3) +$(DOCKER_SNMP_SV2)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_SNMP_SV2) diff --git a/rules/docker-team.mk b/rules/docker-team.mk new file mode 100644 index 000000000000..a11698634d57 --- /dev/null +++ b/rules/docker-team.mk @@ -0,0 +1,7 @@ +# docker image for team agent + +DOCKER_TEAM = docker-team.gz +$(DOCKER_TEAM)_PATH = $(DOCKERS_PATH)/docker-team +$(DOCKER_TEAM)_DEPENDS += $(SWSS) +$(DOCKER_TEAM)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_TEAM) diff --git a/rules/functions b/rules/functions new file mode 100644 index 000000000000..b0d7f9e68499 --- /dev/null +++ b/rules/functions @@ -0,0 +1,103 @@ +############################################################################### +## FUNCTIONS +############################################################################### + +############################################################################### +## Colored output +############################################################################### + +# Enable colored output +ifeq ($(SONIC_CONFIG_ENABLE_COLORS),y) +ifeq ($(MAKE_TERMOUT),) +RED=\033[1;31m +PURPLE=\033[1;35m +CYAN=\033[1;36m +GREEN=\033[1;32m +GRAY=\033[0m +endif +endif + +# Print red colored output +# call: +# log_red message +log_red = echo -e "$(RED)$(1)$(GRAY)" + +# Print purple colored output +# call: +# log_purple message +log_purple = echo -e "$(PURPLE)$(1)$(GRAY)" + +# Print blue colored output +# call: +# log_blue message +log_blue = echo -e "$(CYAN)$(1)$(GRAY)" + +# Print green colored output +# call: +# log_green message +log_green = echo -e "$(GREEN)$(1)$(GRAY)" + +############################################################################### +## Logging +############################################################################### + +ifeq ($(SONIC_CONFIG_LOG_TO_FILES),y) +FLUSH_LOG = rm -f $@.log + +LOG = &>> $(PROJECT_ROOT)/$@.log || { [ $$? -eq 0 ] || cat $(PROJECT_ROOT)/$@.log ; false ; } +endif + +############################################################################### +## Header and footer for each target +############################################################################### + +# Print name of target being built +PRINT_TARGET = $(call log_purple,Executing rules for $@) + +# Print name of target that finished build +PRINT_END_TARGET = $(call log_green,Finished $@) + +# Dump targets taht current depends on +ifeq ($(SONIC_CONFIG_PRINT_DEPENDENCIES),y) +PRINT_DEPENDENCIES = $(call log_blue,Dependencies for $@ are $^) +endif + +# Enable verbose mode +ifneq ($(SONIC_CONFIG_VERBOSE),y) +ENABLE_VERBOSE = @ +endif + +# header for each rule +define HEADER +$(ENABLE_VERBOSE) +$(PRINT_TARGET) +$(PRINT_DEPENDENCIES) +$(FLUSH_LOG) +endef + +# footer for each rule +define FOOTER +$(PRINT_END_TARGET) +endef + +############################################################################### +## Definition of derived target +############################################################################### + +# call: +# add_derived_package some_deb.deb, some_derived_deb +define add_derived_package +$(2)_DEPENDS += $(1) +$(2)_RDEPENDS += $($(1)_RDEPENDS) +$(2)_DERIVED_FROM = $(1) +$(1)_DERIVED_DEBS += $(2) +$(2)_URL = $($(1)_URL) +$(2)_SRC_PATH = $($(1)_SRC_PATH) +SONIC_DERIVED_DEBS += $(2) +endef + +############################################################################### +## Utility functions +############################################################################### + +expand = $(foreach d,$(1),$(call expand,$($(d)_$(2)),$(2))) $(1) diff --git a/rules/hiredis.mk b/rules/hiredis.mk new file mode 100644 index 000000000000..170a430eaba1 --- /dev/null +++ b/rules/hiredis.mk @@ -0,0 +1,18 @@ +# libhiredis package + +HIREDIS_VERSION = 0.13.3 +HIREDIS_VERSION_FULL = $(HIREDIS_VERSION)-2 + +export HIREDIS_VERSION HIREDIS_VERSION_FULL + +LIBHIREDIS = libhiredis0.13_$(HIREDIS_VERSION_FULL)_amd64.deb +$(LIBHIREDIS)_SRC_PATH = $(SRC_PATH)/hiredis +$(LIBHIREDIS)_DEPENDS += $(REDIS_SERVER) $(REDIS_TOOLS) $(REDIS_SENTINEL) +$(LIBHIREDIS)_RDEPENDS += $(REDIS_SERVER) $(REDIS_TOOLS) $(REDIS_SENTINEL) +SONIC_MAKE_DEBS += $(LIBHIREDIS) + +LIBHIREDIS_DEV = libhiredis-dev_$(HIREDIS_VERSION_FULL)_amd64.deb +$(eval $(call add_derived_package,$(LIBHIREDIS),$(LIBHIREDIS_DEV))) + +LIBHIREDIS_DBG = libhiredis-dbg_$(HIREDIS_VERSION_FULL)_amd64.deb +$(eval $(call add_derived_package,$(LIBHIREDIS),$(LIBHIREDIS_DBG))) diff --git a/rules/initramfs-tools.mk b/rules/initramfs-tools.mk new file mode 100644 index 000000000000..ef06c1056d41 --- /dev/null +++ b/rules/initramfs-tools.mk @@ -0,0 +1,8 @@ +# initramfs-tools package + +INITRAMFS_TOOLS_VERSION = 0.120 +export INITRAMFS_TOOLS_VERSION + +INITRAMFS_TOOLS = initramfs-tools_$(INITRAMFS_TOOLS_VERSION)_all.deb +$(INITRAMFS_TOOLS)_SRC_PATH = $(SRC_PATH)/initramfs-tools +SONIC_MAKE_DEBS += $(INITRAMFS_TOOLS) diff --git a/rules/libnl3.mk b/rules/libnl3.mk new file mode 100644 index 000000000000..fe43708a9399 --- /dev/null +++ b/rules/libnl3.mk @@ -0,0 +1,44 @@ +# libnl3 + +LIBNL3_VERSION = 3.2.27-1 + +export LIBNL3_VERSION + +LIBNL3 = libnl-3-200_$(LIBNL3_VERSION)_amd64.deb +$(LIBNL3)_SRC_PATH = $(SRC_PATH)/libnl3 +SONIC_MAKE_DEBS += $(LIBNL3) + +LIBNL3_DEV = libnl-3-dev_$(LIBNL3_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(LIBNL3),$(LIBNL3_DEV))) + +LIBNL_GENL3 = libnl-genl-3-200_$(LIBNL3_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(LIBNL3),$(LIBNL_GENL3))) + +LIBNL_GENL3_DEV = libnl-genl-3-dev_$(LIBNL3_VERSION)_amd64.deb +$(LIBNL_GENL3_DEV)_DEPENDS += $(LIBNL_GENL3) $(LIBNL3_DEV) +$(eval $(call add_derived_package,$(LIBNL3),$(LIBNL_GENL3_DEV))) + +LIBNL_ROUTE3 = libnl-route-3-200_$(LIBNL3_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(LIBNL3),$(LIBNL_ROUTE3))) + +LIBNL_ROUTE3_DEV = libnl-route-3-dev_$(LIBNL3_VERSION)_amd64.deb +$(LIBNL_ROUTE3_DEV)_DEPENDS += $(LIBNL_ROUTE3) $(LIBNL3_DEV) +$(eval $(call add_derived_package,$(LIBNL3),$(LIBNL_ROUTE3_DEV))) + +LIBNL_NF3 = libnl-nf-3-200_$(LIBNL3_VERSION)_amd64.deb +$(LIBNL_NF3)_DEPENDS += $(LIBNL_ROUTE3_DEV) +$(LIBNL_NF3)_RDEPENDS += $(LIBNL_ROUTE3) +$(eval $(call add_derived_package,$(LIBNL3),$(LIBNL_NF3))) + +LIBNL_NF3_DEV = libnl-nf-3-dev_$(LIBNL3_VERSION)_amd64.deb +$(LIBNL_NF3_DEV)_DEPENDS += $(LIBNL_NF3) +$(eval $(call add_derived_package,$(LIBNL3),$(LIBNL_NF3_DEV))) + +LIBNL_CLI = libnl-cli-3-200_$(LIBNL3_VERSION)_amd64.deb +$(LIBNL_CLI)_DEPENDS += $(LIBNL_GENL3_DEV) $(LIBNL_NF3_DEV) $(LIBNL_ROUTE3_DEV) +$(LIBNL_CLI)_RDEPENDS += $(LIBNL_GENL3) $(LIBNL_NF3) $(LIBNL_ROUTE3) +$(eval $(call add_derived_package,$(LIBNL3),$(LIBNL_CLI))) + +LIBNL_CLI_DEV = libnl-cli-3-dev_$(LIBNL3_VERSION)_amd64.deb +$(LIBNL_CLI_DEV)_DEPENDS += $(LIBNL_CLI) $(LIBNL_GENL3_DEV) $(LIBNL_NF3_DEV) $(LIBNL_ROUTE3_DEV) +$(eval $(call add_derived_package,$(LIBNL3),$(LIBNL_CLI_DEV))) diff --git a/rules/libteam.mk b/rules/libteam.mk new file mode 100644 index 000000000000..9aecb07ce86a --- /dev/null +++ b/rules/libteam.mk @@ -0,0 +1,21 @@ +# libteam packages + +LIBTEAM_VERSION = 1.26-1 + +export LIBTEAM_VERSION + +LIBTEAM = libteam5_$(LIBTEAM_VERSION)_amd64.deb +$(LIBTEAM)_SRC_PATH = $(SRC_PATH)/libteam +$(LIBTEAM)_DEPENDS += $(LIBNL_GENL3_DEV) $(LIBNL_CLI_DEV) +SONIC_MAKE_DEBS += $(LIBTEAM) + +LIBTEAM_DEV = libteam-dev_$(LIBTEAM_VERSION)_amd64.deb +$(LIBTEAM_DEV)_DEPENDS += $(LIBTEAMDCT) +$(eval $(call add_derived_package,$(LIBTEAM),$(LIBTEAM_DEV))) + +LIBTEAMDCT = libteamdctl0_$(LIBTEAM_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(LIBTEAM),$(LIBTEAMDCT))) + +LIBTEAM_UTILS = libteam-utils_$(LIBTEAM_VERSION)_amd64.deb +$(LIBTEAM_UTILS)_DEPENDS += $(LIBTEAMDCT) +$(eval $(call add_derived_package,$(LIBTEAM),$(LIBTEAM_UTILS))) diff --git a/rules/linux-kernel.mk b/rules/linux-kernel.mk new file mode 100644 index 000000000000..6aae74dc2b95 --- /dev/null +++ b/rules/linux-kernel.mk @@ -0,0 +1,9 @@ +# redis package + +KVERSION = 3.16.0-4-amd64 + +export KVERSION + +LINUX_KERNEL = linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb +$(LINUX_KERNEL)_SRC_PATH = $(SRC_PATH)/sonic-linux-kernel +SONIC_MAKE_DEBS += $(LINUX_KERNEL) diff --git a/rules/lldpd.mk b/rules/lldpd.mk new file mode 100644 index 000000000000..65cfb61b3eee --- /dev/null +++ b/rules/lldpd.mk @@ -0,0 +1,12 @@ +# lldpd package + +LLDPD_VERSION = 0.9.5-0 + +LLDPD = lldpd_$(LLDPD_VERSION)_amd64.deb +$(LLDPD)_DEPENDS += $(LIBSNMP_DEV) +$(LLDPD)_RDEPENDS += $(LIBSNMP) +$(LLDPD)_SRC_PATH = $(SRC_PATH)/lldpd +SONIC_DPKG_DEBS += $(LLDPD) + +LIBLLDPCTL = liblldpctl-dev_$(LLDPD_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(LLDPD),$(LIBLLDPCTL))) diff --git a/rules/mpdecimal.mk b/rules/mpdecimal.mk new file mode 100644 index 000000000000..849c65057192 --- /dev/null +++ b/rules/mpdecimal.mk @@ -0,0 +1,13 @@ +# mpdecimal package + +MPDECIMAL_VERSION = 2.4.2 +MPDECIMAL_VERSION_FULL = $(MPDECIMAL_VERSION)-1 + +export MPDECIMAL_VERSION MPDECIMAL_VERSION_FULL + +LIBMPDECIMAL = libmpdec2_$(MPDECIMAL_VERSION_FULL)_amd64.deb +$(LIBMPDECIMAL)_SRC_PATH = $(SRC_PATH)/mpdecimal +SONIC_MAKE_DEBS += $(LIBMPDECIMAL) + +LIBMPDECIMAL_DEV = libmpdec-dev_$(MPDECIMAL_VERSION_FULL)_amd64.deb +$(eval $(call add_derived_package,$(LIBMPDECIMAL),$(LIBMPDECIMAL_DEV))) diff --git a/rules/quagga.mk b/rules/quagga.mk new file mode 100644 index 000000000000..f4ba4f2d0be8 --- /dev/null +++ b/rules/quagga.mk @@ -0,0 +1,6 @@ +# quagga package + +QUAGGA = quagga_0.99.24.1-2.1_amd64.deb +$(QUAGGA)_DEPENDS += $(LIBSNMP_DEV) +$(QUAGGA)_SRC_PATH = $(SRC_PATH)/sonic-quagga +SONIC_DPKG_DEBS += $(QUAGGA) diff --git a/rules/redis.mk b/rules/redis.mk new file mode 100644 index 000000000000..1adf209f6a6c --- /dev/null +++ b/rules/redis.mk @@ -0,0 +1,15 @@ +# redis package + +REDIS_VERSION = 3.2.4-1~bpo8+1 + +REDIS_TOOLS = redis-tools_$(REDIS_VERSION)_amd64.deb +$(REDIS_TOOLS)_SRC_PATH = $(SRC_PATH)/redis +SONIC_MAKE_DEBS += $(REDIS_TOOLS) + +REDIS_SERVER = redis-server_$(REDIS_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(REDIS_TOOLS),$(REDIS_SERVER))) + +REDIS_SENTINEL = redis-sentinel_$(REDIS_VERSION)_amd64.deb +$(REDIS_SENTINEL)_DEPENDS += $(REDIS_SERVER) +$(REDIS_SENTINEL)_RDEPENDS += $(REDIS_SERVER) +$(eval $(call add_derived_package,$(REDIS_TOOLS),$(REDIS_SENTINEL))) diff --git a/rules/sairedis.mk b/rules/sairedis.mk new file mode 100644 index 000000000000..145a0901b287 --- /dev/null +++ b/rules/sairedis.mk @@ -0,0 +1,20 @@ +# sairedis package + +LIBSAIREDIS = libsairedis_1.0.0_amd64.deb +$(LIBSAIREDIS)_SRC_PATH = $(SRC_PATH)/sonic-sairedis +$(LIBSAIREDIS)_DEPENDS += $(LIBSWSSCOMMON_DEV) +$(LIBSAIREDIS)_RDEPENDS += $(LIBSWSSCOMMON) +SONIC_DPKG_DEBS += $(LIBSAIREDIS) + +LIBSAIREDIS_DEV = libsairedis-dev_1.0.0_amd64.deb +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DEV))) + +SYNCD = syncd_1.0.0_amd64.deb +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD))) + +LIBSAIMETADATA = libsaimetadata_1.0.0_amd64.deb +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA))) + +LIBSAIMETADATA_DEV = libsaimetadata-dev_1.0.0_amd64.deb +$(LIBSAIMETADATA_DEV)_DEPENDS += $(LIBSAIMETADATA) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DEV))) diff --git a/rules/snmpd.mk b/rules/snmpd.mk new file mode 100644 index 000000000000..db85ca0d94a9 --- /dev/null +++ b/rules/snmpd.mk @@ -0,0 +1,53 @@ +# snmpd package + +SNMPD_VERSION = 5.7.3+dfsg +SNMPD_VERSION_FULL = $(SNMPD_VERSION)-1.5 + +export SNMPD_VERSION SNMPD_VERSION_FULL + +LIBSNMP_BASE = libsnmp-base_$(SNMPD_VERSION_FULL)_all.deb +$(LIBSNMP_BASE)_SRC_PATH = $(SRC_PATH)/snmpd +SONIC_MAKE_DEBS += $(LIBSNMP_BASE) + +SNMPTRAPD = snmptrapd_$(SNMPD_VERSION_FULL)_amd64.deb +$(SNMPTRAPD)_DEPENDS += $(LIBSNMP) $(SNMPD) +$(SNMPTRAPD)_RDEPENDS += $(LIBSNMP) $(SNMPD) +$(eval $(call add_derived_package,$(LIBSNMP_BASE),$(SNMPTRAPD))) + +SNMP = snmp_$(SNMPD_VERSION_FULL)_amd64.deb +$(SNMP)_DEPENDS += $(LIBSNMP) +$(SNMP)_RDEPENDS += $(LIBSNMP) +$(eval $(call add_derived_package,$(LIBSNMP_BASE),$(SNMP))) + +SNMPD = snmpd_$(SNMPD_VERSION_FULL)_amd64.deb +$(SNMPD)_DEPENDS += $(LIBSNMP) +$(SNMPD)_RDEPENDS += $(LIBSNMP) +$(eval $(call add_derived_package,$(LIBSNMP_BASE),$(SNMPD))) + +LIBSNMP = libsnmp30_$(SNMPD_VERSION_FULL)_amd64.deb +$(LIBSNMP)_RDEPENDS += $(LIBSNMP_BASE) +$(eval $(call add_derived_package,$(LIBSNMP_BASE),$(LIBSNMP))) + +LIBSNMP_DBG = libsnmp30-dbg_$(SNMPD_VERSION_FULL)_amd64.deb +$(LIBSNMP_DBG)_DEPENDS += $(LIBSNMP) +$(LIBSNMP_DBG)_RDEPENDS += $(LIBSNMP) +$(eval $(call add_derived_package,$(LIBSNMP_BASE),$(LIBSNMP_DBG))) + +LIBSNMP_DEV = libsnmp-dev_$(SNMPD_VERSION_FULL)_amd64.deb +$(LIBSNMP_DEV)_DEPENDS += $(LIBSNMP) +$(eval $(call add_derived_package,$(LIBSNMP_BASE),$(LIBSNMP_DEV))) + +LIBSNMP_PERL = libsnmp-perl_$(SNMPD_VERSION_FULL)_amd64.deb +$(LIBSNMP_PERL)_DEPENDS += $(LIBSNMP) +$(LIBSNMP_PERL)_RDEPENDS += $(LIBSNMP) +$(eval $(call add_derived_package,$(LIBSNMP_BASE),$(LIBSNMP_PERL))) + +PYTHON_NETSNMP = python-netsnmp_$(SNMPD_VERSION_FULL)_amd64.deb +$(PYTHON_NETSNMP)_DEPENDS += $(LIBSNMP) +$(PYTHON_NETSNMP)_RDEPENDS += $(LIBSNMP) +$(eval $(call add_derived_package,$(LIBSNMP_BASE),$(PYTHON_NETSNMP))) + +TKMIB = tkmib_$(SNMPD_VERSION_FULL)_all.deb +$(TKMIB)_DEPENDS += $(LIBSNMP_PERL) +$(TKMIB)_RDEPENDS += $(LIBSNMP_PERL) +$(eval $(call add_derived_package,$(LIBSNMP_BASE),$(TKMIB))) diff --git a/rules/sonic-aboot.mk b/rules/sonic-aboot.mk new file mode 100644 index 000000000000..7db01c10d3b5 --- /dev/null +++ b/rules/sonic-aboot.mk @@ -0,0 +1,6 @@ +# sonic aboot installer + +SONIC_ABOOT = sonic-aboot.bin +$(SONIC_ABOOT)_MACHINE = aboot +$(SONIC_ABOOT)_DEPENDS += $(LINUX_KERNEL) $(INITRAMFS_TOOLS) +SONIC_INSTALLERS += $(SONIC_ABOOT) diff --git a/rules/sonic-generic.mk b/rules/sonic-generic.mk new file mode 100644 index 000000000000..a87c39c65127 --- /dev/null +++ b/rules/sonic-generic.mk @@ -0,0 +1,6 @@ +# sonic generic installer + +SONIC_GENERIC = sonic-generic.bin +$(SONIC_GENERIC)_MACHINE = generic +$(SONIC_GENERIC)_DEPENDS += $(LINUX_KERNEL) $(INITRAMFS_TOOLS) +SONIC_INSTALLERS += $(SONIC_GENERIC) diff --git a/rules/sswsdk-py2.mk b/rules/sswsdk-py2.mk new file mode 100644 index 000000000000..b50ea229ab7e --- /dev/null +++ b/rules/sswsdk-py2.mk @@ -0,0 +1,6 @@ +# sswsdk python2 wheel + +SSWSDK_PY2 = sswsdk-2.0.1-py2-none-any.whl +$(SSWSDK_PY2)_SRC_PATH = $(SRC_PATH)/sonic-py-swsssdk +$(SSWSDK_PY2)_PYTHON_VERSION = 2 +SONIC_PYTHON_WHEELS += $(SSWSDK_PY2) diff --git a/rules/sswsdk-py3.mk b/rules/sswsdk-py3.mk new file mode 100644 index 000000000000..4dd0e7805bb1 --- /dev/null +++ b/rules/sswsdk-py3.mk @@ -0,0 +1,8 @@ +# sswsdk python3 wheel + +SSWSDK_PY3 = sswsdk-2.0.1-py3-none-any.whl +$(SSWSDK_PY3)_SRC_PATH = $(SRC_PATH)/sonic-py-swsssdk +$(SSWSDK_PY3)_PYTHON_VERSION = 3 +# Synthetic dependency just to avoid race condition +$(SSWSDK_PY3)_DEPENDS += $(SSWSDK_PY2) +SONIC_PYTHON_WHEELS += $(SSWSDK_PY3) diff --git a/rules/swss-common.mk b/rules/swss-common.mk new file mode 100644 index 000000000000..d066714ae3a9 --- /dev/null +++ b/rules/swss-common.mk @@ -0,0 +1,13 @@ +# libswsscommon package + +LIBSWSSCOMMON = libswsscommon_1.0.0_amd64.deb +$(LIBSWSSCOMMON)_SRC_PATH = $(SRC_PATH)/sonic-swss-common +$(LIBSWSSCOMMON)_DEPENDS += $(LIBHIREDIS_DEV) $(LIBNL3_DEV) $(LIBNL_GENL3_DEV) \ + $(LIBNL_ROUTE3_DEV) $(LIBNL_NF3_DEV) \ + $(LIBNL_CLI_DEV) +$(LIBSWSSCOMMON)_RDEPENDS += $(LIBHIREDIS) $(LIBNL3) $(LIBNL_GENL3) \ + $(LIBNL_ROUTE3) $(LIBNL_NF3) $(LIBNL_CLI) +SONIC_DPKG_DEBS += $(LIBSWSSCOMMON) + +LIBSWSSCOMMON_DEV = libswsscommon-dev_1.0.0_amd64.deb +$(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(LIBSWSSCOMMON_DEV))) diff --git a/rules/swss.mk b/rules/swss.mk new file mode 100644 index 000000000000..4761d2fb8876 --- /dev/null +++ b/rules/swss.mk @@ -0,0 +1,9 @@ +# swss package + +SWSS = swss_1.0.0_amd64.deb +$(SWSS)_SRC_PATH = $(SRC_PATH)/sonic-swss +$(SWSS)_DEPENDS += $(LIBSAIREDIS_DEV) $(LIBSAIMETADATA_DEV) $(LIBTEAM_DEV) \ + $(LIBTEAMDCT) $(LIBTEAM_UTILS) +$(SWSS)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(LIBTEAM) $(LIBTEAMDCT) \ + $(LIBTEAM_UTILS) +SONIC_DPKG_DEBS += $(SWSS) diff --git a/rules/thrift.mk b/rules/thrift.mk new file mode 100644 index 000000000000..20b01359a1ee --- /dev/null +++ b/rules/thrift.mk @@ -0,0 +1,17 @@ +# thrift package + +THRIFT_VERSION = 0.9.3 +THRIFT_VERSION_FULL = $(THRIFT_VERSION)-2 + +LIBTHRIFT = libthrift-$(THRIFT_VERSION)_$(THRIFT_VERSION_FULL)_amd64.deb +$(LIBTHRIFT)_SRC_PATH = $(SRC_PATH)/thrift +SONIC_MAKE_DEBS += $(LIBTHRIFT) + +LIBTHRIFT_DEV = libthrift-dev_$(THRIFT_VERSION_FULL)_amd64.deb +$(eval $(call add_derived_package,$(LIBTHRIFT),$(LIBTHRIFT_DEV))) + +PYTHON_THRIFT = python-thrift_$(THRIFT_VERSION_FULL)_amd64.deb +$(eval $(call add_derived_package,$(LIBTHRIFT),$(PYTHON_THRIFT))) + +THRIFT_COMPILER = thrift-compiler_$(THRIFT_VERSION_FULL)_amd64.deb +$(eval $(call add_derived_package,$(LIBTHRIFT),$(THRIFT_COMPILER))) diff --git a/slave.mk b/slave.mk new file mode 100644 index 000000000000..5b98d8bba2c2 --- /dev/null +++ b/slave.mk @@ -0,0 +1,311 @@ +############################################################################### +## Presettings +############################################################################### + +# Select bash for commands +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +.SECONDEXPANSION: + +SPACE := +SPACE += + +############################################################################### +## General definitions +############################################################################### + +SRC_PATH = src +RULES_PATH = rules +TARGET_PATH = target +DOCKERS_PATH = dockers +DEBS_PATH = $(TARGET_PATH)/debs +PYTHON_WHEELS_PATH = $(TARGET_PATH)/python-wheels +PROJECT_ROOT = $(shell pwd) + +CONFIGURED_PLATFORM := $(shell [ -f .platform ] && cat .platform || echo undefined) +PLATFORM_PATH = platform/$(CONFIGURED_PLATFORM) + +############################################################################### +## Utility rules +## Define configuration, help etc. +############################################################################### + +.platform : + @echo Build system is not configured, please run make configure + @exit 1 + +configure : + @mkdir -p target/debs + @mkdir -p target/python-wheels + @echo $(PLATFORM) > .platform + +distclean : .platform clean + @rm -f .platform + +############################################################################### +## Include other rules +############################################################################### + +include $(RULES_PATH)/config +include $(RULES_PATH)/functions +include $(RULES_PATH)/*.mk +ifneq ($(CONFIGURED_PLATFORM), undefined) +include $(PLATFORM_PATH)/rules.mk +endif + +MAKEFLAGS += -j $(SONIC_CONFIG_BUILD_JOBS) + +############################################################################### +## Generic rules section +## All rules must go after includes for propper targets expansion +############################################################################### + +############################################################################### +## Online targets +############################################################################### + +# Download debian packages from online location +# Add new package for download: +# SOME_NEW_DEB = some_new_deb.deb +# $(SOME_NEW_DEB)_URL = https://url/to/this/deb.deb +# SONIC_ONLINE_DEBS += $(SOME_NEW_DEB) +$(addprefix $(DEBS_PATH)/, $(SONIC_ONLINE_DEBS)) : $(DEBS_PATH)/% : .platform + $(HEADER) + $(foreach deb,$* $($*_DERIVED_DEBS), \ + { wget -O $(DEBS_PATH)/$(deb) $($(deb)_URL) $(LOG) || exit 1 ; } ; ) + $(FOOTER) + +# Download regular files from online location +# Files are stored in deb packages directory for convenience +# Add new file for download: +# SOME_NEW_FILE = some_new_file +# $(SOME_NEW_FILE)_URL = https://url/to/this/file +# SONIC_ONLINE_FILES += $(SOME_NEW_FILE) +$(addprefix $(DEBS_PATH)/, $(SONIC_ONLINE_FILES)) : $(DEBS_PATH)/% : .platform + $(HEADER) + wget -O $@ $($*_URL) $(LOG) + $(FOOTER) + +# Copy debian packages from local directory +# Add new package for copy: +# SOME_NEW_DEB = some_new_deb.deb +# $(SOME_NEW_DEB)_PATH = path/to/some_new_deb.deb +# SONIC_COPY_DEBS += $(SOME_NEW_DEB) +$(addprefix $(DEBS_PATH)/, $(SONIC_COPY_DEBS)) : $(DEBS_PATH)/% : .platform + $(HEADER) + $(foreach deb,$* $($*_DERIVED_DEBS), \ + { cp $($(deb)_PATH) $(DEBS_PATH)/ $(LOG) || exit 1 ; } ; ) + $(FOOTER) + +############################################################################### +## Debian package related targets +############################################################################### + +# Build project using build.sh script +# They are essentially a one-time build projects that get sources from some URL +# and compile them +# Add new package for build: +# SOME_NEW_DEB = some_new_deb.deb +# $(SOME_NEW_DEB)_SRC_PATH = $(SRC_PATH)/project_name +# $(SOME_NEW_DEB)_DEPENDS = $(SOME_OTHER_DEB1) $(SOME_OTHER_DEB2) ... +# SONIC_MAKE_DEBS += $(SOME_NEW_DEB) +$(addprefix $(DEBS_PATH)/, $(SONIC_MAKE_DEBS)) : $(DEBS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) + $(HEADER) + # remove target to force rebuild + rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS)) + # build project and take package + make DEST=$(shell pwd)/$(DEBS_PATH) -C $($*_SRC_PATH) $(shell pwd)/$(DEBS_PATH)/$* $(LOG) + $(FOOTER) + +# Build project with dpkg-buildpackage +# Add new package for build: +# SOME_NEW_DEB = some_new_deb.deb +# $(SOME_NEW_DEB)_SRC_PATH = $(SRC_PATH)/project_name +# $(SOME_NEW_DEB)_DEPENDS = $(SOME_OTHER_DEB1) $(SOME_OTHER_DEB2) ... +# SONIC_DPKG_DEBS += $(SOME_NEW_DEB) +$(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) : $(DEBS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) + $(HEADER) + # Build project and take package + rm -f $($*_SRC_PATH)/debian/*.debhelper.log + pushd $($*_SRC_PATH) $(LOG) + [ ! -f ./autogen.sh ] || ./autogen.sh $(LOG) + dpkg-buildpackage -rfakeroot -b -us -uc $(LOG) + popd $(LOG) + mv $(addprefix $($*_SRC_PATH)/../, $* $($*_DERIVED_DEBS)) $(DEBS_PATH) $(LOG) + $(FOOTER) + +# Build project with python setup.py --command-packages=stdeb.command +# Add new package for build: +# SOME_NEW_DEB = some_new_deb.deb +# $(SOME_NEW_DEB)_SRC_PATH = $(SRC_PATH)/project_name +# $(SOME_NEW_DEB)_DEPENDS = $(SOME_OTHER_DEB1) $(SOME_OTHER_DEB2) ... +# SONIC_PYTHON_STDEB_DEBS += $(SOME_NEW_DEB) +$(addprefix $(DEBS_PATH)/, $(SONIC_PYTHON_STDEB_DEBS)) : $(DEBS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) + $(HEADER) + # Build project and take package + pushd $($*_SRC_PATH) $(LOG) + python setup.py --command-packages=stdeb.command bdist_deb + popd $(LOG) + mv $(addprefix $($*_SRC_PATH)/deb_dist/, $* $($*_DERIVED_DEBS)) $(DEBS_PATH) $(LOG) + $(FOOTER) + +# Rules for derived debian packages (dev, dbg, etc.) +# All noise takes place in main deb recipe, so we are just telling that +# we depend on it and move our deb to other targets +# Add new dev package: +# $(eval $(call add_derived_package,$(ORIGINAL_DEB),derived_deb_file.deb)) +$(addprefix $(DEBS_PATH)/, $(SONIC_DERIVED_DEBS)) : $(DEBS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) + $(HEADER) + # All noise takes place in main deb recipe, so we are just telling that + # we depend on it + # Put newer timestamp + [ -f $@ ] && touch $@ + $(FOOTER) + +# Targets for installing debian packages prior to build one that depends on them +SONIC_INSTALL_TARGETS = $(addsuffix -install,$(addprefix $(DEBS_PATH)/, \ + $(SONIC_ONLINE_DEBS) \ + $(SONIC_COPY_DEBS) \ + $(SONIC_MAKE_DEBS) \ + $(SONIC_DPKG_DEBS) \ + $(SONIC_PYTHON_STDEB_DEBS) \ + $(SONIC_DERIVED_DEBS))) +$(SONIC_INSTALL_TARGETS) : $(DEBS_PATH)/%-install : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) $(DEBS_PATH)/$$* + $(HEADER) + [ -f $(DEBS_PATH)/$* ] || { echo $(DEBS_PATH)/$* does not exist $(LOG) && exit 1; } + # put a lock here because dpkg does not allow installing packages in parallel + while true; do + if mkdir $(DEBS_PATH)/dpkg_lock &> /dev/null; then + { sudo dpkg -i $(DEBS_PATH)/$* $(LOG) && rm -d $(DEBS_PATH)/dpkg_lock && break; } || { rm -d $(DEBS_PATH)/dpkg_lock && exit 1 ; } + fi + done + $(FOOTER) + +############################################################################### +## Python packages +############################################################################### + +# Build project using python setup.py bdist_wheel +# Projects that generate python wheels +# Add new package for build: +# SOME_NEW_WHL = some_new_whl.whl +# $(SOME_NEW_WHL)_SRC_PATH = $(SRC_PATH)/project_name +# $(SOME_NEW_WHL)_PYTHON_VERSION = 2 (or 3) +# $(SOME_NEW_WHL)_DEPENDS = $(SOME_OTHER_WHL1) $(SOME_OTHER_WHL2) ... +# SONIC_PYTHON_WHEELS += $(SOME_NEW_DEB) +$(addprefix $(PYTHON_WHEELS_PATH)/, $(SONIC_PYTHON_WHEELS)) : $(PYTHON_WHEELS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*_DEPENDS))) + $(HEADER) + pushd $($*_SRC_PATH) $(LOG) + python$($*_PYTHON_VERSION) setup.py bdist_wheel $(LOG) + popd $(LOG) + mv $($*_SRC_PATH)/dist/$* $(PYTHON_WHEELS_PATH) $(LOG) + $(FOOTER) + +# Targets for installing python wheels. +# Autogenerated +SONIC_INSTALL_WHEELS = $(addsuffix -install, $(addprefix $(PYTHON_WHEELS_PATH)/, $(SONIC_PYTHON_WHEELS))) +$(SONIC_INSTALL_WHEELS) : $(PYTHON_WHEELS_PATH)/%-install : .platform $$(addsuffix -install,$$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*_DEPENDS))) $(PYTHON_WHEELS_PATH)/$$* + $(HEADER) + [ -f $(PYTHON_WHEELS_PATH)/$* ] || { echo $(PYTHON_WHEELS_PATH)/$* does not exist $(LOG) && exit 1; } + # put a lock here to avoid race conditions + while true; do + if mkdir $(PYTHON_WHEELS_PATH)/pip_lock &> /dev/null; then + { sudo pip$($*_PYTHON_VERSION) install $(PYTHON_WHEELS_PATH)/$* $(LOG) && rm -d $(PYTHON_WHEELS_PATH)/pip_lock && break; } || { rm -d $(PYTHON_WHEELS_PATH)/pip_lock && exit 1 ; } + fi + done + $(FOOTER) + +############################################################################### +## Docker images related targets +############################################################################### + +# start docker daemon +docker-start : + @sudo service docker start &> /dev/null && sleep 1 + +# targets for building simple docker images that do not depend on any debian packages +$(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) + $(HEADER) + docker build --no-cache -t $* $($*.gz_PATH) $(LOG) + docker save $* | gzip -c > $@ + $(FOOTER) + +# Targets for building docker images +$(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addprefix $(DEBS_PATH)/,$$($$*.gz_DEPENDS) $$($$*.gz_FILES)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*.gz_PYTHON_WHEELS)) $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) + $(HEADER) + mkdir -p $($*.gz_PATH)/deps $(LOG) + mkdir -p $($*.gz_PATH)/python-wheels $(LOG) + sudo mount --bind $(DEBS_PATH) $($*.gz_PATH)/deps $(LOG) + sudo mount --bind $(PYTHON_WHEELS_PATH) $($*.gz_PATH)/python-wheels $(LOG) + sed 's/SED_DPKG/RUN cd deps \&\& dpkg -i $(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DEPENDS),RDEPENDS))\n" | awk '!a[$$0]++')/g' $($*.gz_PATH)/Dockerfile.template > $($*.gz_PATH)/Dockerfile + docker build --no-cache -t $* $($*.gz_PATH) $(LOG) + docker save $* | gzip -c > $@ + $(FOOTER) + +DOCKER_LOAD_TARGETS = $(addsuffix -load,$(addprefix $(TARGET_PATH)/, \ + $(SONIC_SIMPLE_DOCKER_IMAGES) \ + $(SONIC_DOCKER_IMAGES))) +$(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TARGET_PATH)/$$*.gz + $(HEADER) + docker load -i $(TARGET_PATH)/$*.gz $(LOG) + $(FOOTER) + +############################################################################### +## Installers +############################################################################### + +# targets for building installers with base image +$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) + $(HEADER) + ./build_debian.sh "$(USERNAME)" "$(shell perl -e 'print crypt("$(PASSWORD)", "salt"),"\n"')" $(LOG) + TARGET_MACHINE=$($*_MACHINE) ./build_image.sh $(LOG) + $(FOOTER) + +############################################################################### +## Clean targets +############################################################################### + +SONIC_CLEAN_DEBS = $(addsuffix -clean,$(addprefix $(DEBS_PATH)/, \ + $(SONIC_ONLINE_DEBS) \ + $(SONIC_ONLINE_FILES) \ + $(SONIC_COPY_DEBS) \ + $(SONIC_MAKE_DEBS) \ + $(SONIC_DPKG_DEBS) \ + $(SONIC_PYTHON_STDEB_DEBS) \ + $(SONIC_DERIVED_DEBS))) +$(SONIC_CLEAN_DEBS) : $(DEBS_PATH)/%-clean : .platform $$(addsuffix -clean,$$(addprefix $(DEBS_PATH)/,$$($$*_DERIVED_FROM))) + @# remove derived targets if main one is removed, because we treat them + @# as part of one package + @rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS)) + +SONIC_CLEAN_TARGETS += $(addsuffix -clean,$(addprefix $(TARGET_PATH)/, \ + $(SONIC_DOCKER_IMAGES) \ + $(SONIC_SIMPLE_DOCKER_IMAGES))) +$(SONIC_CLEAN_TARGETS) : $(TARGET_PATH)/%-clean : .platform + @rm -f $(TARGET_PATH)/$* + +SONIC_CLEAN_WHEELS = $(addsuffix -clean,$(addprefix $(PYTHON_WHEELS_PATH)/, \ + $(SONIC_PYTHON_WHEELS))) +$(SONIC_CLEAN_WHEELS) : $(PYTHON_WHEELS_PATH)/%-clean : .platform + @rm -f $(PYTHON_WHEELS_PATH)/$* + +clean-logs : .platform + @rm -f $(TARGET_PATH)/*.log $(DEBS_PATH)/*.log + +clean : .platform clean-logs $$(SONIC_CLEAN_DEBS) $$(SONIC_CLEAN_TARGETS) $$(SONIC_CLEAN_WHEELS) + +############################################################################### +## all +############################################################################### + +all : .platform $$(addprefix $(TARGET_PATH)/,$$(SONIC_ALL)) + +############################################################################### +## Standard targets +############################################################################### + +.PHONY : $(SONIC_CLEAN_DEBS) $(SONIC_CLEAN_TARGETS) $(SONIC_CLEAN_WHEELS) clean distclean configure + +.INTERMEDIATE : $(SONIC_INSTALL_TARGETS) $(SONIC_INSTALL_WHEELS) $(DOCKER_LOAD_TARGETS) docker-start diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile new file mode 100644 index 000000000000..4d9794cfa1b3 --- /dev/null +++ b/sonic-slave/Dockerfile @@ -0,0 +1,105 @@ +FROM debian:jessie + +MAINTAINER johnar@microsoft.com + +RUN echo "deb http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free" >> /etc/apt/sources.list +RUN echo "deb-src http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free" >> /etc/apt/sources.list +RUN echo "deb http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list +RUN echo "deb-src http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list + +RUN apt-get clean && apt-get update && apt-get install -y apt-utils default-jre-headless openssh-server curl wget unzip git build-essential libtool lintian + +RUN apt-get update && apt-get install -y sudo dh-make dh-exec kmod libtinyxml2-2 libboost-program-options1.55-dev libtinyxml2-dev python python-pip libncurses5-dev texinfo dh-autoreconf python3-pip +RUN apt-get update && apt-get install -y doxygen devscripts git-buildpackage perl-modules libswitch-perl dh-systemd + +# For quagga build +RUN apt-get update && apt-get install -y libreadline-dev texlive-latex-base texlive-generic-recommended texlive-fonts-recommended libpam0g-dev libpam-dev libcap-dev imagemagick ghostscript groff libpcre3-dev gawk chrpath + +# For libnl3 (local) build +RUN apt-get install -y cdbs + +# For SAI meta build +RUN apt-get update && apt-get install -y libxml-simple-perl + +# For linux build +RUN apt-get update && apt-get install -y bc fakeroot build-essential devscripts quilt stgit +RUN apt-get update && apt-get -y build-dep linux + +# For platform-modules build +RUN apt-get update && apt-get install -y module-assistant + +# For thrift build +RUN apt-get update && apt-get install -y gem2deb libboost-all-dev libevent-dev libglib2.0-dev libqt4-dev python-all-dev python-twisted php5-dev phpunit libbit-vector-perl openjdk-7-jdk javahelper maven-debian-helper ant libmaven-ant-tasks-java libhttpclient-java libslf4j-java libservlet3.1-java qt5-default + +# For mellanox sdk build +RUN apt-get update && apt-get install -y libpcre3 libpcre3-dev byacc flex libglib2.0-dev bison expat libexpat1-dev dpatch libdb-dev iptables-dev swig + +# For mellanox sai build +RUN apt-get update && apt-get install -y libtool-bin libxml2-dev + +# For build image +RUN apt-get update && apt-get install -y cpio squashfs-tools zip + +# For broadcom sdk build +RUN apt-get update && apt-get install -y linux-compiler-gcc-4.8-x86 linux-kbuild-3.16 + +# teamd build +RUN apt-get update && apt-get install -y libdaemon-dev libdbus-1-dev libjansson-dev + +# For cavium sdk build +RUN apt-get update && apt-get install -y libpcap-dev dnsutils libusb-dev + +# For debian image reconfiguration +RUN apt-get update && apt-get install -y augeas-tools + +# For p4 build +RUN apt-get update && apt-get install -y libyaml-dev libevent-dev libjudy-dev libedit-dev libpcap-dev libnanomsg-dev +RUN apt-get update && apt-get install -y python-stdeb +RUN pip install ctypesgen +RUN pip install crc16 + +# For redis build +RUN apt-get update && apt-get install -y libjemalloc-dev + +# For mft kernel module build +RUN apt-get update && apt-get install -y dkms + +RUN mkdir /var/run/sshd +EXPOSE 22 + +# For gtest +RUN apt-get update && apt-get install -y libgtest-dev cmake && cd /usr/src/gtest && cmake . && make -C /usr/src/gtest + +# For Jenkins static analysis, unit testing and code coverage +RUN apt-get update && apt-get install -y cppcheck clang pylint python-pytest gcovr python-pytest=2.6.3* python-pytest-cov python-parse + +# For snmpd +RUN apt-get update && apt-get install -y libmysqlclient-dev libmysqld-dev libperl-dev libpci-dev libpci3 libsensors4 libsensors4-dev libwrap0-dev + +# For mpdecimal +RUN apt-get update && apt-get install -y docutils-common libjs-sphinxdoc libjs-underscore python-docutils python-jinja2 python-markupsafe python-pygments python-roman python-sphinx sphinx-common python3-sphinx + +# Install depot-tools (for git-retry) +RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /usr/share/depot_tools +ENV PATH /usr/share/depot_tools:$PATH + +# Install docker engine 1.11.2 inside docker +RUN curl -sSL https://get.docker.com/ | sh && apt-get install -y --force-yes -q docker-engine=1.11.2-0~jessie + +# Add user +ARG user +ARG uid +ARG guid + +RUN useradd $user -u $uid -g $guid -d /var/$user -m -s /bin/bash + +RUN gpasswd -a $user docker + +COPY sonic-jenkins-id_rsa.pub /var/$user/.ssh/authorized_keys2 +RUN chown $user /var/$user/.ssh -R +RUN chmod go= /var/$user/.ssh -R + +# Add user to sudoers +RUN echo "$user ALL=(ALL) NOPASSWD:ALL" >>/etc/sudoers + +USER $user diff --git a/sonic-slave/sonic-jenkins-id_rsa.pub b/sonic-slave/sonic-jenkins-id_rsa.pub new file mode 100644 index 000000000000..2a19c9e70d3c --- /dev/null +++ b/sonic-slave/sonic-jenkins-id_rsa.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC769BQUJVeSIOyPsN4/Vo8xTqXQ6RI7ysVyCw/ABP3FIxf+fxmtm8t/Nbp9hq0uLHOjCw8UQbJ+XltsThFWJfH6RJY5NbfvwG7nUDjfjjp+SGEIHaVgIlpiuqiPbZ6QMjZ8Q0Sgi5p5ts1xe/4TFThwOJBHmhwydD5nk3BH7P3DDwlOCov5gjM40uMZJkketlO83zGG+25zu7O0hfDVt1vyK9bNWAhhPmGc79zdetfeFCxjimsff2m31B1KuVXiT5PDB1w+BSrUK6nNzJubnYCRgjg4prVTjA50EhlT2P7EoJAbW3TnTq8vUDkcstsGe/HZpfIB1VHBX97u4fAfGJZ root@acs-jenkins diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index 5aea155cc43c..000000000000 --- a/src/Makefile +++ /dev/null @@ -1,214 +0,0 @@ -## TODO: if install dev package really happens, rebuild the depending project - -.ONESHELL: -SHELL := /bin/bash - -REDIS_VERSION=3.2.4-1~bpo8+1_amd64 - -LIBNL-DEBS=libnl-3-200_3.2.27-1_amd64.deb \ - libnl-3-dev_3.2.27-1_amd64.deb \ - libnl-genl-3-200_3.2.27-1_amd64.deb \ - libnl-genl-3-dev_3.2.27-1_amd64.deb \ - libnl-route-3-200_3.2.27-1_amd64.deb \ - libnl-route-3-dev_3.2.27-1_amd64.deb \ - libnl-nf-3-200_3.2.27-1_amd64.deb \ - libnl-nf-3-dev_3.2.27-1_amd64.deb \ - libnl-cli-3-200_3.2.27-1_amd64.deb \ - libnl-cli-3-dev_3.2.27-1_amd64.deb - -LIBTEAM-DEBS=libteam5_1.26-1_amd64.deb \ - libteamdctl0_1.26-1_amd64.deb \ - libteam-dev_1.26-1_amd64.deb \ - libteam-utils_1.26-1_amd64.deb - -MPDECIMAL_VER=2.4.2-1 - -MPDECIMAL-DEBS=libmpdec2_$(MPDECIMAL_VER)_amd64.deb \ - libmpdec-dev_$(MPDECIMAL_VER)_amd64.deb - -PYTHON3_5_VER=3.5.2-8 - -PYTHON3_5-DEBS=libpython3.5-minimal_$(PYTHON3_5_VER)_amd64.deb \ - python3.5-minimal_$(PYTHON3_5_VER)_amd64.deb \ - libpython3.5-stdlib_$(PYTHON3_5_VER)_amd64.deb \ - python3.5_$(PYTHON3_5_VER)_amd64.deb - -## Function: build_project, directory -## Build the project and save the .deb target in the same directory -## TRICK: clean dh state so it will force recreating .deb later -define build_project - rm -f $(1)/debian/*.debhelper.log - pushd $(1) - [ ! -f ./autogen.sh ] || ./autogen.sh - dpkg-buildpackage -rfakeroot -b -us -uc - popd -endef - -## Function: build_project_py2, directory -## Build the project and save the .deb target in the same directory -define build_project_py2 - pushd $(1) - python2 setup.py bdist_wheel - popd -endef - -## Function: build_project_py3, directory -## Build the project and save the .deb target in the same directory -define build_project_py3 - pushd $(1) - python3 setup.py bdist_wheel - popd -endef - -## Function: install_deb, debfile -install_deb = \ - [ -f $(1) ] && { sudo dpkg -i $(1) || sudo apt-get -y install -f; } || return 1; - -## Function: install_py2, whlfile -install_py2 = \ - sudo pip install $(1) - -## Function: install_py3, whlfile -install_py3 = \ - sudo pip3 install $(1) - -## Rules -$(LIBNL-DEBS): - pushd libnl3; ./build.sh; popd - -$(LIBTEAM-DEBS): $(LIBNL-DEBS) - $(foreach dep, $^, $(call install_deb, $(dep))) - pushd libteam; ./build.sh; popd - -$(MPDECIMAL-DEBS): - pushd mpdecimal; ./build.sh; popd - -$(PYTHON3_5-DEBS): $(MPDECIMAL-DEBS) - $(foreach dep, $^, $(call install_deb, $(dep))) - pushd python3.5; ./build.sh; popd - -redis-sentinel_$(REDIS_VERSION).deb redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb: - pushd redis; ./build.sh; popd - -libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dbg_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb: redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb redis-sentinel_$(REDIS_VERSION).deb - $(foreach dep, $^, $(call install_deb, $(dep))) - pushd hiredis; ./build.sh; popd - -libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb thrift-compiler_0.9.3-2_amd64.deb: - pushd thrift; ./build.sh; popd - -p4-bmv2_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb - $(foreach dep, $^, $(call install_deb, $(dep))) - pushd p4-bmv2; ./build.sh; popd - -kernel-mft-dkms_4.5.0-3.16.0-4-amd64_all.deb mft-4.5.0-31.amd64.deb: - pushd mft; ./build.sh; popd - -python-p4-hlir_0.9.36-1_all.deb: - pushd p4-hlir; ./build.sh; popd - -python-p4c-bm_1.0.0-5415c416-1_all.deb: python-tenjin_1.1.1-1_all.deb python-p4-hlir_0.9.36-1_all.deb - $(foreach dep, $^, $(call install_deb, $(dep))) - pushd p4c-bm; ./build.sh; popd - -python-tenjin_1.1.1-1_all.deb: - pushd tenjin; ./build.sh; popd - -snmpd_5.7.3+dfsg-1.5_amd64.deb snmptrapd_5.7.3+dfsg-1.5_amd64.deb snmp_5.7.3+dfsg-1.5_amd64.deb libsnmp-base_5.7.3+dfsg-1.5_all.deb libsnmp30_5.7.3+dfsg-1.5_amd64.deb libsnmp30-dbg_5.7.3+dfsg-1.5_amd64.deb libsnmp-dev_5.7.3+dfsg-1.5_amd64.deb libsnmp-perl_5.7.3+dfsg-1.5_amd64.deb python-netsnmp_5.7.3+dfsg-1.5_amd64.deb tkmib_5.7.3+dfsg-1.5_all.deb: - pushd snmpd; ./build.sh; popd - -sswsdk-2.0.1-py2-none-any.whl: - $(call build_project_py2, sonic-py-swsssdk) - cp sonic-py-swsssdk/dist/$@ . - -sswsdk-2.0.1-py3-none-any.whl: - $(call build_project_py3, sonic-py-swsssdk) - cp sonic-py-swsssdk/dist/$@ . - -sonic_d-2.0.0-py2-none-any.whl: sswsdk-2.0.1-py2-none-any.whl - $(foreach dep, $^, $(call install_py2, $(dep))) - $(call build_project_py2, sonic-dbsyncd) - cp sonic-dbsyncd/dist/$@ . - -asyncsnmp-2.1.0-py3-none-any.whl: sswsdk-2.0.1-py3-none-any.whl - $(foreach dep, $^, $(call install_py3, $(dep))) - $(call build_project_py3, sonic-snmpagent) - cp sonic-snmpagent/dist/$@ . - -p4-switch_1.0.0_amd64.deb: thrift-compiler_0.9.3-2_amd64.deb python-thrift_0.9.3-2_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb libthrift-dev_0.9.3-2_amd64.deb python-p4-hlir_0.9.36-1_all.deb python-tenjin_1.1.1-1_all.deb python-p4c-bm_1.0.0-5415c416-1_all.deb p4-bmv2_1.0.0_amd64.deb - $(foreach dep, $^, $(call install_deb, $(dep))) - pushd p4-switch; ./build.sh; popd - -lldpd_0.9.5-0_amd64.deb liblldpctl-dev_0.9.5-0_amd64.deb: - ## Install build dependency for lldpd - ## Note: lldpd and snmpd conflict on Build-Depends, so install before build - sudo apt-get -y build-dep lldpd - $(call build_project, lldpd) - -quagga_0.99.24.1-2.1_amd64.deb: - $(call build_project, sonic-quagga) - -libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb: redis-server_$(REDIS_VERSION).deb redis-tools_$(REDIS_VERSION).deb libhiredis0.13_0.13.3-2_amd64.deb libhiredis-dev_0.13.3-2_amd64.deb $(LIBNL-DEBS) - $(foreach dep, $^, $(call install_deb, $(dep))) - $(call build_project, sonic-swss-common) - -brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb brcm/libsaimetadata_1.0.0_amd64.deb brcm/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb brcm-sdk/libopennsl_*_amd64.deb brcm-sdk/libsaibcm_1.0.2*_amd64.deb brcm-sdk/libsaibcm-dev_1.0.2*_amd64.deb - $(foreach dep, $^, $(call install_deb, $(dep))) - $(call build_project, sonic-sairedis) - mkdir -p brcm - cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb brcm/ - -mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb mlnx-sdk/*.deb - ## Install applibs first for late depending packages - $(call install_deb, mlnx-sdk/applibs_1.mlnx.*.deb) - $(foreach dep, $^, $(call install_deb, $(dep))) - $(call build_project, sonic-sairedis) - mkdir -p mlnx - cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb mlnx/ - -cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb cavm/libsaimetadata_1.0.0_amd64.deb cavm/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb cavm-sdk/libsai.deb cavm-sdk/xp-tools.deb cavm-sdk/xpshell.deb - $(foreach dep, $^, $(call install_deb, $(dep))) - $(call build_project, sonic-sairedis) - mkdir -p cavm - cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb cavm/ - -p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb p4/libsaimetadata-dev_1.0.0_amd64.deb: libswsscommon_1.0.0_amd64.deb libswsscommon-dev_1.0.0_amd64.deb p4-switch_1.0.0_amd64.deb p4-bmv2_1.0.0_amd64.deb libthrift-0.9.3_0.9.3-2_amd64.deb - $(foreach dep, $^, $(call install_deb, $(dep))) - $(call build_project, sonic-sairedis) - mkdir -p p4 - cp syncd_1.0.0_amd64.deb libsairedis_1.0.0_amd64.deb libsairedis-dev_1.0.0_amd64.deb libsaimetadata_1.0.0_amd64.deb libsaimetadata-dev_1.0.0_amd64.deb p4/ - -## Note: fpmsyncd and teamsyncd are two implicit targets -brcm/swss_1.0.0_amd64.deb: brcm/syncd_1.0.0_amd64.deb brcm/libsairedis_1.0.0_amd64.deb brcm/libsairedis-dev_1.0.0_amd64.deb brcm/libsaimetadata_1.0.0_amd64.deb brcm/libsaimetadata-dev_1.0.0_amd64.deb $(LIBTEAM-DEBS) $(LIBNL-DEBS) - $(foreach dep, $^, $(call install_deb, $(dep))) - $(call build_project, sonic-swss) - cp swss_1.0.0_amd64.deb brcm/ - cp sonic-swss/debian/swss/usr/bin/fpmsyncd . - cp sonic-swss/debian/swss/usr/bin/teamsyncd . - -## Note: fpmsyncd and teamsyncd are two implicit targets -mlnx/swss_1.0.0_amd64.deb: mlnx/syncd_1.0.0_amd64.deb mlnx/libsairedis_1.0.0_amd64.deb mlnx/libsairedis-dev_1.0.0_amd64.deb mlnx/libsaimetadata_1.0.0_amd64.deb mlnx/libsaimetadata-dev_1.0.0_amd64.deb $(LIBTEAM-DEBS) $(LIBNL-DEBS) - $(foreach dep, $^, $(call install_deb, $(dep))) - $(call build_project, sonic-swss) - cp swss_1.0.0_amd64.deb mlnx/ - cp sonic-swss/debian/swss/usr/bin/fpmsyncd . - cp sonic-swss/debian/swss/usr/bin/teamsyncd . - -## Note: fpmsyncd and teamsyncd are two implicit targets -cavm/swss_1.0.0_amd64.deb: cavm/syncd_1.0.0_amd64.deb cavm/libsairedis_1.0.0_amd64.deb cavm/libsairedis-dev_1.0.0_amd64.deb cavm/libsaimetadata_1.0.0_amd64.deb cavm/libsaimetadata-dev_1.0.0_amd64.deb $(LIBTEAM-DEBS) $(LIBNL-DEBS) - $(foreach dep, $^, $(call install_deb, $(dep))) - $(call build_project, sonic-swss) - cp swss_1.0.0_amd64.deb cavm/ - cp sonic-swss/debian/swss/usr/bin/fpmsyncd . - cp sonic-swss/debian/swss/usr/bin/teamsyncd . - -p4/swss_1.0.0_amd64.deb: p4/syncd_1.0.0_amd64.deb p4/libsairedis_1.0.0_amd64.deb p4/libsairedis-dev_1.0.0_amd64.deb p4/libsaimetadata_1.0.0_amd64.deb p4/libsaimetadata-dev_1.0.0_amd64.deb $(LIBTEAM-DEBS) $(LIBNL-DEBS) - $(foreach dep, $^, $(call install_deb, $(dep))) - $(call build_project, sonic-swss) - cp swss_1.0.0_amd64.deb p4/ - -$(addprefix sonic-linux-kernel/,linux-headers-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb linux-headers-3.16.0-4-common_3.16.7-ckt11-2+acs8u2_amd64.deb linux-image-3.16.0-4-amd64-dbg_3.16.7-ckt11-2+acs8u2_amd64.deb linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb xen-linux-system-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb): - pushd sonic-linux-kernel; sudo ./build.sh; popd - -initramfs-tools/initramfs-tools_0.120_all.deb: - pushd initramfs-tools; ./build.sh; popd diff --git a/src/brcm-sdk/filelist.txt b/src/brcm-sdk/filelist.txt deleted file mode 100644 index 549d89f54567..000000000000 --- a/src/brcm-sdk/filelist.txt +++ /dev/null @@ -1,7 +0,0 @@ -## Get vendor SAI SDK -## https://github.com/Azure/sonic-buildimage/blob/master/README.md#3-get-vendor-sai-sdk - -libopennsl_6.4.11-1+0~20160719212144.23~1.gbp8ec2d1_amd64.deb -libsaibcm-dbg_1.0.2~20160727172452.52_amd64.deb -libsaibcm-dev_1.0.2~20160727172452.52_amd64.deb -libsaibcm_1.0.2~20160727172452.52_amd64.deb diff --git a/src/cavm-sdk/filelist.txt b/src/cavm-sdk/filelist.txt deleted file mode 100644 index bc40295dfbdc..000000000000 --- a/src/cavm-sdk/filelist.txt +++ /dev/null @@ -1,7 +0,0 @@ -## Get vendor SAI SDK -## https://github.com/Azure/sonic-buildimage/blob/master/README.md#3-get-vendor-sai-sdk - -libsai.deb -sai.deb -xp-tools.deb -xpshell.deb diff --git a/src/hiredis/Makefile b/src/hiredis/Makefile new file mode 100644 index 000000000000..f8d9db431483 --- /dev/null +++ b/src/hiredis/Makefile @@ -0,0 +1,22 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = libhiredis0.13_$(HIREDIS_VERSION_FULL)_amd64.deb +DERIVED_TARGETS = libhiredis-dbg_$(HIREDIS_VERSION_FULL)_amd64.deb libhiredis-dev_$(HIREDIS_VERSION_FULL)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + rm -rf hiredis-$(HIREDIS_VERSION) + + wget -O hiredis_$(HIREDIS_VERSION).orig.tar.gz http://http.debian.net/debian/pool/main/h/hiredis/hiredis_$(HIREDIS_VERSION).orig.tar.gz + wget -O hiredis_$(HIREDIS_VERSION_FULL).debian.tar.xz http://http.debian.net/debian/pool/main/h/hiredis/hiredis_$(HIREDIS_VERSION_FULL).debian.tar.xz + wget -O hiredis_$(HIREDIS_VERSION_FULL).dsc http://http.debian.net/debian/pool/main/h/hiredis/hiredis_$(HIREDIS_VERSION_FULL).dsc + + dpkg-source -x hiredis_$(HIREDIS_VERSION_FULL).dsc + pushd hiredis-$(HIREDIS_VERSION) + fakeroot debian/rules binary + popd + + mv $* $(DERIVED_TARGETS) $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/hiredis/build.sh b/src/hiredis/build.sh deleted file mode 100755 index fbaed5f15028..000000000000 --- a/src/hiredis/build.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -x - -# Install redis-server -sudo dpkg -i redis/*.deb - -wget http://http.debian.net/debian/pool/main/h/hiredis/hiredis_0.13.3.orig.tar.gz -wget http://http.debian.net/debian/pool/main/h/hiredis/hiredis_0.13.3-2.debian.tar.xz -wget http://http.debian.net/debian/pool/main/h/hiredis/hiredis_0.13.3-2.dsc -dpkg-source -x hiredis_0.13.3-2.dsc -pushd hiredis-0.13.3; fakeroot debian/rules binary; popd - -cp *.deb .. diff --git a/src/initramfs-tools/Makefile b/src/initramfs-tools/Makefile new file mode 100644 index 000000000000..c7522aa3f66a --- /dev/null +++ b/src/initramfs-tools/Makefile @@ -0,0 +1,21 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = initramfs-tools_$(INITRAMFS_TOOLS_VERSION)_all.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Obtaining the initramfs-tools + rm -rf ./initramfs-tools + git clone --branch v0.120 https://anonscm.debian.org/git/kernel/initramfs-tools.git ./initramfs-tools + + # Patch + pushd ./initramfs-tools + patch -p1 < ../loopback-file-system-support.patch + + # Build the package + rm -f debian/*.debhelper.log + dpkg-buildpackage -rfakeroot -b -us -uc + popd + + mv $* $(DEST)/ diff --git a/src/initramfs-tools/build.sh b/src/initramfs-tools/build.sh deleted file mode 100755 index 335b834a538b..000000000000 --- a/src/initramfs-tools/build.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -## This script is to build the initramfs-tools with patches -## -## USAGE: -## ./build.sh - -# Obtaining the initramfs-tools -rm -rf ./initramfs-tools -git clone --branch v0.120 https://anonscm.debian.org/git/kernel/initramfs-tools.git ./initramfs-tools - -# Patch -pushd ./initramfs-tools -patch -p1 < $OLDPWD/loopback-file-system-support.patch - -# Build the package -rm -f debian/*.debhelper.log -dpkg-buildpackage -rfakeroot -b -us -uc - -popd diff --git a/src/libnl3/Makefile b/src/libnl3/Makefile new file mode 100644 index 000000000000..97beb746454c --- /dev/null +++ b/src/libnl3/Makefile @@ -0,0 +1,35 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = libnl-3-200_$(LIBNL3_VERSION)_amd64.deb +DERIVED_TARGETS = libnl-3-dev_$(LIBNL3_VERSION)_amd64.deb \ + libnl-genl-3-200_$(LIBNL3_VERSION)_amd64.deb \ + libnl-genl-3-dev_$(LIBNL3_VERSION)_amd64.deb \ + libnl-route-3-200_$(LIBNL3_VERSION)_amd64.deb \ + libnl-route-3-dev_$(LIBNL3_VERSION)_amd64.deb \ + libnl-nf-3-200_$(LIBNL3_VERSION)_amd64.deb \ + libnl-nf-3-dev_$(LIBNL3_VERSION)_amd64.deb \ + libnl-cli-3-200_$(LIBNL3_VERSION)_amd64.deb \ + libnl-cli-3-dev_$(LIBNL3_VERSION)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Obtaining the libnl3 + rm -rf ./libnl3 + git clone https://anonscm.debian.org/git/collab-maint/libnl3.git + pushd ./libnl3 + git checkout -f b77c0e49cb + + # Patch + export QUILT_PATCHES=debian/patches + quilt push + quilt push + quilt push + quilt push + quilt push + dpkg-buildpackage -rfakeroot -b -us -uc + popd + + mv $(DERIVED_TARGETS) $* $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/libnl3/build.sh b/src/libnl3/build.sh deleted file mode 100755 index 47eb0048f45d..000000000000 --- a/src/libnl3/build.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -## This script is to build the libnl3 3.2.27-1 -## -## USAGE: -## ./build.sh - -# Obtaining the libnl3 -rm -rf ./libnl3 -git clone https://anonscm.debian.org/git/collab-maint/libnl3.git -pushd ./libnl3 -git checkout -f b77c0e49cb - -# Patch -export QUILT_PATCHES=debian/patches -quilt push -quilt push -quilt push -quilt push -quilt push -dpkg-buildpackage -rfakeroot -b -us -uc - -popd -cp *.deb .. diff --git a/src/libteam/Makefile b/src/libteam/Makefile new file mode 100644 index 000000000000..b41487241b83 --- /dev/null +++ b/src/libteam/Makefile @@ -0,0 +1,31 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = libteam5_$(LIBTEAM_VERSION)_amd64.deb +DERIVED_TARGETS = libteam-dev_$(LIBTEAM_VERSION)_amd64.deb \ + libteamdctl0_$(LIBTEAM_VERSION)_amd64.deb \ + libteam-utils_$(LIBTEAM_VERSION)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Obtain libteam + rm -rf ./libteam + git clone https://github.com/jpirko/libteam.git + pushd ./libteam + git checkout -f v1.26 + popd + + git clone https://anonscm.debian.org/git/collab-maint/libteam.git tmp + pushd ./tmp + git checkout -f da006f2 # v1.26 + popd + + mv tmp/debian libteam/ + rm -rf tmp + pushd ./libteam + dpkg-buildpackage -rfakeroot -b -us -uc + popd + + mv $(DERIVED_TARGETS) $* $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/libteam/build.sh b/src/libteam/build.sh deleted file mode 100755 index 8a7e69cfb1a2..000000000000 --- a/src/libteam/build.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -## This script is to build libteam -## -## USAGE: -## ./build.sh - -# Obtain libteam -rm -rf ./libteam -git clone https://github.com/jpirko/libteam.git -pushd ./libteam -git checkout -f v1.26 -popd - -git clone https://anonscm.debian.org/git/collab-maint/libteam.git tmp -pushd ./tmp -git checkout -f da006f2 # v1.26 -popd -mv tmp/debian libteam/ -rm -rf tmp - -pushd ./libteam -dpkg-buildpackage -rfakeroot -b -us -uc - -popd -cp *.deb .. - diff --git a/src/mft/build.sh b/src/mft/build.sh deleted file mode 100755 index 44aa233a3124..000000000000 --- a/src/mft/build.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -## This script is to build the kernel-mft-dkms_4.5.0-3.16.0-4-amd64 kernel modules -## -## USAGE: -## ./build.sh - -MFT_NAME=mft-4.5.0-31-x86_64-deb -MFT_TGZ=${MFT_NAME}.tgz -MFT_KERNEL_DEB=kernel-mft-dkms_4.5.0-31_all.deb -KERNELVER=3.16.0-4-amd64 - -wget -N http://www.mellanox.com/downloads/MFT/${MFT_TGZ} -tar xzf $MFT_TGZ -pushd $MFT_NAME/SDEBS -dpkg -i $MFT_KERNEL_DEB -TARBALL_PATH=$(dkms mkdriverdisk kernel-mft-dkms/4.5.0 -a all -d ubuntu -k ${KERNELVER} --media tar | grep "Disk image location" | cut -d':' -f2) -echo $TARBALL_PATH -tar xvf $TARBALL_PATH -popd - -cp $MFT_NAME/SDEBS/ubuntu-drivers/3.16.0/kernel-mft-dkms_4.5.0-3.16.0-4-amd64_all.deb ../ -cp $MFT_NAME/DEBS/mft-4.5.0-31.amd64.deb ../ diff --git a/src/mlnx-sdk/filelist.txt b/src/mlnx-sdk/filelist.txt deleted file mode 100644 index 354c84140927..000000000000 --- a/src/mlnx-sdk/filelist.txt +++ /dev/null @@ -1,24 +0,0 @@ -## Get vendor SAI SDK -## https://github.com/Azure/sonic-buildimage/blob/master/README.md#3-get-vendor-sai-sdk - -fw-SPC.mfa -applibs-dev_1.mlnx.4.2.3002_amd64.deb -applibs_1.mlnx.4.2.3002_amd64.deb -iproute2-dev_1.mlnx.4.2.3002_amd64.deb -iproute2_1.mlnx.4.2.3002_amd64.deb -python-sdk-api_1.mlnx.4.2.3002_amd64.deb -sx-complib-dev-static_1.mlnx.4.2.3002_amd64.deb -sx-complib-dev_1.mlnx.4.2.3002_amd64.deb -sx-complib_1.mlnx.4.2.3002_amd64.deb -sx-examples-dev_1.mlnx.4.2.3002_amd64.deb -sx-examples_1.mlnx.4.2.3002_amd64.deb -sx-gen-utils-dev_1.mlnx.4.2.3002_amd64.deb -sx-gen-utils_1.mlnx.4.2.3002_amd64.deb -sx-kernel-dev_1.mlnx.4.2.3002_amd64.deb -sx-kernel_1.mlnx.4.2.3002_amd64.deb -sx-scew-dev-static_1.mlnx.4.2.3002_amd64.deb -sx-scew-dev_1.mlnx.4.2.3002_amd64.deb -sx-scew_1.mlnx.4.2.3002_amd64.deb -sxd-libs-dev-static_1.mlnx.4.2.3002_amd64.deb -sxd-libs-dev_1.mlnx.4.2.3002_amd64.deb -sxd-libs_1.mlnx.4.2.3002_amd64.deb diff --git a/src/mpdecimal/Makefile b/src/mpdecimal/Makefile new file mode 100644 index 000000000000..c7f94203f472 --- /dev/null +++ b/src/mpdecimal/Makefile @@ -0,0 +1,22 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = libmpdec2_$(MPDECIMAL_VERSION_FULL)_amd64.deb +DERIVED_TARGETS = libmpdec-dev_$(MPDECIMAL_VERSION_FULL)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + rm -rf mpdecimal-$(MPDECIMAL_VERSION) + + wget -N -O mpdecimal_$(MPDECIMAL_VERSION).orig.tar.gz http://http.debian.net/debian/pool/main/m/mpdecimal/mpdecimal_$(MPDECIMAL_VERSION).orig.tar.gz + wget -N -O mpdecimal_$(MPDECIMAL_VERSION_FULL).debian.tar.xz http://http.debian.net/debian/pool/main/m/mpdecimal/mpdecimal_$(MPDECIMAL_VERSION_FULL).debian.tar.xz + wget -N -O mpdecimal_$(MPDECIMAL_VERSION_FULL).dsc http://http.debian.net/debian/pool/main/m/mpdecimal/mpdecimal_$(MPDECIMAL_VERSION_FULL).dsc + + dpkg-source -x mpdecimal_$(MPDECIMAL_VERSION_FULL).dsc + pushd mpdecimal-$(MPDECIMAL_VERSION) + dpkg-buildpackage -us -uc -b + popd + + mv $* $(DERIVED_TARGETS) $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/mpdecimal/build.sh b/src/mpdecimal/build.sh deleted file mode 100755 index be06c35766cf..000000000000 --- a/src/mpdecimal/build.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -MPDECIMAL_VER=2.4.2 -MPDECIMAL_DEB_VER=1 - -wget -N http://http.debian.net/debian/pool/main/m/mpdecimal/mpdecimal_${MPDECIMAL_VER}.orig.tar.gz -wget -N http://http.debian.net/debian/pool/main/m/mpdecimal/mpdecimal_${MPDECIMAL_VER}-${MPDECIMAL_DEB_VER}.debian.tar.xz -wget -N http://http.debian.net/debian/pool/main/m/mpdecimal/mpdecimal_${MPDECIMAL_VER}-${MPDECIMAL_DEB_VER}.dsc - -dpkg-source -x mpdecimal_${MPDECIMAL_VER}-${MPDECIMAL_DEB_VER}.dsc - -pushd mpdecimal-${MPDECIMAL_VER} - -sudo apt-get -y build-dep mpdecimal - -dpkg-buildpackage -us -uc -b - -popd - -cp *.deb ../ diff --git a/src/p4-bmv2/build.sh b/src/p4-bmv2/build.sh deleted file mode 100755 index 779da0b3caf6..000000000000 --- a/src/p4-bmv2/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -x - -pushd behavioral-model; ./autogen.sh; dpkg-buildpackage -us -uc -b -j4; popd - -cp *.deb ../ diff --git a/src/p4-hlir/build.sh b/src/p4-hlir/build.sh deleted file mode 100755 index 68c7807ad648..000000000000 --- a/src/p4-hlir/build.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -x - -pushd p4-hlir -python setup.py --command-packages=stdeb.command bdist_deb -popd - -cp p4-hlir/deb_dist/*.deb ../ diff --git a/src/p4-switch/build.sh b/src/p4-switch/build.sh deleted file mode 100755 index eb0f0bcc7676..000000000000 --- a/src/p4-switch/build.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -x - -sudo pip install ctypesgen - -sudo pip install crc16 - -pushd switch - -mkdir -p p4-build/bmv2/switch -mkdir -p p4-build/bmv2/pd_thrift_gen - -./autogen.sh -dpkg-buildpackage -us -uc -b -j4 - -popd - -cp *.deb ../ diff --git a/src/p4c-bm/build.sh b/src/p4c-bm/build.sh deleted file mode 100755 index 83fa649005eb..000000000000 --- a/src/p4c-bm/build.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -x - -pushd p4c-bm -python setup.py --command-packages=stdeb.command bdist_deb -popd - -cp p4c-bm/deb_dist/*.deb ../ diff --git a/src/redis/Makefile b/src/redis/Makefile new file mode 100644 index 000000000000..a49ee4a9f015 --- /dev/null +++ b/src/redis/Makefile @@ -0,0 +1,24 @@ +SHELL = /bin/bash +.ONESHELL: +.SHELLFLAGS += -e + +REDIS_VERSION = 3.2.4 +REDIS_VERSION_FULL = $(REDIS_VERSION)-1~bpo8+1 + +MAIN_TARGET = redis-server_$(REDIS_VERSION_FULL)_amd64.deb +DERIVED_TARGETS = redis-tools_$(REDIS_VERSION_FULL)_amd64.deb \ + redis-sentinel_$(REDIS_VERSION_FULL)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + wget -O redis_$(REDIS_VERSION).orig.tar.gz -N "https://sonicstorage.blob.core.windows.net/packages/redis_$(REDIS_VERSION).orig.tar.gz?sv=2015-04-05&sr=b&sig=B3qGEoSHe%2FBh5rVwvXHpKijgBtKF7dHeuJWp1p17UnU%3D&se=2026-11-26T22%3A31%3A31Z&sp=r" + wget -O redis_$(REDIS_VERSION_FULL).dsc -N "https://sonicstorage.blob.core.windows.net/packages/redis_$(REDIS_VERSION_FULL).dsc?sv=2015-04-05&sr=b&sig=LoUtjLXa%2BCcoM%2BsPewRLkY7YPRvSJTbsvQoW%2BL%2B3QWM%3D&se=2026-11-26T22%3A32%3A11Z&sp=r" + wget -O redis_$(REDIS_VERSION_FULL).debian.tar.xz -N "https://sonicstorage.blob.core.windows.net/packages/redis_$(REDIS_VERSION_FULL).debian.tar.xz?sv=2015-04-05&sr=b&sig=I33UsbDHiffEkQRndpFwY9y3I%2FrKTu0wmG%2FMXB98kys%3D&se=2026-11-26T22%3A32%3A34Z&sp=r" + dpkg-source -x redis_$(REDIS_VERSION_FULL).dsc + + pushd redis-$(REDIS_VERSION) + fakeroot debian/rules binary + popd + + mv $(DERIVED_TARGETS) $* $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/redis/build.sh b/src/redis/build.sh deleted file mode 100755 index b0727c03a1f6..000000000000 --- a/src/redis/build.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -x - -REDIS_VERION=3.2.4 -REDIS_VERION_FULL=$REDIS_VERION-1~bpo8+1 - -wget -O redis_$REDIS_VERION.orig.tar.gz -N "https://sonicstorage.blob.core.windows.net/packages/redis_$REDIS_VERION.orig.tar.gz?sv=2015-04-05&sr=b&sig=B3qGEoSHe%2FBh5rVwvXHpKijgBtKF7dHeuJWp1p17UnU%3D&se=2026-11-26T22%3A31%3A31Z&sp=r" -wget -O redis_$REDIS_VERION_FULL.dsc -N "https://sonicstorage.blob.core.windows.net/packages/redis_$REDIS_VERION_FULL.dsc?sv=2015-04-05&sr=b&sig=LoUtjLXa%2BCcoM%2BsPewRLkY7YPRvSJTbsvQoW%2BL%2B3QWM%3D&se=2026-11-26T22%3A32%3A11Z&sp=r" -wget -O redis_$REDIS_VERION_FULL.debian.tar.xz -N "https://sonicstorage.blob.core.windows.net/packages/redis_$REDIS_VERION_FULL.debian.tar.xz?sv=2015-04-05&sr=b&sig=I33UsbDHiffEkQRndpFwY9y3I%2FrKTu0wmG%2FMXB98kys%3D&se=2026-11-26T22%3A32%3A34Z&sp=r" - -dpkg-source -x redis_$REDIS_VERION_FULL.dsc - -pushd redis-$REDIS_VERION; fakeroot debian/rules binary; popd - -cp *.deb .. diff --git a/src/snmpd/Makefile b/src/snmpd/Makefile new file mode 100644 index 000000000000..4cd036655af4 --- /dev/null +++ b/src/snmpd/Makefile @@ -0,0 +1,31 @@ +SHELL = /bin/bash +.ONESHELL: +.SHELLFLAGS += -e + +MAIN_TARGET = libsnmp-base_$(SNMPD_VERSION_FULL)_all.deb +DERIVED_TARGETS = snmptrapd_$(SNMPD_VERSION_FULL)_amd64.deb \ + snmp_$(SNMPD_VERSION_FULL)_amd64.deb \ + snmpd_$(SNMPD_VERSION_FULL)_amd64.deb \ + libsnmp30_$(SNMPD_VERSION_FULL)_amd64.deb \ + libsnmp30-dbg_$(SNMPD_VERSION_FULL)_amd64.deb \ + libsnmp-dev_$(SNMPD_VERSION_FULL)_amd64.deb \ + libsnmp-perl_$(SNMPD_VERSION_FULL)_amd64.deb \ + python-netsnmp_$(SNMPD_VERSION_FULL)_amd64.deb \ + tkmib_$(SNMPD_VERSION_FULL)_all.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + rm -rf net-snmp-$(SNMPD_VERSION) + + # download debian net-snmp + wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_$(SNMPD_VERSION_FULL).dsc + wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_$(SNMPD_VERSION).orig.tar.xz + wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_$(SNMPD_VERSION_FULL).debian.tar.xz + dpkg-source -x net-snmp_$(SNMPD_VERSION_FULL).dsc + + pushd net-snmp-$(SNMPD_VERSION) + fakeroot debian/rules binary + popd + + mv $(DERIVED_TARGETS) $* $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/snmpd/build.sh b/src/snmpd/build.sh deleted file mode 100755 index 65d47d9def81..000000000000 --- a/src/snmpd/build.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# Install build dependency for snmpd -sudo apt-get -y build-dep snmpd - -# download debian net-snmp 5.7.3 -wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_5.7.3+dfsg-1.5.dsc -wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_5.7.3+dfsg.orig.tar.xz -wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_5.7.3+dfsg-1.5.debian.tar.xz - -dpkg-source -x net-snmp_5.7.3+dfsg-1.5.dsc - -pushd net-snmp-5.7.3+dfsg - -fakeroot debian/rules binary - -popd - -cp *.deb ../ diff --git a/src/tenjin/build.sh b/src/tenjin/build.sh deleted file mode 100755 index 37b8f9051d5b..000000000000 --- a/src/tenjin/build.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -x - -wget -nc http://pypi.python.org/packages/source/T/Tenjin/Tenjin-1.1.1.tar.gz -tar xzf Tenjin-1.1.1.tar.gz -pushd Tenjin-1.1.1 -python setup.py --command-packages=stdeb.command bdist_deb -popd -cp Tenjin-1.1.1/deb_dist/*.deb ../ diff --git a/src/thrift/Makefile b/src/thrift/Makefile new file mode 100644 index 000000000000..edb14e0cfa0d --- /dev/null +++ b/src/thrift/Makefile @@ -0,0 +1,27 @@ +SHELL = /bin/bash +.ONESHELL: +.SHELLFLAGS += -e + +THRIFT_VERSION = 0.9.3 +THRIFT_VERSION_FULL = $(THRIFT_VERSION)-2 + +MAIN_TARGET = libthrift-$(THRIFT_VERSION)_$(THRIFT_VERSION_FULL)_amd64.deb +DERIVED_TARGETS = libthrift-dev_$(THRIFT_VERSION_FULL)_amd64.deb \ + python-thrift_$(THRIFT_VERSION_FULL)_amd64.deb \ + thrift-compiler_$(THRIFT_VERSION_FULL)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + rm -rf thrift-$(THRIFT_VERSION) + + wget -nc http://http.debian.net/debian/pool/main/t/thrift/thrift_$(THRIFT_VERSION).orig.tar.gz + wget -nc http://http.debian.net/debian/pool/main/t/thrift/thrift_$(THRIFT_VERSION_FULL).debian.tar.xz + wget -nc http://http.debian.net/debian/pool/main/t/thrift/thrift_$(THRIFT_VERSION_FULL).dsc + + dpkg-source -x thrift_$(THRIFT_VERSION_FULL).dsc + pushd thrift-$(THRIFT_VERSION) + dpkg-buildpackage -d -rfakeroot -b -us -uc + popd + + mv $(DERIVED_TARGETS) $* $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/thrift/build.sh b/src/thrift/build.sh deleted file mode 100755 index 12aa1479e9c2..000000000000 --- a/src/thrift/build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -x - -wget -nc http://http.debian.net/debian/pool/main/t/thrift/thrift_0.9.3.orig.tar.gz -wget -nc http://http.debian.net/debian/pool/main/t/thrift/thrift_0.9.3-2.debian.tar.xz -wget -nc http://http.debian.net/debian/pool/main/t/thrift/thrift_0.9.3-2.dsc -dpkg-source -x thrift_0.9.3-2.dsc -cd thrift-0.9.3 -dpkg-buildpackage -d -rfakeroot -b -us -uc -cd .. -cp *.deb ../ From edb54704abb7f26a3c74d4c167b668c7a48ee095 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 5 Dec 2016 21:20:46 +0200 Subject: [PATCH 0107/1011] Update mellanox FW version (#96) Make FW compatible with SDK 4.2.3002 --- platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh b/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh index 2ef46685f801..81514f77b062 100755 --- a/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh +++ b/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh @@ -1,7 +1,7 @@ #!/bin/bash query_retry_count_max="10" -required_fw_version="13.1130.0010" +required_fw_version="13.1200.0116" fw_file=/etc/mlnx/fw-SPC.mfa run_or_fail() { From 54a3178174a3707638a0f5cbc5d502a1a803fe15 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 5 Dec 2016 21:21:22 +0200 Subject: [PATCH 0108/1011] Add runtime dependencies for syncd (#97) Install lisairedis and libsaimetadata along with syncd --- rules/sairedis.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/rules/sairedis.mk b/rules/sairedis.mk index 145a0901b287..02c20ef54588 100644 --- a/rules/sairedis.mk +++ b/rules/sairedis.mk @@ -10,6 +10,7 @@ LIBSAIREDIS_DEV = libsairedis-dev_1.0.0_amd64.deb $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DEV))) SYNCD = syncd_1.0.0_amd64.deb +$(SYNCD)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD))) LIBSAIMETADATA = libsaimetadata_1.0.0_amd64.deb From 16a8224e23e0d227d388973bc4187a7ae57bf3a3 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 6 Dec 2016 16:31:59 +0200 Subject: [PATCH 0109/1011] Create group for user in sonic-slave if does absent (#98) --- sonic-slave/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 4d9794cfa1b3..1c484a37c4db 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -91,6 +91,8 @@ ARG user ARG uid ARG guid +RUN groupadd -f -r -g $guid g$user + RUN useradd $user -u $uid -g $guid -d /var/$user -m -s /bin/bash RUN gpasswd -a $user docker From e6aadeb9f8c150ca4c57851bafd1e91881ee9fdc Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 6 Dec 2016 16:32:12 +0200 Subject: [PATCH 0110/1011] Update Dockerfile.template (#95) --- dockers/docker-fpm/Dockerfile.template | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dockers/docker-fpm/Dockerfile.template b/dockers/docker-fpm/Dockerfile.template index d09a81a25155..47d250fb15fb 100644 --- a/dockers/docker-fpm/Dockerfile.template +++ b/dockers/docker-fpm/Dockerfile.template @@ -12,5 +12,7 @@ SED_DPKG RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /deps +COPY ["start.sh", "/usr/bin/"] + ENTRYPOINT /usr/bin/start.sh \ && /bin/bash From 6503d6a584ddef22f809d6e1d3aae0f0615d1eb5 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 6 Dec 2016 20:12:22 +0200 Subject: [PATCH 0111/1011] Add dependency on libl3 for libsnmp-base (#100) --- rules/snmpd.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rules/snmpd.mk b/rules/snmpd.mk index db85ca0d94a9..b7635cc7e032 100644 --- a/rules/snmpd.mk +++ b/rules/snmpd.mk @@ -7,6 +7,8 @@ export SNMPD_VERSION SNMPD_VERSION_FULL LIBSNMP_BASE = libsnmp-base_$(SNMPD_VERSION_FULL)_all.deb $(LIBSNMP_BASE)_SRC_PATH = $(SRC_PATH)/snmpd +$(LIBSNMP_BASE)_DEPENDS += $(LIBNL3_DEV) +$(LIBSNMP_BASE)_RDEPENDS += $(LIBNL3) SONIC_MAKE_DEBS += $(LIBSNMP_BASE) SNMPTRAPD = snmptrapd_$(SNMPD_VERSION_FULL)_amd64.deb From 9b415aa5cfc61a5af7e7f616f141cd3066a5e9c8 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 7 Dec 2016 01:29:25 +0200 Subject: [PATCH 0112/1011] Update README according to new build procedure (#101) * Update README according to new build procedure * Add detailed description for targets --- README.md | 53 ++++++++++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 37be054f15c2..ea6e2ee9e48e 100644 --- a/README.md +++ b/README.md @@ -6,23 +6,7 @@ Mellanox[![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellano Build an [Open Network Install Environment (ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also build docker images running inside the NOS. # Prerequisite -## 1. Build environment -Build a docker image by [the Dockerfile](https://github.com/Azure/sonic-build-tools/blob/master/sonic-slave/Dockerfile) and build all remains in the docker container. - - git clone https://github.com/Azure/sonic-build-tools - cd sonic-build-tools - ./build.sh sonic-slave - docker run -v /var/run/docker.sock:/var/run/docker.sock -it --privileged local/sonic-slave bash - -You can also download sonic-slave docker from sonicdev docker registry using following command: - - docker login -u 1dafc8d7-d19c-4f58-8653-e8d904f30dab -p sonic sonicdev-microsoft.azurecr.io:443 - docker pull sonicdev-microsoft.azurecr.io:443/sonic-slave - docker run -v /var/run/docker.sock:/var/run/docker.sock -it --privileged sonicdev-microsoft.azurecr.io:443/sonic-slave bash - -Note that all the below steps should be executed in the docker container, not in the host machine. - -## 2. Clone or fetch the code repository with all git submodules +## Clone or fetch the code repository with all git submodules To clone the code repository recursively, assuming git version 1.9 or newer git clone --recursive https://github.com/Azure/sonic-buildimage.git @@ -31,23 +15,38 @@ If it is already cloned, however there is no files under ./dockers/docker-base/ git submodule update --init --recursive -## 3. Get vendor SAI SDK -Obtain Switch Abstraction Interface (SAI) SDK from one of supported vendors (see the list in [Usage](#usage) Section), and place it in the directory ./src/[VENDOR]-sdk/ as filelist.txt in that directory. Skip this step for p4 since it is an open source software switch. - # Usage To build NOS installer image and docker images, run command line - make [VENDOR]-all USERNAME=[USERNAME] PASSWORD_ENCRYPTED=[PASSWORD_ENCRYPTED] + make configure PLATFORM=[VENDOR] + make Supported VENDORs are: -- brcm: Broadcom -- mlnx: Mellanox -- cavm: Cavium -- p4: barefoot +- broadcom +- mellanox +- cavium +- p4 + +You can find rules/config file useful. It contains configuration options for build process, like adding more verbosity or showing dependencies, username and password for base image etc. + +Every docker image is built and saved to target/ directory. +So, for instance, to build only docker-database, execute + + make target/docker-database.gz + +Same goes for debian packages, which are under target/debs/: + + make target/debs/swss_1.0.0_amd64.deb + +Every target has a clean target, so in order to clean swss, execute + + make target/debs/swss_1.0.0_amd64.deb-clean -For example, the user name is 'admin' and the password is 'YourPaSsWoRd'. To build all the images for Broadcom platform, use the command: +It is recommended to use clean targets to clean all packages, that are built together, like dev packages for instance. - make brcm-all USERNAME="admin" PASSWORD_ENCRYPTED="$(perl -e 'print crypt("YourPaSsWoRd", "salt"),"\n"')" +# Note: +If you are running make for the first time, a sonic-slave-${USER} docker image will be built automatically. +It is a one time action, so be patient. The root is disabled, but the created user could sudo. From 709ca3c00f4d351be6854c89120e86f19611ba87 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 7 Dec 2016 01:30:20 +0200 Subject: [PATCH 0113/1011] Add mlnx hw-management to all targets (#102) * Add mlnx hw-management to all targets * Use correct path for hw-management in all targets --- platform/mellanox/rules.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index d24b3e3a2e82..b6d1056071ee 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -12,7 +12,8 @@ SONIC_ALL += $(DOCKER_SYNCD_MLNX) \ $(DOCKER_LLDP_SV2) \ $(DOCKER_SNMP_SV2) \ $(DOCKER_TEAM) \ - $(DOCKER_PLATFORM_MONITOR) + $(DOCKER_PLATFORM_MONITOR) \ + debs/$(MLNX_HW_MANAGEMENT) # Inject mlnx sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) From 7c9bffb18fb96daa4f89c08e951d7c86cd48f531 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 7 Dec 2016 07:26:07 -0800 Subject: [PATCH 0114/1011] Remove unnecessary build dependencies for hiredis (#91) --- rules/hiredis.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/hiredis.mk b/rules/hiredis.mk index 170a430eaba1..600d1c72f5b2 100644 --- a/rules/hiredis.mk +++ b/rules/hiredis.mk @@ -7,8 +7,8 @@ export HIREDIS_VERSION HIREDIS_VERSION_FULL LIBHIREDIS = libhiredis0.13_$(HIREDIS_VERSION_FULL)_amd64.deb $(LIBHIREDIS)_SRC_PATH = $(SRC_PATH)/hiredis -$(LIBHIREDIS)_DEPENDS += $(REDIS_SERVER) $(REDIS_TOOLS) $(REDIS_SENTINEL) -$(LIBHIREDIS)_RDEPENDS += $(REDIS_SERVER) $(REDIS_TOOLS) $(REDIS_SENTINEL) +$(LIBHIREDIS)_DEPENDS += $(REDIS_TOOLS) $(REDIS_SERVER) +$(LIBHIREDIS)_RDEPENDS += SONIC_MAKE_DEBS += $(LIBHIREDIS) LIBHIREDIS_DEV = libhiredis-dev_$(HIREDIS_VERSION_FULL)_amd64.deb From b31956d333e49ecb64263f9815b6eb9a909c196e Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 7 Dec 2016 07:59:21 -0800 Subject: [PATCH 0115/1011] add build dep for sai meta build and python3.5 (#103) --- sonic-slave/Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 1c484a37c4db..50e96bfcd1d9 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -19,7 +19,7 @@ RUN apt-get update && apt-get install -y libreadline-dev texlive-latex-base texl RUN apt-get install -y cdbs # For SAI meta build -RUN apt-get update && apt-get install -y libxml-simple-perl +RUN apt-get update && apt-get install -y libxml-simple-perl graphviz # For linux build RUN apt-get update && apt-get install -y bc fakeroot build-essential devscripts quilt stgit @@ -64,6 +64,9 @@ RUN apt-get update && apt-get install -y libjemalloc-dev # For mft kernel module build RUN apt-get update && apt-get install -y dkms +# For python3.5 build +RUN apt-get update && apt-get install -y sharutils libncursesw5-dev libbz2-dev liblzma-dev libgdbm-dev tk-dev blt-dev libmpdec-dev libbluetooth-dev locales libsqlite3-dev libgpm2 time net-tools xvfb python-sphinx python3-sphinx + RUN mkdir /var/run/sshd EXPOSE 22 From 0d9ca53c00f47469c9ed314bf797fc810fa08209 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 8 Dec 2016 17:05:19 +0200 Subject: [PATCH 0116/1011] Enable logging for targets in SONIC_PYTHON_STDEB_DEBS (#105) --- slave.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slave.mk b/slave.mk index 5b98d8bba2c2..80308929dc05 100644 --- a/slave.mk +++ b/slave.mk @@ -146,7 +146,7 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_PYTHON_STDEB_DEBS)) : $(DEBS_PATH)/% : .platf $(HEADER) # Build project and take package pushd $($*_SRC_PATH) $(LOG) - python setup.py --command-packages=stdeb.command bdist_deb + python setup.py --command-packages=stdeb.command bdist_deb $(LOG) popd $(LOG) mv $(addprefix $($*_SRC_PATH)/deb_dist/, $* $($*_DERIVED_DEBS)) $(DEBS_PATH) $(LOG) $(FOOTER) From c42a54d7556d8b76c98089080ef19c3db7f7b175 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 8 Dec 2016 17:06:42 +0200 Subject: [PATCH 0117/1011] Add required packages for docker-p4 (#106) --- platform/p4/docker-sonic-p4/Dockerfile.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/p4/docker-sonic-p4/Dockerfile.template b/platform/p4/docker-sonic-p4/Dockerfile.template index bb790950b211..f03127502104 100644 --- a/platform/p4/docker-sonic-p4/Dockerfile.template +++ b/platform/p4/docker-sonic-p4/Dockerfile.template @@ -2,7 +2,7 @@ FROM docker-base RUN apt-get update -RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils +RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils python-ply libqt5core5a libqt5network5 libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0 libgmp10 libjudydebian1 libnanomsg0 libdaemon0 libjansson4 COPY deps /deps From 44265fcffdf7a7bf76902a9e8c7c721f6e6020c7 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 8 Dec 2016 17:07:05 +0200 Subject: [PATCH 0118/1011] Add docker-p4 to all tagets for p4 platform (#107) Add dependency on p4 switch for libsairedis --- platform/p4/rules.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/platform/p4/rules.mk b/platform/p4/rules.mk index 07ef1618f6df..408a58041f56 100644 --- a/platform/p4/rules.mk +++ b/platform/p4/rules.mk @@ -4,3 +4,8 @@ include $(PLATFORM_PATH)/p4-hlir.mk include $(PLATFORM_PATH)/p4c-bm.mk include $(PLATFORM_PATH)/tenjin.mk include $(PLATFORM_PATH)/docker-sonic-p4.mk + +SONIC_ALL += $(DOCKER_SONIC_P4) + +$(LIBSAIREDIS)_DEPENDS += $(P4_SWITCH) +$(LIBSAIREDIS)_RDEPENDS += $(P4_SWITCH) From 4e4168d1006760a4637c690edfa6c3f5da88ba83 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 8 Dec 2016 17:07:54 +0200 Subject: [PATCH 0119/1011] Rename docker-orchagent to docker-orchagent-mlnx (#108) --- platform/mellanox/docker-orchagent-mlnx.mk | 7 +++++++ platform/mellanox/rules.mk | 3 ++- rules/docker-orchagent.mk | 7 ------- 3 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 platform/mellanox/docker-orchagent-mlnx.mk delete mode 100644 rules/docker-orchagent.mk diff --git a/platform/mellanox/docker-orchagent-mlnx.mk b/platform/mellanox/docker-orchagent-mlnx.mk new file mode 100644 index 000000000000..6db369a797c5 --- /dev/null +++ b/platform/mellanox/docker-orchagent-mlnx.mk @@ -0,0 +1,7 @@ +# docker image for orchagent + +DOCKER_ORCHAGENT_MLNX = docker-orchagent-mlnx.gz +$(DOCKER_ORCHAGENT_MLNX)_PATH = $(DOCKERS_PATH)/docker-orchagent +$(DOCKER_ORCHAGENT_MLNX)_DEPENDS += $(SWSS) +$(DOCKER_ORCHAGENT_MLNX)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_MLNX) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index b6d1056071ee..a31d22fc25a6 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -4,9 +4,10 @@ include $(PLATFORM_PATH)/mft.mk include $(PLATFORM_PATH)/mlnx-sai.mk include $(PLATFORM_PATH)/hw-management.mk include $(PLATFORM_PATH)/docker-syncd-mlnx.mk +include $(PLATFORM_PATH)/docker-orchagent-mlnx.mk SONIC_ALL += $(DOCKER_SYNCD_MLNX) \ - $(DOCKER_ORCHAGENT) \ + $(DOCKER_ORCHAGENT_MLNX) \ $(DOCKER_FPM) \ $(DOCKER_DATABASE) \ $(DOCKER_LLDP_SV2) \ diff --git a/rules/docker-orchagent.mk b/rules/docker-orchagent.mk deleted file mode 100644 index c4bd99fac08e..000000000000 --- a/rules/docker-orchagent.mk +++ /dev/null @@ -1,7 +0,0 @@ -# docker image for orchagent - -DOCKER_ORCHAGENT = docker-orchagent.gz -$(DOCKER_ORCHAGENT)_PATH = $(DOCKERS_PATH)/docker-orchagent -$(DOCKER_ORCHAGENT)_DEPENDS += $(SWSS) -$(DOCKER_ORCHAGENT)_LOAD_DOCKERS += $(DOCKER_BASE) -SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT) From dd9389febf7c27a0b2a647268261b29700d4cf9f Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 8 Dec 2016 17:08:13 +0200 Subject: [PATCH 0120/1011] Add dev sdk packages to runtime dependency (#109) Symbolic links for sx libraries are in dev packages, so we need them installed in containers too --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 917fc8c4dae2..a80bd87a0292 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -8,5 +8,5 @@ export MLNX_SAI_VERSION MLNX_SAI_REVISION MLNX_SAI = mlnx-sai_1.mlnx.$(MLNX_SAI_VERSION)_amd64.deb $(MLNX_SAI)_SRC_PATH = $(PLATFORM_PATH)/mlnx-sai $(MLNX_SAI)_DEPENDS += $(MLNX_SDK_DEBS) -$(MLNX_SAI)_RDEPENDS += $(MLNX_SDK_RDEBS) +$(MLNX_SAI)_RDEPENDS += $(MLNX_SDK_RDEBS) $(MLNX_SDK_DEBS) SONIC_MAKE_DEBS += $(MLNX_SAI) From 9095ea0d307121c9ee44186199dd1c6205a770bd Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 8 Dec 2016 19:24:48 +0200 Subject: [PATCH 0121/1011] Integrate ptf into buildimage (#111) --- .gitmodules | 3 +++ rules/ptf.mk | 5 +++++ src/ptf | 1 + 3 files changed, 9 insertions(+) create mode 100644 rules/ptf.mk create mode 160000 src/ptf diff --git a/.gitmodules b/.gitmodules index 8db0758ed28c..a6928d64f2c4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -41,3 +41,6 @@ [submodule "src/sonic-snmpagent"] path = src/sonic-snmpagent url = https://github.com/Azure/sonic-snmpagent +[submodule "src/ptf"] + path = src/ptf + url = https://github.com/p4lang/ptf.git diff --git a/rules/ptf.mk b/rules/ptf.mk new file mode 100644 index 000000000000..5fe275bdadae --- /dev/null +++ b/rules/ptf.mk @@ -0,0 +1,5 @@ +# ptf package + +PTF = python-ptf_0.9-1_all.deb +$(PTF)_SRC_PATH = $(SRC_PATH)/ptf +SONIC_DPKG_DEBS += $(PTF) diff --git a/src/ptf b/src/ptf new file mode 160000 index 000000000000..ec33433f0276 --- /dev/null +++ b/src/ptf @@ -0,0 +1 @@ +Subproject commit ec33433f027625f4ba85c4eba8258e29f1dd6496 From 9a39142421862fe4d0c047bd7ca71ad3c77967f5 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 8 Dec 2016 20:31:02 +0200 Subject: [PATCH 0122/1011] Add python api to mlnx SDK (#110) * Add python api to mlnx SDK * Update sdk.mk * Add runtime dependency on python api Python SX SDK API is not required for build, however it is useful package to have in syncd docker --- platform/mellanox/docker-syncd-mlnx.mk | 2 +- platform/mellanox/sdk.mk | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/docker-syncd-mlnx.mk b/platform/mellanox/docker-syncd-mlnx.mk index 990ec0f7a4cb..81d27aacea46 100644 --- a/platform/mellanox/docker-syncd-mlnx.mk +++ b/platform/mellanox/docker-syncd-mlnx.mk @@ -2,7 +2,7 @@ DOCKER_SYNCD_MLNX = docker-syncd-mlnx.gz $(DOCKER_SYNCD_MLNX)_PATH = $(PLATFORM_PATH)/docker-syncd-mlnx -$(DOCKER_SYNCD_MLNX)_DEPENDS += $(SYNCD) $(MFT) +$(DOCKER_SYNCD_MLNX)_DEPENDS += $(SYNCD) $(MFT) $(PYTHON_SDK_API) $(DOCKER_SYNCD_MLNX)_FILES += $(MLNX_FW) $(DOCKER_SYNCD_MLNX)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX) diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index b8a8e1bbc0ba..06b71f6847be 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -37,6 +37,8 @@ SXD_LIBS_DEV = sxd-libs-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SXD_LIBS),$(SXD_LIBS_DEV))) SXD_LIBS_DEV_STATIC = sxd-libs-dev-static_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SXD_LIBS),$(SXD_LIBS_DEV_STATIC))) +#packages that are required for runtime only +PYTHON_SDK_API = python-sdk-api_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb define make_url $(1)_URL = $(MLNX_SDK_BASE_URL)/$(1) @@ -45,5 +47,6 @@ endef $(eval $(foreach deb,$(MLNX_SDK_DEBS),$(call make_url,$(deb)))) $(eval $(foreach deb,$(MLNX_SDK_RDEBS),$(call make_url,$(deb)))) +$(eval $(foreach deb,$(PYTHON_SDK_API),$(call make_url,$(deb)))) -SONIC_ONLINE_DEBS += $(MLNX_SDK_RDEBS) +SONIC_ONLINE_DEBS += $(MLNX_SDK_RDEBS) $(PYTHON_SDK_API) From 6ed8ff0a8ba4708e630a92c6fea2b1f49a688101 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Fri, 9 Dec 2016 16:31:11 +0200 Subject: [PATCH 0123/1011] Use permanent URL for mlnx SDK (#113) Change branch name into commit hash to have a permanent URL for SDK --- platform/mellanox/sdk.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index 06b71f6847be..d7a887eb1edb 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,4 +1,4 @@ -MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/sonic/sdk +MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/9ae5a29e344e23cd4ce92805f990f8ce8fab292a/sdk MLNX_SDK_VERSION = 4.2.3002 MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2) $(SX_ACL_RM) $(SX_COMPLIB) \ $(SX_EXAMPLES) $(SX_GEN_UTILS) $(SX_SCEW) $(SX_SDN_HAL) \ From 1e3fdc45c4cd4b94493672f2f6b59d67959b238d Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 14 Dec 2016 00:42:43 +0200 Subject: [PATCH 0124/1011] Use same URL for mlnx FW as mlnx SDK does (#116) --- platform/mellanox/fw.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index b1e418e697e9..6f03c0fca221 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -1,5 +1,5 @@ # mellanox firmware MLNX_FW = fw-SPC.mfa -$(MLNX_FW)_URL = https://github.com/Mellanox/SAI-Implementation/raw/sonic/sdk/fw-SPC.mfa +$(MLNX_FW)_URL = $(MLNX_SDK_BASE_URL)/$(MLNX_FW) SONIC_ONLINE_FILES += $(MLNX_FW) From c199614b69be65edfecc504f6fd3042dbc3d195c Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 14 Dec 2016 18:48:59 +0200 Subject: [PATCH 0125/1011] Add redis-tools to docker-orchagent (#117) Changes done in 7c9bffb18fb96daa4f89c08e951d7c86cd48f531 removed runtime dependency on redis from hiredis. So we need to add them manually into orchagent docker --- platform/mellanox/docker-orchagent-mlnx.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/docker-orchagent-mlnx.mk b/platform/mellanox/docker-orchagent-mlnx.mk index 6db369a797c5..a2138c029ff9 100644 --- a/platform/mellanox/docker-orchagent-mlnx.mk +++ b/platform/mellanox/docker-orchagent-mlnx.mk @@ -2,6 +2,6 @@ DOCKER_ORCHAGENT_MLNX = docker-orchagent-mlnx.gz $(DOCKER_ORCHAGENT_MLNX)_PATH = $(DOCKERS_PATH)/docker-orchagent -$(DOCKER_ORCHAGENT_MLNX)_DEPENDS += $(SWSS) +$(DOCKER_ORCHAGENT_MLNX)_DEPENDS += $(SWSS) $(REDIS_TOOLS) $(DOCKER_ORCHAGENT_MLNX)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_MLNX) From 98e3479e26c963815bb1801c61f15402c472feb0 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 14 Dec 2016 11:59:24 -0800 Subject: [PATCH 0126/1011] build orchagent and syncd docker on broadcom platform (#118) * build orchagent and syncd docker on broadcom platform --- dockers/docker-syncd/Dockerfile | 29 --------------- platform/broadcom/docker-orchagent-brcm.mk | 7 ++++ platform/broadcom/docker-syncd-brcm.mk | 8 ++++ .../docker-syncd-brcm/Dockerfile.template | 19 ++++++++++ .../broadcom/docker-syncd-brcm}/start.sh | 0 platform/broadcom/rules.mk | 26 ++++++------- platform/broadcom/sai.mk | 10 +++++ platform/broadcom/sdk.mk | 4 ++ slave.mk | 37 +++++++++++++------ 9 files changed, 87 insertions(+), 53 deletions(-) delete mode 100755 dockers/docker-syncd/Dockerfile create mode 100644 platform/broadcom/docker-orchagent-brcm.mk create mode 100644 platform/broadcom/docker-syncd-brcm.mk create mode 100755 platform/broadcom/docker-syncd-brcm/Dockerfile.template rename {dockers/docker-syncd => platform/broadcom/docker-syncd-brcm}/start.sh (100%) create mode 100644 platform/broadcom/sai.mk create mode 100644 platform/broadcom/sdk.mk diff --git a/dockers/docker-syncd/Dockerfile b/dockers/docker-syncd/Dockerfile deleted file mode 100755 index 88c521ffef68..000000000000 --- a/dockers/docker-syncd/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM docker-base - -RUN apt-get update - -COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libopennsl_*.deb", "deps/libsaibcm_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/syncd_*.deb", "/deps/"] - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/libhiredis0.13*.deb \ - && dpkg_apt /deps/libnl-3-200_*.deb \ - && dpkg_apt /deps/libnl-genl-3-200_*.deb \ - && dpkg_apt /deps/libnl-route-3-200_*.deb \ - && dpkg_apt /deps/libswsscommon_*.deb \ - && dpkg_apt /deps/libopennsl_*.deb \ - && dpkg_apt /deps/libsaibcm_*.deb \ - && dpkg_apt /deps/libsairedis_*.deb \ - && dpkg_apt /deps/libsaimetadata_*.deb \ - && dpkg_apt /deps/syncd_*.deb - -## TODO: add kmod into Depends -RUN apt-get install -f kmod - -COPY ["deps/dsserve", "deps/bcmcmd", "start.sh", "/usr/bin/"] - -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps - -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] diff --git a/platform/broadcom/docker-orchagent-brcm.mk b/platform/broadcom/docker-orchagent-brcm.mk new file mode 100644 index 000000000000..c847d93b748d --- /dev/null +++ b/platform/broadcom/docker-orchagent-brcm.mk @@ -0,0 +1,7 @@ +# docker image for orchagent + +DOCKER_ORCHAGENT_BRCM = docker-orchagent-brcm.gz +$(DOCKER_ORCHAGENT_BRCM)_PATH = $(DOCKERS_PATH)/docker-orchagent +$(DOCKER_ORCHAGENT_BRCM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) +$(DOCKER_ORCHAGENT_BRCM)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_BRCM) diff --git a/platform/broadcom/docker-syncd-brcm.mk b/platform/broadcom/docker-syncd-brcm.mk new file mode 100644 index 000000000000..42fe63c86a44 --- /dev/null +++ b/platform/broadcom/docker-syncd-brcm.mk @@ -0,0 +1,8 @@ +# docker image for brcm syncd + +DOCKER_SYNCD_BRCM = docker-syncd-brcm.gz +$(DOCKER_SYNCD_BRCM)_PATH = $(PLATFORM_PATH)/docker-syncd-brcm +$(DOCKER_SYNCD_BRCM)_DEPENDS += $(SYNCD) +$(DOCKER_SYNCD_BRCM)_FILES += $(BRCM_DSSERVE) $(BRCM_BCMCMD) +$(DOCKER_SYNCD_BRCM)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM) diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.template b/platform/broadcom/docker-syncd-brcm/Dockerfile.template new file mode 100755 index 000000000000..958c0757b283 --- /dev/null +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.template @@ -0,0 +1,19 @@ +FROM docker-base + +RUN apt-get update + +COPY deps /deps + +SED_DPKG + +## TODO: add kmod into Depends +RUN apt-get install -f kmod + +COPY ["deps/dsserve", "deps/bcmcmd", "start.sh", "/usr/bin/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-syncd/start.sh b/platform/broadcom/docker-syncd-brcm/start.sh similarity index 100% rename from dockers/docker-syncd/start.sh rename to platform/broadcom/docker-syncd-brcm/start.sh diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index aa5570082911..6cafbbefac79 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -1,20 +1,20 @@ -OPENNSL = libopennsl_6.4.11-1+0~20160719212144.23~1.gbp8ec2d1_amd64.deb -$(OPENNSL)_PATH = $(PLATFORM_PATH)/brcm_sdk -BRCM_SAI = libsaibcm_1.0.2~20160727172452.52_amd64.deb -$(BRCM_SAI)_PATH = $(PLATFORM_PATH)/brcm_sdk -BRCM_SAI_DBG = libsaibcm-dbg_1.0.2~20160727172452.52_amd64.deb -$(BRCM_SAI_DEV)_PATH = $(PLATFORM_PATH)/brcm_sdk -BRCM_SAI_DEV = libsaibcm-dev_1.0.2~20160727172452.52_amd64.deb -$(BRCM_SAI_DBG)_PATH = $(PLATFORM_PATH)/brcm_sdk +include $(PLATFORM_PATH)/sdk.mk +include $(PLATFORM_PATH)/sai.mk +include $(PLATFORM_PATH)/docker-orchagent-brcm.mk +include $(PLATFORM_PATH)/docker-syncd-brcm.mk -SONIC_COPY_DEBS += $(OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DBG) $(BRCM_SAI_DEV) +BRCM_DSSERVE = dsserve +$(BRCM_DSSERVE)_PATH = $(PLATFORM_PATH)/sdk +BRCM_BCMCMD = bcmcmd +$(BRCM_BCMCMD)_PATH = $(PLATFORM_PATH)/sdk -# TODO: Put dependencies for SDK packages +SONIC_COPY_FILES += $(BRCM_DSSERVE) $(BRCM_BCMCMD) -SONIC_ALL += $(SONIC_GENERIC) $(DOCKER_SYNCD) $(DOCKER_ORCHAGENT) $(DOCKER_FPM) +SONIC_ALL += $(DOCKER_SYNCD_BRCM) \ + $(DOCKER_ORCHAGENT_MLNX) # Inject brcm sai into sairedis -$(LIBSAIREDIS)_DEPENDS += $(BRCM_LIBSAI) +$(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) # Runtime dependency on brcm sai is set only for syncd -$(SYNCD)_RDEPENDS += $(BRCM_LIBSAI) +$(SYNCD)_RDEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk new file mode 100644 index 000000000000..ecedb48edd7a --- /dev/null +++ b/platform/broadcom/sai.mk @@ -0,0 +1,10 @@ +BRCM_SAI = libsaibcm_2.0.3.7~20161214010054.112_amd64.deb +$(BRCM_SAI)_PATH = $(PLATFORM_PATH)/sdk +BRCM_SAI_DEV = libsaibcm-dev_2.0.3.7~20161214010054.112_amd64.deb +$(BRCM_SAI_DEV)_PATH = $(PLATFORM_PATH)/sdk +$(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) + +SONIC_COPY_DEBS += $(BRCM_SAI) + +$(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) +$(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk new file mode 100644 index 000000000000..d3d94e606a64 --- /dev/null +++ b/platform/broadcom/sdk.mk @@ -0,0 +1,4 @@ +BRCM_OPENNSL = libopennsl_3.2.1.5+0~20161214000201.54~1.gbpb514c3_amd64.deb +$(BRCM_OPENNSL)_PATH = $(PLATFORM_PATH)/sdk + +SONIC_COPY_DEBS += $(BRCM_OPENNSL) diff --git a/slave.mk b/slave.mk index 80308929dc05..ee89df4b4c8b 100644 --- a/slave.mk +++ b/slave.mk @@ -62,6 +62,31 @@ MAKEFLAGS += -j $(SONIC_CONFIG_BUILD_JOBS) ## All rules must go after includes for propper targets expansion ############################################################################### +############################################################################### +## Local targets +############################################################################### + +# Copy debian packages from local directory +# Add new package for copy: +# SOME_NEW_DEB = some_new_deb.deb +# $(SOME_NEW_DEB)_PATH = path/to/some_new_deb.deb +# SONIC_COPY_DEBS += $(SOME_NEW_DEB) +$(addprefix $(DEBS_PATH)/, $(SONIC_COPY_DEBS)) : $(DEBS_PATH)/% : .platform + $(HEADER) + $(foreach deb,$* $($*_DERIVED_DEBS), \ + { cp $($(deb)_PATH)/$(deb) $(DEBS_PATH)/ $(LOG) || exit 1 ; } ; ) + $(FOOTER) + +# Copy regular files from local directory +# Add new package for copy: +# SOME_NEW_FILE = some_new_file +# $(SOME_NEW_FILE)_PATH = path/to/some_new_file +# SONIC_COPY_FILES += $(SOME_NEW_FILE) +$(addprefix $(DEBS_PATH)/, $(SONIC_COPY_FILES)) : $(DEBS_PATH)/% : .platform + $(HEADER) + cp $($*_PATH)/$* $(DEBS_PATH)/ $(LOG) || exit 1 + $(FOOTER) + ############################################################################### ## Online targets ############################################################################### @@ -88,17 +113,6 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_ONLINE_FILES)) : $(DEBS_PATH)/% : .platform wget -O $@ $($*_URL) $(LOG) $(FOOTER) -# Copy debian packages from local directory -# Add new package for copy: -# SOME_NEW_DEB = some_new_deb.deb -# $(SOME_NEW_DEB)_PATH = path/to/some_new_deb.deb -# SONIC_COPY_DEBS += $(SOME_NEW_DEB) -$(addprefix $(DEBS_PATH)/, $(SONIC_COPY_DEBS)) : $(DEBS_PATH)/% : .platform - $(HEADER) - $(foreach deb,$* $($*_DERIVED_DEBS), \ - { cp $($(deb)_PATH) $(DEBS_PATH)/ $(LOG) || exit 1 ; } ; ) - $(FOOTER) - ############################################################################### ## Debian package related targets ############################################################################### @@ -271,6 +285,7 @@ SONIC_CLEAN_DEBS = $(addsuffix -clean,$(addprefix $(DEBS_PATH)/, \ $(SONIC_ONLINE_DEBS) \ $(SONIC_ONLINE_FILES) \ $(SONIC_COPY_DEBS) \ + $(SONIC_COPY_FILES) \ $(SONIC_MAKE_DEBS) \ $(SONIC_DPKG_DEBS) \ $(SONIC_PYTHON_STDEB_DEBS) \ From a65224abc57729163605b6c25224307a580e10e2 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 14 Dec 2016 12:29:21 -0800 Subject: [PATCH 0127/1011] add build badge for broadcom platform --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ea6e2ee9e48e..d6fb75c3b99c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Mellanox[![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) +Mellanox[![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all)Broadcom[![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) # Build SONiC Switch Images - buildimage From 131aa6f4edbd97f5c294f46f12511de41ba06692 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 14 Dec 2016 21:02:21 -0800 Subject: [PATCH 0128/1011] bug fix: build docker orchagent brcm (#122) --- platform/broadcom/rules.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 6cafbbefac79..79f00e16fa35 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -11,7 +11,7 @@ $(BRCM_BCMCMD)_PATH = $(PLATFORM_PATH)/sdk SONIC_COPY_FILES += $(BRCM_DSSERVE) $(BRCM_BCMCMD) SONIC_ALL += $(DOCKER_SYNCD_BRCM) \ - $(DOCKER_ORCHAGENT_MLNX) + $(DOCKER_ORCHAGENT_BRCM) # Inject brcm sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) From 82e6b1d7d4158b6d38a470c2d1ac75f73fe91a8d Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 14 Dec 2016 21:02:44 -0800 Subject: [PATCH 0129/1011] [quagga]: add bgp ipv6 ecmp support (#123) --- src/sonic-quagga | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-quagga b/src/sonic-quagga index 1997fb28efe4..cf02de55bf00 160000 --- a/src/sonic-quagga +++ b/src/sonic-quagga @@ -1 +1 @@ -Subproject commit 1997fb28efe441a761b16559775006a2e37913e0 +Subproject commit cf02de55bf00a874fc1cc2aa53b65596294fe495 From 8886fc8286cb5f47f10407803b628bb1eae2b886 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 15 Dec 2016 16:48:22 -0800 Subject: [PATCH 0130/1011] Fix build: install libjemalloc1 when build docker images (#128) * Fix build: install libjemalloc1 when build docker images * (comment) --- dockers/docker-base | 2 +- dockers/docker-database/Dockerfile.template | 4 ++++ dockers/docker-orchagent/Dockerfile.template | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/dockers/docker-base b/dockers/docker-base index 73b5fcee2840..1ae8aaa535f8 160000 --- a/dockers/docker-base +++ b/dockers/docker-base @@ -1 +1 @@ -Subproject commit 73b5fcee2840adcc64bee5e6ffb226a9928959e4 +Subproject commit 1ae8aaa535f8e2fd1ffa9d150abe5855d9ac2c70 diff --git a/dockers/docker-database/Dockerfile.template b/dockers/docker-database/Dockerfile.template index adc6dad9330d..5d26946acf0a 100644 --- a/dockers/docker-database/Dockerfile.template +++ b/dockers/docker-database/Dockerfile.template @@ -4,6 +4,10 @@ RUN apt-get update COPY deps/ deps +## Install redis-tools dependencies +## TODO: implicitly install dependencies +RUN apt-get -y install libjemalloc1 + SED_DPKG ## Clean up diff --git a/dockers/docker-orchagent/Dockerfile.template b/dockers/docker-orchagent/Dockerfile.template index 04979db4d9d6..c8c858bf2c2c 100755 --- a/dockers/docker-orchagent/Dockerfile.template +++ b/dockers/docker-orchagent/Dockerfile.template @@ -4,6 +4,10 @@ RUN apt-get update RUN apt-get install -f -y ifupdown bridge-utils libdbus-1-3 libdaemon0 libjansson4 +## Install redis-tools dependencies +## TODO: implicitly install dependencies +RUN apt-get -y install libjemalloc1 + COPY deps /deps SED_DPKG From f20bba87a067844baab5c6e8fb160257af449ef2 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 15 Dec 2016 17:19:11 -0800 Subject: [PATCH 0131/1011] Refine get_docker-base: store the file in target directory (#129) --- get_docker-base.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/get_docker-base.sh b/get_docker-base.sh index b85ab4166104..c417ca12c111 100755 --- a/get_docker-base.sh +++ b/get_docker-base.sh @@ -9,9 +9,12 @@ set -x -e . ./functions.sh +TARGET_PATH=$(sed -n 's/TARGET_PATH\s*=\s*//p' slave.mk) + ## [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Read-only link of Azure Blob storage with shared access signature (SAS)")] BASE_URL="https://sonicstorage.blob.core.windows.net/packages/docker-base.ea507753d98b0769e2a15be13003331f8ad38d1c15b40a683e05fc53b1463b10.gz?sv=2015-04-05&sr=b&sig=YNN6eYVMEFndUaiHIRnqcZFdDZwIG%2BaAuVj0IoyDWPw%3D&se=2026-10-27T20%3A46%3A18Z&sp=r" base_image_name=docker-base docker_try_rmi $base_image_name -curl "$BASE_URL" | docker load +wget --no-use-server-timestamps -O $TARGET_PATH/$base_image_name.gz "$BASE_URL" +docker load < $TARGET_PATH/$base_image_name.gz From f92ee6937c0984ea6b6e0a9befe1be558e661c01 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 15 Dec 2016 18:16:47 -0800 Subject: [PATCH 0132/1011] Add mkdir if the target dir does not exist (#130) --- get_docker-base.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/get_docker-base.sh b/get_docker-base.sh index c417ca12c111..ff2bdeaff02b 100755 --- a/get_docker-base.sh +++ b/get_docker-base.sh @@ -16,5 +16,6 @@ BASE_URL="https://sonicstorage.blob.core.windows.net/packages/docker-base.ea5077 base_image_name=docker-base docker_try_rmi $base_image_name +mkdir -p $TARGET_PATH wget --no-use-server-timestamps -O $TARGET_PATH/$base_image_name.gz "$BASE_URL" docker load < $TARGET_PATH/$base_image_name.gz From da9022971e5e5714ff6c4fa0ab7eb4991eb2b6b2 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 15 Dec 2016 19:43:17 -0800 Subject: [PATCH 0133/1011] Makefile: Add platform generic for platform neutral targets (#127) --- platform/generic/rules.mk | 6 ++++++ slave.mk | 2 ++ 2 files changed, 8 insertions(+) create mode 100644 platform/generic/rules.mk diff --git a/platform/generic/rules.mk b/platform/generic/rules.mk new file mode 100644 index 000000000000..5ef6468b2f7e --- /dev/null +++ b/platform/generic/rules.mk @@ -0,0 +1,6 @@ +SONIC_ALL += $(DOCKER_DATABASE) \ + $(DOCKER_FPM) \ + $(DOCKER_TEAM) \ + $(DOCKER_LLDP_SV2) \ + $(DOCKER_SNMP_SV2) \ + $(DOCKER_PLATFORM_MONITOR) diff --git a/slave.mk b/slave.mk index ee89df4b4c8b..cb7cc0371583 100644 --- a/slave.mk +++ b/slave.mk @@ -26,6 +26,7 @@ PROJECT_ROOT = $(shell pwd) CONFIGURED_PLATFORM := $(shell [ -f .platform ] && cat .platform || echo undefined) PLATFORM_PATH = platform/$(CONFIGURED_PLATFORM) +PLATFORM_GENERIC_PATH = platform/generic ############################################################################### ## Utility rules @@ -51,6 +52,7 @@ distclean : .platform clean include $(RULES_PATH)/config include $(RULES_PATH)/functions include $(RULES_PATH)/*.mk +include $(PLATFORM_GENERIC_PATH)/rules.mk ifneq ($(CONFIGURED_PLATFORM), undefined) include $(PLATFORM_PATH)/rules.mk endif From 775156f3bfbb259d2585b0e7020bb815cad57fbf Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 16 Dec 2016 19:12:56 -0800 Subject: [PATCH 0134/1011] [thrift]: fix thrift 0.9.3 test failure (#135) https://issues.apache.org/jira/browse/THRIFT-3577 --- src/thrift/Makefile | 1 + .../patch/THRIFT-3577-assertion-failed.patch | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/thrift/patch/THRIFT-3577-assertion-failed.patch diff --git a/src/thrift/Makefile b/src/thrift/Makefile index edb14e0cfa0d..2b450e52d4c1 100644 --- a/src/thrift/Makefile +++ b/src/thrift/Makefile @@ -19,6 +19,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : dpkg-source -x thrift_$(THRIFT_VERSION_FULL).dsc pushd thrift-$(THRIFT_VERSION) + patch -p1 < ../patch/THRIFT-3577-assertion-failed.patch dpkg-buildpackage -d -rfakeroot -b -us -uc popd diff --git a/src/thrift/patch/THRIFT-3577-assertion-failed.patch b/src/thrift/patch/THRIFT-3577-assertion-failed.patch new file mode 100644 index 000000000000..ad984ebbdb73 --- /dev/null +++ b/src/thrift/patch/THRIFT-3577-assertion-failed.patch @@ -0,0 +1,27 @@ +From 9f96e358fb5bdac8a6570dc3c79e9416e4f407ce Mon Sep 17 00:00:00 2001 +From: Nobuaki Sukegawa +Date: Mon, 22 Feb 2016 01:33:27 +0900 +Subject: [PATCH] THRIFT-3577 assertion failed at line 512 of + testcontainertest.c + +--- + lib/c_glib/test/testcontainertest.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/lib/c_glib/test/testcontainertest.c b/lib/c_glib/test/testcontainertest.c +index 852254b..1cbc55c 100644 +--- a/lib/c_glib/test/testcontainertest.c ++++ b/lib/c_glib/test/testcontainertest.c +@@ -507,9 +507,9 @@ main(int argc, char *argv[]) + + /* Make sure the server stopped only because it was interrupted (by the + child process terminating) */ +- g_assert (g_error_matches (error, +- THRIFT_SERVER_SOCKET_ERROR, +- THRIFT_SERVER_SOCKET_ERROR_ACCEPT)); ++ g_assert(!error || g_error_matches(error, ++ THRIFT_SERVER_SOCKET_ERROR, ++ THRIFT_SERVER_SOCKET_ERROR_ACCEPT)); + + /* Free our resources */ + g_object_unref (server); From b8ca9c40475dc5e826341dd4df2f5ac9ccc2400a Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 19 Dec 2016 19:39:07 +0200 Subject: [PATCH 0135/1011] Add sx-kernel to all targets (#138) Define sx-kernel pckages in sdk.mk Add them to SONIC_ALL --- platform/mellanox/rules.mk | 3 ++- platform/mellanox/sdk.mk | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index a31d22fc25a6..abeed6c1080e 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -14,7 +14,8 @@ SONIC_ALL += $(DOCKER_SYNCD_MLNX) \ $(DOCKER_SNMP_SV2) \ $(DOCKER_TEAM) \ $(DOCKER_PLATFORM_MONITOR) \ - debs/$(MLNX_HW_MANAGEMENT) + debs/$(MLNX_HW_MANAGEMENT) \ + debs/$(SX_KERNEL) # Inject mlnx sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index d7a887eb1edb..e9f4524dda5b 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -39,6 +39,9 @@ SXD_LIBS_DEV_STATIC = sxd-libs-dev-static_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SXD_LIBS),$(SXD_LIBS_DEV_STATIC))) #packages that are required for runtime only PYTHON_SDK_API = python-sdk-api_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +SX_KERNEL = sx-kernel_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +SX_KERNEL_DEV = sx-kernel-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(SX_KERNEL),$(SX_KERNEL_DEV))) define make_url $(1)_URL = $(MLNX_SDK_BASE_URL)/$(1) @@ -47,6 +50,6 @@ endef $(eval $(foreach deb,$(MLNX_SDK_DEBS),$(call make_url,$(deb)))) $(eval $(foreach deb,$(MLNX_SDK_RDEBS),$(call make_url,$(deb)))) -$(eval $(foreach deb,$(PYTHON_SDK_API),$(call make_url,$(deb)))) +$(eval $(foreach deb,$(PYTHON_SDK_API) $(SX_KERNEL) $(SX_KERNEL_DEV),$(call make_url,$(deb)))) -SONIC_ONLINE_DEBS += $(MLNX_SDK_RDEBS) $(PYTHON_SDK_API) +SONIC_ONLINE_DEBS += $(MLNX_SDK_RDEBS) $(PYTHON_SDK_API) $(SX_KERNEL) From aefb32b2e8a0afdd3438d1a2c2fd04aa2a7b2a91 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 19 Dec 2016 19:39:31 +0200 Subject: [PATCH 0136/1011] [sonic-slave]: Install j2cli for templating (#139) --- sonic-slave/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 50e96bfcd1d9..7b03e4ee8162 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -82,6 +82,9 @@ RUN apt-get update && apt-get install -y libmysqlclient-dev libmysqld-dev libper # For mpdecimal RUN apt-get update && apt-get install -y docutils-common libjs-sphinxdoc libjs-underscore python-docutils python-jinja2 python-markupsafe python-pygments python-roman python-sphinx sphinx-common python3-sphinx +# For templating +RUN pip install j2cli + # Install depot-tools (for git-retry) RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /usr/share/depot_tools ENV PATH /usr/share/depot_tools:$PATH From 506af2ecab6b94de383b53f30745be603b23a43d Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 19 Dec 2016 19:41:08 +0200 Subject: [PATCH 0137/1011] Update .gitignore (#140) --- .gitignore | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 18225c156201..372634cfb016 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,31 @@ -deps/ -dockers/*/files/ -*.bin -*.deb -*.zip +# Build system related +.platform + +# Build artifacts fsroot/ fs.* -src/hiredis/hiredis_* -src/hiredis/hiredis-*/ -src/quagga/quagga_* -src/quagga/quagga/ -src/initramfs-tools/initramfs-tools/ -src/redis/redis_* -src/redis/redis-*/ +target/ + +# Subdirectories in src +src/hiredis/* +!src/hiredis/Makefile +src/initramfs-tools/* +!src/initramfs-tools/Makefile +src/redis/* +!src/redis/Makefile +src/libnl3/* +!src/libnl3/Makefile +src/libteam/* +!src/libteam/Makefile +src/snmpd/* +!src/snmpd/Makefile +src/thrift/* +!src/thrift/Makefile + +# Autogenerated Dockerfiles +dockers/docker-database/Dockerfile +dockers/docker-fpm/Dockerfile +dockers/docker-lldp-sv2/Dockerfile +dockers/docker-orchagent/Dockerfile +dockers/docker-snmp-sv2/Dockerfile +dockers/docker-team/Dockerfile From 7039a05604b83d47a6ce4e47bcd9efba1a7d92df Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 19 Dec 2016 19:41:33 +0200 Subject: [PATCH 0138/1011] Add .gitignore for Mellanox platform (#141) --- platform/mellanox/.gitignore | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 platform/mellanox/.gitignore diff --git a/platform/mellanox/.gitignore b/platform/mellanox/.gitignore new file mode 100644 index 000000000000..3c0769067437 --- /dev/null +++ b/platform/mellanox/.gitignore @@ -0,0 +1,10 @@ +# Subdirectories +mlnx-sai/* +!mlnx-sai/Makefile +hw-management/* +!hw-management/Makefile +mft/* +!mft/Makefile + +# Autogenerated Dockerfiles +docker-syncd-mlnx/Dockerfile From 9390d54775dddc8bf41e1c1e9bdc05ca6f87a8da Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 19 Dec 2016 13:27:30 -0800 Subject: [PATCH 0139/1011] [readme]: Add P4 build status --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d6fb75c3b99c..46927d6c1396 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -Mellanox[![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all)Broadcom[![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) +Broadcom[![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) +Mellanox[![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) +P4[![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all) # Build SONiC Switch Images - buildimage From ab4a35a1d1ace48814e2e28e529d7456ff1133db Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 19 Dec 2016 14:35:09 -0800 Subject: [PATCH 0140/1011] [submodules]: Update submodules to latest commits (#143) --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 96bcb6382a12..e393930b8bc3 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 96bcb6382a12d789830d848fe05681ee75238162 +Subproject commit e393930b8bc38fcdb950139db8c2353b887128c8 diff --git a/src/sonic-swss b/src/sonic-swss index 05bac483585d..205405667396 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 05bac483585dd5e564ed5db43efb1020fa25c703 +Subproject commit 205405667396f606d9560ed6d861063f35f07d94 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 136aca5ff74d..81ed1b603add 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 136aca5ff74d7082d0a1def8b02032689ce3507e +Subproject commit 81ed1b603add087b0ea3827036910a6785dba0c5 From 4356a6bef692e1aab6877a542a80cfe2afc9c26c Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 20 Dec 2016 00:39:24 -0800 Subject: [PATCH 0141/1011] [team]: Add docker-team dependencies (#136) --- rules/docker-team.mk | 2 +- rules/swss.mk | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/rules/docker-team.mk b/rules/docker-team.mk index a11698634d57..3f5b99ac9666 100644 --- a/rules/docker-team.mk +++ b/rules/docker-team.mk @@ -2,6 +2,6 @@ DOCKER_TEAM = docker-team.gz $(DOCKER_TEAM)_PATH = $(DOCKERS_PATH)/docker-team -$(DOCKER_TEAM)_DEPENDS += $(SWSS) +$(DOCKER_TEAM)_DEPENDS += $(SWSS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(DOCKER_TEAM)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_TEAM) diff --git a/rules/swss.mk b/rules/swss.mk index 4761d2fb8876..6b2620f81309 100644 --- a/rules/swss.mk +++ b/rules/swss.mk @@ -4,6 +4,5 @@ SWSS = swss_1.0.0_amd64.deb $(SWSS)_SRC_PATH = $(SRC_PATH)/sonic-swss $(SWSS)_DEPENDS += $(LIBSAIREDIS_DEV) $(LIBSAIMETADATA_DEV) $(LIBTEAM_DEV) \ $(LIBTEAMDCT) $(LIBTEAM_UTILS) -$(SWSS)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(LIBTEAM) $(LIBTEAMDCT) \ - $(LIBTEAM_UTILS) +$(SWSS)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(LIBTEAM) SONIC_DPKG_DEBS += $(SWSS) From 02ba3f9b5cb4741a564dfeb3930bdd5bcbf52c51 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 19 Dec 2016 02:30:09 +0200 Subject: [PATCH 0142/1011] Create first draft for buildimage readme --- README.buildsystem.md | 96 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 README.buildsystem.md diff --git a/README.buildsystem.md b/README.buildsystem.md new file mode 100644 index 000000000000..95476c88d412 --- /dev/null +++ b/README.buildsystem.md @@ -0,0 +1,96 @@ +# SONiC Buildimage Guide +## Overview +SONiC build system is a *GNU make* based environment for build process automation. +It consists of two main parts: + * Backend - collection of makefiles and other helpers that define generic target groups, used by recipes + * Frontend - collection of recipes, that define metadata for each build target + +## Structure +File structure of SONiC Buildimage is as follows: +``` +sonic-buildimage/ + Makefile + slave.mk + sonic-slave/ + Dockerfile + rules/ + config + functions + recipe1.mk + .. + dockers/ + docker1/ + Dockerfile.template + .. + src/ + submodule1/ + .. + package1/ + Makefile + .. + platform/ + vendor1/ + .. + target/ + debs/ + python-wheels/ +``` +### Backend +**Makefile**, **slave.mk** and **sonic-slave/Dockerfile** are the backend of buildimage. +*slave.mk* is the actual makefile. It defines a set of rules for *target groups* (more on that later). +You can find a make rules for every target that is defined in recipe there. +*Makefile* is a wrapper over sonic-slave docker image. +Every part of build is executed in a docker container called sonic-slave, specifically crafted for this environment. +If build is started for the first time, a new sonic-slave image will be built form *sonic-slave/Dockerfile* on the machine. +It might take some time, so be patient. +After that all subsequent make commands will be executed inside this container. +*Makefile* takes every target that is passed to make command and delegates it as an entry point to a container, +making process of running container transparent. + +### Frontend +**rules/** has a collection of recipes for platform independent targets. +Every recipe is a file that describes a metadata of a specific target, that is needed for its build. +You might find **rules/config** very useful, as it is a configuration file for a build system, which enables/disables some tweaks. +**dockers/** directory is a place where you can find Dockerfiles for generic docker images. +**src/** is a place where a source code for generic packages goes. +It has both submodules (simple case, just run dpkg-buildpackage to build), +and directories with more complcated components, that provide their own Makefiles. +**platform/** contains all vendor-specific recipes, submodules etc. +Every **platform/[VENDOR]/** directory is a derived part of buildimage frontend, that defines rules and targets for a concrete vendor. + +### Build output +**target/** is basically a build output. You can find all biuld artifacts there. +## Recipes and target groups +Now let's go over a definition of recipes and target groups. +*Recipe* is a small makefile that defines a target and set of variables for building it. +*Target group* is a set of targets that are built according to the same rulels. + +### Recipe example +Lets take a recipe for swss as an example: +```make +# libswsscommon package + +LIBSWSSCOMMON = libswsscommon_1.0.0_amd64.deb +$(LIBSWSSCOMMON)_SRC_PATH = $(SRC_PATH)/sonic-swss-common +$(LIBSWSSCOMMON)_DEPENDS += $(LIBHIREDIS_DEV) $(LIBNL3_DEV) $(LIBNL_GENL3_DEV) \ + $(LIBNL_ROUTE3_DEV) $(LIBNL_NF3_DEV) \ + $(LIBNL_CLI_DEV) +$(LIBSWSSCOMMON)_RDEPENDS += $(LIBHIREDIS) $(LIBNL3) $(LIBNL_GENL3) \ + $(LIBNL_ROUTE3) $(LIBNL_NF3) $(LIBNL_CLI) +SONIC_DPKG_DEBS += $(LIBSWSSCOMMON) + +LIBSWSSCOMMON_DEV = libswsscommon-dev_1.0.0_amd64.deb +$(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(LIBSWSSCOMMON_DEV))) +``` +First we define our package swsscommon. +Then we secify **SRC_PATH** (path to sources), +**DEPENDS** (build dependencies), +and **RDEPENDS** (runtime dependencies for docker installation). +Then we add our target to SONIC_DPKG_DEBS target group. +At the end we define a dev package for swsscommon and make it derived from main one. +Using **add_derived_package** just makes a deep copy of package's metadata, so that we don't have to repeat ourselves. + +### Target groups +**TODO** +## Tips & Tricks +**TODO** From 826851f948ee5eac81b65d5cf2be51256459073c Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 20 Dec 2016 12:34:05 +0200 Subject: [PATCH 0143/1011] Update README.buildsystem.md Add section with recipes and target groups Add section with tips & tricks --- README.buildsystem.md | 126 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 117 insertions(+), 9 deletions(-) diff --git a/README.buildsystem.md b/README.buildsystem.md index 95476c88d412..947ee6b54cf8 100644 --- a/README.buildsystem.md +++ b/README.buildsystem.md @@ -1,6 +1,6 @@ # SONiC Buildimage Guide ## Overview -SONiC build system is a *GNU make* based environment for build process automation. +SONiC buildimage is a *GNU make* based environment for build process automation. It consists of two main parts: * Backend - collection of makefiles and other helpers that define generic target groups, used by recipes * Frontend - collection of recipes, that define metadata for each build target @@ -38,10 +38,11 @@ sonic-buildimage/ ### Backend **Makefile**, **slave.mk** and **sonic-slave/Dockerfile** are the backend of buildimage. *slave.mk* is the actual makefile. It defines a set of rules for *target groups* (more on that later). -You can find a make rules for every target that is defined in recipe there. -*Makefile* is a wrapper over sonic-slave docker image. +You can find a make rule for every target that is defined in recipe there. +*Makefile* is a wrapper over sonic-slave docker image. + Every part of build is executed in a docker container called sonic-slave, specifically crafted for this environment. -If build is started for the first time, a new sonic-slave image will be built form *sonic-slave/Dockerfile* on the machine. +If build is started for the first time on a particular host, a new sonic-slave image will be built form *sonic-slave/Dockerfile* on the machine. It might take some time, so be patient. After that all subsequent make commands will be executed inside this container. *Makefile* takes every target that is passed to make command and delegates it as an entry point to a container, @@ -60,13 +61,16 @@ Every **platform/[VENDOR]/** directory is a derived part of buildimage frontend, ### Build output **target/** is basically a build output. You can find all biuld artifacts there. + ## Recipes and target groups Now let's go over a definition of recipes and target groups. -*Recipe* is a small makefile that defines a target and set of variables for building it. -*Target group* is a set of targets that are built according to the same rulels. +**Recipe** is a small makefile that defines a target and set of variables for building it. +If you want to add a new target to buildimage (.deb package or docker image), you have to create a recipe for this target. +**Target group** is a set of targets that are built according to the same rulels. +Every recipe sets a target group to which this target belongs. ### Recipe example -Lets take a recipe for swss as an example: +Lets take a recipe for swsscommon as an example: ```make # libswsscommon package @@ -91,6 +95,110 @@ At the end we define a dev package for swsscommon and make it derived from main Using **add_derived_package** just makes a deep copy of package's metadata, so that we don't have to repeat ourselves. ### Target groups -**TODO** +**SONIC_DPKG_DEBS** +Main target group for building .deb packages. +Define: +```make +SOME_NEW_DEB = some_new_deb.deb # name of your package +$(SOME_NEW_DEB)_SRC_PATH = $(SRC_PATH)/project_name # path to directory with sources +$(SOME_NEW_DEB)_DEPENDS = $(SOME_OTHER_DEB1) $(SOME_OTHER_DEB2) ... # build dependencies +$(SOME_NEW_DEB)_RDEPENDS = $(SOME_OTHER_DEB1) $(SOME_OTHER_DEB2) ... # runtime dependencies +SONIC_DPKG_DEBS += $(SOME_NEW_DEB) # add package to this target group +``` + +**SONIC_PYTHON_STDEB_DEBS** +Same as above, but instead of building package using dpkg-buildpackage it executes `python setup.py --command-packages=stdeb.command bdist_deb`. +Define: +```make +SOME_NEW_DEB = some_new_deb.deb # name of your package +$(SOME_NEW_DEB)_SRC_PATH = $(SRC_PATH)/project_name # path to directory with sources +$(SOME_NEW_DEB)_DEPENDS = $(SOME_OTHER_DEB1) $(SOME_OTHER_DEB2) ... # build dependencies +$(SOME_NEW_DEB)_RDEPENDS = $(SOME_OTHER_DEB1) $(SOME_OTHER_DEB2) ... # runtime dependencies +SONIC_PYTHON_STDEB_DEBS += $(SOME_NEW_DEB) # add package to this target group +``` + +**SONIC_MAKE_DEBS** +This is a bit more flexible case. +If you have to do some specific type of build or apply pathes prior to build, just define your owm Makefile and add it to buildomage. +Define: +```make +SOME_NEW_DEB = some_new_deb.deb # name of your package +$(SOME_NEW_DEB)_SRC_PATH = $(SRC_PATH)/project_name # path to directory with sources +$(SOME_NEW_DEB)_DEPENDS = $(SOME_OTHER_DEB1) $(SOME_OTHER_DEB2) ... # build dependencies +$(SOME_NEW_DEB)_RDEPENDS = $(SOME_OTHER_DEB1) $(SOME_OTHER_DEB2) ... # runtime dependencies +SONIC_MAKE_DEBS += $(SOME_NEW_DEB) # add package to this target group +``` + +If some packages have to be built locally due to some legal issues or they are already prebuilt and available online, you might find next four target groups useful. + +**SONIC_COPY_DEBS** +Those packages will be just copied from specified location on your machine. +Define: +```make +SOME_NEW_DEB = some_new_deb.deb # name of your package +$(SOME_NEW_DEB)_PATH = path/to/some_new_deb.deb # path to file +SONIC_COPY_DEBS += $(SOME_NEW_DEB) # add package to this target group +``` + +**SONIC_COPY_FILES** +Same as above, but applicable for regular files. Use when you need some regular files for installation in docker container. +Define: +```make +SOME_NEW_FILE = some_new_file # name of your file +$(SOME_NEW_FILE)_PATH = path/to/some_new_file # path to file +SONIC_COPY_FILES += $(SOME_NEW_FILE) # add file to this target group +``` + +**SONIC_ONLINE_DEBS** +Target group for debian packages that should be fetched from an online source. +Define: +```make +SOME_NEW_DEB = some_new_deb.deb # name of your package +$(SOME_NEW_DEB)_URL = https://url/to/this/deb.deb # path to file # URL for downloading +SONIC_ONLINE_DEBS += $(SOME_NEW_DEB) # add file to this target group +``` + +**SONIC_ONLINE_FILES** +Target group for regular files that should be fetched from an online source. +Define: +```make +SOME_NEW_FILE = some_new_file # name of your file +$(SOME_NEW_FILE)_URL = https://url/to/this/file # URL for downloading +SONIC_ONLINE_FILES += $(SOME_NEW_FILE) # add file to this target group +``` + +Docker images also have their target groups. +**SONIC_SIMPLE_DOCKER_IMAGES** +As you see from a name of the group, it is intended to build a docker image from a regular Dockerfile. +Define: +```make +SOME_DOCKER = some_docker.gz # name of your docker +$(SOME_DOCKER)_PATH = path/to/your/docker # path to your Dockerfile +SONIC_SIMPLE_DOCKER_IMAGES += $(SOME_DOCKER) # add docker to this group +``` + +**SONIC_DOCKER_IMAGES** +This one is a bit more sophisticated. You can define debian packages from buildimage that will be installed to it, and corresponding Dockerfile will be dinamically generated from a template. +Define: +```make +SOME_DOCKER = some_docker.gz # name of your docker +$(SOME_DOCKER)_PATH = path/to/your/docker # path to your Dockerfile +$(SOME_DOCKER)_DEPENDS += $(SOME_DEB1) $(SOME_DEB2) # .deb packages to install into image +$(SOME_DOCKER)_PYTHON_WHEELS += $(SOME_WHL1) $(SOME_WHL2) # python wheels to install into image +$(SOME_DOCKER)_LOAD_DOCKERS += $(SOME_OTHER_DOCkER) # docker image from which this one is built +SONIC_DOCKER_IMAGES += $(SOME_DOCKER) # add docker to this group +``` + ## Tips & Tricks -**TODO** +Although every target is built inside a sonic-slave container, which exits at the end of build, you can enter bash of sonic-slave using this command: +``` +$ sonic-slave-bash +``` +It is very useful for debugging when you add a new target and facing some trubles. + +sonic-slave environment is built only once, but if sonic-slave/Dockerfile was updated, you can rebuild it with this command: +``` +$ sonic-slave-build +``` + +All target groups are used by one or another recipe, so use those recipes as a reference when adding new ones. From b1b4a0b539ed8703f260065ef222c932af1404b2 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 20 Dec 2016 14:05:22 +0200 Subject: [PATCH 0144/1011] Add link to build system documentation in README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 46927d6c1396..5e93c543e0e8 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,9 @@ If it is already cloned, however there is no files under ./dockers/docker-base/ git submodule update --init --recursive # Usage + +**NOTE:** In order to be more familiar with build process and make some hanges to it, it is recommended to read this short [Documentation](README.buildsystem.md) + To build NOS installer image and docker images, run command line make configure PLATFORM=[VENDOR] From 3c01b398f48274d8cc738fe71d72ab82f620b70d Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 20 Dec 2016 13:29:00 -0800 Subject: [PATCH 0145/1011] [docker]: add support for Force10-S6100 (#145) --- dockers/docker-orchagent/start.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 0cea8e4de988..9530f39261f5 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -38,6 +38,9 @@ if [ "$onie_platform" == "x86_64-dell_s6000_s1220-r0" ]; then PORTSYNCD_ARGS+="-p /etc/ssw/Force10-S6000/port_config.ini" SWSSCONFIG_ARGS+="td2.32ports.qos.1.json td2.32ports.qos.2.json td2.32ports.qos.3.json td2.32ports.qos.4.json td2.32ports.qos.5.json td2.32ports.qos.6.json " SWSSCONFIG_ARGS+="td2.32ports.buffers.1.json td2.32ports.buffers.2.json td2.32ports.buffers.3.json " +elif [ "$onie_platform" == "x86_64-dell_s6100_c2538-r0" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" + PORTSYNCD_ARGS+="-p /etc/ssw/Force10-S6100/port_config.ini" elif [ "$aboot_platform" == "x86_64-arista_7050_qx32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" PORTSYNCD_ARGS+="-p /etc/ssw/Arista-7050-QX32/port_config.ini" From 562d8759004b3982a617d6e378fb5c319eeeda3c Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Tue, 20 Dec 2016 23:30:48 +0200 Subject: [PATCH 0146/1011] [platform]: Update Mellanox SAI and SDK version. Add SDK installation dependencies. (#142) * Update Mellanox SAI and SDK version. Add SDK installation dependencies * Update Mellanox Fimware version. * Update sdk.mk --- platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh | 2 +- platform/mellanox/mlnx-sai.mk | 2 +- platform/mellanox/sdk.mk | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh b/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh index 81514f77b062..eee5d5a45ef8 100755 --- a/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh +++ b/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh @@ -1,7 +1,7 @@ #!/bin/bash query_retry_count_max="10" -required_fw_version="13.1200.0116" +required_fw_version="13.1220.0130" fw_file=/etc/mlnx/fw-SPC.mfa run_or_fail() { diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index a80bd87a0292..3b8db59e7fc5 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = 161120 -MLNX_SAI_REVISION = c7ccc8a8ba9864b62b0c038ad57d6dd94771f5ee +MLNX_SAI_REVISION = 35e5e8739bec80c19053b7bb9cf6d083b8144fb5 export MLNX_SAI_VERSION MLNX_SAI_REVISION diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index e9f4524dda5b..71b3d218418b 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,5 +1,5 @@ -MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/9ae5a29e344e23cd4ce92805f990f8ce8fab292a/sdk -MLNX_SDK_VERSION = 4.2.3002 +MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/35e5e8739bec80c19053b7bb9cf6d083b8144fb5/sdk +MLNX_SDK_VERSION = 4.2.3102 MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2) $(SX_ACL_RM) $(SX_COMPLIB) \ $(SX_EXAMPLES) $(SX_GEN_UTILS) $(SX_SCEW) $(SX_SDN_HAL) \ $(SXD_LIBS) $(TESTX) @@ -11,6 +11,7 @@ MLNX_SDK_DEBS += $(APPLIBS_DEV) $(IPROUTE2_DEV) $(SX_ACL_RM_DEV) \ $(SXD_LIBS_DEV_STATIC) $(TESTX_DEV) APPLIBS = applibs_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(APPLIBS)_DEPENDS += $(SX_COMPLIB) $(SX_GEN_UTILS) $(SXD_LIBS) $(LIBNL3) $(LIBNL_GENL3) APPLIBS_DEV = applibs-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(APPLIBS),$(APPLIBS_DEV))) IPROUTE2 = iproute2_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb @@ -22,9 +23,11 @@ $(eval $(call add_derived_package,$(SX_COMPLIB),$(SX_COMPLIB_DEV))) SX_COMPLIB_DEV_STATIC = sx-complib-dev-static_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SX_COMPLIB),$(SX_COMPLIB_DEV_STATIC))) SX_EXAMPLES = sx-examples_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(SX_EXAMPLES)_DEPENDS += $(APPLIBS) $(SX_SCEW) $(SXD_LIBS) SX_EXAMPLES_DEV = sx-examples-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SX_EXAMPLES),$(SX_EXAMPLES_DEV))) SX_GEN_UTILS = sx-gen-utils_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(SX_GEN_UTILS)_DEPENDS += $(SX_COMPLIB) SX_GEN_UTILS_DEV = sx-gen-utils-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SX_GEN_UTILS),$(SX_GEN_UTILS_DEV))) SX_SCEW = sx-scew_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb @@ -39,6 +42,7 @@ SXD_LIBS_DEV_STATIC = sxd-libs-dev-static_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SXD_LIBS),$(SXD_LIBS_DEV_STATIC))) #packages that are required for runtime only PYTHON_SDK_API = python-sdk-api_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(PYTHON_SDK_API)_DEPENDS += $(APPLIBS) $(SXD_LIBS) SX_KERNEL = sx-kernel_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb SX_KERNEL_DEV = sx-kernel-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SX_KERNEL),$(SX_KERNEL_DEV))) From b77d53fd8f41ba48d03dfbfa05017595f0bff65e Mon Sep 17 00:00:00 2001 From: jiacao Date: Wed, 21 Dec 2016 02:44:41 -0800 Subject: [PATCH 0147/1011] Add redis in sonic p4 image (#146) --- platform/p4/docker-sonic-p4.mk | 2 +- platform/p4/docker-sonic-p4/Dockerfile.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/p4/docker-sonic-p4.mk b/platform/p4/docker-sonic-p4.mk index 3204f1d50f97..0e10e9e319fc 100644 --- a/platform/p4/docker-sonic-p4.mk +++ b/platform/p4/docker-sonic-p4.mk @@ -2,6 +2,6 @@ DOCKER_SONIC_P4 = docker-sonic-p4.gz $(DOCKER_SONIC_P4)_PATH = $(PLATFORM_PATH)/docker-sonic-p4 -$(DOCKER_SONIC_P4)_DEPENDS += $(SWSS) $(SYNCD) $(P4_SWITCH) +$(DOCKER_SONIC_P4)_DEPENDS += $(SWSS) $(SYNCD) $(P4_SWITCH) $(REDIS_SERVER) $(REDIS_TOOLS) $(DOCKER_SONIC_P4)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SONIC_P4) diff --git a/platform/p4/docker-sonic-p4/Dockerfile.template b/platform/p4/docker-sonic-p4/Dockerfile.template index f03127502104..4f68259d02f4 100644 --- a/platform/p4/docker-sonic-p4/Dockerfile.template +++ b/platform/p4/docker-sonic-p4/Dockerfile.template @@ -2,7 +2,7 @@ FROM docker-base RUN apt-get update -RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils python-ply libqt5core5a libqt5network5 libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0 libgmp10 libjudydebian1 libnanomsg0 libdaemon0 libjansson4 +RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils python-ply libqt5core5a libqt5network5 libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0 libgmp10 libjudydebian1 libnanomsg0 libdaemon0 libjansson4 libjemalloc1 COPY deps /deps From 92d9f9b23a2f7ad5595666eb26f44e9469242ef1 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 21 Dec 2016 21:50:35 +0200 Subject: [PATCH 0148/1011] Fix commands in buildsystem README (#147) --- README.buildsystem.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.buildsystem.md b/README.buildsystem.md index 947ee6b54cf8..666ddf026540 100644 --- a/README.buildsystem.md +++ b/README.buildsystem.md @@ -192,13 +192,13 @@ SONIC_DOCKER_IMAGES += $(SOME_DOCKER) # add docker to this group ## Tips & Tricks Although every target is built inside a sonic-slave container, which exits at the end of build, you can enter bash of sonic-slave using this command: ``` -$ sonic-slave-bash +$ make sonic-slave-bash ``` It is very useful for debugging when you add a new target and facing some trubles. sonic-slave environment is built only once, but if sonic-slave/Dockerfile was updated, you can rebuild it with this command: ``` -$ sonic-slave-build +$ make sonic-slave-build ``` All target groups are used by one or another recipe, so use those recipes as a reference when adding new ones. From c07e54c3e1e57e0629e60213603c5b3b8c8ea933 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 21 Dec 2016 15:16:18 -0800 Subject: [PATCH 0149/1011] [platform-monitor] update apt cache (#148) --- dockers/docker-platform-monitor/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-platform-monitor/Dockerfile b/dockers/docker-platform-monitor/Dockerfile index 041f03f69927..9bd3d79d9a70 100755 --- a/dockers/docker-platform-monitor/Dockerfile +++ b/dockers/docker-platform-monitor/Dockerfile @@ -2,7 +2,8 @@ FROM docker-base ## Pre-install the fundamental packages ## Clean up -RUN apt-get -y install \ +RUN apt-get update && \ + apt-get -y install \ smartmontools \ sensord \ && \ From 48d7fe1009f38420914386022f958628aecf2e9a Mon Sep 17 00:00:00 2001 From: Xin Liu Date: Wed, 21 Dec 2016 15:51:23 -0800 Subject: [PATCH 0150/1011] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e93c543e0e8..47f5ae33062c 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,10 @@ P4[![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildi Build an [Open Network Install Environment (ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also build docker images running inside the NOS. # Prerequisite -## Clone or fetch the code repository with all git submodules +## SAI Version +SONiC V2 is using [SAI 0.9.4](https://github.com/opencomputeproject/SAI/tree/v0.9.4). + +# Clone or fetch the code repository with all git submodules To clone the code repository recursively, assuming git version 1.9 or newer git clone --recursive https://github.com/Azure/sonic-buildimage.git From dc4dc7ba99e8d6ab3ee9d02644b2ac77248a0912 Mon Sep 17 00:00:00 2001 From: Xin Liu Date: Wed, 21 Dec 2016 16:43:41 -0800 Subject: [PATCH 0151/1011] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 47f5ae33062c..2857038178b6 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ P4[![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildi Build an [Open Network Install Environment (ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also build docker images running inside the NOS. # Prerequisite -## SAI Version +# SAI Version SONiC V2 is using [SAI 0.9.4](https://github.com/opencomputeproject/SAI/tree/v0.9.4). # Clone or fetch the code repository with all git submodules From 2380359059c76f6e0b2f10bbbeb1a3858320ef7d Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 21 Dec 2016 18:20:46 -0800 Subject: [PATCH 0152/1011] Add apt update in Dockerfile, since cached lists file may be obsoleted (#149) [docker]: Add apt update in Dockerfile, since cached lists file may be obsoleted --- dockers/docker-snmp/Dockerfile | 2 +- dockers/docker-vas/Dockerfile | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dockers/docker-snmp/Dockerfile b/dockers/docker-snmp/Dockerfile index 29bad3d746b4..7ffc0b122870 100644 --- a/dockers/docker-snmp/Dockerfile +++ b/dockers/docker-snmp/Dockerfile @@ -17,7 +17,7 @@ RUN apt-get update && \ dpkg_apt /deps/libsnmp30_*.deb && \ dpkg_apt /deps/snmp_*.deb && \ dpkg_apt /deps/snmpd_*.deb && \ - rm -rf /deps + rm -rf /deps # install subagent RUN apt-get -y install build-essential wget libssl-dev openssl supervisor && \ diff --git a/dockers/docker-vas/Dockerfile b/dockers/docker-vas/Dockerfile index 1b51bb968cff..84b5eb46d40e 100755 --- a/dockers/docker-vas/Dockerfile +++ b/dockers/docker-vas/Dockerfile @@ -5,7 +5,8 @@ COPY user-override /etc/opt/quest/vas/user-override ## Pre-install the fundamental packages ## Clean up -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ +RUN apt-get update && \ + dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ apt-get -y install \ sudo \ && \ From a01d484087f182c26cd08e38af34a774e3ea91cc Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 21 Dec 2016 20:30:26 -0800 Subject: [PATCH 0153/1011] [docker-base] Update git submodule hash (#150) --- dockers/docker-base | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-base b/dockers/docker-base index 1ae8aaa535f8..4b42689e8c5b 160000 --- a/dockers/docker-base +++ b/dockers/docker-base @@ -1 +1 @@ -Subproject commit 1ae8aaa535f8e2fd1ffa9d150abe5855d9ac2c70 +Subproject commit 4b42689e8c5b14deda6ef64a287e4641bd999bf5 From a11593a7468f9ee10faf70f5aeb116542c4c2d37 Mon Sep 17 00:00:00 2001 From: jiacao Date: Wed, 21 Dec 2016 20:30:47 -0800 Subject: [PATCH 0154/1011] Fix the redis.conf file for sonic p4 image (#151) --- platform/p4/docker-sonic-p4/Dockerfile.template | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/platform/p4/docker-sonic-p4/Dockerfile.template b/platform/p4/docker-sonic-p4/Dockerfile.template index 4f68259d02f4..357548591d1a 100644 --- a/platform/p4/docker-sonic-p4/Dockerfile.template +++ b/platform/p4/docker-sonic-p4/Dockerfile.template @@ -17,4 +17,10 @@ ADD rsyslog.conf /etc/rsyslog.conf RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /deps +RUN sed -ri 's/^daemonize yes$/daemonize no/; \ + s/^logfile .*$/logfile ""/; \ + s/^# syslog-enabled no$/syslog-enabled no/; \ + s/^# unixsocket/unixsocket/ \ + ' /etc/redis/redis.conf + ENTRYPOINT /bin/bash From e3b126893ba37f0fe3292f9f953c4d9a63d4f631 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 22 Dec 2016 21:32:07 -0800 Subject: [PATCH 0155/1011] [makefile]: Exclude p4 from building generic platform dockers (#155) --- platform/broadcom/rules.mk | 2 ++ platform/cavium/rules.mk | 2 ++ platform/mellanox/rules.mk | 2 ++ slave.mk | 1 - 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 79f00e16fa35..3ad72308b56f 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -1,3 +1,5 @@ +include $(PLATFORM_GENERIC_PATH)/rules.mk + include $(PLATFORM_PATH)/sdk.mk include $(PLATFORM_PATH)/sai.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index 7d8ef49177d3..93f89f7382cf 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -1,3 +1,5 @@ +include $(PLATFORM_GENERIC_PATH)/rules.mk + CAVM_LIBSAI = libsai.deb $(CAVM_LIBSAI)_PATH = $(PLATFORM_PATH)/cavm_sdk CAVM_SAI = sai.deb diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index abeed6c1080e..bb07273417b7 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -1,3 +1,5 @@ +include $(PLATFORM_GENERIC_PATH)/rules.mk + include $(PLATFORM_PATH)/sdk.mk include $(PLATFORM_PATH)/fw.mk include $(PLATFORM_PATH)/mft.mk diff --git a/slave.mk b/slave.mk index cb7cc0371583..74f07cad06b8 100644 --- a/slave.mk +++ b/slave.mk @@ -52,7 +52,6 @@ distclean : .platform clean include $(RULES_PATH)/config include $(RULES_PATH)/functions include $(RULES_PATH)/*.mk -include $(PLATFORM_GENERIC_PATH)/rules.mk ifneq ($(CONFIGURED_PLATFORM), undefined) include $(PLATFORM_PATH)/rules.mk endif From aefefeff0559d67a37ca191f96c2477b2d4264c9 Mon Sep 17 00:00:00 2001 From: Nadiya Date: Sat, 24 Dec 2016 01:20:45 +0200 Subject: [PATCH 0156/1011] Fix git/stg error for linux kernel build (#156) Signed-off-by: Nadiya.Stetskovych --- sonic-slave/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 7b03e4ee8162..1a09b9d8c0f0 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -103,6 +103,10 @@ RUN useradd $user -u $uid -g $guid -d /var/$user -m -s /bin/bash RUN gpasswd -a $user docker +# Config git for stg +RUN su $user -c "git config --global user.name $user" +RUN su $user -c "git config --global user.email $user@company.com" + COPY sonic-jenkins-id_rsa.pub /var/$user/.ssh/authorized_keys2 RUN chown $user /var/$user/.ssh -R RUN chmod go= /var/$user/.ssh -R From 66aebb329ccec74e92ad25875ea3e8cc2de65055 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Sat, 24 Dec 2016 01:22:06 +0200 Subject: [PATCH 0157/1011] [docker]: Change templating method to jinja2 (#115) (#153) Move from sed to jinja2 for more readability. --- .../{Dockerfile.template => Dockerfile.j2} | 9 ++++++--- .../docker-fpm/{Dockerfile.template => Dockerfile.j2} | 9 ++++++--- .../{Dockerfile.template => Dockerfile.j2} | 9 ++++++--- .../{Dockerfile.template => Dockerfile.j2} | 9 ++++++--- .../{Dockerfile.template => Dockerfile.j2} | 9 ++++++--- .../{Dockerfile.template => Dockerfile.j2} | 9 ++++++--- .../{Dockerfile.template => Dockerfile.j2} | 11 +++++++---- .../{Dockerfile.template => Dockerfile.j2} | 11 +++++++---- .../{Dockerfile.template => Dockerfile.j2} | 9 ++++++--- slave.mk | 10 ++++++---- 10 files changed, 62 insertions(+), 33 deletions(-) rename dockers/docker-database/{Dockerfile.template => Dockerfile.j2} (83%) rename dockers/docker-fpm/{Dockerfile.template => Dockerfile.j2} (67%) rename dockers/docker-lldp-sv2/{Dockerfile.template => Dockerfile.j2} (81%) rename dockers/docker-orchagent/{Dockerfile.template => Dockerfile.j2} (74%) rename dockers/docker-snmp-sv2/{Dockerfile.template => Dockerfile.j2} (92%) rename dockers/docker-team/{Dockerfile.template => Dockerfile.j2} (66%) rename platform/broadcom/docker-syncd-brcm/{Dockerfile.template => Dockerfile.j2} (53%) rename platform/mellanox/docker-syncd-mlnx/{Dockerfile.template => Dockerfile.j2} (61%) rename platform/p4/docker-sonic-p4/{Dockerfile.template => Dockerfile.j2} (87%) diff --git a/dockers/docker-database/Dockerfile.template b/dockers/docker-database/Dockerfile.j2 similarity index 83% rename from dockers/docker-database/Dockerfile.template rename to dockers/docker-database/Dockerfile.j2 index 5d26946acf0a..cc8cd9bb206a 100644 --- a/dockers/docker-database/Dockerfile.template +++ b/dockers/docker-database/Dockerfile.j2 @@ -2,17 +2,20 @@ FROM docker-base RUN apt-get update -COPY deps/ deps +COPY debs/ debs ## Install redis-tools dependencies ## TODO: implicitly install dependencies RUN apt-get -y install libjemalloc1 -SED_DPKG +RUN dpkg -i \ +{% for deb in docker_database_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN rm -rf /debs RUN sed -ri 's/^daemonize yes$/daemonize no/; \ s/^logfile .*$/logfile ""/; \ diff --git a/dockers/docker-fpm/Dockerfile.template b/dockers/docker-fpm/Dockerfile.j2 similarity index 67% rename from dockers/docker-fpm/Dockerfile.template rename to dockers/docker-fpm/Dockerfile.j2 index 47d250fb15fb..3007d8e1e53c 100644 --- a/dockers/docker-fpm/Dockerfile.template +++ b/dockers/docker-fpm/Dockerfile.j2 @@ -4,13 +4,16 @@ RUN apt-get update RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4 -COPY deps/ deps +COPY debs/ debs -SED_DPKG +RUN dpkg -i \ +{% for deb in docker_fpm_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN rm -rf /debs COPY ["start.sh", "/usr/bin/"] diff --git a/dockers/docker-lldp-sv2/Dockerfile.template b/dockers/docker-lldp-sv2/Dockerfile.j2 similarity index 81% rename from dockers/docker-lldp-sv2/Dockerfile.template rename to dockers/docker-lldp-sv2/Dockerfile.j2 index da1717f81918..833e4673733e 100644 --- a/dockers/docker-lldp-sv2/Dockerfile.template +++ b/dockers/docker-lldp-sv2/Dockerfile.j2 @@ -1,6 +1,6 @@ FROM docker-base -COPY deps /deps +COPY debs /debs COPY python-wheels /python-wheels RUN apt-get update && apt-get install -y python-pip supervisor libbsd0 libevent-2.0-5 libjansson4 libwrap0 libxml2 libpci3 libperl5.20 @@ -9,13 +9,16 @@ RUN apt-get update && apt-get install -y python-pip supervisor libbsd0 libevent- ## Install Python SSWSDK ## Install LLDP Sync Daemon -SED_DPKG +RUN dpkg -i \ +{% for deb in docker_lldp_sv2_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} RUN pip install /python-wheels/sswsdk-2.0.1-py2-none-any.whl && \ pip install /python-wheels/sonic_d-2.0.0-py2-none-any.whl && \ apt-get remove -y python-pip && \ apt-get purge -y && apt-get autoclean -y && apt-get autoremove -y && \ - rm -rf /deps /python-wheels ~/.cache + rm -rf /debs /python-wheels ~/.cache COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY reconfigure.sh /opt/reconfigure.sh diff --git a/dockers/docker-orchagent/Dockerfile.template b/dockers/docker-orchagent/Dockerfile.j2 similarity index 74% rename from dockers/docker-orchagent/Dockerfile.template rename to dockers/docker-orchagent/Dockerfile.j2 index c8c858bf2c2c..8b82102993dc 100755 --- a/dockers/docker-orchagent/Dockerfile.template +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -8,15 +8,18 @@ RUN apt-get install -f -y ifupdown bridge-utils libdbus-1-3 libdaemon0 libjansso ## TODO: implicitly install dependencies RUN apt-get -y install libjemalloc1 -COPY deps /deps +COPY debs /debs -SED_DPKG +RUN dpkg -i \ +{% for deb in docker_orchagent_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} COPY start.sh /usr/bin/start.sh ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN rm -rf /debs ENTRYPOINT ["/bin/bash"] CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-snmp-sv2/Dockerfile.template b/dockers/docker-snmp-sv2/Dockerfile.j2 similarity index 92% rename from dockers/docker-snmp-sv2/Dockerfile.template rename to dockers/docker-snmp-sv2/Dockerfile.j2 index 876a7aca3445..9d8c068064c5 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.template +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -1,6 +1,6 @@ FROM docker-base -COPY deps /deps +COPY debs /debs COPY python-wheels /python-wheels # enable -O for all Python calls @@ -12,9 +12,12 @@ ENV PYTHONOPTIMIZE 1 ## Clean up RUN apt-get update && apt-get install -y libmysqlclient-dev libmysqld-dev libperl-dev libpci-dev libpci3 libsensors4 libsensors4-dev libwrap0-dev -SED_DPKG +RUN dpkg -i \ +{% for deb in docker_snmp_sv2_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} -RUN rm -rf /deps +RUN rm -rf /debs # install subagent RUN apt-get -y install build-essential wget libssl-dev openssl supervisor && \ diff --git a/dockers/docker-team/Dockerfile.template b/dockers/docker-team/Dockerfile.j2 similarity index 66% rename from dockers/docker-team/Dockerfile.template rename to dockers/docker-team/Dockerfile.j2 index 487ff3d0434e..27c5704234ea 100644 --- a/dockers/docker-team/Dockerfile.template +++ b/dockers/docker-team/Dockerfile.j2 @@ -2,14 +2,17 @@ FROM docker-base RUN apt-get update && apt-get install -f -y libdbus-1-3 libdaemon0 libjansson4 -COPY deps /deps +COPY debs /debs -SED_DPKG +RUN dpkg -i \ +{% for deb in docker_team_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} COPY start.sh /usr/bin/start.sh RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN rm -rf /debs ENTRYPOINT ["/bin/bash"] CMD ["/usr/bin/start.sh"] diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.template b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 similarity index 53% rename from platform/broadcom/docker-syncd-brcm/Dockerfile.template rename to platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index 958c0757b283..163e664f0dec 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.template +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -2,18 +2,21 @@ FROM docker-base RUN apt-get update -COPY deps /deps +COPY debs /debs -SED_DPKG +RUN dpkg -i \ +{% for deb in docker_syncd_brcm_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} ## TODO: add kmod into Depends RUN apt-get install -f kmod -COPY ["deps/dsserve", "deps/bcmcmd", "start.sh", "/usr/bin/"] +COPY ["debs/dsserve", "debs/bcmcmd", "start.sh", "/usr/bin/"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN rm -rf /debs ENTRYPOINT ["/bin/bash"] CMD ["/usr/bin/start.sh"] diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.template b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 similarity index 61% rename from platform/mellanox/docker-syncd-mlnx/Dockerfile.template rename to platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index d71245dcd8e3..b5a58b0a0577 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.template +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -2,19 +2,22 @@ FROM docker-base RUN apt-get update -COPY deps /deps +COPY debs /debs RUN apt-get install -y libxml2 -SED_DPKG +RUN dpkg -i \ +{% for deb in docker_syncd_mlnx_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} COPY ["start.sh", "/usr/bin/"] COPY ["mlnx-fw-upgrade.sh", "/usr/bin/"] -COPY ["/deps/fw-SPC.mfa", "/etc/mlnx/"] +COPY ["/debs/fw-SPC.mfa", "/etc/mlnx/"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN rm -rf /debs ENTRYPOINT ["/bin/bash"] CMD ["/usr/bin/start.sh"] diff --git a/platform/p4/docker-sonic-p4/Dockerfile.template b/platform/p4/docker-sonic-p4/Dockerfile.j2 similarity index 87% rename from platform/p4/docker-sonic-p4/Dockerfile.template rename to platform/p4/docker-sonic-p4/Dockerfile.j2 index 357548591d1a..3cf775ea97f6 100644 --- a/platform/p4/docker-sonic-p4/Dockerfile.template +++ b/platform/p4/docker-sonic-p4/Dockerfile.j2 @@ -4,9 +4,12 @@ RUN apt-get update RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils python-ply libqt5core5a libqt5network5 libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0 libgmp10 libjudydebian1 libnanomsg0 libdaemon0 libjansson4 libjemalloc1 -COPY deps /deps +COPY debs /debs -SED_DPKG +RUN dpkg -i \ +{% for deb in docker_sonic_p4_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} ADD port_config.ini /port_config.ini ADD startup.sh /scripts/startup.sh @@ -15,7 +18,7 @@ ADD rsyslog.conf /etc/rsyslog.conf ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN rm -rf /debs RUN sed -ri 's/^daemonize yes$/daemonize no/; \ s/^logfile .*$/logfile ""/; \ diff --git a/slave.mk b/slave.mk index 74f07cad06b8..a97f4d83f5ba 100644 --- a/slave.mk +++ b/slave.mk @@ -248,13 +248,15 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.g $(FOOTER) # Targets for building docker images -$(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addprefix $(DEBS_PATH)/,$$($$*.gz_DEPENDS) $$($$*.gz_FILES)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*.gz_PYTHON_WHEELS)) $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) +$(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addprefix $(DEBS_PATH)/,$$($$*.gz_DEPENDS) $$($$*.gz_FILES)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*.gz_PYTHON_WHEELS)) $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) $$($$*.gz_PATH)/Dockerfile.j2 $(HEADER) - mkdir -p $($*.gz_PATH)/deps $(LOG) + mkdir -p $($*.gz_PATH)/debs $(LOG) mkdir -p $($*.gz_PATH)/python-wheels $(LOG) - sudo mount --bind $(DEBS_PATH) $($*.gz_PATH)/deps $(LOG) + sudo mount --bind $(DEBS_PATH) $($*.gz_PATH)/debs $(LOG) sudo mount --bind $(PYTHON_WHEELS_PATH) $($*.gz_PATH)/python-wheels $(LOG) - sed 's/SED_DPKG/RUN cd deps \&\& dpkg -i $(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DEPENDS),RDEPENDS))\n" | awk '!a[$$0]++')/g' $($*.gz_PATH)/Dockerfile.template > $($*.gz_PATH)/Dockerfile + # Export variables for j2. Use path for unique variable names, e.g. docker_orchagent_debs + $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_debs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DEPENDS),RDEPENDS))\n" | awk '!a[$$0]++')) + j2 $($*.gz_PATH)/Dockerfile.j2 > $($*.gz_PATH)/Dockerfile docker build --no-cache -t $* $($*.gz_PATH) $(LOG) docker save $* | gzip -c > $@ $(FOOTER) From b8825498daaf0a64d68db83a5962e17ff60087a0 Mon Sep 17 00:00:00 2001 From: Denys Haryachyy Date: Sat, 24 Dec 2016 01:26:51 +0200 Subject: [PATCH 0158/1011] Added rules to build syncd and orchagent containers for Cavium target (#152) * Cavium support in the new build infrastructure * Added a file with a list of cavium debian packages * docker-syncd-cavm : Added SAI and XDK libraries * docker-syncd-cavm : Removed redis-tools from docker template --- platform/cavium/cavm-sai.mk | 12 +++++++++ platform/cavium/cavm_sdk/filelist.txt | 7 +++++ platform/cavium/docker-orchagent-cavm.mk | 7 +++++ platform/cavium/docker-syncd-cavm.mk | 7 +++++ .../docker-syncd-cavm/Dockerfile.template | 18 +++++++++++++ platform/cavium/docker-syncd-cavm/start.sh | 23 ++++++++++++++++ platform/cavium/rules.mk | 26 +++++++------------ 7 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 platform/cavium/cavm-sai.mk create mode 100644 platform/cavium/cavm_sdk/filelist.txt create mode 100644 platform/cavium/docker-orchagent-cavm.mk create mode 100644 platform/cavium/docker-syncd-cavm.mk create mode 100755 platform/cavium/docker-syncd-cavm/Dockerfile.template create mode 100755 platform/cavium/docker-syncd-cavm/start.sh diff --git a/platform/cavium/cavm-sai.mk b/platform/cavium/cavm-sai.mk new file mode 100644 index 000000000000..9f537c50f37c --- /dev/null +++ b/platform/cavium/cavm-sai.mk @@ -0,0 +1,12 @@ +# Cavium SAI + +CAVM_LIBSAI = libsai.deb +$(CAVM_LIBSAI)_PATH = $(PLATFORM_PATH)/cavm_sdk +CAVM_SAI = sai.deb +$(CAVM_SAI)_PATH = $(PLATFORM_PATH)/cavm_sdk +XP_TOOLS = xp-tools.deb +$(XP_TOOLS)_PATH = $(PLATFORM_PATH)/cavm_sdk +XPSHELL = xpshell.deb +$(XPSHELL)_PATH = $(PLATFORM_PATH)/cavm_sdk + +SONIC_COPY_DEBS += $(CAVM_LIBSAI) $(CAVM_SAI) $(XP_TOOLS) $(XPSHELL) diff --git a/platform/cavium/cavm_sdk/filelist.txt b/platform/cavium/cavm_sdk/filelist.txt new file mode 100644 index 000000000000..bc40295dfbdc --- /dev/null +++ b/platform/cavium/cavm_sdk/filelist.txt @@ -0,0 +1,7 @@ +## Get vendor SAI SDK +## https://github.com/Azure/sonic-buildimage/blob/master/README.md#3-get-vendor-sai-sdk + +libsai.deb +sai.deb +xp-tools.deb +xpshell.deb diff --git a/platform/cavium/docker-orchagent-cavm.mk b/platform/cavium/docker-orchagent-cavm.mk new file mode 100644 index 000000000000..b66c7dbf0395 --- /dev/null +++ b/platform/cavium/docker-orchagent-cavm.mk @@ -0,0 +1,7 @@ +# docker image for orchagent + +DOCKER_ORCHAGENT_CAVM = docker-orchagent-cavm.gz +$(DOCKER_ORCHAGENT_CAVM)_PATH = $(DOCKERS_PATH)/docker-orchagent +$(DOCKER_ORCHAGENT_CAVM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) +$(DOCKER_ORCHAGENT_CAVM)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_CAVM) diff --git a/platform/cavium/docker-syncd-cavm.mk b/platform/cavium/docker-syncd-cavm.mk new file mode 100644 index 000000000000..fb0893df1eaf --- /dev/null +++ b/platform/cavium/docker-syncd-cavm.mk @@ -0,0 +1,7 @@ +# docker image for cavium syncd + +DOCKER_SYNCD_CAVM = docker-syncd-cavm.gz +$(DOCKER_SYNCD_CAVM)_PATH = $(PLATFORM_PATH)/docker-syncd-cavm +$(DOCKER_SYNCD_CAVM)_DEPENDS += $(SYNCD) $(CAVM_LIBSAI) $(XP_TOOLS) $(XPSHELL) $(REDIS_TOOLS) +$(DOCKER_SYNCD_CAVM)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CAVM) diff --git a/platform/cavium/docker-syncd-cavm/Dockerfile.template b/platform/cavium/docker-syncd-cavm/Dockerfile.template new file mode 100755 index 000000000000..d40051e2858d --- /dev/null +++ b/platform/cavium/docker-syncd-cavm/Dockerfile.template @@ -0,0 +1,18 @@ +FROM docker-base + +RUN apt-get update + +COPY deps /deps + +RUN apt-get -y install libpcap-dev libxml2-dev python-dev swig libsensors4-dev + +SED_DPKG + +COPY ["start.sh", "/usr/bin/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /deps + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/platform/cavium/docker-syncd-cavm/start.sh b/platform/cavium/docker-syncd-cavm/start.sh new file mode 100755 index 000000000000..21d61e707344 --- /dev/null +++ b/platform/cavium/docker-syncd-cavm/start.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +export XP_ROOT=/usr/bin/ + +service rsyslog start + +while true; do + + # Check if redis-server starts + + result=$(redis-cli ping) + + if [ "$result" == "PONG" ]; then + + redis-cli FLUSHALL + syncd -p /etc/ssw/AS7512/profile.ini -N + break + + fi + + sleep 1 + +done diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index 93f89f7382cf..efb9159c34d6 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -1,23 +1,15 @@ include $(PLATFORM_GENERIC_PATH)/rules.mk -CAVM_LIBSAI = libsai.deb -$(CAVM_LIBSAI)_PATH = $(PLATFORM_PATH)/cavm_sdk -CAVM_SAI = sai.deb -$(CAVM_SAI)_PATH = $(PLATFORM_PATH)/cavm_sdk -XP_TOOLS = xp-tools.deb -$(XP_TOOLS)_PATH = $(PLATFORM_PATH)/cavm_sdk -XPSHELL = xpshell.deb -$(XPSHELL)_PATH = $(PLATFORM_PATH)/cavm_sdk +include $(PLATFORM_PATH)/cavm-sai.mk +include $(PLATFORM_PATH)/docker-syncd-cavm.mk +include $(PLATFORM_PATH)/docker-orchagent-cavm.mk -SONIC_COPY_DEBS += $(CAVM_LIBSAI) $(CAVM_SAI) $(XP_TOOLS) $(XPSHELL) +SONIC_ALL += $(DOCKER_SYNCD_CAVM) \ + $(DOCKER_ORCHAGENT_CAVM) -# TODO: Put dependencies for SDK packages +# Inject cavium sai into sairedis +$(LIBSAIREDIS)_DEPENDS += $(CAVM_SAI) $(CAVM_LIBSAI) -SONIC_ALL += $(SONIC_GENERIC) $(DOCKER_SYNCD_CAVM) $(DOCKER_ORCHAGENT) \ - $(DOCKER_FPM) +# Runtime dependency on cavium sai is set only for syncd +$(SYNCD)_RDEPENDS += $(CAVM_SAI) -# Inject cavm sai into sairedis -$(LIBSAIREDIS)_DEPENDS += $(CAVM_LIBSAI) - -# Runtime dependency on cavm sai is set only for syncd -$(SYNCD)_RDEPENDS += $(CAVM_LIBSAI) From 38aa59787583fa57003997cf1668ddac9966000e Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 24 Dec 2016 12:07:53 -0800 Subject: [PATCH 0159/1011] [p4]: update p4-switch submodule to fix p4 qos scheduler query (#158) --- platform/p4/p4-switch/switch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/p4/p4-switch/switch b/platform/p4/p4-switch/switch index d6346b9b3339..fff59db0f28f 160000 --- a/platform/p4/p4-switch/switch +++ b/platform/p4/p4-switch/switch @@ -1 +1 @@ -Subproject commit d6346b9b3339a2a1243c1e7a1b00b71c66fa6cb5 +Subproject commit fff59db0f28fe4309d2032c1b2aba477d542f359 From 4673be0d707e6944df720c24903964bb86368e32 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 25 Dec 2016 00:44:06 -0800 Subject: [PATCH 0160/1011] add download url for broadcom sai/sdk deb packages (#159) --- platform/broadcom/docker-syncd-brcm.mk | 2 +- platform/broadcom/rules.mk | 14 ++++++++------ platform/broadcom/sai.mk | 13 ++++++++----- platform/broadcom/sdk.mk | 9 ++++++--- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/platform/broadcom/docker-syncd-brcm.mk b/platform/broadcom/docker-syncd-brcm.mk index 42fe63c86a44..e1f02c59fa12 100644 --- a/platform/broadcom/docker-syncd-brcm.mk +++ b/platform/broadcom/docker-syncd-brcm.mk @@ -3,6 +3,6 @@ DOCKER_SYNCD_BRCM = docker-syncd-brcm.gz $(DOCKER_SYNCD_BRCM)_PATH = $(PLATFORM_PATH)/docker-syncd-brcm $(DOCKER_SYNCD_BRCM)_DEPENDS += $(SYNCD) -$(DOCKER_SYNCD_BRCM)_FILES += $(BRCM_DSSERVE) $(BRCM_BCMCMD) +$(DOCKER_SYNCD_BRCM)_FILES += $(DSSERVE) $(BCMCMD) $(DOCKER_SYNCD_BRCM)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 3ad72308b56f..d1865d2eaf55 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -5,15 +5,17 @@ include $(PLATFORM_PATH)/sai.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk -BRCM_DSSERVE = dsserve -$(BRCM_DSSERVE)_PATH = $(PLATFORM_PATH)/sdk -BRCM_BCMCMD = bcmcmd -$(BRCM_BCMCMD)_PATH = $(PLATFORM_PATH)/sdk +BCMCMD = bcmcmd +$(BCMCMD)_URL = "https://sonicstorage.blob.core.windows.net/packages/bcmcmd?sv=2015-04-05&sr=b&sig=X3bFApmsNFmcnWM9mSGRxBugPcg%2FgJCHh5hhSuV1M2c%3D&se=2030-08-23T14%3A41%3A56Z&sp=r" -SONIC_COPY_FILES += $(BRCM_DSSERVE) $(BRCM_BCMCMD) +DSSERVE = dsserve +$(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/dsserve?sv=2015-04-05&sr=b&sig=aMlnRA%2FXZNmHPgmOj%2FNMJMYLWyvva1QrN4HcsVXvqKA%3D&se=2030-08-23T14%3A42%3A32Z&sp=r" + +SONIC_ONLINE_FILES += $(BCMCMD) $(DSSERVE) SONIC_ALL += $(DOCKER_SYNCD_BRCM) \ - $(DOCKER_ORCHAGENT_BRCM) + $(DOCKER_ORCHAGENT_BRCM) \ + debs/$(BRCM_OPENNSL_KERNEL) # Inject brcm sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index ecedb48edd7a..2185edefe2b1 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,10 +1,13 @@ -BRCM_SAI = libsaibcm_2.0.3.7~20161214010054.112_amd64.deb -$(BRCM_SAI)_PATH = $(PLATFORM_PATH)/sdk -BRCM_SAI_DEV = libsaibcm-dev_2.0.3.7~20161214010054.112_amd64.deb -$(BRCM_SAI_DEV)_PATH = $(PLATFORM_PATH)/sdk +BRCM_SAI = libsaibcm_2.0.3.7_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.0.3.7_amd64.deb?sv=2015-04-05&sr=b&sig=3S9pY5Allql4fguipFdilJ%2BzP%2Ff4dvUFe3mNY3uhCIc%3D&se=2030-09-02T21%3A43%3A38Z&sp=r" + +BRCM_SAI_DEV = libsaibcm-dev_2.0.3.7_amd64.deb + $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -SONIC_COPY_DEBS += $(BRCM_SAI) +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.0.3.7_amd64.deb?sv=2015-04-05&sr=b&sig=KI8DfgGW8%2BOoZL6tJ9aJa%2F3RvHi%2FXD8gtOcDUD5nOPA%3D&se=2030-09-03T04%3A52%3A41Z&sp=r" + +SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index d3d94e606a64..7778e2cf5376 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,4 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.1.5+0~20161214000201.54~1.gbpb514c3_amd64.deb -$(BRCM_OPENNSL)_PATH = $(PLATFORM_PATH)/sdk +BRCM_OPENNSL = libopennsl_3.2.1.5_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5_amd64.deb?sv=2015-04-05&sr=b&sig=qm6%2BkiGuRGsFKwZcUz6yEtbgbbwQuhxEr0chLM7qJEQ%3D&se=2030-09-02T21%3A41%3A11Z&sp=r" -SONIC_COPY_DEBS += $(BRCM_OPENNSL) +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5_amd64.deb?sv=2015-04-05&sr=b&sig=c8hO5PQpvod7IX3aYOiyvFB9rICxDgGiFF5g3GDHx84%3D&se=2030-09-02T21%3A42%3A34Z&sp=r" + +SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 3f1a7895b8dc88787e593b52e0f854e12be584df Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 25 Dec 2016 09:53:47 -0800 Subject: [PATCH 0161/1011] [p4]: update p4-switch submodule (#160) --- platform/p4/p4-switch/switch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/p4/p4-switch/switch b/platform/p4/p4-switch/switch index fff59db0f28f..21adcdddac59 160000 --- a/platform/p4/p4-switch/switch +++ b/platform/p4/p4-switch/switch @@ -1 +1 @@ -Subproject commit fff59db0f28fe4309d2032c1b2aba477d542f359 +Subproject commit 21adcdddac59b75e4627255a12f1ed1a4369bb62 From 057eea849676d4d13b102210ef256e9d0494bcf7 Mon Sep 17 00:00:00 2001 From: Denys Haryachyy Date: Tue, 27 Dec 2016 02:16:52 +0200 Subject: [PATCH 0162/1011] docker-syncd-cavm : Changed template method to jinja2 (#161) * Cavium support in the new build infrastructure * Added a file with a list of cavium debian packages * docker-syncd-cavm : Added SAI and XDK libraries * docker-syncd-cavm : Removed redis-tools from docker template * docker-syncd-cavm : Changed templating method to jinja2 * docker-syncd-cavm : Install libjemalloc1 --- .../{Dockerfile.template => Dockerfile.j2} | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) rename platform/cavium/docker-syncd-cavm/{Dockerfile.template => Dockerfile.j2} (62%) diff --git a/platform/cavium/docker-syncd-cavm/Dockerfile.template b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 similarity index 62% rename from platform/cavium/docker-syncd-cavm/Dockerfile.template rename to platform/cavium/docker-syncd-cavm/Dockerfile.j2 index d40051e2858d..f8e48259e8be 100755 --- a/platform/cavium/docker-syncd-cavm/Dockerfile.template +++ b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 @@ -2,17 +2,20 @@ FROM docker-base RUN apt-get update -COPY deps /deps +COPY debs /debs -RUN apt-get -y install libpcap-dev libxml2-dev python-dev swig libsensors4-dev +RUN apt-get -y install libpcap-dev libxml2-dev python-dev swig libsensors4-dev libjemalloc1 -SED_DPKG +RUN dpkg -i \ +{% for deb in docker_syncd_cavm_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} COPY ["start.sh", "/usr/bin/"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps +RUN rm -rf /debs ENTRYPOINT ["/bin/bash"] CMD ["/usr/bin/start.sh"] From 2c444590e96a0427af98c8cd2ac960609bfff91f Mon Sep 17 00:00:00 2001 From: jiacao Date: Tue, 27 Dec 2016 15:10:02 -0800 Subject: [PATCH 0163/1011] Take sonic-swss commit 96b5b523a0dedf237228b118f0420f117dca2a5b (#164) --- platform/p4/docker-sonic-p4/startup.sh | 3 +++ src/sonic-swss | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/platform/p4/docker-sonic-p4/startup.sh b/platform/p4/docker-sonic-p4/startup.sh index 319ac8e57850..e5221f834259 100755 --- a/platform/p4/docker-sonic-p4/startup.sh +++ b/platform/p4/docker-sonic-p4/startup.sh @@ -1,5 +1,8 @@ #!/bin/bash +echo "Set onie_platform to x86_64-barefoot_p4-r0" +export onie_platform=x86_64-barefoot_p4-r0 + echo "Start rsyslog" service rsyslog start diff --git a/src/sonic-swss b/src/sonic-swss index 205405667396..96b5b523a0de 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 205405667396f606d9560ed6d861063f35f07d94 +Subproject commit 96b5b523a0dedf237228b118f0420f117dca2a5b From fe5074f48e2789dd12a28679b2d0db89cb11fc1f Mon Sep 17 00:00:00 2001 From: Nadiya Date: Wed, 28 Dec 2016 01:16:18 +0200 Subject: [PATCH 0164/1011] Update linux-kernel hash commit (#163) Signed-off-by: Nadiya.Stetskovych --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index db5ba1485acd..971c8b1b7b31 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit db5ba1485acd7dd9620bf3216c21bb4c3efebfb5 +Subproject commit 971c8b1b7b3180ae92ce1c8e8246198a2d177709 From caf5333386cb9b28096d70aacd8e53d82efca174 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 28 Dec 2016 06:10:01 -0800 Subject: [PATCH 0165/1011] [kernel]: update sonic-linux-kernel submodule to integrate with build (#165) --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 971c8b1b7b31..74a38ccde0d6 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 971c8b1b7b3180ae92ce1c8e8246198a2d177709 +Subproject commit 74a38ccde0d65f7aa7b9797510fc95cd318f7919 From 8bdb59b5b0465b5ffdb45e714ddebb5a471ee6b6 Mon Sep 17 00:00:00 2001 From: Denys Haryachyy Date: Wed, 28 Dec 2016 22:34:41 +0200 Subject: [PATCH 0166/1011] platform/cavium : Download debian packages (#162) * platform/cavium : Download debian packages * platform/cavium : Removed obsolete Makefile rules * platform/cavium : Replaced branch name with commit id --- platform/cavium/cavm-sai.mk | 13 +++++++------ platform/cavium/docker-syncd-cavm.mk | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/platform/cavium/cavm-sai.mk b/platform/cavium/cavm-sai.mk index 9f537c50f37c..c0e16e1ebd94 100644 --- a/platform/cavium/cavm-sai.mk +++ b/platform/cavium/cavm-sai.mk @@ -1,12 +1,13 @@ # Cavium SAI +CAVM_SAI_GITHUB = https://github.com/garyachy/OpenXPS/raw/3c2dbbee23ee76570bbdb11d4955882279cc3f9a/SAI/cavm-sai + CAVM_LIBSAI = libsai.deb -$(CAVM_LIBSAI)_PATH = $(PLATFORM_PATH)/cavm_sdk CAVM_SAI = sai.deb -$(CAVM_SAI)_PATH = $(PLATFORM_PATH)/cavm_sdk XP_TOOLS = xp-tools.deb -$(XP_TOOLS)_PATH = $(PLATFORM_PATH)/cavm_sdk -XPSHELL = xpshell.deb -$(XPSHELL)_PATH = $(PLATFORM_PATH)/cavm_sdk -SONIC_COPY_DEBS += $(CAVM_LIBSAI) $(CAVM_SAI) $(XP_TOOLS) $(XPSHELL) +$(CAVM_LIBSAI)_URL = $(CAVM_SAI_GITHUB)/$(CAVM_LIBSAI) +$(CAVM_SAI)_URL = $(CAVM_SAI_GITHUB)/$(CAVM_SAI) +$(XP_TOOLS)_URL = $(CAVM_SAI_GITHUB)/$(XP_TOOLS) + +SONIC_ONLINE_DEBS += $(CAVM_LIBSAI) $(CAVM_SAI) $(XP_TOOLS) diff --git a/platform/cavium/docker-syncd-cavm.mk b/platform/cavium/docker-syncd-cavm.mk index fb0893df1eaf..ec410ca3052d 100644 --- a/platform/cavium/docker-syncd-cavm.mk +++ b/platform/cavium/docker-syncd-cavm.mk @@ -2,6 +2,6 @@ DOCKER_SYNCD_CAVM = docker-syncd-cavm.gz $(DOCKER_SYNCD_CAVM)_PATH = $(PLATFORM_PATH)/docker-syncd-cavm -$(DOCKER_SYNCD_CAVM)_DEPENDS += $(SYNCD) $(CAVM_LIBSAI) $(XP_TOOLS) $(XPSHELL) $(REDIS_TOOLS) +$(DOCKER_SYNCD_CAVM)_DEPENDS += $(SYNCD) $(CAVM_LIBSAI) $(XP_TOOLS) $(REDIS_TOOLS) $(DOCKER_SYNCD_CAVM)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CAVM) From 7b4d715dcca4f12f9121dd1f5ddb3dbd82aef60d Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 28 Dec 2016 17:57:07 -0800 Subject: [PATCH 0167/1011] add quagga teamd targets into docker-sonic-p4 (#166) --- platform/p4/docker-sonic-p4.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/p4/docker-sonic-p4.mk b/platform/p4/docker-sonic-p4.mk index 0e10e9e319fc..df944be4c363 100644 --- a/platform/p4/docker-sonic-p4.mk +++ b/platform/p4/docker-sonic-p4.mk @@ -2,6 +2,6 @@ DOCKER_SONIC_P4 = docker-sonic-p4.gz $(DOCKER_SONIC_P4)_PATH = $(PLATFORM_PATH)/docker-sonic-p4 -$(DOCKER_SONIC_P4)_DEPENDS += $(SWSS) $(SYNCD) $(P4_SWITCH) $(REDIS_SERVER) $(REDIS_TOOLS) +$(DOCKER_SONIC_P4)_DEPENDS += $(SWSS) $(SYNCD) $(P4_SWITCH) $(REDIS_SERVER) $(REDIS_TOOLS) $(QUAGGA) $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(DOCKER_SONIC_P4)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SONIC_P4) From 26930e5e172fff73a376b7fd4cb46e55a0ecab64 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 28 Dec 2016 19:05:09 -0800 Subject: [PATCH 0168/1011] install latest intel igb driver 5.3.5.4 in the base image (#167) --- build_debian.sh | 3 ++ rules/igb.mk | 8 ++++ rules/linux-kernel.mk | 2 +- rules/sonic-aboot.mk | 2 +- rules/sonic-generic.mk | 2 +- src/igb/Makefile | 23 ++++++++++++ ...or-BCM54616-phy-for-intel-igb-driver.patch | 37 +++++++++++++++++++ 7 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 rules/igb.mk create mode 100644 src/igb/Makefile create mode 100644 src/igb/patch/0001-add-support-for-BCM54616-phy-for-intel-igb-driver.patch diff --git a/build_debian.sh b/build_debian.sh index 185825cf34b7..7a4e2f33c77c 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -129,6 +129,9 @@ sudo cp files/initramfs-tools/union-fsck $FILESYSTEM_ROOT/etc/initramfs-tools/ho sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/union-fsck sudo chroot $FILESYSTEM_ROOT update-initramfs -u +## Install latest intel igb driver +sudo cp target/debs/igb.ko $FILESYSTEM_ROOT/lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/intel/igb/igb.ko + ## Install docker echo '[INFO] Install docker' ## Install apparmor utils since they're missing and apparmor is enabled in the kernel diff --git a/rules/igb.mk b/rules/igb.mk new file mode 100644 index 000000000000..654c4bd77037 --- /dev/null +++ b/rules/igb.mk @@ -0,0 +1,8 @@ +# initramfs-tools package + +IGB_DRIVER_VERSION = 5.3.5.4 +export IGB_DRIVER_VERSION + +IGB_DRIVER = igb.ko +$(IGB_DRIVER)_SRC_PATH = $(SRC_PATH)/igb +SONIC_MAKE_DEBS += $(IGB_DRIVER) diff --git a/rules/linux-kernel.mk b/rules/linux-kernel.mk index 6aae74dc2b95..fbda245b8d45 100644 --- a/rules/linux-kernel.mk +++ b/rules/linux-kernel.mk @@ -1,4 +1,4 @@ -# redis package +# linux kernel package KVERSION = 3.16.0-4-amd64 diff --git a/rules/sonic-aboot.mk b/rules/sonic-aboot.mk index 7db01c10d3b5..c2762cfa012e 100644 --- a/rules/sonic-aboot.mk +++ b/rules/sonic-aboot.mk @@ -2,5 +2,5 @@ SONIC_ABOOT = sonic-aboot.bin $(SONIC_ABOOT)_MACHINE = aboot -$(SONIC_ABOOT)_DEPENDS += $(LINUX_KERNEL) $(INITRAMFS_TOOLS) +$(SONIC_ABOOT)_DEPENDS += $(LINUX_KERNEL) $(INITRAMFS_TOOLS) $(IGB_DRIVER) SONIC_INSTALLERS += $(SONIC_ABOOT) diff --git a/rules/sonic-generic.mk b/rules/sonic-generic.mk index a87c39c65127..807e26dbfd0e 100644 --- a/rules/sonic-generic.mk +++ b/rules/sonic-generic.mk @@ -2,5 +2,5 @@ SONIC_GENERIC = sonic-generic.bin $(SONIC_GENERIC)_MACHINE = generic -$(SONIC_GENERIC)_DEPENDS += $(LINUX_KERNEL) $(INITRAMFS_TOOLS) +$(SONIC_GENERIC)_DEPENDS += $(LINUX_KERNEL) $(INITRAMFS_TOOLS) $(IGB_DRIVER) SONIC_INSTALLERS += $(SONIC_GENERIC) diff --git a/src/igb/Makefile b/src/igb/Makefile new file mode 100644 index 000000000000..ab8c68cef32d --- /dev/null +++ b/src/igb/Makefile @@ -0,0 +1,23 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = igb.ko + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + rm -rf ./igb-$(IGB_DRIVER_VERSION) + wget -O igb-$(IGB_DRIVER_VERSION).tar.gz "https://downloadmirror.intel.com/13663/eng/igb-$(IGB_DRIVER_VERSION).tar.gz" + tar xzf igb-$(IGB_DRIVER_VERSION).tar.gz + + # Patch + pushd ./igb-$(IGB_DRIVER_VERSION) + patch -p1 < ../patch/0001-add-support-for-BCM54616-phy-for-intel-igb-driver.patch + + # Build the package + pushd src + export BUILD_KERNEL=3.16.0-4-amd64 + make + popd + + popd + mv ./igb-$(IGB_DRIVER_VERSION)/src/$* $(DEST)/ diff --git a/src/igb/patch/0001-add-support-for-BCM54616-phy-for-intel-igb-driver.patch b/src/igb/patch/0001-add-support-for-BCM54616-phy-for-intel-igb-driver.patch new file mode 100644 index 000000000000..3059c5f6f951 --- /dev/null +++ b/src/igb/patch/0001-add-support-for-BCM54616-phy-for-intel-igb-driver.patch @@ -0,0 +1,37 @@ +From 548db654a498a017ce121292f12820176544e6ed Mon Sep 17 00:00:00 2001 +From: Guohan Lu +Date: Tue, 27 Dec 2016 23:21:22 +0000 +Subject: [PATCH] add support for BCM54616 phy for intel igb driver + +--- + src/e1000_82575.c | 1 + + src/e1000_defines.h | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/src/e1000_82575.c b/src/e1000_82575.c +index b4b973e..248c670 100644 +--- a/src/e1000_82575.c ++++ b/src/e1000_82575.c +@@ -223,6 +223,7 @@ static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) + case M88E1112_E_PHY_ID: + case M88E1340M_E_PHY_ID: + case M88E1111_I_PHY_ID: ++ case BCM54616_E_PHY_ID: + phy->type = e1000_phy_m88; + phy->ops.check_polarity = e1000_check_polarity_m88; + phy->ops.get_info = e1000_get_phy_info_m88; +diff --git a/src/e1000_defines.h b/src/e1000_defines.h +index 6de3988..d5da148 100644 +--- a/src/e1000_defines.h ++++ b/src/e1000_defines.h +@@ -1185,6 +1185,7 @@ + #define I210_I_PHY_ID 0x01410C00 + #define IGP04E1000_E_PHY_ID 0x02A80391 + #define M88_VENDOR 0x0141 ++#define BCM54616_E_PHY_ID 0x03625D10 + + /* M88E1000 Specific Registers */ + #define M88E1000_PHY_SPEC_CTRL 0x10 /* PHY Specific Control Reg */ +-- +1.9.1 + From 66e3392e8a75d5afbd1877f7851283a8855cceb0 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 29 Dec 2016 00:15:31 -0800 Subject: [PATCH 0169/1011] [linux-kernel]: update linux kernel to 3.16.36-1+deb8u2 (#168) --- rules/linux-kernel.mk | 2 +- src/sonic-linux-kernel | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/linux-kernel.mk b/rules/linux-kernel.mk index fbda245b8d45..46467666539e 100644 --- a/rules/linux-kernel.mk +++ b/rules/linux-kernel.mk @@ -4,6 +4,6 @@ KVERSION = 3.16.0-4-amd64 export KVERSION -LINUX_KERNEL = linux-image-3.16.0-4-amd64_3.16.7-ckt11-2+acs8u2_amd64.deb +LINUX_KERNEL = linux-image-3.16.0-4-amd64_3.16.36-1+deb8u2_amd64.deb $(LINUX_KERNEL)_SRC_PATH = $(SRC_PATH)/sonic-linux-kernel SONIC_MAKE_DEBS += $(LINUX_KERNEL) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 74a38ccde0d6..b21e14354e95 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 74a38ccde0d65f7aa7b9797510fc95cd318f7919 +Subproject commit b21e14354e959db2a0639334b7d4f6f9eaa4d1d1 From 5a5f5c26da67a9e92c60a606e7479ba659b243f8 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 29 Dec 2016 09:53:46 -0800 Subject: [PATCH 0170/1011] [linux-kernel]: fix sched: Fix race between task_group and sched_task_group (#169) --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index b21e14354e95..5b652fca4fe6 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit b21e14354e959db2a0639334b7d4f6f9eaa4d1d1 +Subproject commit 5b652fca4fe6f215e2869ae1d2e6ef44b3553698 From 03660d9dd38641ddc39b066a4b1dfa71454317de Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 29 Dec 2016 10:03:59 -0800 Subject: [PATCH 0171/1011] add build badge for Cavium platform --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2857038178b6..c821fd47ecbc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ Broadcom[![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) +Cavium[![Cavium](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) Mellanox[![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) P4[![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all) @@ -64,8 +65,11 @@ The target directory is ./target, containing the NOS installer image and docker - docker-base.gz: base docker image where other docker images are built from, only used in build process (gzip tar archive) - docker-database.gz: docker image for in-memory key-value store, used as inter-process communication (gzip tar archive) - docker-fpm.gz: docker image for quagga with fpm module enabled (gzip tar archive) -- docker-orchagent.gz: docker image for SWitch State Service (SWSS) (gzip tar archive) -- docker-syncd.gz: docker image for the daemon to sync database and Broadcom switch ASIC (gzip tar archive) +- docker-orchagent-brcm.gz: docker image for SWitch State Service (SWSS) on Broadcom platform (gzip tar archive) +- docker-orchagent-cavm.gz: docker image for SWitch State Service (SWSS) on Cavium platform (gzip tar archive) +- docker-orchagent-mlnx.gz: docker image for SWitch State Service (SWSS) on Mellanox platform (gzip tar archive) +- docker-syncd-brcm.gz: docker image for the daemon to sync database and Broadcom switch ASIC (gzip tar archive) +- docker-syncd-cavm.gz: docker image for the daemon to sync database and Cavium switch ASIC (gzip tar archive) - docker-syncd-mlnx.gz: docker image for the daemon to sync database and Mellanox switch ASIC (gzip tar archive) - docker-sonic-p4.gz: docker image for all-in-one for p4 software switch (gzip tar archive) From 4123f684f344076f1f80b5409740c351afe7157b Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 29 Dec 2016 12:14:19 -0800 Subject: [PATCH 0172/1011] [sonic-slave] Use fictional company for the email adddress of sonic-slave user (#170) --- sonic-slave/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 1a09b9d8c0f0..2a06770dfed9 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -105,7 +105,7 @@ RUN gpasswd -a $user docker # Config git for stg RUN su $user -c "git config --global user.name $user" -RUN su $user -c "git config --global user.email $user@company.com" +RUN su $user -c "git config --global user.email $user@contoso.com" COPY sonic-jenkins-id_rsa.pub /var/$user/.ssh/authorized_keys2 RUN chown $user /var/$user/.ssh -R From bc03c196a4cf1c6c452b484337923f59b8db8647 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 29 Dec 2016 18:38:08 -0800 Subject: [PATCH 0173/1011] [swss]: bring swss submodule to the latest (#172) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 96b5b523a0de..4c753eb8133d 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 96b5b523a0dedf237228b118f0420f117dca2a5b +Subproject commit 4c753eb8133d1ac708190c89ed75c2274bce4c5d From 930ee3f89da76374fd47562c23e785dfc1e7b6aa Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 30 Dec 2016 10:40:40 -0800 Subject: [PATCH 0174/1011] [baseimage] Install package without starting service (#171) * Install package without starting service * No need to mount /sys in chroot * (comment) --- build_debian.sh | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 7a4e2f33c77c..fdefde3bb153 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -81,13 +81,6 @@ echo '[INFO] Mount all' mount trap_push 'sudo umount $FILESYSTEM_ROOT/proc || true' sudo LANG=C chroot $FILESYSTEM_ROOT mount proc /proc -t proc -clean_sys() { - sudo umount $FILESYSTEM_ROOT/sys/fs/cgroup/* \ - $FILESYSTEM_ROOT/sys/fs/cgroup \ - $FILESYSTEM_ROOT/sys || true -} -trap_push clean_sys -sudo LANG=C chroot $FILESYSTEM_ROOT mount sysfs /sys -t sysfs ## Pointing apt to public apt mirrors and getting latest packages, needed for latest security updates sudo cp files/apt/sources.list $FILESYSTEM_ROOT/etc/apt/ @@ -132,6 +125,15 @@ sudo chroot $FILESYSTEM_ROOT update-initramfs -u ## Install latest intel igb driver sudo cp target/debs/igb.ko $FILESYSTEM_ROOT/lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/intel/igb/igb.ko +## Install package without starting service +## ref: https://wiki.debian.org/chroot +trap_push 'sudo rm -f $FILESYSTEM_ROOT/usr/sbin/policy-rc.d' +sudo tee -a $FILESYSTEM_ROOT/usr/sbin/policy-rc.d > /dev/null < Date: Fri, 30 Dec 2016 23:34:38 +0200 Subject: [PATCH 0175/1011] [docker-teamd]: rename docker-team to docker-teamd (#174) --- dockers/{docker-team => docker-teamd}/Dockerfile.j2 | 2 +- dockers/{docker-team => docker-teamd}/start.sh | 0 platform/generic/rules.mk | 2 +- platform/mellanox/rules.mk | 2 +- rules/docker-team.mk | 7 ------- rules/docker-teamd.mk | 7 +++++++ 6 files changed, 10 insertions(+), 10 deletions(-) rename dockers/{docker-team => docker-teamd}/Dockerfile.j2 (87%) rename dockers/{docker-team => docker-teamd}/start.sh (100%) delete mode 100644 rules/docker-team.mk create mode 100644 rules/docker-teamd.mk diff --git a/dockers/docker-team/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 similarity index 87% rename from dockers/docker-team/Dockerfile.j2 rename to dockers/docker-teamd/Dockerfile.j2 index 27c5704234ea..3cbb5007507d 100644 --- a/dockers/docker-team/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -5,7 +5,7 @@ RUN apt-get update && apt-get install -f -y libdbus-1-3 libdaemon0 libjansson4 COPY debs /debs RUN dpkg -i \ -{% for deb in docker_team_debs.split(' ') -%} +{% for deb in docker_teamd_debs.split(' ') -%} debs/{{ deb }}{{' '}} {%- endfor %} diff --git a/dockers/docker-team/start.sh b/dockers/docker-teamd/start.sh similarity index 100% rename from dockers/docker-team/start.sh rename to dockers/docker-teamd/start.sh diff --git a/platform/generic/rules.mk b/platform/generic/rules.mk index 5ef6468b2f7e..cff64a8b6003 100644 --- a/platform/generic/rules.mk +++ b/platform/generic/rules.mk @@ -1,6 +1,6 @@ SONIC_ALL += $(DOCKER_DATABASE) \ $(DOCKER_FPM) \ - $(DOCKER_TEAM) \ + $(DOCKER_TEAMD) \ $(DOCKER_LLDP_SV2) \ $(DOCKER_SNMP_SV2) \ $(DOCKER_PLATFORM_MONITOR) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index bb07273417b7..debf4a4606da 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -14,7 +14,7 @@ SONIC_ALL += $(DOCKER_SYNCD_MLNX) \ $(DOCKER_DATABASE) \ $(DOCKER_LLDP_SV2) \ $(DOCKER_SNMP_SV2) \ - $(DOCKER_TEAM) \ + $(DOCKER_TEAMD) \ $(DOCKER_PLATFORM_MONITOR) \ debs/$(MLNX_HW_MANAGEMENT) \ debs/$(SX_KERNEL) diff --git a/rules/docker-team.mk b/rules/docker-team.mk deleted file mode 100644 index 3f5b99ac9666..000000000000 --- a/rules/docker-team.mk +++ /dev/null @@ -1,7 +0,0 @@ -# docker image for team agent - -DOCKER_TEAM = docker-team.gz -$(DOCKER_TEAM)_PATH = $(DOCKERS_PATH)/docker-team -$(DOCKER_TEAM)_DEPENDS += $(SWSS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) -$(DOCKER_TEAM)_LOAD_DOCKERS += $(DOCKER_BASE) -SONIC_DOCKER_IMAGES += $(DOCKER_TEAM) diff --git a/rules/docker-teamd.mk b/rules/docker-teamd.mk new file mode 100644 index 000000000000..0760f27902ae --- /dev/null +++ b/rules/docker-teamd.mk @@ -0,0 +1,7 @@ +# docker image for teamd agent + +DOCKER_TEAMD = docker-teamd.gz +$(DOCKER_TEAMD)_PATH = $(DOCKERS_PATH)/docker-teamd +$(DOCKER_TEAMD)_DEPENDS += $(SWSS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) +$(DOCKER_TEAMD)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_TEAMD) From 61496a5959cff4c317f998da6605d8b3072a7de4 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Fri, 30 Dec 2016 23:35:04 +0200 Subject: [PATCH 0176/1011] [docker]: Remove obsolete dockers (#175) docker-syncd-mlnx and docker-syncd-cavm were moved to platform directories --- dockers/docker-syncd-cavm/Dockerfile | 30 ----------- dockers/docker-syncd-cavm/start.sh | 23 --------- dockers/docker-syncd-mlnx/Dockerfile | 39 -------------- dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh | 53 -------------------- dockers/docker-syncd-mlnx/start.sh | 21 -------- 5 files changed, 166 deletions(-) delete mode 100755 dockers/docker-syncd-cavm/Dockerfile delete mode 100755 dockers/docker-syncd-cavm/start.sh delete mode 100755 dockers/docker-syncd-mlnx/Dockerfile delete mode 100755 dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh delete mode 100755 dockers/docker-syncd-mlnx/start.sh diff --git a/dockers/docker-syncd-cavm/Dockerfile b/dockers/docker-syncd-cavm/Dockerfile deleted file mode 100755 index 41298a29ede4..000000000000 --- a/dockers/docker-syncd-cavm/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -FROM docker-base - -RUN apt-get update - -COPY ["deps/libhiredis0.13*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "deps/libswsscommon_*.deb", "deps/libsairedis_*.deb", "deps/libsaimetadata_*.deb", "deps/syncd_*.deb", "deps/sai*.deb", "deps/libsai*.deb", "deps/xp-tools*.deb", "deps/xpshell*.deb", "/deps/"] - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/libhiredis0.13*.deb \ - && dpkg_apt /deps/libnl-3-200_*.deb \ - && dpkg_apt /deps/libnl-genl-3-200_*.deb \ - && dpkg_apt /deps/libnl-route-3-200_*.deb \ - && dpkg_apt /deps/libswsscommon_*.deb \ - && dpkg_apt /deps/sai*.deb \ - && dpkg_apt /deps/libsai*.deb \ - && dpkg_apt /deps/xp-tools*.deb \ - && dpkg_apt /deps/xpshell*.deb \ - && dpkg_apt /deps/libsairedis_*.deb \ - && dpkg_apt /deps/libsaimetadata_*.deb \ - && dpkg_apt /deps/syncd_*.deb - -RUN apt-get -y install libpcap-dev libxml2-dev python-dev swig libsensors4-dev redis-tools - -COPY ["start.sh", "/usr/bin/"] - -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps - -ENTRYPOINT /usr/bin/start.sh \ - && /bin/bash diff --git a/dockers/docker-syncd-cavm/start.sh b/dockers/docker-syncd-cavm/start.sh deleted file mode 100755 index 21d61e707344..000000000000 --- a/dockers/docker-syncd-cavm/start.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -export XP_ROOT=/usr/bin/ - -service rsyslog start - -while true; do - - # Check if redis-server starts - - result=$(redis-cli ping) - - if [ "$result" == "PONG" ]; then - - redis-cli FLUSHALL - syncd -p /etc/ssw/AS7512/profile.ini -N - break - - fi - - sleep 1 - -done diff --git a/dockers/docker-syncd-mlnx/Dockerfile b/dockers/docker-syncd-mlnx/Dockerfile deleted file mode 100755 index 77229a333d11..000000000000 --- a/dockers/docker-syncd-mlnx/Dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -FROM docker-base - -RUN apt-get update - -COPY deps /deps - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/applibs_*.deb \ - && dpkg_apt /deps/applibs-dev_*.deb \ - && dpkg_apt /deps/sx-complib_*.deb \ - && dpkg_apt /deps/sxd-libs_*.deb \ - && dpkg_apt /deps/sx-scew_*.deb \ - && dpkg_apt /deps/sx-examples_*.deb \ - && dpkg_apt /deps/sx-gen-utils_*.deb \ - && dpkg_apt /deps/python-sdk-api_*.deb \ - && dpkg_apt /deps/iproute2_*.deb \ - && dpkg_apt /deps/mft*.deb \ - - && dpkg_apt /deps/libhiredis0.13*.deb \ - && dpkg_apt /deps/libnl-3-200_*.deb \ - && dpkg_apt /deps/libnl-genl-3-200_*.deb \ - && dpkg_apt /deps/libnl-route-3-200_*.deb \ - && dpkg_apt /deps/libswsscommon_*.deb \ - && dpkg_apt /deps/mlnx-sai_*.deb \ - && dpkg_apt /deps/libsairedis_*.deb \ - && dpkg_apt /deps/libsaimetadata_*.deb - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/syncd_*.deb - -COPY ["start.sh", "/usr/bin/"] -COPY ["mlnx-fw-upgrade.sh", "/usr/bin/"] -COPY ["/deps/fw-SPC.mfa", "/etc/mlnx/"] - -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /deps - -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh b/dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh deleted file mode 100755 index 81514f77b062..000000000000 --- a/dockers/docker-syncd-mlnx/mlnx-fw-upgrade.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -query_retry_count_max="10" -required_fw_version="13.1200.0116" -fw_file=/etc/mlnx/fw-SPC.mfa - -run_or_fail() { - $1 - if [[ $? != 0 ]]; then - echo $1 failed - exit 1 - fi -} - -# wait until devices will be available -query_retry_count="0" -mlxfwmanager --query > /dev/null - -while [[ (${query_retry_count} -lt ${query_retry_count_max}) && ($? -ne "0") ]]; do - sleep 1 - query_retry_count=$[${query_retry_count}+1] - mlxfwmanager --query > /dev/null -done - -run_or_fail "mlxfwmanager --query" > /tmp/mlnxfwmanager-query.txt - -# get current firmware version -found_fw=false -for word in `cat /tmp/mlnxfwmanager-query.txt` -do - if [[ ${found_fw} == true ]]; then - fw_version=${word} - break - fi - if [[ ${word} == FW ]]; then - found_fw=true - fi -done - -if [[ -z ${fw_version} ]]; then - echo "Could not retreive current FW version." - exit 1 -fi - -if [[ ${required_fw_version} == ${fw_version} ]]; then - echo "Mellanox firmware is up to date." -else - echo "Mellanox firmware required version is ${required_fw_version}. Installing compatible version..." - run_or_fail "mlxfwmanager -i ${fw_file} -u -f -y" - - # exit from here so that syncd service will restart - exit 0 -fi diff --git a/dockers/docker-syncd-mlnx/start.sh b/dockers/docker-syncd-mlnx/start.sh deleted file mode 100755 index 3c07069ba26e..000000000000 --- a/dockers/docker-syncd-mlnx/start.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -function clean_up { - service syncd stop - service rsyslog stop - exit -} - -trap clean_up SIGTERM SIGKILL - -# fw-upgrade will exit if firmware was actually upgraded or if some error -# occures -. mlnx-fw-upgrade.sh - -# FIXME: the script cannot trap SIGTERM signal and it exits without clean_up -# Remove rsyslogd.pid file manually so that to start the rsyslog instantly -[ -e /var/run/rsyslogd.pid ] && rm /var/run/rsyslogd.pid -service rsyslog start -service syncd start - -read From dcc9d01577c595d7125b9f4915967fb2401ffe88 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 3 Jan 2017 21:02:09 -0800 Subject: [PATCH 0177/1011] [sairedis]: update sairedis submodule (#177) --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index e393930b8bc3..d1c6eb891bb4 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit e393930b8bc38fcdb950139db8c2353b887128c8 +Subproject commit d1c6eb891bb40317afa47389b8fa24212f03c24e From 0252d78aec0f0a8300eaa8fe1ab33b8ecf1cea2c Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 4 Jan 2017 08:06:38 -0800 Subject: [PATCH 0178/1011] [swss]: update sonic-swss submodule (#179) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 4c753eb8133d..9be6620bbf4d 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 4c753eb8133d1ac708190c89ed75c2274bce4c5d +Subproject commit 9be6620bbf4dc0c822661920b8bbac5c419a2b4d From c19a25988c6f3e76f77ede773c350f78aba68c7f Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 4 Jan 2017 19:07:50 -0800 Subject: [PATCH 0179/1011] add sonic utilities into buildimage (#180) --- .gitmodules | 3 +++ rules/sonic-utilities.mk | 5 +++++ src/sonic-utilities | 1 + 3 files changed, 9 insertions(+) create mode 100644 rules/sonic-utilities.mk create mode 160000 src/sonic-utilities diff --git a/.gitmodules b/.gitmodules index a6928d64f2c4..c8b1acdb78ec 100644 --- a/.gitmodules +++ b/.gitmodules @@ -44,3 +44,6 @@ [submodule "src/ptf"] path = src/ptf url = https://github.com/p4lang/ptf.git +[submodule "src/sonic-utilities"] + path = src/sonic-utilities + url = https://github.com/Azure/sonic-utilities diff --git a/rules/sonic-utilities.mk b/rules/sonic-utilities.mk new file mode 100644 index 000000000000..7f40cdc93c6c --- /dev/null +++ b/rules/sonic-utilities.mk @@ -0,0 +1,5 @@ +# sonic utilities package + +SONIC_UTILS = sonic-utilities_0.1_amd64.deb +$(SONIC_UTILS)_SRC_PATH = $(SRC_PATH)/sonic-utilities +SONIC_DPKG_DEBS += $(SONIC_UTILS) diff --git a/src/sonic-utilities b/src/sonic-utilities new file mode 160000 index 000000000000..a3f98cdb8f07 --- /dev/null +++ b/src/sonic-utilities @@ -0,0 +1 @@ +Subproject commit a3f98cdb8f073b567c3d4f552ea53e110da960bb From 57dd634935dfbb5b6f184f11a41105d18c6025ef Mon Sep 17 00:00:00 2001 From: Denys Haryachyy Date: Thu, 5 Jan 2017 20:14:03 +0200 Subject: [PATCH 0180/1011] platform/cavium : Download SAI libraries from Xpliant github repo (#183) --- platform/cavium/cavm-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/cavium/cavm-sai.mk b/platform/cavium/cavm-sai.mk index c0e16e1ebd94..9308766e16e1 100644 --- a/platform/cavium/cavm-sai.mk +++ b/platform/cavium/cavm-sai.mk @@ -1,6 +1,6 @@ # Cavium SAI -CAVM_SAI_GITHUB = https://github.com/garyachy/OpenXPS/raw/3c2dbbee23ee76570bbdb11d4955882279cc3f9a/SAI/cavm-sai +CAVM_SAI_GITHUB = https://github.com/XPliant/OpenXPS/raw/d8868c604ef32dd3f254c3ba58b3453d21bc5722/SAI/cavm-sai/ CAVM_LIBSAI = libsai.deb CAVM_SAI = sai.deb From a0281f806919e23a33e62aba5ef319380463af4d Mon Sep 17 00:00:00 2001 From: Nadiya Date: Thu, 5 Jan 2017 20:14:46 +0200 Subject: [PATCH 0181/1011] Added profile.ini into docker-syncd-cavm (#184) Signed-off-by: Nadiya.Stetskovych --- platform/cavium/docker-syncd-cavm/Dockerfile.j2 | 2 ++ platform/cavium/docker-syncd-cavm/profile.ini | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 platform/cavium/docker-syncd-cavm/profile.ini diff --git a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 index f8e48259e8be..840399ac5953 100755 --- a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 +++ b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 @@ -13,6 +13,8 @@ debs/{{ deb }}{{' '}} COPY ["start.sh", "/usr/bin/"] +COPY ["profile.ini", "/etc/ssw/AS7512/"] + ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs diff --git a/platform/cavium/docker-syncd-cavm/profile.ini b/platform/cavium/docker-syncd-cavm/profile.ini new file mode 100644 index 000000000000..1e5fc5f0fc0a --- /dev/null +++ b/platform/cavium/docker-syncd-cavm/profile.ini @@ -0,0 +1,3 @@ +mode=1 +hwId=as7512 + From 43b0e502de060b08874c5190e8532dea8878a953 Mon Sep 17 00:00:00 2001 From: marian-pritsak Date: Fri, 9 Dec 2016 12:24:08 +0200 Subject: [PATCH 0182/1011] Add recipe for ptf docker --- dockers/docker-ptf/{Dockerfile => Dockerfile.j2} | 16 ++++++++++------ rules/docker-ptf.mk | 6 ++++++ 2 files changed, 16 insertions(+), 6 deletions(-) rename dockers/docker-ptf/{Dockerfile => Dockerfile.j2} (89%) create mode 100644 rules/docker-ptf.mk diff --git a/dockers/docker-ptf/Dockerfile b/dockers/docker-ptf/Dockerfile.j2 similarity index 89% rename from dockers/docker-ptf/Dockerfile rename to dockers/docker-ptf/Dockerfile.j2 index d72391a7ba43..db67c3261d36 100644 --- a/dockers/docker-ptf/Dockerfile +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -3,7 +3,7 @@ FROM debian:jessie MAINTAINER Pavel Shirshov ## Copy dependencies -COPY deps /root/deps +COPY debs /debs ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -35,11 +35,15 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / python-dev \ wget \ cmake \ - && dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ - && dpkg_apt /root/deps/python-ptf_*.deb \ - && dpkg_apt /root/deps/libthrift-0.9.3_*.deb \ - && dpkg_apt /root/deps/python-thrift_*.deb \ - && rm -rf /root/deps \ + libqt5core5a \ + libqt5network5 + +RUN dpkg -i \ +{% for deb in docker_ptf_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +RUN rm -rf /debs \ && apt-get -y autoclean \ && apt-get -y autoremove \ && rm -rf /var/lib/apt/lists/* \ diff --git a/rules/docker-ptf.mk b/rules/docker-ptf.mk new file mode 100644 index 000000000000..2782c45339bd --- /dev/null +++ b/rules/docker-ptf.mk @@ -0,0 +1,6 @@ +# docker image for ptf + +DOCKER_PTF = docker-ptf.gz +$(DOCKER_PTF)_PATH = $(DOCKERS_PATH)/docker-ptf +$(DOCKER_PTF)_DEPENDS += $(LIBTHRIFT) $(PYTHON_THRIFT) $(PTF) +SONIC_DOCKER_IMAGES += $(DOCKER_PTF) From ed9c8fbe8e4f570c66835a1455cee82a7d2ef5ac Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 6 Jan 2017 18:19:42 -0800 Subject: [PATCH 0183/1011] add sonic config render engine (#178) add sonic config render engine --- rules/sonic-config.mk | 5 + src/sonic-config-engine/minigraph.py | 381 +++++++++++++++++++++++++++ src/sonic-config-engine/setup.py | 14 + src/sonic-config-engine/sonic-cfggen | 63 +++++ 4 files changed, 463 insertions(+) create mode 100644 rules/sonic-config.mk create mode 100644 src/sonic-config-engine/minigraph.py create mode 100644 src/sonic-config-engine/setup.py create mode 100755 src/sonic-config-engine/sonic-cfggen diff --git a/rules/sonic-config.mk b/rules/sonic-config.mk new file mode 100644 index 000000000000..ba2fdacc2c50 --- /dev/null +++ b/rules/sonic-config.mk @@ -0,0 +1,5 @@ +# sonic-config-engine package + +SONIC_CONFIG_ENGINE = sonic-config-engine_1.0-1_all.deb +$(SONIC_CONFIG_ENGINE)_SRC_PATH = $(SRC_PATH)/sonic-config-engine +SONIC_PYTHON_STDEB_DEBS += $(SONIC_CONFIG_ENGINE) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py new file mode 100644 index 000000000000..2bc7bf43cdfa --- /dev/null +++ b/src/sonic-config-engine/minigraph.py @@ -0,0 +1,381 @@ +#!/usr/bin/env python +import calendar +import os +import sys +import socket +import struct +import json +import copy +import ipaddr as ipaddress +from collections import defaultdict + +from lxml import etree as ET +from lxml.etree import QName + +DOCUMENTATION = ''' +--- +module: minigraph_facts +version_added: "1.9" +author: Guohan Lu (gulv@microsoft.com) +short_description: Retrive minigraph facts for a device. +description: + - Retrieve minigraph facts for a device, the facts will be + inserted to the ansible_facts key. +options: + host: + description: + - Set to target snmp server (normally {{inventory_hostname}}) + required: true +''' + +EXAMPLES = ''' +# Gather minigraph facts +- name: Gathering minigraph facts about the device + minigraph_facts: host={{ hostname }} +''' + +ns = "Microsoft.Search.Autopilot.Evolution" +ns1 = "http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution" +ns2 = "Microsoft.Search.Autopilot.NetMux" +ns3 = "http://www.w3.org/2001/XMLSchema-instance" + +class minigraph_encoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, (ipaddress.IPv4Network, ipaddress.IPv6Network, ipaddress.IPv4Address, ipaddress.IPv6Address)): + return str(obj) + return json.JSONEncoder.default(self, obj) + +def parse_png(png, hname): + neighbors = {} + devices = {} + console_dev = '' + console_port = '' + mgmt_dev = '' + mgmt_port = '' + for child in png: + if child.tag == str(QName(ns, "DeviceInterfaceLinks")): + for link in child.findall(str(QName(ns, "DeviceLinkBase"))): + linktype = link.find(str(QName(ns, "ElementType"))).text + if linktype != "DeviceInterfaceLink" and linktype != "UnderlayInterfaceLink": + continue + + enddevice = link.find(str(QName(ns, "EndDevice"))).text + endport = link.find(str(QName(ns, "EndPort"))).text + startdevice = link.find(str(QName(ns, "StartDevice"))).text + startport = link.find(str(QName(ns, "StartPort"))).text + + if enddevice == hname: + neighbors[endport] = {'name': startdevice, 'port': startport} + else: + neighbors[startport] = {'name': enddevice, 'port': endport} + if child.tag == str(QName(ns, "Devices")): + for device in child.findall(str(QName(ns, "Device"))): + lo_addr = None + # don't shadow type() + d_type = None + mgmt_addr = None + hwsku = None + if str(QName(ns3, "type")) in device.attrib: + d_type = device.attrib[str(QName(ns3, "type"))] + + for node in device: + if node.tag == str(QName(ns, "Address")): + lo_addr = node.find(str(QName(ns2, "IPPrefix"))).text.split('/')[0] + elif node.tag == str(QName(ns, "ManagementAddress")): + mgmt_addr = node.find(str(QName(ns2, "IPPrefix"))).text.split('/')[0] + elif node.tag == str(QName(ns, "Hostname")): + name = node.text + elif node.tag == str(QName(ns, "HwSku")): + hwsku = node.text + + devices[name] = {'lo_addr': lo_addr, 'type': d_type, 'mgmt_addr': mgmt_addr, 'hwsku': hwsku} + + if child.tag == str(QName(ns, "DeviceInterfaceLinks")): + for if_link in child.findall(str(QName(ns, 'DeviceLinkBase'))): + if str(QName(ns3, "type")) in if_link.attrib: + link_type = if_link.attrib[str(QName(ns3, "type"))] + if link_type == 'DeviceSerialLink': + for node in if_link: + if node.tag == str(QName(ns, "EndPort")): + console_port = node.text.split()[-1] + elif node.tag == str(QName(ns, "EndDevice")): + console_dev = node.text + elif link_type == 'DeviceMgmtLink': + for node in if_link: + if node.tag == str(QName(ns, "EndPort")): + mgmt_port = node.text.split()[-1] + elif node.tag == str(QName(ns, "EndDevice")): + mgmt_dev = node.text + + + return (neighbors, devices, console_dev, console_port, mgmt_dev, mgmt_port) + + +def parse_dpg(dpg, hname): + for child in dpg: + hostname = child.find(str(QName(ns, "Hostname"))) + if hostname.text != hname: + continue + + ipintfs = child.find(str(QName(ns, "IPInterfaces"))) + intfs = [] + vlan_map = {} + for ipintf in ipintfs.findall(str(QName(ns, "IPInterface"))): + intfname = ipintf.find(str(QName(ns, "AttachTo"))).text + ipprefix = ipintf.find(str(QName(ns, "Prefix"))).text + ipn = ipaddress.IPNetwork(ipprefix) + ipaddr = ipn.ip + prefix_len = ipn.prefixlen + addr_bits = ipn.max_prefixlen + subnet = ipaddress.IPNetwork(str(ipn.network) + '/' + str(prefix_len)) + ipmask = ipn.netmask + + intf = {'addr': ipaddr, 'subnet': subnet} + if isinstance(ipn, ipaddress.IPv4Network): + intf['mask'] = ipmask + else: + intf['mask'] = str(prefix_len) + + if intfname[0:4] == "Vlan": + if intfname in vlan_map: + vlan_map[intfname].append(intf) + + else: + vlan_map[intfname] = [intf] + else: + intf.update({'name': intfname, 'prefixlen': int(prefix_len)}) + + if port_alias_map.has_key(intfname): + intf['alias'] = port_alias_map[intfname] + else: + intf['alias'] = intfname + + # TODO: remove peer_addr after dependency removed + ipaddr_val = int(ipn.ip) + peer_addr_val = None + if int(prefix_len) == addr_bits - 2: + if ipaddr_val & 0x3 == 1: + peer_addr_val = ipaddr_val + 1 + else: + peer_addr_val = ipaddr_val - 1 + elif int(prefix_len) == addr_bits - 1: + if ipaddr_val & 0x1 == 0: + peer_addr_val = ipaddr_val + 1 + else: + peer_addr_val = ipaddr_val - 1 + + if peer_addr_val is not None: + intf['peer_addr'] = ipaddress.IPAddress(peer_addr_val) + intfs.append(intf) + + pcintfs = child.find(str(QName(ns, "PortChannelInterfaces"))) + pc_intfs = [] + for pcintf in pcintfs.findall(str(QName(ns, "PortChannel"))): + pcintfname = pcintf.find(str(QName(ns, "Name"))).text + pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text + pcmbr_list = pcintfmbr.split(';', 1) + pc_intfs.append({'name': pcintfname, 'members': pcmbr_list}) + + lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces"))) + lo_intfs = [] + for lointf in lointfs.findall(str(QName(ns1, "LoopbackIPInterface"))): + intfname = lointf.find(str(QName(ns, "AttachTo"))).text + ipprefix = lointf.find(str(QName(ns1, "PrefixStr"))).text + ipn = ipaddress.IPNetwork(ipprefix) + ipaddr = ipn.ip + prefix_len = ipn.prefixlen + ipmask = ipn.netmask + lo_intf = {'name': intfname, 'addr': ipaddr, 'prefixlen': prefix_len} + if isinstance(ipn, ipaddress.IPv4Network): + lo_intf['mask'] = ipmask + else: + lo_intf['mask'] = str(prefix_len) + lo_intfs.append(lo_intf) + + mgmtintfs = child.find(str(QName(ns, "ManagementIPInterfaces"))) + mgmt_intf = None + for mgmtintf in mgmtintfs.findall(str(QName(ns1, "ManagementIPInterface"))): + ipprefix = mgmtintf.find(str(QName(ns1, "PrefixStr"))).text + mgmtipn = ipaddress.IPNetwork(ipprefix) + ipaddr = mgmtipn.ip + prefix_len = str(mgmtipn.prefixlen) + ipmask = mgmtipn.netmask + gwaddr = ipaddress.IPAddress(int(mgmtipn.network) + 1) + mgmt_intf = {'addr': ipaddr, 'prefixlen': prefix_len, 'mask': ipmask, 'gwaddr': gwaddr} + + vlanintfs = child.find(str(QName(ns, "VlanInterfaces"))) + vlan_intfs = [] + for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))): + vintfname = vintf.find(str(QName(ns, "Name"))).text + vlanid = vintf.find(str(QName(ns, "VlanID"))).text + vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text + vmbr_list = vintfmbr.split(';')) + vlan_attributes = {'name': vintfname, 'members': vmbr_list, 'vlanid': vlanid} + for addrtuple in vlan_map.get(vintfname, []): + vlan_attributes.update(addrtuple) + vlan_intfs.append(copy.deepcopy(vlan_attributes)) + + return intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs + return None, None, None, None, None + +def parse_cpg(cpg, hname): + bgp_sessions = [] + myasn = None + for child in cpg: + tag = child.tag + if tag == str(QName(ns, "PeeringSessions")): + for session in child.findall(str(QName(ns, "BGPSession"))): + start_router = session.find(str(QName(ns, "StartRouter"))).text + start_peer = session.find(str(QName(ns, "StartPeer"))).text + end_router = session.find(str(QName(ns, "EndRouter"))).text + end_peer = session.find(str(QName(ns, "EndPeer"))).text + if end_router == hname: + bgp_sessions.append({ + 'name': start_router, + 'addr': start_peer, + 'peer_addr': end_peer + }) + else: + bgp_sessions.append({ + 'name': end_router, + 'addr': end_peer, + 'peer_addr': start_peer + }) + elif child.tag == str(QName(ns, "Routers")): + for router in child.findall(str(QName(ns1, "BGPRouterDeclaration"))): + asn = router.find(str(QName(ns1, "ASN"))).text + hostname = router.find(str(QName(ns1, "Hostname"))).text + if hostname == hname: + myasn = int(asn) + else: + for bgp_session in bgp_sessions: + if hostname == bgp_session['name']: + bgp_session['asn'] = int(asn) + + return bgp_sessions, myasn + + +def get_console_info(devices, dev, port): + for k, v in devices.items(): + if k == dev: + break + else: + return {} + + ret_val = v + ret_val.update({ + 'ts_port': port, + 'ts_dev': dev + }) + + return ret_val + +def get_mgmt_info(devices, dev, port): + for k, v in devices.items(): + if k == dev: + break + else: + return {} + + ret_val = v + ret_val.update({ + 'mgmt_port': port, + 'mgmt_dev': dev + }) + + return ret_val + +def parse_xml(filename): + root = ET.parse(filename).getroot() + mini_graph_path = filename + + u_neighbors = None + u_devices = None + hwsku = None + bgp_sessions = None + bgp_asn = None + intfs = None + vlan_intfs = None + pc_intfs = None + mgmt_intf = None + lo_intf = None + neighbors = None + devices = None + hostname = None + + hwsku_qn = QName(ns, "HwSku") + hostname_qn = QName(ns, "Hostname") + for child in root: + if child.tag == str(hwsku_qn): + hwsku = child.text + if child.tag == str(hostname_qn): + hostname = child.text + + # port_alias_map maps ngs port name to sonic port name + if hwsku == "Force10-S6000": + for i in range(0, 128, 4): + port_alias_map["fortyGigE0/%d" % i] = "Ethernet%d" % i + elif hwsku == "Arista-7050-QX32": + for i in range(1, 25): + port_alias_map["Ethernet%d/1" % i] = "Ethernet%d" % ((i - 1) * 4) + for i in range(25, 33): + port_alias_map["Ethernet%d" % i] = "Ethernet%d" % ((i - 1) * 4) + + for child in root: + if child.tag == str(QName(ns, "DpgDec")): + (intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs) = parse_dpg(child, hostname) + elif child.tag == str(QName(ns, "CpgDec")): + (bgp_sessions, bgp_asn) = 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) + + # Replace port with alias in Vlan interfaces members + for vlan in vlan_intfs: + for i,member in enumerate(vlan['members']): + vlan['members'][i] = port_alias_map[member] + + # Convert vlan members into a space-delimited string + vlan['members'] = " ".join(vlan['members']) + + # Replace port with alias in port channel interfaces members + for pc in pc_intfs: + for i,member in enumerate(pc['members']): + pc['members'][i] = port_alias_map[member] + + Tree = lambda: defaultdict(Tree) + + results = Tree() + results['minigraph_hwsku'] = hwsku + # sorting by lambdas are not easily done without custom filters. + # TODO: add jinja2 filter to accept a lambda to sort a list of dictionaries by attribute. + # 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 + # TODO: sort does not work properly on all interfaces of varying lengths. Need to sort by integer group(s). + results['minigraph_interfaces'] = sorted(intfs, key=lambda x: x['name']) + results['minigraph_vlan_interfaces'] = vlan_intfs + results['minigraph_portchannel_interfaces'] = pc_intfs + results['minigraph_mgmt_interface'] = mgmt_intf + results['minigraph_lo_interfaces'] = lo_intfs + results['minigraph_neighbors'] = neighbors + results['minigraph_devices'] = devices + results['minigraph_underlay_neighbors'] = u_neighbors + results['minigraph_underlay_devices'] = u_devices + results['minigraph_as_xml'] = mini_graph_path + results['minigraph_console'] = get_console_info(devices, console_dev, console_port) + results['minigraph_mgmt'] = get_mgmt_info(devices, mgmt_dev, mgmt_port) + results['inventory_hostname'] = hostname + + return results + + +port_alias_map = {} + + +def print_parse_xml(filename): + results = parse_xml(filename) + print(json.dumps(results, indent=3, cls=minigraph_encoder)) + + diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py new file mode 100644 index 000000000000..3223735b971a --- /dev/null +++ b/src/sonic-config-engine/setup.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python + +from setuptools import setup + +setup(name='sonic-config-engine', + version='1.0', + description='Utilities for generating SONiC configuration files', + author='Taoyu Li', + author_email='taoyl@microsoft.com', + url='https://github.com/Azure/sonic-buildimage', + py_modules=['minigraph'], + scripts=['sonic-cfggen'], + install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'yaml'], + ) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen new file mode 100755 index 000000000000..e20b15977d18 --- /dev/null +++ b/src/sonic-config-engine/sonic-cfggen @@ -0,0 +1,63 @@ +#!/usr/bin/env python + +import sys +import os.path +import argparse +import yaml +import jinja2 +import netaddr +from minigraph import parse_xml + + +def is_ipv4(value): + if not value: + return False + if isinstance(value, netaddr.IPAddress): + addr = value + else: + try: + addr = netaddr.IPAddress(str(value)) + except: + return False + return addr.version == 4 + +def is_ipv6(value): + if not value: + return False + if isinstance(value, netaddr.IPAddress): + addr = value + else: + try: + addr = netaddr.IPAddress(str(value)) + except: + return False + return addr.version == 6 + + +def main(): + parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") + parser.add_argument("template") + parser.add_argument("-m", "--minigraph", required=True, help="minigraph xml file") + parser.add_argument("-v", "--var-file", help="yaml file that contains addtional variables") + args = parser.parse_args() + + minigraph = args.minigraph + template_file = os.path.abspath(args.template) + + data = parse_xml(minigraph) + + if args.var_file != None: + with open(args.var_file, 'r') as stream: + additional_data = yaml.load(stream) + data.update(additional_data) + + env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'), trim_blocks=True) + env.filters['ipv4'] = is_ipv4 + env.filters['ipv6'] = is_ipv6 + template = env.get_template(template_file) + + print template.render(data) + +if __name__ == "__main__": + main() + From d92f99799b1f8132016e6dc115eae1f25dcb9520 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 9 Jan 2017 14:34:14 -0800 Subject: [PATCH 0184/1011] [platform]: Update Broadcom debian package versions and chmod on executables (#185) --- platform/broadcom/docker-syncd-brcm/Dockerfile.j2 | 1 + platform/broadcom/sai.mk | 10 ++++------ platform/broadcom/sdk.mk | 8 ++++---- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index 163e664f0dec..89204c03d9be 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -13,6 +13,7 @@ debs/{{ deb }}{{' '}} RUN apt-get install -f kmod COPY ["debs/dsserve", "debs/bcmcmd", "start.sh", "/usr/bin/"] +RUN chmod +x /usr/bin/dsserve /usr/bin/bcmcmd ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 2185edefe2b1..e7366d90a2bd 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,11 +1,9 @@ -BRCM_SAI = libsaibcm_2.0.3.7_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.0.3.7_amd64.deb?sv=2015-04-05&sr=b&sig=3S9pY5Allql4fguipFdilJ%2BzP%2Ff4dvUFe3mNY3uhCIc%3D&se=2030-09-02T21%3A43%3A38Z&sp=r" - -BRCM_SAI_DEV = libsaibcm-dev_2.0.3.7_amd64.deb +BRCM_SAI = libsaibcm_2.0.3.7-1_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.0.3.7-1_amd64.deb?sv=2015-04-05&sr=b&sig=VCOFP%2FtCWJUZpN04CMHbsSXS7bKMIV%2B14fLbpNBUe4A%3D&se=2030-09-18T19%3A17%3A52Z&sp=r" +BRCM_SAI_DEV = libsaibcm-dev_2.0.3.7-1_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) - -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.0.3.7_amd64.deb?sv=2015-04-05&sr=b&sig=KI8DfgGW8%2BOoZL6tJ9aJa%2F3RvHi%2FXD8gtOcDUD5nOPA%3D&se=2030-09-03T04%3A52%3A41Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.0.3.7-1_amd64.deb?sv=2015-04-05&sr=b&sig=QeOqPjmYW%2BHqaK3x1JlgCEVeYto0cZeYj6M52vY1Wjw%3D&se=2030-09-18T19%3A18%3A55Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 7778e2cf5376..74d1d8ce145c 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.1.5_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5_amd64.deb?sv=2015-04-05&sr=b&sig=qm6%2BkiGuRGsFKwZcUz6yEtbgbbwQuhxEr0chLM7qJEQ%3D&se=2030-09-02T21%3A41%3A11Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.1.5-1_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-1_amd64.deb?sv=2015-04-05&sr=b&sig=9Mhm4cuju4P7TmVApXihECo1fHLbANWNWTKYLnHcrOk%3D&se=2030-09-18T19%3A19%3A46Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5_amd64.deb?sv=2015-04-05&sr=b&sig=c8hO5PQpvod7IX3aYOiyvFB9rICxDgGiFF5g3GDHx84%3D&se=2030-09-02T21%3A42%3A34Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-1_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-1_amd64.deb?sv=2015-04-05&sr=b&sig=iakUQ4CdHYbKc9ikiNNVrrLe0K8cMrez5vex7L%2BWD2o%3D&se=2030-09-18T19%3A20%3A14Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 5aae34ab4d6b2e56abcde0482872dc778d47c671 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 11 Jan 2017 13:54:58 -0800 Subject: [PATCH 0185/1011] [redis]: disable auto test during the build (#187) --- src/redis/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/redis/Makefile b/src/redis/Makefile index a49ee4a9f015..ddc952ff75ad 100644 --- a/src/redis/Makefile +++ b/src/redis/Makefile @@ -16,7 +16,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : dpkg-source -x redis_$(REDIS_VERSION_FULL).dsc pushd redis-$(REDIS_VERSION) - fakeroot debian/rules binary + DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -us -uc -b popd mv $(DERIVED_TARGETS) $* $(DEST)/ From fe5182c5b45ef744de50330bf156098bf9803c7e Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 12 Jan 2017 08:06:14 -0800 Subject: [PATCH 0186/1011] update swss, swss-common, sairedis submodules (#189) --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index d1c6eb891bb4..04ba52422ecc 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit d1c6eb891bb40317afa47389b8fa24212f03c24e +Subproject commit 04ba52422ecc038b509c072cfcf4ac2baa06db84 diff --git a/src/sonic-swss b/src/sonic-swss index 9be6620bbf4d..1bd4240f6641 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 9be6620bbf4dc0c822661920b8bbac5c419a2b4d +Subproject commit 1bd4240f6641223f70d215fb044fdf8ecf93da85 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 81ed1b603add..e06988dd2c44 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 81ed1b603add087b0ea3827036910a6785dba0c5 +Subproject commit e06988dd2c44f6c5200f16c765a0e9a64a0ce274 From 387399663f39815bddd4c08a709e06028b45d711 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 12 Jan 2017 10:40:25 -0800 Subject: [PATCH 0187/1011] [platform]: Update Broadcom debian packages (#188) --- platform/broadcom/sai.mk | 11 +++++------ platform/broadcom/sdk.mk | 8 ++++---- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index e7366d90a2bd..c89382b5fff4 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,11 +1,10 @@ -BRCM_SAI = libsaibcm_2.0.3.7-1_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.0.3.7-1_amd64.deb?sv=2015-04-05&sr=b&sig=VCOFP%2FtCWJUZpN04CMHbsSXS7bKMIV%2B14fLbpNBUe4A%3D&se=2030-09-18T19%3A17%3A52Z&sp=r" +BRCM_SAI = libsaibcm_2.0.3.7-2_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.0.3.7-2_amd64.deb?sv=2015-04-05&sr=b&sig=E9zdq7DpvZSpztO94eiNF4svl8T3wCywZxXRLpLnIpk%3D&se=2030-09-21T00%3A27%3A41Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.0.3.7-1_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.0.3.7-2_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.0.3.7-1_amd64.deb?sv=2015-04-05&sr=b&sig=QeOqPjmYW%2BHqaK3x1JlgCEVeYto0cZeYj6M52vY1Wjw%3D&se=2030-09-18T19%3A18%3A55Z&sp=r" - -SONIC_ONLINE_DEBS += $(BRCM_SAI) +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.0.3.7-2_amd64.deb?sv=2015-04-05&sr=b&sig=I11bX9%2Fo%2F2v1e0KGOnC9pN2MkDcQQZLUGtIJF8rE65w%3D&se=2030-09-21T00%3A28%3A19Z&sp=r" +SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 74d1d8ce145c..23e7881b456c 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.1.5-1_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-1_amd64.deb?sv=2015-04-05&sr=b&sig=9Mhm4cuju4P7TmVApXihECo1fHLbANWNWTKYLnHcrOk%3D&se=2030-09-18T19%3A19%3A46Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.1.5-2_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-2_amd64.deb?sv=2015-04-05&sr=b&sig=dWe5YgQv%2FG5VxC4YaKUQEDtDjIygowNhSHyN0Kv3e78%3D&se=2030-09-21T00%3A31%3A21Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-1_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-1_amd64.deb?sv=2015-04-05&sr=b&sig=iakUQ4CdHYbKc9ikiNNVrrLe0K8cMrez5vex7L%2BWD2o%3D&se=2030-09-18T19%3A20%3A14Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-2_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-2_amd64.deb?sv=2015-04-05&sr=b&sig=tupvWh%2FYdPn2%2FlCIfsUBjjbpGYSy5PHQvxHutQ4aMPc%3D&se=2030-09-21T00%3A31%3A47Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From ae4b72e866b5ebd968aaabe3e02f59f8ad0fba20 Mon Sep 17 00:00:00 2001 From: Nadiya Date: Fri, 13 Jan 2017 04:02:19 +0200 Subject: [PATCH 0188/1011] [platform]: Add rules to build cavium platform modules (#186) * Added rules to build cavium platform modules * Use correct kernel version Signed-off-by: Nadiya.Stetskovych --- platform/cavium/cavm_platform_modules.mk | 4 +++ .../cavm_platform_modules/DEBIAN/changelog | 6 +++++ .../cavm_platform_modules/DEBIAN/control | 6 +++++ .../cavium/cavm_platform_modules/Makefile | 26 +++++++++++++++++++ platform/cavium/rules.mk | 1 + 5 files changed, 43 insertions(+) create mode 100644 platform/cavium/cavm_platform_modules.mk create mode 100644 platform/cavium/cavm_platform_modules/DEBIAN/changelog create mode 100755 platform/cavium/cavm_platform_modules/DEBIAN/control create mode 100644 platform/cavium/cavm_platform_modules/Makefile diff --git a/platform/cavium/cavm_platform_modules.mk b/platform/cavium/cavm_platform_modules.mk new file mode 100644 index 000000000000..8ed10a6b9289 --- /dev/null +++ b/platform/cavium/cavm_platform_modules.mk @@ -0,0 +1,4 @@ +CAVM_PLATFORM_DEB = cavm_platform_modules.deb +$(CAVM_PLATFORM_DEB)_SRC_PATH = $(PLATFORM_PATH)/cavm_platform_modules +SONIC_MAKE_DEBS += $(CAVM_PLATFORM_DEB) + diff --git a/platform/cavium/cavm_platform_modules/DEBIAN/changelog b/platform/cavium/cavm_platform_modules/DEBIAN/changelog new file mode 100644 index 000000000000..b138dba26289 --- /dev/null +++ b/platform/cavium/cavm_platform_modules/DEBIAN/changelog @@ -0,0 +1,6 @@ + +cavm-platform-modules (1.0) unstable; urgency=low + + * Initial release + +-- Nadiya.Stetskovych@cavium.com Thu, 12 Jan 2017 19:24:41 +0200 diff --git a/platform/cavium/cavm_platform_modules/DEBIAN/control b/platform/cavium/cavm_platform_modules/DEBIAN/control new file mode 100755 index 000000000000..75f8adc0cbd2 --- /dev/null +++ b/platform/cavium/cavm_platform_modules/DEBIAN/control @@ -0,0 +1,6 @@ +Package: cavm-platform-modules +Version: 1.0 +Architecture: amd64 +Depends: linux-image-3.16.0-4-amd64 +Maintainer: Nadiya.Stetskovych@cavium.com +Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/cavium/cavm_platform_modules/Makefile b/platform/cavium/cavm_platform_modules/Makefile new file mode 100644 index 000000000000..5d2624acbebb --- /dev/null +++ b/platform/cavium/cavm_platform_modules/Makefile @@ -0,0 +1,26 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = cavm_platform_modules.deb +DEB_BUILD_DIR = cavm-platform-modules-deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # get sources + rm -rf SONiC + git clone https://github.com/edge-core/SONiC.git + + # build + pushd SONiC/AS7512-32X/module/ + + KERNEL_SRC=/lib/modules/$(KVERSION)/build make + popd + mkdir -p $(DEB_BUILD_DIR)/lib/modules/$(KVERSION) + + cp SONiC/AS7512-32X/module/*.ko $(DEB_BUILD_DIR)/lib/modules/$(KVERSION) + cp -r DEBIAN $(DEB_BUILD_DIR) + dpkg-deb -b $(DEB_BUILD_DIR) $(MAIN_TARGET) + + mv $(MAIN_TARGET) $(DEST)/ + rm -rf $(DEB_BUILD_DIR) + diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index efb9159c34d6..7ed8ea17e24b 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -3,6 +3,7 @@ include $(PLATFORM_GENERIC_PATH)/rules.mk include $(PLATFORM_PATH)/cavm-sai.mk include $(PLATFORM_PATH)/docker-syncd-cavm.mk include $(PLATFORM_PATH)/docker-orchagent-cavm.mk +include $(PLATFORM_PATH)/cavm_platform_modules.mk SONIC_ALL += $(DOCKER_SYNCD_CAVM) \ $(DOCKER_ORCHAGENT_CAVM) From 86f5c196434f4ad855ca90149a08a4ff265d8b2e Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Tue, 17 Jan 2017 11:12:43 -0800 Subject: [PATCH 0189/1011] [docker]: docker-ptf doesn't wait until eth3 is up This is done inside ptf agent now --- dockers/docker-ptf/Dockerfile.j2 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index db67c3261d36..85732eae35b0 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -79,5 +79,4 @@ COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf EXPOSE 22 -ENTRYPOINT while [ "x$( ifconfig eth3 | grep RUNNING )" = 'x' ] ; do sleep 1 ; done \ - && /usr/bin/supervisord +ENTRYPOINT ["/usr/bin/supervisord"] From e471c983234ce8207940fdda42cdc94e15512ce7 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 18 Jan 2017 10:53:58 -0800 Subject: [PATCH 0190/1011] [src]: Update sonic-sairedis/swss/common commit to latest (#193) --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 04ba52422ecc..e5d0aa91ea74 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 04ba52422ecc038b509c072cfcf4ac2baa06db84 +Subproject commit e5d0aa91ea74eccc7e63b321c43640658337a836 diff --git a/src/sonic-swss b/src/sonic-swss index 1bd4240f6641..e5683423edf1 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 1bd4240f6641223f70d215fb044fdf8ecf93da85 +Subproject commit e5683423edf1c6ec98502894a07bd8cf7cadcf7c diff --git a/src/sonic-swss-common b/src/sonic-swss-common index e06988dd2c44..31a6b40089ef 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit e06988dd2c44f6c5200f16c765a0e9a64a0ce274 +Subproject commit 31a6b40089efd42c895604b7d1d9fcc5b5c37040 From 3df2c474664f363160a7fabe9209a59135154342 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 18 Jan 2017 13:29:06 -0800 Subject: [PATCH 0191/1011] [src]: Update quagga to latest (#194) --- src/sonic-quagga | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-quagga b/src/sonic-quagga index cf02de55bf00..77a98c2de5f8 160000 --- a/src/sonic-quagga +++ b/src/sonic-quagga @@ -1 +1 @@ -Subproject commit cf02de55bf00a874fc1cc2aa53b65596294fe495 +Subproject commit 77a98c2de5f80421f1c671d82d3207154eca4ee9 From 6d4d54c9844da12c72026bf99e0db80ab24f473a Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 18 Jan 2017 17:11:29 -0800 Subject: [PATCH 0192/1011] [platform]: Update Broadcom debian packages (#195) Fix /proc/bcm/knet/link set wrong port status --- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index c89382b5fff4..6e768856e772 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.0.3.7-2_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.0.3.7-2_amd64.deb?sv=2015-04-05&sr=b&sig=E9zdq7DpvZSpztO94eiNF4svl8T3wCywZxXRLpLnIpk%3D&se=2030-09-21T00%3A27%3A41Z&sp=r" +BRCM_SAI = libsaibcm_2.0.3.7-3-20170118215303.119_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.0.3.7-3-20170118215303.119_amd64.deb?sv=2015-04-05&sr=b&sig=lmAbkYBRtlEDUwFxAGK0bpGOZ3QIrgzrF3WD%2Ba2tvvY%3D&se=2030-09-27T22%3A51%3A39Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.0.3.7-2_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.0.3.7-3-20170118215303.119_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.0.3.7-2_amd64.deb?sv=2015-04-05&sr=b&sig=I11bX9%2Fo%2F2v1e0KGOnC9pN2MkDcQQZLUGtIJF8rE65w%3D&se=2030-09-21T00%3A28%3A19Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.0.3.7-3-20170118215303.119_amd64.deb?sv=2015-04-05&sr=b&sig=e8tPGsXcOfVtMpQdwZKNOpHplezroAkIfxASfK%2BJDR8%3D&se=2030-09-27T22%3A49%3A47Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 23e7881b456c..05c4b814d57c 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.1.5-2_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-2_amd64.deb?sv=2015-04-05&sr=b&sig=dWe5YgQv%2FG5VxC4YaKUQEDtDjIygowNhSHyN0Kv3e78%3D&se=2030-09-21T00%3A31%3A21Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.1.5-3-20170118205520.58_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-3-20170118205520.58_amd64.deb?sv=2015-04-05&sr=b&sig=R3hWzXrbe4IMSBImAUwK30iSSTIfEtXku6ZYWDX5WhI%3D&se=2030-09-27T22%3A45%3A59Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-2_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-2_amd64.deb?sv=2015-04-05&sr=b&sig=tupvWh%2FYdPn2%2FlCIfsUBjjbpGYSy5PHQvxHutQ4aMPc%3D&se=2030-09-21T00%3A31%3A47Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-3-20170118205520.58_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-3-20170118205520.58_amd64.deb?sv=2015-04-05&sr=b&sig=RArOfg5ll6uVbrD0a4VLADHvpJktcJsMSOGYwQ7RZnQ%3D&se=2030-09-27T22%3A49%3A11Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 80d0d2d43bc068dda6f559fe028b0909636c682d Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Thu, 19 Jan 2017 22:19:21 +0200 Subject: [PATCH 0193/1011] Reduce docker images size. (#196) * Reduce docker images size. Install only required dependencies. * Update Dockerfile.j2 --- dockers/docker-database/Dockerfile.j2 | 6 +++++- dockers/docker-fpm/Dockerfile.j2 | 6 +++++- dockers/docker-lldp-sv2/Dockerfile.j2 | 7 ++++++- dockers/docker-orchagent/Dockerfile.j2 | 6 +++++- dockers/docker-ptf/Dockerfile.j2 | 6 +++++- dockers/docker-snmp-sv2/Dockerfile.j2 | 7 ++++++- dockers/docker-teamd/Dockerfile.j2 | 6 +++++- platform/broadcom/docker-syncd-brcm/Dockerfile.j2 | 6 +++++- platform/cavium/docker-syncd-cavm/Dockerfile.j2 | 6 +++++- platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 | 6 +++++- platform/p4/docker-sonic-p4/Dockerfile.j2 | 6 +++++- 11 files changed, 57 insertions(+), 11 deletions(-) diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index cc8cd9bb206a..cca7cd535933 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -2,7 +2,11 @@ FROM docker-base RUN apt-get update -COPY debs/ debs +COPY \ +{% for deb in docker_database_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ ## Install redis-tools dependencies ## TODO: implicitly install dependencies diff --git a/dockers/docker-fpm/Dockerfile.j2 b/dockers/docker-fpm/Dockerfile.j2 index 3007d8e1e53c..ae638d078ac4 100644 --- a/dockers/docker-fpm/Dockerfile.j2 +++ b/dockers/docker-fpm/Dockerfile.j2 @@ -4,7 +4,11 @@ RUN apt-get update RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4 -COPY debs/ debs +COPY \ +{% for deb in docker_fpm_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ RUN dpkg -i \ {% for deb in docker_fpm_debs.split(' ') -%} diff --git a/dockers/docker-lldp-sv2/Dockerfile.j2 b/dockers/docker-lldp-sv2/Dockerfile.j2 index 833e4673733e..9fdb3244e6bc 100644 --- a/dockers/docker-lldp-sv2/Dockerfile.j2 +++ b/dockers/docker-lldp-sv2/Dockerfile.j2 @@ -1,6 +1,11 @@ FROM docker-base -COPY debs /debs +COPY \ +{% for deb in docker_lldp_sv2_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + COPY python-wheels /python-wheels RUN apt-get update && apt-get install -y python-pip supervisor libbsd0 libevent-2.0-5 libjansson4 libwrap0 libxml2 libpci3 libperl5.20 diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 8b82102993dc..cea7cb1a3a0e 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -8,7 +8,11 @@ RUN apt-get install -f -y ifupdown bridge-utils libdbus-1-3 libdaemon0 libjansso ## TODO: implicitly install dependencies RUN apt-get -y install libjemalloc1 -COPY debs /debs +COPY \ +{% for deb in docker_orchagent_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ RUN dpkg -i \ {% for deb in docker_orchagent_debs.split(' ') -%} diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 85732eae35b0..ea86fd6c3cff 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -3,7 +3,11 @@ FROM debian:jessie MAINTAINER Pavel Shirshov ## Copy dependencies -COPY debs /debs +COPY \ +{% for deb in docker_ptf_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index 9d8c068064c5..93436e5782fe 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -1,6 +1,11 @@ FROM docker-base -COPY debs /debs +COPY \ +{% for deb in docker_snmp_sv2_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + COPY python-wheels /python-wheels # enable -O for all Python calls diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index 3cbb5007507d..ad0d4cdfe544 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -2,7 +2,11 @@ FROM docker-base RUN apt-get update && apt-get install -f -y libdbus-1-3 libdaemon0 libjansson4 -COPY debs /debs +COPY \ +{% for deb in docker_teamd_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ RUN dpkg -i \ {% for deb in docker_teamd_debs.split(' ') -%} diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index 89204c03d9be..0050cf9b1bf3 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -2,7 +2,11 @@ FROM docker-base RUN apt-get update -COPY debs /debs +COPY \ +{% for deb in docker_syncd_brcm_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ RUN dpkg -i \ {% for deb in docker_syncd_brcm_debs.split(' ') -%} diff --git a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 index 840399ac5953..9c66649420c0 100755 --- a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 +++ b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 @@ -2,7 +2,11 @@ FROM docker-base RUN apt-get update -COPY debs /debs +COPY \ +{% for deb in docker_syncd_cavm_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ RUN apt-get -y install libpcap-dev libxml2-dev python-dev swig libsensors4-dev libjemalloc1 diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index b5a58b0a0577..d296ab4e8210 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -2,7 +2,11 @@ FROM docker-base RUN apt-get update -COPY debs /debs +COPY \ +{% for deb in docker_syncd_mlnx_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ RUN apt-get install -y libxml2 diff --git a/platform/p4/docker-sonic-p4/Dockerfile.j2 b/platform/p4/docker-sonic-p4/Dockerfile.j2 index 3cf775ea97f6..f285f8f0750f 100644 --- a/platform/p4/docker-sonic-p4/Dockerfile.j2 +++ b/platform/p4/docker-sonic-p4/Dockerfile.j2 @@ -4,7 +4,11 @@ RUN apt-get update RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils python-ply libqt5core5a libqt5network5 libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0 libgmp10 libjudydebian1 libnanomsg0 libdaemon0 libjansson4 libjemalloc1 -COPY debs /debs +COPY \ +{% for deb in docker_sonic_p4_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ RUN dpkg -i \ {% for deb in docker_sonic_p4_debs.split(' ') -%} From 0d6b1e86a8a1cbc188bc81840c909f791d874ae8 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 19 Jan 2017 15:40:18 -0800 Subject: [PATCH 0194/1011] Change default password, so less confuse to sonic-mgmt playbook (#197) --- rules/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/config b/rules/config index 111772136429..d76477ce5adc 100644 --- a/rules/config +++ b/rules/config @@ -30,4 +30,4 @@ SONIC_CONFIG_LOG_TO_FILES = y USERNAME = admin # PASSWORD - password for installer build -PASSWORD = admin +PASSWORD = YourPaSsWoRd From 4fe1bdcf87119961685fdf42ab3d04f039ccf4a5 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 19 Jan 2017 20:56:26 -0800 Subject: [PATCH 0195/1011] sonic-cfggen with sonicv2 dockers (#190) Add a sonic-config-engine to help generate config file based on minigraph and other data on runtime. Modify fpm, teamd, lldp, snmp, and platform-monitor docker to use sonic-config-engine to generate config in docker upon load. --- dockers/docker-fpm/Dockerfile.j2 | 11 +- dockers/docker-fpm/bgpd.conf.j2 | 63 +++++++++ dockers/docker-fpm/config.sh | 14 ++ dockers/docker-fpm/isolate.j2 | 20 +++ dockers/docker-fpm/unisolate.j2 | 20 +++ dockers/docker-fpm/zebra.conf.j2 | 61 +++++++++ dockers/docker-lldp-sv2/Dockerfile.j2 | 10 +- dockers/docker-lldp-sv2/config.sh | 4 + dockers/docker-lldp-sv2/lldpd | 6 + dockers/docker-lldp-sv2/lldpd.conf.j2 | 3 + dockers/docker-platform-monitor/Dockerfile | 16 --- dockers/docker-platform-monitor/Dockerfile.j2 | 28 ++++ dockers/docker-platform-monitor/config.sh | 7 + dockers/docker-snmp-sv2/Dockerfile.j2 | 8 +- dockers/docker-snmp-sv2/config.sh | 13 ++ dockers/docker-snmp-sv2/snmpd | 11 ++ dockers/docker-snmp-sv2/snmpd.conf.j2 | 127 ++++++++++++++++++ dockers/docker-snmp-sv2/sysDescription.j2 | 1 + dockers/docker-teamd/Dockerfile.j2 | 10 +- dockers/docker-teamd/config.sh | 8 ++ dockers/docker-teamd/teamd.j2 | 19 +++ rules/docker-fpm.mk | 2 +- rules/docker-lldp-sv2.mk | 2 +- rules/docker-platform-monitor.mk | 3 +- rules/docker-snmp-sv2.mk | 2 +- rules/docker-teamd.mk | 2 +- rules/sonic-config.mk | 2 +- src/sonic-config-engine/MANIFEST.in | 1 + src/sonic-config-engine/minigraph.py | 36 +++-- .../platform/ACS-MSN2700/alias_map.json | 34 +++++ .../platform/ACS-MSN2700/port_config.ini | 33 +++++ .../platform/ACS-MSN2700/sensors.conf | 21 +++ .../platform/Force10-S6000/alias_map.json | 34 +++++ .../platform/Force10-S6000/port_config.ini | 33 +++++ .../platform/Force10-S6000/sensors.conf | 57 ++++++++ src/sonic-config-engine/setup.py | 17 ++- src/sonic-config-engine/sonic-cfggen | 55 +++++--- 37 files changed, 733 insertions(+), 61 deletions(-) create mode 100644 dockers/docker-fpm/bgpd.conf.j2 create mode 100755 dockers/docker-fpm/config.sh create mode 100755 dockers/docker-fpm/isolate.j2 create mode 100755 dockers/docker-fpm/unisolate.j2 create mode 100644 dockers/docker-fpm/zebra.conf.j2 create mode 100755 dockers/docker-lldp-sv2/config.sh create mode 100644 dockers/docker-lldp-sv2/lldpd create mode 100644 dockers/docker-lldp-sv2/lldpd.conf.j2 delete mode 100755 dockers/docker-platform-monitor/Dockerfile create mode 100755 dockers/docker-platform-monitor/Dockerfile.j2 create mode 100755 dockers/docker-platform-monitor/config.sh create mode 100755 dockers/docker-snmp-sv2/config.sh create mode 100644 dockers/docker-snmp-sv2/snmpd create mode 100644 dockers/docker-snmp-sv2/snmpd.conf.j2 create mode 100644 dockers/docker-snmp-sv2/sysDescription.j2 create mode 100755 dockers/docker-teamd/config.sh create mode 100644 dockers/docker-teamd/teamd.j2 create mode 100644 src/sonic-config-engine/MANIFEST.in create mode 100644 src/sonic-config-engine/platform/ACS-MSN2700/alias_map.json create mode 100644 src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini create mode 100644 src/sonic-config-engine/platform/ACS-MSN2700/sensors.conf create mode 100644 src/sonic-config-engine/platform/Force10-S6000/alias_map.json create mode 100644 src/sonic-config-engine/platform/Force10-S6000/port_config.ini create mode 100644 src/sonic-config-engine/platform/Force10-S6000/sensors.conf diff --git a/dockers/docker-fpm/Dockerfile.j2 b/dockers/docker-fpm/Dockerfile.j2 index ae638d078ac4..dfd3450743fc 100644 --- a/dockers/docker-fpm/Dockerfile.j2 +++ b/dockers/docker-fpm/Dockerfile.j2 @@ -2,7 +2,10 @@ FROM docker-base RUN apt-get update -RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4 +RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4 + +# Dependencies for sonic-cfggen +RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml COPY \ {% for deb in docker_fpm_debs.split(' ') -%} @@ -19,7 +22,9 @@ debs/{{ deb }}{{' '}} RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -COPY ["start.sh", "/usr/bin/"] +COPY ["*.j2", "/etc/swss/bgp/"] +COPY ["start.sh", "config.sh", "/usr/bin/"] -ENTRYPOINT /usr/bin/start.sh \ +ENTRYPOINT /usr/bin/config.sh \ + && /usr/bin/start.sh \ && /bin/bash diff --git a/dockers/docker-fpm/bgpd.conf.j2 b/dockers/docker-fpm/bgpd.conf.j2 new file mode 100644 index 000000000000..25839864fbb7 --- /dev/null +++ b/dockers/docker-fpm/bgpd.conf.j2 @@ -0,0 +1,63 @@ +! +{% block banner %} +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/bgpd.conf.j2 using minigraph_facts.py +! file: bgpd.conf +! +{% endblock banner %} +! +{% block system_init %} +hostname {{ inventory_hostname }} +password zebra +log syslog informational +log facility local4 +! enable password {# {{ en_passwd }} TODO: param needed #} +{% endblock system_init %} +! +{% block bgp_init %} +! +! bgp multiple-instance +! +router bgp {{ minigraph_bgp_asn }} + bgp log-neighbor-changes + bgp bestpath as-path multipath-relax +{# TODO: use lo[0] for backward compatibility, will revisit the case with multiple lo interfaces #} + bgp router-id {{ minigraph_lo_interfaces[0]['addr'] }} +{# advertise loopback #} +{% for lo in minigraph_lo_interfaces %} +{% if lo['addr'] | ipv4 %} + network {{ lo['addr'] }}/32 +{% elif lo['addr'] | ipv6 %} + address-family ipv6 + network {{ lo['addr'] }}/128 + exit-address-family +{% endif %} +{% endfor %} +{% endblock bgp_init %} +{% block vlan_advertisement %} +{% for interface in minigraph_interfaces %} +{% if interface['name'].startswith('Vlan') %} + network {{ interface['subnet'] }} +{% endif %} +{% endfor %} +{% endblock vlan_advertisement %} +{% block bgp_sessions %} +{% for bgp_session in minigraph_bgp %} +{% if bgp_session['asn'] != 0 %} + neighbor {{ bgp_session['addr'] }} remote-as {{ bgp_session['asn'] }} + neighbor {{ bgp_session['addr'] }} description {{ bgp_session['name'] }} +{% if bgp_session['addr'] | ipv6 %} + address-family ipv6 + neighbor {{ bgp_session['addr'] }} activate + maximum-paths 64 + exit-address-family +{% endif %} +{% endif %} +{% endfor %} +{% endblock bgp_sessions %} +! +maximum-paths 64 +! +route-map ISOLATE permit 10 +set as-path prepend {{ minigraph_bgp_asn }} +! diff --git a/dockers/docker-fpm/config.sh b/dockers/docker-fpm/config.sh new file mode 100755 index 000000000000..647d9d34ba70 --- /dev/null +++ b/dockers/docker-fpm/config.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +mkdir -p /etc/quagga +sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/bgp/bgpd.conf.j2 >/etc/quagga/bgpd.conf +sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/bgp/zebra.conf.j2 >/etc/quagga/zebra.conf + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/bgp/isolate.j2 >/usr/sbin/bgp-isolate +chown root:root /usr/sbin/bgp-isolate +chmod 0755 /usr/sbin/bgp-isolate + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/bgp/unisolate.j2 >/usr/sbin/bgp-unisolate +chown root:root /usr/sbin/bgp-unisolate +chmod 0755 /usr/sbin/bgp-unisolate + diff --git a/dockers/docker-fpm/isolate.j2 b/dockers/docker-fpm/isolate.j2 new file mode 100755 index 000000000000..35ef5bbc0209 --- /dev/null +++ b/dockers/docker-fpm/isolate.j2 @@ -0,0 +1,20 @@ +#!/bin/bash +## vtysh only accepts script in stdin, so cannot be directly used in shebang +## Cut the tail of this script and feed vtysh stdin +sed -n -e '9,$p' < "$0" | vtysh "$@" +## Exit with vtysh return code +exit $? + +## vtysh script start from next line, which line number MUST eqaul in 'sed' command above + +configure terminal + router bgp {{ minigraph_bgp_asn }} +{% for bgp_session in minigraph_bgp %} + neighbor {{ bgp_session['addr'] }} route-map ISOLATE out +{% endfor %} + exit +exit + +{% for bgp_session in minigraph_bgp %} +clear ip bgp {{ bgp_session['addr'] }} soft out +{% endfor %} diff --git a/dockers/docker-fpm/unisolate.j2 b/dockers/docker-fpm/unisolate.j2 new file mode 100755 index 000000000000..c113a74fab45 --- /dev/null +++ b/dockers/docker-fpm/unisolate.j2 @@ -0,0 +1,20 @@ +#!/bin/bash +## vtysh only accepts script in stdin, so cannot be directly used in shebang +## Cut the tail of this script and feed vtysh stdin +sed -n -e '9,$p' < "$0" | vtysh "$@" +## Exit with vtysh return code +exit $? + +## vtysh script start from next line, which line number MUST eqaul in 'sed' command above + +configure terminal + router bgp {{ minigraph_bgp_asn }} +{% for bgp_session in minigraph_bgp %} + no neighbor {{ bgp_session['addr'] }} route-map ISOLATE out +{% endfor %} + exit +exit + +{% for bgp_session in minigraph_bgp %} +clear ip bgp {{ bgp_session['addr'] }} soft out +{% endfor %} diff --git a/dockers/docker-fpm/zebra.conf.j2 b/dockers/docker-fpm/zebra.conf.j2 new file mode 100644 index 000000000000..ad05dcbe4e90 --- /dev/null +++ b/dockers/docker-fpm/zebra.conf.j2 @@ -0,0 +1,61 @@ +! +{% block banner %} +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/zebra.conf.j2 using minigraph_facts.py +! file: zebra.conf +! +{% endblock banner %} +! +{% block sys_init %} +hostname {{ inventory_hostname }} +password zebra +enable password zebra +{% endblock sys_init %} +! +{% block interfaces %} +! Enable link-detect (default disabled) +{% for interface in minigraph_interfaces %} +interface {{ interface['alias'] }} +link-detect +! +{% endfor %} +{% endblock interfaces %} +! +{% block default_route %} +! set static default route to mgmt gateway as a backup to learned default +ip route 0.0.0.0/0 {{ minigraph_mgmt_interface['gwaddr'] }} 200 +{% endblock default_route %} +! +{% block source_loopback %} +! Set ip source to loopback for bgp learned routes +route-map RM_SET_SRC permit 10 + set src {{ minigraph_lo_interfaces[0]['addr'] }} +! +{% set lo_ipv6_addrs = [] %} +{% if minigraph_lo_interfaces is defined %} +{% for interface in minigraph_lo_interfaces %} +{% if interface['addr'] is defined and interface['addr']|ipv6 %} +{% if lo_ipv6_addrs.append(interface['addr']) %} +{% endif %} +{% endif %} +{% endfor %} +{% endif %} +{% if lo_ipv6_addrs|length > 0 %} +route-map RM_SET_SRC6 permit 10 + set src {{ lo_ipv6_addrs[0] }} +! +{% endif %} +ip protocol bgp route-map RM_SET_SRC +! +{% if lo_ipv6_addrs|length > 0 %} +ipv6 protocol bgp route-map RM_SET_SRC6 +! +{% endif %} +{% endblock source_loopback %} +! +{% block logging %} +log syslog informational +log facility local4 +{% endblock logging %} +! + diff --git a/dockers/docker-lldp-sv2/Dockerfile.j2 b/dockers/docker-lldp-sv2/Dockerfile.j2 index 9fdb3244e6bc..399d2ca6e732 100644 --- a/dockers/docker-lldp-sv2/Dockerfile.j2 +++ b/dockers/docker-lldp-sv2/Dockerfile.j2 @@ -8,7 +8,10 @@ debs/ COPY python-wheels /python-wheels -RUN apt-get update && apt-get install -y python-pip supervisor libbsd0 libevent-2.0-5 libjansson4 libwrap0 libxml2 libpci3 libperl5.20 +RUN apt-get update && apt-get install -y python-pip supervisor libbsd0 libevent-2.0-5 libjansson4 libwrap0 libxml2 libpci3 libperl5.20 + +# Dependencies for sonic-cfggen +RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml ## Pre-install the fundamental packages ## Install Python SSWSDK @@ -27,5 +30,8 @@ RUN pip install /python-wheels/sswsdk-2.0.1-py2-none-any.whl && \ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY reconfigure.sh /opt/reconfigure.sh +COPY ["config.sh", "/usr/bin/"] +COPY ["lldpd.conf.j2", "/etc/swss/lldp/"] +COPY ["lldpd", "/etc/default/"] -ENTRYPOINT ["/usr/bin/supervisord"] +ENTRYPOINT /usr/bin/config.sh && /usr/bin/supervisord diff --git a/dockers/docker-lldp-sv2/config.sh b/dockers/docker-lldp-sv2/config.sh new file mode 100755 index 000000000000..d6ded04bc394 --- /dev/null +++ b/dockers/docker-lldp-sv2/config.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/lldp/lldpd.conf.j2 >/etc/lldpd.conf + diff --git a/dockers/docker-lldp-sv2/lldpd b/dockers/docker-lldp-sv2/lldpd new file mode 100644 index 000000000000..ba22e49b9b47 --- /dev/null +++ b/dockers/docker-lldp-sv2/lldpd @@ -0,0 +1,6 @@ +############################################################################### +# Managed by sonic-cfggen +############################################################################### + +# Uncomment to start SNMP subagent and enable CDP, SONMP and EDP protocol +DAEMON_ARGS="" diff --git a/dockers/docker-lldp-sv2/lldpd.conf.j2 b/dockers/docker-lldp-sv2/lldpd.conf.j2 new file mode 100644 index 000000000000..d6be1e3ce0f2 --- /dev/null +++ b/dockers/docker-lldp-sv2/lldpd.conf.j2 @@ -0,0 +1,3 @@ +{% for member in alias_map %} +configure ports {{member['sonic']}} lldp portidsubtype local {{member['origin']}} +{% endfor %} diff --git a/dockers/docker-platform-monitor/Dockerfile b/dockers/docker-platform-monitor/Dockerfile deleted file mode 100755 index 9bd3d79d9a70..000000000000 --- a/dockers/docker-platform-monitor/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM docker-base - -## Pre-install the fundamental packages -## Clean up -RUN apt-get update && \ - apt-get -y install \ - smartmontools \ - sensord \ - && \ - apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y - -ENTRYPOINT service rsyslog start \ - && service lm-sensors start \ - && service smartmontools start \ - && service sensord start \ - && /bin/bash diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 new file mode 100755 index 000000000000..83463acf480f --- /dev/null +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -0,0 +1,28 @@ +FROM docker-base + +RUN apt-get update + +RUN apt-get install -y smartmontools sensord + +# Dependencies for sonic-cfggen +RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml + +COPY debs/ debs + +RUN dpkg -i \ +{% for deb in docker_fpm_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +COPY ["config.sh", "/usr/bin/"] + +ENTRYPOINT /usr/bin/config.sh \ + && service rsyslog start \ + && service lm-sensors start \ + && service smartmontools start \ + && service sensord start \ + && /bin/bash diff --git a/dockers/docker-platform-monitor/config.sh b/dockers/docker-platform-monitor/config.sh new file mode 100755 index 000000000000..4267bc547934 --- /dev/null +++ b/dockers/docker-platform-monitor/config.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +mkdir -p /etc/sensors.d + +hwsku=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` +/bin/cp -rf /usr/share/sonic/$hwsku/sensors.conf /etc/sensors.d/ + diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index 93436e5782fe..8e3a019b74c9 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -17,6 +17,9 @@ ENV PYTHONOPTIMIZE 1 ## Clean up RUN apt-get update && apt-get install -y libmysqlclient-dev libmysqld-dev libperl-dev libpci-dev libpci3 libsensors4 libsensors4-dev libwrap0-dev +# Dependencies for sonic-cfggen +RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml + RUN dpkg -i \ {% for deb in docker_snmp_sv2_debs.split(' ') -%} debs/{{ deb }}{{' '}} @@ -44,8 +47,11 @@ RUN apt-get -y install build-essential wget libssl-dev openssl supervisor && \ rm -rf ~/.cache COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY ["*.j2", "/etc/swss/snmp/"] +COPY ["snmpd", "/etc/default/"] +COPY ["config.sh", "/usr/bin/"] ## Although exposing ports is not need for host net mode, keep it for possible bridge mode EXPOSE 161/udp 162/udp -ENTRYPOINT ["/usr/bin/supervisord"] +ENTRYPOINT /usr/bin/config.sh && /usr/bin/supervisord diff --git a/dockers/docker-snmp-sv2/config.sh b/dockers/docker-snmp-sv2/config.sh new file mode 100755 index 000000000000..880aef593045 --- /dev/null +++ b/dockers/docker-snmp-sv2/config.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +#sysDescription is currently mounted, uncomment this line and provide version.yml instead if use copying instead of mounting +#sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/version.yml -t /etc/swss/snmp/sysDescription.j2 >/etc/ssw/sysDescription + +mkdir -p /etc/snmp + +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/snmp.yml -t /etc/swss/snmp/snmpd.conf.j2 >/etc/snmp/snmpd.conf + +hwsku=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` +/bin/cp -rf /usr/share/sonic/$hwsku/alias_map.json /etc/snmp/ + + diff --git a/dockers/docker-snmp-sv2/snmpd b/dockers/docker-snmp-sv2/snmpd new file mode 100644 index 000000000000..4b35c6cc936a --- /dev/null +++ b/dockers/docker-snmp-sv2/snmpd @@ -0,0 +1,11 @@ +# This file controls the activity of snmpd + +# Don't load any MIBs by default. +# You might comment this lines once you have the MIBs downloaded. +export MIBS= + +# snmpd control (yes means start daemon). +SNMPDRUN=yes + +# snmpd options (use syslog, close stdin/out/err). +SNMPDOPTS='-LS4d -Lf /dev/null -u snmp -g snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable -p /run/snmpd.pid' diff --git a/dockers/docker-snmp-sv2/snmpd.conf.j2 b/dockers/docker-snmp-sv2/snmpd.conf.j2 new file mode 100644 index 000000000000..1f1691f987b5 --- /dev/null +++ b/dockers/docker-snmp-sv2/snmpd.conf.j2 @@ -0,0 +1,127 @@ +############################################################################### +# Managed by Ansible +# file: ansible/roles/acs/templates/snmpd.conf.j2 +############################################################################### +# +# EXAMPLE.conf: +# An example configuration file for configuring the Net-SNMP agent ('snmpd') +# See the 'snmpd.conf(5)' man page for details +# +# Some entries are deliberately commented out, and will need to be explicitly activated +# +############################################################################### +# +# AGENT BEHAVIOUR +# + +# Listen for connections on localhost, loopback ip and mgmt (eth0) ip +agentAddress udp:127.0.0.1:161 +agentAddress udp:{{ minigraph_mgmt_interface.addr }}:161 +{% for minigraph_lo_interface in minigraph_lo_interfaces %} +# TODO: only support ipv4 lo addresses, add ipv6 support later +{% if minigraph_lo_interface.addr | ipv4 %} +agentAddress udp:{{ minigraph_lo_interface.addr }}:161 +{% endif %} +{% endfor %} +############################################################################### +# +# ACCESS CONTROL +# + + # system + hrSystem groups only +view systemonly included .1.3.6.1.2.1.1 +view systemonly included .1.3.6.1.2.1.25.1 + + # Default access to basic system info +rocommunity {{ snmp_rocommunity }} + + +############################################################################### +# +# SYSTEM INFORMATION +# + +# Note that setting these values here, results in the corresponding MIB objects being 'read-only' +# See snmpd.conf(5) for more details +sysLocation {{ snmp_location }} +sysContact Azure Cloud Switch vteam + # Application + End-to-End layers +sysServices 72 + + +# +# Process Monitoring +# +# todo: should we enable snmp based monitoring of sswsyncd and other processes? + +# At least one 'sendmail' process, but no more than 10 +#proc sendmail 10 1 + +# Walk the UCD-SNMP-MIB::prTable to see the resulting output +# Note that this table will be empty if there are no "proc" entries in the snmpd.conf file + + +# +# Disk Monitoring +# + # 10MBs required on root disk, 5% free on /var, 10% free on all other disks +disk / 10000 +disk /var 5% +includeAllDisks 10% + +# Walk the UCD-SNMP-MIB::dskTable to see the resulting output +# Note that this table will be empty if there are no "disk" entries in the snmpd.conf file + + +# +# System Load +# + # Unacceptable 1-, 5-, and 15-minute load averages +load 12 10 5 + +# Walk the UCD-SNMP-MIB::laTable to see the resulting output +# Note that this table *will* be populated, even without a "load" entry in the snmpd.conf file + + + +############################################################################### +# +# ACTIVE MONITORING +# +# Note: disabled snmp traps due to side effect of causing snmpd to listen on all ports (0.0.0.0) +# +# send SNMPv1 traps +#trapsink localhost public +# send SNMPv2c traps +#trap2sink localhost public +# send SNMPv2c INFORMs +#informsink localhost public + +# Note that you typically only want *one* of these three lines +# Uncommenting two (or all three) will result in multiple copies of each notification. + + +# +# Event MIB - automatically generate alerts +# +# Remember to activate the 'createUser' lines above +#iquerySecName internalUser +#rouser internalUser +# generate traps on UCD error conditions +#defaultMonitors yes +#note, this release of snmpd does not support linkUpDownNotifications +# generate traps on linkUp/Down +#linkUpDownNotifications yes + + +# +# AgentX Sub-agents +# + # Run as an AgentX master agent +master agentx + +# +# SysDescription pass-through +# + +pass -p 10 .1.3.6.1.2.1.1.1 /usr/share/snmp/sysDescr_pass.py diff --git a/dockers/docker-snmp-sv2/sysDescription.j2 b/dockers/docker-snmp-sv2/sysDescription.j2 new file mode 100644 index 000000000000..a4871a6ffd44 --- /dev/null +++ b/dockers/docker-snmp-sv2/sysDescription.j2 @@ -0,0 +1 @@ +SONiC Software Version: {{ sonic_baseimage_version}}.SONiC.{{ sonic_version }} - HwSku: {{ minigraph_hwsku }} diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index ad0d4cdfe544..e663b9d7d1f7 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -2,6 +2,10 @@ FROM docker-base RUN apt-get update && apt-get install -f -y libdbus-1-3 libdaemon0 libjansson4 + +# Dependencies for sonic-cfggen +RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml + COPY \ {% for deb in docker_teamd_debs.split(' ') -%} debs/{{ deb }}{{' '}} @@ -13,10 +17,10 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} -COPY start.sh /usr/bin/start.sh +COPY ["start.sh", "config.sh", "/usr/bin/"] +COPY ["teamd.j2", "/etc/swss/teamd/"] RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] +ENTRYPOINT /usr/bin/config.sh && /usr/bin/start.sh diff --git a/dockers/docker-teamd/config.sh b/dockers/docker-teamd/config.sh new file mode 100755 index 000000000000..482cde53bdf2 --- /dev/null +++ b/dockers/docker-teamd/config.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +mkdir -p /etc/teamd + +for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml --var-keys minigraph_portchannel_interfaces`; do + sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'"}' -t /etc/swss/teamd/teamd.j2 >/etc/teamd/$pc.conf +done + diff --git a/dockers/docker-teamd/teamd.j2 b/dockers/docker-teamd/teamd.j2 new file mode 100644 index 000000000000..7c6e4b355e0b --- /dev/null +++ b/dockers/docker-teamd/teamd.j2 @@ -0,0 +1,19 @@ +{ + "device": "{{ pc }}", + "runner": { + "name": "lacp", + "active": true, + "min_ports": 2, + "tx_hash": ["eth", "ipv4", "ipv6"] + }, + "link_watch": { + "name": "ethtool" + }, + "ports": { + {% for member in minigraph_portchannel_interfaces[pc] %} +"{{member}}": {}{% if not loop.last %},{% endif %} + + {% endfor %} + } +} + diff --git a/rules/docker-fpm.mk b/rules/docker-fpm.mk index d9fa51f0eeca..48d35592d402 100644 --- a/rules/docker-fpm.mk +++ b/rules/docker-fpm.mk @@ -2,6 +2,6 @@ DOCKER_FPM = docker-fpm.gz $(DOCKER_FPM)_PATH = $(DOCKERS_PATH)/docker-fpm -$(DOCKER_FPM)_DEPENDS += $(QUAGGA) $(SWSS) +$(DOCKER_FPM)_DEPENDS += $(QUAGGA) $(SWSS) $(SONIC_CONFIG_ENGINE) $(DOCKER_FPM)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_FPM) diff --git a/rules/docker-lldp-sv2.mk b/rules/docker-lldp-sv2.mk index 17347fa79ed7..b2efe81e8b70 100644 --- a/rules/docker-lldp-sv2.mk +++ b/rules/docker-lldp-sv2.mk @@ -2,7 +2,7 @@ DOCKER_LLDP_SV2 = docker-lldp-sv2.gz $(DOCKER_LLDP_SV2)_PATH = $(DOCKERS_PATH)/docker-lldp-sv2 -$(DOCKER_LLDP_SV2)_DEPENDS += $(LLDPD) +$(DOCKER_LLDP_SV2)_DEPENDS += $(LLDPD) $(SONIC_CONFIG_ENGINE) $(DOCKER_LLDP_SV2)_PYTHON_WHEELS += $(DBSYNCD_PY2) $(DOCKER_LLDP_SV2)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_LLDP_SV2) diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index 1a48e4c2234a..51997cc41516 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -2,6 +2,7 @@ DOCKER_PLATFORM_MONITOR = docker-platform-monitor.gz $(DOCKER_PLATFORM_MONITOR)_PATH = $(DOCKERS_PATH)/docker-platform-monitor +$(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(SONIC_CONFIG_ENGINE) $(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_BASE) -SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) +SONIC_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) diff --git a/rules/docker-snmp-sv2.mk b/rules/docker-snmp-sv2.mk index 038c3fb7f002..619e48f5591d 100644 --- a/rules/docker-snmp-sv2.mk +++ b/rules/docker-snmp-sv2.mk @@ -2,7 +2,7 @@ DOCKER_SNMP_SV2 = docker-snmp-sv2.gz $(DOCKER_SNMP_SV2)_PATH = $(DOCKERS_PATH)/docker-snmp-sv2 -$(DOCKER_SNMP_SV2)_DEPENDS += $(SNMP) $(SNMPD) +$(DOCKER_SNMP_SV2)_DEPENDS += $(SNMP) $(SNMPD) $(SONIC_CONFIG_ENGINE) $(DOCKER_SNMP_SV2)_PYTHON_WHEELS += $(ASYNCSNMP_PY3) $(DOCKER_SNMP_SV2)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SNMP_SV2) diff --git a/rules/docker-teamd.mk b/rules/docker-teamd.mk index 0760f27902ae..4924b2b18891 100644 --- a/rules/docker-teamd.mk +++ b/rules/docker-teamd.mk @@ -2,6 +2,6 @@ DOCKER_TEAMD = docker-teamd.gz $(DOCKER_TEAMD)_PATH = $(DOCKERS_PATH)/docker-teamd -$(DOCKER_TEAMD)_DEPENDS += $(SWSS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) +$(DOCKER_TEAMD)_DEPENDS += $(SWSS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(SONIC_CONFIG_ENGINE) $(DOCKER_TEAMD)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_TEAMD) diff --git a/rules/sonic-config.mk b/rules/sonic-config.mk index ba2fdacc2c50..e0f6504bf994 100644 --- a/rules/sonic-config.mk +++ b/rules/sonic-config.mk @@ -1,5 +1,5 @@ # sonic-config-engine package -SONIC_CONFIG_ENGINE = sonic-config-engine_1.0-1_all.deb +SONIC_CONFIG_ENGINE = python-sonic-config-engine_1.0-1_all.deb $(SONIC_CONFIG_ENGINE)_SRC_PATH = $(SRC_PATH)/sonic-config-engine SONIC_PYTHON_STDEB_DEBS += $(SONIC_CONFIG_ENGINE) diff --git a/src/sonic-config-engine/MANIFEST.in b/src/sonic-config-engine/MANIFEST.in new file mode 100644 index 000000000000..a98b68c2a5bb --- /dev/null +++ b/src/sonic-config-engine/MANIFEST.in @@ -0,0 +1 @@ +recursive-include platform *.json *.ini *.conf diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 2bc7bf43cdfa..8560b850c179 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -169,12 +169,12 @@ def parse_dpg(dpg, hname): intfs.append(intf) pcintfs = child.find(str(QName(ns, "PortChannelInterfaces"))) - pc_intfs = [] + pc_intfs = {} for pcintf in pcintfs.findall(str(QName(ns, "PortChannel"))): pcintfname = pcintf.find(str(QName(ns, "Name"))).text pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text pcmbr_list = pcintfmbr.split(';', 1) - pc_intfs.append({'name': pcintfname, 'members': pcmbr_list}) + pc_intfs[pcintfname]=pcmbr_list lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces"))) lo_intfs = [] @@ -209,7 +209,7 @@ def parse_dpg(dpg, hname): vintfname = vintf.find(str(QName(ns, "Name"))).text vlanid = vintf.find(str(QName(ns, "VlanID"))).text vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text - vmbr_list = vintfmbr.split(';')) + vmbr_list = vintfmbr.split(';') vlan_attributes = {'name': vintfname, 'members': vmbr_list, 'vlanid': vlanid} for addrtuple in vlan_map.get(vintfname, []): vlan_attributes.update(addrtuple) @@ -285,6 +285,17 @@ def get_mgmt_info(devices, dev, port): return ret_val +def get_alias_map_list(hwsku): + alias_map_json = os.path.join('/usr/share/sonic', hwsku, 'alias_map.json') + if not os.path.isfile(alias_map_json): + return None + with open(alias_map_json) as data: + alias_map_dict = json.load(data) + alias_map_list = [] + for k,v in alias_map_dict.items(): + alias_map_list.append({'sonic': k, 'origin': v}) + return alias_map_list + def parse_xml(filename): root = ET.parse(filename).getroot() mini_graph_path = filename @@ -312,14 +323,10 @@ def parse_xml(filename): hostname = child.text # port_alias_map maps ngs port name to sonic port name - if hwsku == "Force10-S6000": - for i in range(0, 128, 4): - port_alias_map["fortyGigE0/%d" % i] = "Ethernet%d" % i - elif hwsku == "Arista-7050-QX32": - for i in range(1, 25): - port_alias_map["Ethernet%d/1" % i] = "Ethernet%d" % ((i - 1) * 4) - for i in range(25, 33): - port_alias_map["Ethernet%d" % i] = "Ethernet%d" % ((i - 1) * 4) + alias_map_list = get_alias_map_list(hwsku) + if alias_map_list != None: + for item in alias_map_list: + port_alias_map[item['origin']] = item['sonic'] for child in root: if child.tag == str(QName(ns, "DpgDec")): @@ -340,9 +347,9 @@ def parse_xml(filename): vlan['members'] = " ".join(vlan['members']) # Replace port with alias in port channel interfaces members - for pc in pc_intfs: - for i,member in enumerate(pc['members']): - pc['members'][i] = port_alias_map[member] + for pc in pc_intfs.keys(): + for i,member in enumerate(pc_intfs[pc]): + pc_intfs[pc][i] = port_alias_map[member] Tree = lambda: defaultdict(Tree) @@ -367,6 +374,7 @@ def parse_xml(filename): results['minigraph_console'] = get_console_info(devices, console_dev, console_port) results['minigraph_mgmt'] = get_mgmt_info(devices, mgmt_dev, mgmt_port) results['inventory_hostname'] = hostname + results['alias_map'] = alias_map_list return results diff --git a/src/sonic-config-engine/platform/ACS-MSN2700/alias_map.json b/src/sonic-config-engine/platform/ACS-MSN2700/alias_map.json new file mode 100644 index 000000000000..dd1324ae4360 --- /dev/null +++ b/src/sonic-config-engine/platform/ACS-MSN2700/alias_map.json @@ -0,0 +1,34 @@ +{ + "Ethernet8": "Ethernet8", + "Ethernet0": "Ethernet0", + "Ethernet4": "Ethernet4", + "Ethernet108": "Ethernet108", + "Ethernet100": "Ethernet100", + "Ethernet104": "Ethernet104", + "Ethernet96": "Ethernet96", + "Ethernet124": "Ethernet124", + "Ethernet120": "Ethernet120", + "Ethernet92": "Ethernet92", + "Ethernet28": "Ethernet28", + "Ethernet52": "Ethernet52", + "Ethernet56": "Ethernet56", + "Ethernet76": "Ethernet76", + "Ethernet72": "Ethernet72", + "Ethernet32": "Ethernet32", + "Ethernet16": "Ethernet16", + "Ethernet36": "Ethernet36", + "Ethernet12": "Ethernet12", + "Ethernet88": "Ethernet88", + "Ethernet24": "Ethernet24", + "Ethernet116": "Ethernet116", + "Ethernet80": "Ethernet80", + "Ethernet112": "Ethernet112", + "Ethernet84": "Ethernet84", + "Ethernet48": "Ethernet48", + "Ethernet44": "Ethernet44", + "Ethernet40": "Ethernet40", + "Ethernet64": "Ethernet64", + "Ethernet60": "Ethernet60", + "Ethernet20": "Ethernet20", + "Ethernet68": "Ethernet68" +} \ No newline at end of file diff --git a/src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini b/src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini new file mode 100644 index 000000000000..ae703f020de6 --- /dev/null +++ b/src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini @@ -0,0 +1,33 @@ +# alias lanes +Ethernet0 0,1,2,3 +Ethernet4 4,5,6,7 +Ethernet8 8,9,10,11 +Ethernet12 12,13,14,15 +Ethernet16 16,17,18,19 +Ethernet20 20,21,22,23 +Ethernet24 24,25,26,27 +Ethernet28 28,29,30,31 +Ethernet32 32,33,34,35 +Ethernet36 36,37,38,39 +Ethernet40 40,41,42,43 +Ethernet44 44,45,46,47 +Ethernet48 48,49,50,51 +Ethernet52 52,53,54,55 +Ethernet56 56,57,58,59 +Ethernet60 60,61,62,63 +Ethernet64 64,65,66,67 +Ethernet68 68,69,70,71 +Ethernet72 72,73,74,75 +Ethernet76 76,77,78,79 +Ethernet80 80,81,82,83 +Ethernet84 84,85,86,87 +Ethernet88 88,89,90,91 +Ethernet92 92,93,94,95 +Ethernet96 96,97,98,99 +Ethernet100 100,101,102,103 +Ethernet104 104,105,106,107 +Ethernet108 108,109,110,111 +Ethernet112 112,113,114,115 +Ethernet116 116,117,118,119 +Ethernet120 120,121,122,123 +Ethernet124 124,125,126,127 diff --git a/src/sonic-config-engine/platform/ACS-MSN2700/sensors.conf b/src/sonic-config-engine/platform/ACS-MSN2700/sensors.conf new file mode 100644 index 000000000000..a3e30391863e --- /dev/null +++ b/src/sonic-config-engine/platform/ACS-MSN2700/sensors.conf @@ -0,0 +1,21 @@ +bus "i2c-7" "i2c-1-mux (chan_id 5)" +chip "lm75-i2c-7-4a" + label temp1 "Ambient Port Temp" + +bus "i2c-5" "i2c-1-mux (chan_id 3)" +chip "ucd9200-i2c-5-27" + label in1 "UCD1 vin" + label in2 "ASIC 3.3 vout" + label in3 "ASIC 1.2 vout" + label temp1 "UCD1 Temp" + label temp2 "UCD1 Temp2" + +chip "ucd9200-i2c-5-41" + label in1 "UCD2 vin" + label in2 "ASIC Vcore vout" + label temp1 "UCD2 Temp1" + label temp2 "UCD2 Temp2" + +bus "i2c-17" "i2c-1-mux (chan_id 7)" +chip "lm75-i2c-17-49" + label temp1 "Ambient Board Temp" diff --git a/src/sonic-config-engine/platform/Force10-S6000/alias_map.json b/src/sonic-config-engine/platform/Force10-S6000/alias_map.json new file mode 100644 index 000000000000..b58d147f70c3 --- /dev/null +++ b/src/sonic-config-engine/platform/Force10-S6000/alias_map.json @@ -0,0 +1,34 @@ +{ + "Ethernet8": "fortyGigE0/8", + "Ethernet0": "fortyGigE0/0", + "Ethernet4": "fortyGigE0/4", + "Ethernet108": "fortyGigE0/108", + "Ethernet100": "fortyGigE0/100", + "Ethernet104": "fortyGigE0/104", + "Ethernet96": "fortyGigE0/96", + "Ethernet124": "fortyGigE0/124", + "Ethernet120": "fortyGigE0/120", + "Ethernet92": "fortyGigE0/92", + "Ethernet28": "fortyGigE0/28", + "Ethernet52": "fortyGigE0/52", + "Ethernet56": "fortyGigE0/56", + "Ethernet76": "fortyGigE0/76", + "Ethernet72": "fortyGigE0/72", + "Ethernet32": "fortyGigE0/32", + "Ethernet16": "fortyGigE0/16", + "Ethernet36": "fortyGigE0/36", + "Ethernet12": "fortyGigE0/12", + "Ethernet88": "fortyGigE0/88", + "Ethernet24": "fortyGigE0/24", + "Ethernet116": "fortyGigE0/116", + "Ethernet80": "fortyGigE0/80", + "Ethernet112": "fortyGigE0/112", + "Ethernet84": "fortyGigE0/84", + "Ethernet48": "fortyGigE0/48", + "Ethernet44": "fortyGigE0/44", + "Ethernet40": "fortyGigE0/40", + "Ethernet64": "fortyGigE0/64", + "Ethernet60": "fortyGigE0/60", + "Ethernet20": "fortyGigE0/20", + "Ethernet68": "fortyGigE0/68" +} \ No newline at end of file diff --git a/src/sonic-config-engine/platform/Force10-S6000/port_config.ini b/src/sonic-config-engine/platform/Force10-S6000/port_config.ini new file mode 100644 index 000000000000..7161416e4d4c --- /dev/null +++ b/src/sonic-config-engine/platform/Force10-S6000/port_config.ini @@ -0,0 +1,33 @@ +# alias lanes +Ethernet0 29,30,31,32 +Ethernet4 25,26,27,28 +Ethernet8 37,38,39,40 +Ethernet12 33,34,35,36 +Ethernet16 41,42,43,44 +Ethernet20 45,46,47,48 +Ethernet24 5,6,7,8 +Ethernet28 1,2,3,4 +Ethernet32 9,10,11,12 +Ethernet36 13,14,15,16 +Ethernet40 21,22,23,24 +Ethernet44 17,18,19,20 +Ethernet48 49,50,51,52 +Ethernet52 53,54,55,56 +Ethernet56 61,62,63,64 +Ethernet60 57,58,59,60 +Ethernet64 65,66,67,68 +Ethernet68 69,70,71,72 +Ethernet72 77,78,79,80 +Ethernet76 73,74,75,76 +Ethernet80 105,106,107,108 +Ethernet84 109,110,111,112 +Ethernet88 117,118,119,120 +Ethernet92 113,114,115,116 +Ethernet96 121,122,123,124 +Ethernet100 125,126,127,128 +Ethernet104 85,86,87,88 +Ethernet108 81,82,83,84 +Ethernet112 89,90,91,92 +Ethernet116 93,94,95,96 +Ethernet120 97,98,99,100 +Ethernet124 101,102,103,104 diff --git a/src/sonic-config-engine/platform/Force10-S6000/sensors.conf b/src/sonic-config-engine/platform/Force10-S6000/sensors.conf new file mode 100644 index 000000000000..2208bb6340d1 --- /dev/null +++ b/src/sonic-config-engine/platform/Force10-S6000/sensors.conf @@ -0,0 +1,57 @@ +# libsensors configuration file +# -------------------------------------------------- +# + +# tmp75-i2c-11-4c has sensors close to Networking ASIC. +# tmp75-i2c-11-4d has sensors close to NIC. +# tmp75-i2c-11-4e is an ambient temperature sensor. + +chip "tmp75-*" + set temp1_max 50 + set temp1_max_hyst 25 + +# emc1403-i2c-10-4d has following temperature sensors: +# temp1: CPU0 external Temp Sensor +# temp2: CPU1 external Temp Sensor +# temp3: CPU Internal DTS (Internal die, max of all die readings) + +chip "emc1403-*" + set temp1_crit 85 + set temp1_max 50 + set temp2_crit 85 + set temp2_max 50 + set temp3_crit 85 + set temp3_max 50 + +chip "max6620-i2c-*-2a" + ignore fan3 + ignore fan4 + +chip "w83627dhg-*" + label in0 "VCore 1" + label in1 "VCore 2" + set in0_min 0 + set in0_max 1.74 + set in1_min 0 + set in1_max 1.74 + ignore fan1 + ignore fan2 + ignore fan3 + ignore fan4 + ignore fan5 + ignore in4 + ignore in5 + ignore in6 + ignore temp1 + ignore temp2 + ignore temp3 + ignore cpu0_vid + ignore intrusion0 + +chip "jc42-*" + set temp1_max 50 + set temp1_crit 85 + +chip "dni_dps460-*" + set temp1_max 50 + set temp2_max 50 diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py index 3223735b971a..af2f6f414d79 100644 --- a/src/sonic-config-engine/setup.py +++ b/src/sonic-config-engine/setup.py @@ -1,6 +1,20 @@ #!/usr/bin/env python from setuptools import setup +import os.path + +def get_platform_file_list(): + data_files = [] + repo_path = os.path.abspath(os.path.dirname(__file__)) + data_path = os.path.join(repo_path, 'platform') + platforms = os.listdir(data_path) + for platform in platforms: + data_files.append( (os.path.join('/usr/share/sonic', platform), + ['platform/' + platform + '/alias_map.json', + 'platform/' + platform + '/port_config.ini', + 'platform/' + platform + '/sensors.conf'] + )) + return data_files setup(name='sonic-config-engine', version='1.0', @@ -10,5 +24,6 @@ url='https://github.com/Azure/sonic-buildimage', py_modules=['minigraph'], scripts=['sonic-cfggen'], - install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'yaml'], + data_files=get_platform_file_list(), + install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'pyyaml'], ) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index e20b15977d18..01774885b578 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -6,6 +6,7 @@ import argparse import yaml import jinja2 import netaddr +import json from minigraph import parse_xml @@ -36,27 +37,51 @@ def is_ipv6(value): def main(): parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") - parser.add_argument("template") - parser.add_argument("-m", "--minigraph", required=True, help="minigraph xml file") - parser.add_argument("-v", "--var-file", help="yaml file that contains addtional variables") + parser.add_argument("-m", "--minigraph", help="minigraph xml file") + parser.add_argument("-y", "--yaml", help="yaml file that contains addtional variables") + parser.add_argument("-a", "--additional-data", help="addition data, in json string") + group = parser.add_mutually_exclusive_group() + group.add_argument("-t", "--template", help="render the data with the template file") + group.add_argument("-v", "--var", help="print the value of a variable") + group.add_argument("--var-json", help="print the value of a variable, in json format") + group.add_argument("--var-keys", help="print all keys of a map variable") + group.add_argument("--print-data", help="print all data", action='store_true') args = parser.parse_args() - minigraph = args.minigraph - template_file = os.path.abspath(args.template) - - data = parse_xml(minigraph) + data = {} + + if args.minigraph != None: + minigraph = args.minigraph + data.update(parse_xml(minigraph)) - if args.var_file != None: - with open(args.var_file, 'r') as stream: - additional_data = yaml.load(stream) + if args.yaml != None: + with open(args.yaml, 'r') as stream: + additional_data = yaml.load(stream) data.update(additional_data) - env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'), trim_blocks=True) - env.filters['ipv4'] = is_ipv4 - env.filters['ipv6'] = is_ipv6 - template = env.get_template(template_file) + if args.additional_data != None: + data.update(json.loads(args.additional_data)) + + if args.template != None: + template_file = os.path.abspath(args.template) + env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'), trim_blocks=True) + env.filters['ipv4'] = is_ipv4 + env.filters['ipv6'] = is_ipv6 + template = env.get_template(template_file) + print template.render(data) + + if args.var != None: + print data[args.var] + + if args.var_json != None: + print json.dumps(data[args.var_json]) + + if args.var_keys != None: + for key in data[args.var_keys].keys(): + print key - print template.render(data) + if args.print_data: + print data if __name__ == "__main__": main() From ea65962fe4ad410e46b3f006e1d1dd28a807a1c3 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Fri, 20 Jan 2017 23:55:42 +0200 Subject: [PATCH 0196/1011] Fix compilation issue. (#198) Fix docker-platform-monitor compilation issue. Update .gitignore file --- .gitignore | 1 + dockers/docker-platform-monitor/Dockerfile.j2 | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 372634cfb016..1e87c52e6f71 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ dockers/docker-lldp-sv2/Dockerfile dockers/docker-orchagent/Dockerfile dockers/docker-snmp-sv2/Dockerfile dockers/docker-team/Dockerfile +dockers/docker-platform-monitor/Dockerfile diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 index 83463acf480f..c6020d113ba6 100755 --- a/dockers/docker-platform-monitor/Dockerfile.j2 +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -7,10 +7,15 @@ RUN apt-get install -y smartmontools sensord # Dependencies for sonic-cfggen RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml -COPY debs/ debs +COPY \ +{% for deb in docker_platform_monitor_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + RUN dpkg -i \ -{% for deb in docker_fpm_debs.split(' ') -%} +{% for deb in docker_platform_monitor_debs.split(' ') -%} debs/{{ deb }}{{' '}} {%- endfor %} From 78f11a7ff3d723d324bfecfe06eae4c5510f79a6 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 20 Jan 2017 22:33:11 -0800 Subject: [PATCH 0197/1011] [docker]: Make line breaks consistent in DHCP relay Dockerfile (#203) --- dockers/docker-dhcp-relay/Dockerfile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile index efc1f7f5c317..17cc13534241 100644 --- a/dockers/docker-dhcp-relay/Dockerfile +++ b/dockers/docker-dhcp-relay/Dockerfile @@ -3,11 +3,12 @@ FROM docker-base ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -## Install isc-dhcp-relay -## Clean up -RUN apt-get update && apt-get -y install \ - isc-dhcp-relay && \ - apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +## Install isc-dhcp-relay and clean up afterward +RUN apt-get update \ + && apt-get -y install isc-dhcp-relay \ + && apt-get clean -y \ + && apt-get autoclean -y \ + && apt-get autoremove -y COPY isc-dhcp-relay /etc/default/isc-dhcp-relay From 9b940c3b3d65330ea272d01706307a2a0e7bec50 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Sat, 21 Jan 2017 10:30:39 -0800 Subject: [PATCH 0198/1011] Remove apt purge which wrongly remove sonic-config-engine (#204) --- dockers/docker-snmp-sv2/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index 8e3a019b74c9..f975fbf845da 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -41,7 +41,7 @@ RUN apt-get -y install build-essential wget libssl-dev openssl supervisor && \ python3 -m sonic_ax_impl install && \ python3 -m pip uninstall -y pip setuptools && \ /bin/bash -c "rm -rf /usr/lib/python3.5/{unittest,lib2to3,tkinter,idlelib,email,test}" && \ - apt-get -y purge build-essential wget libssl-dev openssl && \ + apt-get -y purge build-essential libssl-dev openssl && \ apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ find / | grep -E "__pycache__" | xargs rm -rf && \ rm -rf ~/.cache From 09f61a48943558297acc044925b5a8fd8048f4b7 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Sun, 22 Jan 2017 22:19:43 -0800 Subject: [PATCH 0199/1011] [libteam]: Add patch 0001-libteam-Add-team_get_port_enabled-function.patch (#205) --- ...m-Add-team_get_port_enabled-function.patch | 59 +++++++++++++++++++ src/libteam/Makefile | 4 ++ 2 files changed, 63 insertions(+) create mode 100644 src/libteam/0001-libteam-Add-team_get_port_enabled-function.patch diff --git a/src/libteam/0001-libteam-Add-team_get_port_enabled-function.patch b/src/libteam/0001-libteam-Add-team_get_port_enabled-function.patch new file mode 100644 index 000000000000..9bf08ce61308 --- /dev/null +++ b/src/libteam/0001-libteam-Add-team_get_port_enabled-function.patch @@ -0,0 +1,59 @@ +From 2f9248dd07d51361bc0a93ef70d0f8ac2631af35 Mon Sep 17 00:00:00 2001 +From: Shuotian Cheng +Date: Fri, 20 Jan 2017 12:10:13 -0800 +Subject: [PATCH] libteam: Add team_get_port_enabled function + +--- + include/team.h | 2 ++ + libteam/libteam.c | 22 ++++++++++++++++++++++ + 2 files changed, 24 insertions(+) + +diff --git a/include/team.h b/include/team.h +index 20ebcf6..9ae517d 100644 +--- a/include/team.h ++++ b/include/team.h +@@ -68,6 +68,8 @@ int team_get_bpf_hash_func(struct team_handle *th, struct sock_fprog *fp); + int team_set_bpf_hash_func(struct team_handle *th, const struct sock_fprog *fp); + int team_set_port_enabled(struct team_handle *th, + uint32_t port_ifindex, bool val); ++int team_get_port_enabled(struct team_handle *th, ++ uint32_t port_ifindex, bool *enabled); + int team_set_port_user_linkup_enabled(struct team_handle *th, + uint32_t port_ifindex, bool val); + int team_get_port_user_linkup(struct team_handle *th, +diff --git a/libteam/libteam.c b/libteam/libteam.c +index ac187aa..106e5cf 100644 +--- a/libteam/libteam.c ++++ b/libteam/libteam.c +@@ -1295,6 +1295,28 @@ int team_set_port_enabled(struct team_handle *th, + /** + * @param th libteam library context + * @param port_ifindex port interface index ++ * @param enabled where the enabled state will be stored ++ * ++ * @details Gets enabled state for port identified by port_ifindex ++ * ++ * @return Zero on success or negative number in case of an error. ++ **/ ++TEAM_EXPORT ++int team_get_port_enabled(struct team_handle *th, ++ uint32_t port_ifindex, bool *enabled) ++{ ++ struct team_option *option; ++ ++ option = team_get_option(th, "np", "enabled", port_ifindex); ++ if (!option) ++ return -ENOENT; ++ *enabled = team_get_option_value_bool(option); ++ return 0; ++} ++ ++/** ++ * @param th libteam library context ++ * @param port_ifindex port interface index + * @param val boolean value + * + * @details Enables or disable user linkup for port identified by port_ifindex +-- +2.1.4 + diff --git a/src/libteam/Makefile b/src/libteam/Makefile index b41487241b83..e6864596c98d 100644 --- a/src/libteam/Makefile +++ b/src/libteam/Makefile @@ -13,8 +13,12 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : git clone https://github.com/jpirko/libteam.git pushd ./libteam git checkout -f v1.26 + + # Apply patch + git apply ../0001-libteam-Add-team_get_port_enabled-function.patch popd + # Obtain debian packaging git clone https://anonscm.debian.org/git/collab-maint/libteam.git tmp pushd ./tmp git checkout -f da006f2 # v1.26 From 7bd90505a174aaaa010909a0a483b94e2d5eda4f Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 23 Jan 2017 22:18:53 -0800 Subject: [PATCH 0200/1011] [docker]: Add DHCP relay docker to generic build (#207) --- platform/generic/rules.mk | 3 ++- rules/docker-dhcp-relay.mk | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 rules/docker-dhcp-relay.mk diff --git a/platform/generic/rules.mk b/platform/generic/rules.mk index cff64a8b6003..bc349ac4e7de 100644 --- a/platform/generic/rules.mk +++ b/platform/generic/rules.mk @@ -3,4 +3,5 @@ SONIC_ALL += $(DOCKER_DATABASE) \ $(DOCKER_TEAMD) \ $(DOCKER_LLDP_SV2) \ $(DOCKER_SNMP_SV2) \ - $(DOCKER_PLATFORM_MONITOR) + $(DOCKER_PLATFORM_MONITOR) \ + $(DOCKER_DHCP_RELAY) diff --git a/rules/docker-dhcp-relay.mk b/rules/docker-dhcp-relay.mk new file mode 100644 index 000000000000..1c68e8468a30 --- /dev/null +++ b/rules/docker-dhcp-relay.mk @@ -0,0 +1,7 @@ +# docker dhcp relay image + +DOCKER_DHCP_RELAY = docker-dhcp-relay.gz +$(DOCKER_DHCP_RELAY)_PATH = $(DOCKERS_PATH)/docker-dhcp-relay +$(DOCKER_DHCP_RELAY)_LOAD_DOCKERS = $(DOCKER_BASE) + +SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) From 6d8f57631b66e54dbc94617daead960dc527b3ef Mon Sep 17 00:00:00 2001 From: byu343 Date: Mon, 23 Jan 2017 22:25:47 -0800 Subject: [PATCH 0201/1011] [Arista]: Add support to convert vfat file system to ext4 (#201) This commit will convert the existing file system of flash drive on Arista switches from VFAT to EXT4 in the booting of SONiC. It will take the whole flash and therefore remove the recovery partition. There is a check in the script making sure that the conversion operation will not happen on a non-Arista switch or if the existing file system is not VFAT. --- build_debian.sh | 7 + files/initramfs-tools/arista-convertfs | 170 +++++++++++++++++++++++++ files/initramfs-tools/mke2fs | 50 ++++++++ 3 files changed, 227 insertions(+) create mode 100644 files/initramfs-tools/arista-convertfs create mode 100644 files/initramfs-tools/mke2fs diff --git a/build_debian.sh b/build_debian.sh index fdefde3bb153..c4a0ab112c5c 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -113,6 +113,13 @@ sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/linux-image-3.16.0-4-amd64_*.de ## Update initramfs for booting with squashfs+aufs cat files/initramfs-tools/modules | sudo tee -a $FILESYSTEM_ROOT/etc/initramfs-tools/modules > /dev/null +## Hook into initramfs: change fs type from vfat to ext4 on arista switches +sudo mkdir -p $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/ +sudo cp files/initramfs-tools/arista-convertfs $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-convertfs +sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-convertfs +sudo cp files/initramfs-tools/mke2fs $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/mke2fs +sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/mke2fs + ## Hook into initramfs: after partition mount and loop file mount ## 1. Prepare layered file system ## 2. Bind-mount docker working directory (docker aufs cannot work over aufs rootfs) diff --git a/files/initramfs-tools/arista-convertfs b/files/initramfs-tools/arista-convertfs new file mode 100644 index 000000000000..1aab6fa7d765 --- /dev/null +++ b/files/initramfs-tools/arista-convertfs @@ -0,0 +1,170 @@ +#!/bin/sh + +case $1 in + prereqs) + exit 0 + ;; +esac + +set -e +# set -x +total_mem=$(free | awk '/^Mem:/{print $2}') +tmpfs_size=$(( $total_mem / 20 * 17 )) +free_mem_thres=$(( $total_mem / 20 * 18 )) +tmp_mnt='/mnt/ramdisk-convfs' +root_mnt='/mnt/root-convfs' +root_dev='' +flash_dev='' +block_flash='' +aboot_flag='' +backup_file='' + +# Get the fullpath of flash device, e.g., /dev/sda +get_flash_dev() { + for dev in $(ls /sys/block); do + local is_mmc=$(echo "$dev" | grep 'mmcblk.*boot.*' | cat) + if [ -n "$is_mmc" ]; then + continue + fi + local devid=$(realpath "/sys/block/$dev/device") + local is_device=$(echo "$devid" | grep '^/sys/devices/' | cat) + local is_flash=$(echo "$devid" | grep "$block_flash" | cat) + if [ -n "$is_device" -a -n "$is_flash" ]; then + flash_dev="/dev/$dev" + return 0 + fi + done + return 1 +} + +# Wait for root_dev to be ready +wait_for_root_dev() { + local try_rounds=30 + while [ $try_rounds -gt 0 ]; do + if [ -e "$root_dev" ]; then + return 0 + fi + sleep 1 + try_rounds=$(( $try_rounds - 1 )) + done + return 1 +} + +# Alway run cleanup before exit +cleanup() { + if grep -q "$root_mnt" /proc/mounts; then + umount "$root_mnt" + fi + if grep -q "$tmp_mnt" /proc/mounts; then + umount "$tmp_mnt" + fi + [ -e "$root_mnt" ] && rmdir "$root_mnt" + [ -e "$tmp_mnt" ] && rmdir "$tmp_mnt" +} +trap cleanup EXIT + +notification() { +cat << EOF +A failure happend in modifying the root file system which stopped the upgrade. Manual interventions are needed to fix the issue. Note that: +1) files in the old root file system may have been lost and the old partition table may have been corrupted; +2) The files in the old root file system were copied to $tmp_mnt; +3) The old partition table was dumped to the file $tmp_mnt/$backup_file by sfdisk; +4) Quitting the current shell will lose all files mentioned above permanently. +EOF +} + +run_cmd() { + if ! eval "$1"; then + echo "$2" + notification + sh + exit 1 + fi +} + +# Extract kernel parameters +set -- $(cat /proc/cmdline) +for x in "$@"; do + case "$x" in + block_flash=*) + block_flash="${x#block_flash=}" + ;; + Aboot=*) + aboot_flag="${x#Aboot=}" + esac +done +root_dev="$ROOT" + +#Check aboot and root_dev is vfat +[ -z "$aboot_flag" ] && exit 0 +if [ -z "$root_dev" ]; then + echo "Error: root device name is not provided" + exit 1 +fi +if ! wait_for_root_dev; then + echo "Error: timeout in waiting for $root_dev" + exit 1 +fi +blkid | grep "$root_dev.*vfat" -q || exit 0 + + +# Get flash dev name +if [ -z "$block_flash" ]; then + echo "Error: flash device info is not provided" + exit 1 +fi +if ! get_flash_dev; then + echo "Error: flash device is not found" + exit 1 +fi + +# Check memory size for tmpfs +free_mem=$(free | awk '/^Mem:/{print $4}') +if [ "$free_mem" -lt "$free_mem_thres" ]; then + echo "Error: memory is not enough" + exit 1 +fi + +# Backup partition table +mkdir -p "$root_mnt" +mount "$root_dev" "$root_mnt" +backup_file=backup.$(date +%Y-%m-%d.%H-%M-%S) +sfdisk -d "$flash_dev" > "$root_mnt/$backup_file" + +# Check total size of files in root +total_file_size=$(du -s "$root_mnt" | awk '{print $1}') +if [ "$total_file_size" -gt "$tmpfs_size" ]; then + echo "Error: total file size is too large" + exit 1 +fi + +# Create tmpfs, and copy files to tmpfs +mkdir -p "$tmp_mnt" +mount -t tmpfs -o size="${tmpfs_size}k" tmpfs "$tmp_mnt" +cp -a "$root_mnt/." "$tmp_mnt/" +umount "$root_mnt" + +#### Lines below will modify the root file system, so any failure will be trapped to shell for manual interventions. + +# Create a new partition table (content in flash_dev will be deleted) +err_msg="Error: repartitioning $flash_dev failed" +cmd="echo ';' | sfdisk $flash_dev" +run_cmd "$cmd" "$err_msg" + +sleep 5 +err_msg="Error: timeout in waiting for $root_dev after repartition" +cmd="wait_for_root_dev" +run_cmd "$cmd" "$err_msg" + +err_msg="Error: formatting to ext4 failed" +cmd="mke2fs -t ext4 -m2 -F -O '^huge_file' $root_dev" +run_cmd "$cmd" "$err_msg" + +err_msg="Error: mounting $root_dev to $root_mnt failed" +cmd="mount -t ext4 $root_dev $root_mnt" +run_cmd "$cmd" "$err_msg" + +err_msg="Error: copying files form $tmp_mnt to $root_mnt failed" +cmd="cp -a $tmp_mnt/. $root_mnt/" +run_cmd "$cmd" "$err_msg" + diff --git a/files/initramfs-tools/mke2fs b/files/initramfs-tools/mke2fs new file mode 100644 index 000000000000..de529eb57059 --- /dev/null +++ b/files/initramfs-tools/mke2fs @@ -0,0 +1,50 @@ +#!/bin/sh +#Part of the code is revised based on initramfs-tools/hooks/fsck and initramfs-tool is under GPL v2. + +PREREQ="" + +prereqs() +{ + echo "$PREREQ" +} + +case $1 in +prereqs) + prereqs + exit 0 + ;; +esac + +. /usr/share/initramfs-tools/hook-functions + +copy_exec /sbin/mke2fs +copy_exec /sbin/sfdisk +copy_exec /sbin/fdisk + +fstypes="ext4" + +for type in $fstypes; do + prog="/sbin/mkfs.${type}" + if [ -h "$prog" ]; then + link=$(readlink -f "$prog") + copy_exec "$link" + ln -s "$link" "${DESTDIR}/$prog" + elif [ -x "$prog" ] ; then + copy_exec "$prog" + else + echo "Warning: /sbin/mkfs.${type} doesn't exist, can't install to initramfs, ignoring." + fi +done + +for type in $fstypes; do + prog="/sbin/fsck.${type}" + if [ -h "$prog" ]; then + link=$(readlink -f "$prog") + copy_exec "$link" + ln -s "$link" "${DESTDIR}/$prog" + elif [ -x "$prog" ] ; then + copy_exec "$prog" + else + echo "Warning: /sbin/fsck.${type} doesn't exist, can't install to initramfs, ignoring." + fi +done From 1b49499b65d1a1498bdf5129a89f63b01042b8fd Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 24 Jan 2017 19:16:55 -0800 Subject: [PATCH 0202/1011] [docker]: Add a status file to mark that the file is generated by sonic-config-engine (#211) --- dockers/docker-fpm/config.sh | 3 +++ dockers/docker-lldp-sv2/config.sh | 3 +++ dockers/docker-platform-monitor/config.sh | 3 +++ dockers/docker-snmp-sv2/config.sh | 2 ++ dockers/docker-teamd/config.sh | 3 +++ 5 files changed, 14 insertions(+) diff --git a/dockers/docker-fpm/config.sh b/dockers/docker-fpm/config.sh index 647d9d34ba70..c1d3db29a1bd 100755 --- a/dockers/docker-fpm/config.sh +++ b/dockers/docker-fpm/config.sh @@ -12,3 +12,6 @@ sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/bgp/unisolate.j2 >/usr/sbi chown root:root /usr/sbin/bgp-unisolate chmod 0755 /usr/sbin/bgp-unisolate +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status + diff --git a/dockers/docker-lldp-sv2/config.sh b/dockers/docker-lldp-sv2/config.sh index d6ded04bc394..29c9b11f8ed5 100755 --- a/dockers/docker-lldp-sv2/config.sh +++ b/dockers/docker-lldp-sv2/config.sh @@ -2,3 +2,6 @@ sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/lldp/lldpd.conf.j2 >/etc/lldpd.conf +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status + diff --git a/dockers/docker-platform-monitor/config.sh b/dockers/docker-platform-monitor/config.sh index 4267bc547934..ece507b7cc8a 100755 --- a/dockers/docker-platform-monitor/config.sh +++ b/dockers/docker-platform-monitor/config.sh @@ -5,3 +5,6 @@ mkdir -p /etc/sensors.d hwsku=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` /bin/cp -rf /usr/share/sonic/$hwsku/sensors.conf /etc/sensors.d/ +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status + diff --git a/dockers/docker-snmp-sv2/config.sh b/dockers/docker-snmp-sv2/config.sh index 880aef593045..ac1c307ad0cb 100755 --- a/dockers/docker-snmp-sv2/config.sh +++ b/dockers/docker-snmp-sv2/config.sh @@ -10,4 +10,6 @@ sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/snmp.yml -t /etc/swss/snm hwsku=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` /bin/cp -rf /usr/share/sonic/$hwsku/alias_map.json /etc/snmp/ +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status diff --git a/dockers/docker-teamd/config.sh b/dockers/docker-teamd/config.sh index 482cde53bdf2..085a3d405af2 100755 --- a/dockers/docker-teamd/config.sh +++ b/dockers/docker-teamd/config.sh @@ -6,3 +6,6 @@ for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml --var-keys minigraph_portcha sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'"}' -t /etc/swss/teamd/teamd.j2 >/etc/teamd/$pc.conf done +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status + From c0aa0b9c17a8cac73fc54813eeaf014ba5f2cdd1 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Wed, 25 Jan 2017 05:17:32 +0200 Subject: [PATCH 0203/1011] [Mellanox]: Update Mellanox HW management to V1.0.0030 (#209) --- platform/mellanox/hw-management.mk | 2 +- platform/mellanox/hw-management/Makefile | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk index 6c6ae480db4d..1aa63862306e 100644 --- a/platform/mellanox/hw-management.mk +++ b/platform/mellanox/hw-management.mk @@ -1,6 +1,6 @@ # Mellanox HW Management -MLNX_HW_MANAGEMENT_VERSION = 20.7.2016 +MLNX_HW_MANAGEMENT_VERSION = V1.0.0030 export MLNX_HW_MANAGEMENT_VERSION diff --git a/platform/mellanox/hw-management/Makefile b/platform/mellanox/hw-management/Makefile index 8d1dbcb79d0f..ee2899d07c39 100644 --- a/platform/mellanox/hw-management/Makefile +++ b/platform/mellanox/hw-management/Makefile @@ -6,12 +6,13 @@ MAIN_TARGET = hw-management_1.mlnx.$(MLNX_HW_MANAGEMENT_VERSION)_amd64.deb $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # get sources sudo rm -rf hw-management - wget -N -O mlnx-hw-mgmt-$(MLNX_HW_MANAGEMENT_VERSION).tar.gz https://github.com/Mellanox/mellanox-openswitch/raw/master/hw-mgmt/mlnx-hw-mgmt-$(MLNX_HW_MANAGEMENT_VERSION).tar.gz - tar xzf mlnx-hw-mgmt-$(MLNX_HW_MANAGEMENT_VERSION).tar.gz + git clone https://github.com/Mellanox/hw-mgmt/ -b $(MLNX_HW_MANAGEMENT_VERSION) hw-management # build pushd hw-management - sudo debian/rules binary KVERSION=$(KVERSION) + sed "s~@SED_VERSION@~$(MLNX_HW_MANAGEMENT_VERSION)~" -i debian/changelog + chmod +x ./debian/rules + sudo ./debian/rules binary KVERSION=$(KVERSION) popd mv $* $(DEST)/ From 694e12b4b4b2898d6e6638ca58b9608d5b2be713 Mon Sep 17 00:00:00 2001 From: byu343 Date: Tue, 24 Jan 2017 19:18:01 -0800 Subject: [PATCH 0204/1011] [Arista]: Add VFAT support in initramfs (#208) --- files/initramfs-tools/modules | 3 +++ 1 file changed, 3 insertions(+) diff --git a/files/initramfs-tools/modules b/files/initramfs-tools/modules index 86a1fcf20bd7..1bd0eab15996 100644 --- a/files/initramfs-tools/modules +++ b/files/initramfs-tools/modules @@ -1,2 +1,5 @@ squashfs aufs +vfat +nls_cp437 +nls_utf8 From d1399e2380a52978ca77b263d5c394f9e520764b Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 24 Jan 2017 19:18:42 -0800 Subject: [PATCH 0205/1011] [docker]: Add ptf docker to generic target (#210) --- platform/generic/rules.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/generic/rules.mk b/platform/generic/rules.mk index bc349ac4e7de..0ce1f562c0ad 100644 --- a/platform/generic/rules.mk +++ b/platform/generic/rules.mk @@ -4,4 +4,5 @@ SONIC_ALL += $(DOCKER_DATABASE) \ $(DOCKER_LLDP_SV2) \ $(DOCKER_SNMP_SV2) \ $(DOCKER_PLATFORM_MONITOR) \ - $(DOCKER_DHCP_RELAY) + $(DOCKER_DHCP_RELAY) \ + $(DOCKER_PTF) From 752062d57134125971346e06594748af296de36a Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 25 Jan 2017 00:01:14 -0800 Subject: [PATCH 0206/1011] [src]: Update sonic-sairedis/swss (#213) --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index e5d0aa91ea74..d6e7827a16af 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit e5d0aa91ea74eccc7e63b321c43640658337a836 +Subproject commit d6e7827a16af97f0fadbcf0f2da9b2d80a135cb6 diff --git a/src/sonic-swss b/src/sonic-swss index e5683423edf1..5d31f9d6db40 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit e5683423edf1c6ec98502894a07bd8cf7cadcf7c +Subproject commit 5d31f9d6db407882323ce5484a1a1e5f7648121a From ac7de25d947112b9e6436c5048ccfb20a7775358 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 25 Jan 2017 11:06:08 -0800 Subject: [PATCH 0207/1011] [src]: update linux kernel to take tg3 patch on arista qx32 platfrom (#214) --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 5b652fca4fe6..7f3b4e4949aa 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 5b652fca4fe6f215e2869ae1d2e6ef44b3553698 +Subproject commit 7f3b4e4949aa39481221a0ebf88d055676091916 From e87498d16d432d11ccf7b0ec184c0c40c13a2c39 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 25 Jan 2017 18:18:25 -0800 Subject: [PATCH 0208/1011] Add platform config for 7050 and 6100 (#212) * Add platform config for 7050 and 6100 * allow certain platform to have no sensors.conf file in sonic-cfggen --- dockers/docker-platform-monitor/config.sh | 6 +- .../platform/Arista-7050-QX32/alias_map.json | 34 ++++++++ .../platform/Arista-7050-QX32/port_config.ini | 33 ++++++++ .../platform/Arista-7050-QX32/sensors.conf | 79 +++++++++++++++++++ .../platform/Force10-S6100/alias_map.json | 66 ++++++++++++++++ .../platform/Force10-S6100/port_config.ini | 65 +++++++++++++++ src/sonic-config-engine/setup.py | 10 +-- 7 files changed, 287 insertions(+), 6 deletions(-) create mode 100644 src/sonic-config-engine/platform/Arista-7050-QX32/alias_map.json create mode 100644 src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini create mode 100644 src/sonic-config-engine/platform/Arista-7050-QX32/sensors.conf create mode 100644 src/sonic-config-engine/platform/Force10-S6100/alias_map.json create mode 100644 src/sonic-config-engine/platform/Force10-S6100/port_config.ini diff --git a/dockers/docker-platform-monitor/config.sh b/dockers/docker-platform-monitor/config.sh index ece507b7cc8a..a74c2f5c9097 100755 --- a/dockers/docker-platform-monitor/config.sh +++ b/dockers/docker-platform-monitor/config.sh @@ -3,7 +3,11 @@ mkdir -p /etc/sensors.d hwsku=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` -/bin/cp -rf /usr/share/sonic/$hwsku/sensors.conf /etc/sensors.d/ + +if [ -e /usr/share/sonic/$hwsku/sensors.conf ] +then + /bin/cp -rf /usr/share/sonic/$hwsku/sensors.conf /etc/sensors.d/ +fi mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status diff --git a/src/sonic-config-engine/platform/Arista-7050-QX32/alias_map.json b/src/sonic-config-engine/platform/Arista-7050-QX32/alias_map.json new file mode 100644 index 000000000000..90b35011e2c5 --- /dev/null +++ b/src/sonic-config-engine/platform/Arista-7050-QX32/alias_map.json @@ -0,0 +1,34 @@ +{ + "Ethernet8": "Ethernet3/1", + "Ethernet0": "Ethernet1/1", + "Ethernet4": "Ethernet2/1", + "Ethernet108": "Ethernet28", + "Ethernet100": "Ethernet26", + "Ethernet104": "Ethernet27", + "Ethernet96": "Ethernet25", + "Ethernet124": "Ethernet32", + "Ethernet120": "Ethernet31", + "Ethernet92": "Ethernet24/1", + "Ethernet28": "Ethernet8/1", + "Ethernet52": "Ethernet14/1", + "Ethernet56": "Ethernet15/1", + "Ethernet76": "Ethernet20/1", + "Ethernet72": "Ethernet19/1", + "Ethernet32": "Ethernet9/1", + "Ethernet16": "Ethernet5/1", + "Ethernet36": "Ethernet10/1", + "Ethernet12": "Ethernet4/1", + "Ethernet88": "Ethernet23/1", + "Ethernet24": "Ethernet7/1", + "Ethernet116": "Ethernet30", + "Ethernet80": "Ethernet21/1", + "Ethernet112": "Ethernet29", + "Ethernet84": "Ethernet22/1", + "Ethernet48": "Ethernet13/1", + "Ethernet44": "Ethernet12/1", + "Ethernet40": "Ethernet11/1", + "Ethernet64": "Ethernet17/1", + "Ethernet60": "Ethernet16/1", + "Ethernet20": "Ethernet6/1", + "Ethernet68": "Ethernet18/1" +} \ No newline at end of file diff --git a/src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini b/src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini new file mode 100644 index 000000000000..ec12639d72bf --- /dev/null +++ b/src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini @@ -0,0 +1,33 @@ +# alias lanes +Ethernet0 125,126,127,128 +Ethernet4 121,122,123,124 +Ethernet8 13,14,15,16 +Ethernet12 9,10,11,12 +Ethernet16 17,18,19,20 +Ethernet20 21,22,23,24 +Ethernet24 25,26,27,28 +Ethernet28 29,30,31,32 +Ethernet32 37,38,39,40 +Ethernet36 33,34,35,36 +Ethernet40 45,46,47,48 +Ethernet44 41,42,43,44 +Ethernet48 53,54,55,56 +Ethernet52 49,50,51,52 +Ethernet56 69,70,71,72 +Ethernet60 65,66,67,68 +Ethernet64 77,78,79,80 +Ethernet68 73,74,75,76 +Ethernet72 93,94,95,96 +Ethernet76 89,90,91,92 +Ethernet80 101,102,103,104 +Ethernet84 97,98,99,100 +Ethernet88 109,110,111,112 +Ethernet92 105,106,107,108 +Ethernet96 61,62,63,64 +Ethernet100 57,58,59,60 +Ethernet104 81,82,83,84 +Ethernet108 85,86,87,88 +Ethernet112 117,118,119,120 +Ethernet116 113,114,115,116 +Ethernet120 5,6,7,8 +Ethernet124 1,2,3,4 diff --git a/src/sonic-config-engine/platform/Arista-7050-QX32/sensors.conf b/src/sonic-config-engine/platform/Arista-7050-QX32/sensors.conf new file mode 100644 index 000000000000..7745054a05ca --- /dev/null +++ b/src/sonic-config-engine/platform/Arista-7050-QX32/sensors.conf @@ -0,0 +1,79 @@ +# libsensors configuration file +# ---------------------------------------------- +# + +bus "i2c-2" "SCD SMBus master 0 bus 0" +bus "i2c-3" "SCD SMBus master 0 bus 1" +bus "i2c-5" "SCD SMBus master 0 bus 3" +bus "i2c-6" "SCD SMBus master 0 bus 4" +bus "i2c-7" "SCD SMBus master 0 bus 5" + +chip "k10temp-pci-00c3" + label temp1 "Cpu temp sensor" + +chip "lm73-i2c-3-48" + label temp1 "Rear Temp Sensor" + set temp1_max 65 + #set temp1_max_alarm 75 # read-only + +chip "lm86-i2c-2-4c" + label temp1 "Board Temp Sensor" + set temp1_max 65 + set temp1_crit 75 + + label temp2 "Front-panel Temp Sensor" + set temp2_max 65 + set temp2_crit 75 + +chip "pmbus-i2c-3-4e" + label temp1 "Power Controller Sensor 1" + set temp1_max 60 + set temp1_crit 70 + + label temp2 "Power Controller Sensor 2" + set temp2_max 60 + set temp2_crit 70 + + ignore curr1 + +chip "pmbus-i2c-5-58" + label temp1 "Power Supply 1 Sensor 1" + set temp1_max 60 + set temp1_crit 70 + + label temp2 "Power Supply 1 Sensor 2" + set temp2_max 60 + set temp2_crit 70 + + ignore temp3 + + set in1_max 250 + set in1_crit 255 + set power1_max 525 + set power2_max 460 + set power2_crit 462 + set curr1_max 5.28 + set curr1_crit 5.30 + set curr2_max 36 + set curr2_crit 37 + +chip "pmbus-i2c-6-58" + label temp1 "Power Supply 2 Sensor 1" + set temp1_max 60 + set temp1_crit 70 + + label temp2 "Power Supply 2 Sensor 2" + set temp2_max 60 + set temp2_crit 70 + + ignore temp3 + + set in1_max 250 + set in1_crit 255 + set power1_max 525 + set power2_max 460 + set power2_crit 462 + set curr1_max 5.28 + set curr1_crit 5.30 + set curr2_max 36 + set curr2_crit 37 diff --git a/src/sonic-config-engine/platform/Force10-S6100/alias_map.json b/src/sonic-config-engine/platform/Force10-S6100/alias_map.json new file mode 100644 index 000000000000..19a1ef662d37 --- /dev/null +++ b/src/sonic-config-engine/platform/Force10-S6100/alias_map.json @@ -0,0 +1,66 @@ +{ + "Ethernet0": "fortyGigE1/1/1", + "Ethernet1": "fortyGigE1/1/2", + "Ethernet2": "fortyGigE1/1/3", + "Ethernet3": "fortyGigE1/1/4", + "Ethernet4": "fortyGigE1/1/5", + "Ethernet5": "fortyGigE1/1/6", + "Ethernet6": "fortyGigE1/1/7", + "Ethernet7": "fortyGigE1/1/8", + "Ethernet8": "fortyGigE1/1/9", + "Ethernet9": "fortyGigE1/1/10", + "Ethernet10": "fortyGigE1/1/11", + "Ethernet11": "fortyGigE1/1/12", + "Ethernet12": "fortyGigE1/1/13", + "Ethernet13": "fortyGigE1/1/14", + "Ethernet14": "fortyGigE1/1/15", + "Ethernet15": "fortyGigE1/1/16", + "Ethernet16": "fortyGigE1/2/1", + "Ethernet17": "fortyGigE1/2/2", + "Ethernet18": "fortyGigE1/2/3", + "Ethernet19": "fortyGigE1/2/4", + "Ethernet20": "fortyGigE1/2/5", + "Ethernet21": "fortyGigE1/2/6", + "Ethernet22": "fortyGigE1/2/7", + "Ethernet23": "fortyGigE1/2/8", + "Ethernet24": "fortyGigE1/2/9", + "Ethernet25": "fortyGigE1/2/10", + "Ethernet26": "fortyGigE1/2/11", + "Ethernet27": "fortyGigE1/2/12", + "Ethernet28": "fortyGigE1/2/13", + "Ethernet29": "fortyGigE1/2/14", + "Ethernet30": "fortyGigE1/2/15", + "Ethernet31": "fortyGigE1/2/16", + "Ethernet32": "fortyGigE1/3/1", + "Ethernet33": "fortyGigE1/3/2", + "Ethernet34": "fortyGigE1/3/3", + "Ethernet34": "fortyGigE1/3/4", + "Ethernet36": "fortyGigE1/3/5", + "Ethernet37": "fortyGigE1/3/6", + "Ethernet38": "fortyGigE1/3/7", + "Ethernet39": "fortyGigE1/3/8", + "Ethernet40": "fortyGigE1/3/9", + "Ethernet41": "fortyGigE1/3/10", + "Ethernet42": "fortyGigE1/3/11", + "Ethernet43": "fortyGigE1/3/12", + "Ethernet44": "fortyGigE1/3/13", + "Ethernet45": "fortyGigE1/3/14", + "Ethernet46": "fortyGigE1/3/15", + "Ethernet47": "fortyGigE1/3/16", + "Ethernet48": "fortyGigE1/4/1", + "Ethernet49": "fortyGigE1/4/2", + "Ethernet50": "fortyGigE1/4/3", + "Ethernet51": "fortyGigE1/4/4", + "Ethernet52": "fortyGigE1/4/5", + "Ethernet53": "fortyGigE1/4/6", + "Ethernet54": "fortyGigE1/4/7", + "Ethernet55": "fortyGigE1/4/8", + "Ethernet56": "fortyGigE1/4/9", + "Ethernet57": "fortyGigE1/4/10", + "Ethernet58": "fortyGigE1/4/11", + "Ethernet59": "fortyGigE1/4/12", + "Ethernet60": "fortyGigE1/4/13", + "Ethernet61": "fortyGigE1/4/14", + "Ethernet62": "fortyGigE1/4/15", + "Ethernet63": "fortyGigE1/4/16" +} diff --git a/src/sonic-config-engine/platform/Force10-S6100/port_config.ini b/src/sonic-config-engine/platform/Force10-S6100/port_config.ini new file mode 100644 index 000000000000..d0af86ad1a4f --- /dev/null +++ b/src/sonic-config-engine/platform/Force10-S6100/port_config.ini @@ -0,0 +1,65 @@ +# alias lanes +Ethernet0 1,2 +Ethernet1 3,4 +Ethernet2 5,6 +Ethernet3 7,8 +Ethernet4 9,10 +Ethernet5 11,12 +Ethernet6 13,14 +Ethernet7 15,16 +Ethernet8 17,18 +Ethernet9 19,20 +Ethernet10 21,22 +Ethernet11 23,24 +Ethernet12 25,26 +Ethernet13 27,28 +Ethernet14 29,30 +Ethernet15 31,32 +Ethernet16 33,34 +Ethernet17 35,36 +Ethernet18 37,38 +Ethernet19 39,40 +Ethernet20 41,42 +Ethernet21 43,44 +Ethernet22 45,46 +Ethernet23 47,48 +Ethernet24 49,50 +Ethernet25 51,52 +Ethernet26 53,54 +Ethernet27 55,56 +Ethernet28 57,58 +Ethernet29 59,60 +Ethernet30 61,62 +Ethernet31 63,64 +Ethernet32 65,66 +Ethernet33 67,68 +Ethernet34 69,70 +Ethernet35 71,72 +Ethernet36 73,74 +Ethernet37 75,76 +Ethernet38 77,78 +Ethernet39 79,80 +Ethernet40 81,82 +Ethernet41 83,84 +Ethernet42 85,86 +Ethernet43 87,88 +Ethernet44 89,90 +Ethernet45 91,92 +Ethernet46 93,94 +Ethernet47 95,96 +Ethernet48 97,98 +Ethernet49 99,100 +Ethernet50 101,102 +Ethernet51 103,104 +Ethernet52 105,106 +Ethernet53 107,108 +Ethernet54 109,110 +Ethernet55 111,112 +Ethernet56 113,114 +Ethernet57 115,116 +Ethernet58 117,118 +Ethernet59 119,120 +Ethernet60 121,122 +Ethernet61 123,124 +Ethernet62 125,126 +Ethernet63 127,128 diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py index af2f6f414d79..4c11ceb604ca 100644 --- a/src/sonic-config-engine/setup.py +++ b/src/sonic-config-engine/setup.py @@ -9,11 +9,11 @@ def get_platform_file_list(): data_path = os.path.join(repo_path, 'platform') platforms = os.listdir(data_path) for platform in platforms: - data_files.append( (os.path.join('/usr/share/sonic', platform), - ['platform/' + platform + '/alias_map.json', - 'platform/' + platform + '/port_config.ini', - 'platform/' + platform + '/sensors.conf'] - )) + files = ['platform/' + platform + '/alias_map.json', + 'platform/' + platform + '/port_config.ini'] + if os.path.isfile( os.path.join(data_path, platform, 'sensors.conf') ): + files.append('platform/' + platform + '/sensors.conf') #Not all platforms need to have a sensors.conf file + data_files.append( (os.path.join('/usr/share/sonic', platform), files) ) return data_files setup(name='sonic-config-engine', From 608980524fcc932e9d8aba037d51fecfe3470d67 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 25 Jan 2017 18:19:15 -0800 Subject: [PATCH 0209/1011] [docker]: Install dpkt Python package in PTF docker (#216) --- dockers/docker-ptf/Dockerfile.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index ea86fd6c3cff..78f2eb260480 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -65,6 +65,7 @@ RUN rm -rf /debs \ && pip install cffi==1.7.0 \ && pip install --upgrade cffi==1.7.0 \ && pip install nnpy \ + && pip install dpkt \ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py From c18b65bc167764fe182605f1f73e8cb482716fb5 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 26 Jan 2017 23:36:58 -0800 Subject: [PATCH 0210/1011] Refactor DHCP relay docker in sonicv2 style (#217) * Refactor DHCP relay docker in sonicv2 style --- dockers/docker-dhcp-relay/Dockerfile | 6 ++++-- dockers/docker-dhcp-relay/config.sh | 4 ++++ dockers/docker-dhcp-relay/isc-dhcp-relay | 6 ------ dockers/docker-dhcp-relay/isc-dhcp-relay.j2 | 7 +++++++ 4 files changed, 15 insertions(+), 8 deletions(-) create mode 100755 dockers/docker-dhcp-relay/config.sh delete mode 100644 dockers/docker-dhcp-relay/isc-dhcp-relay create mode 100644 dockers/docker-dhcp-relay/isc-dhcp-relay.j2 diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile index 17cc13534241..6ff95da88d7c 100644 --- a/dockers/docker-dhcp-relay/Dockerfile +++ b/dockers/docker-dhcp-relay/Dockerfile @@ -10,9 +10,11 @@ RUN apt-get update \ && apt-get autoclean -y \ && apt-get autoremove -y -COPY isc-dhcp-relay /etc/default/isc-dhcp-relay +COPY ["isc-dhcp-relay.j2", "/usr/share/dhcp-relay/"] +COPY ["config.sh", "/usr/bin/"] -ENTRYPOINT service rsyslog start \ +ENTRYPOINT /usr/bin/config.sh \ + && service rsyslog start \ && service isc-dhcp-relay start \ && /bin/bash diff --git a/dockers/docker-dhcp-relay/config.sh b/dockers/docker-dhcp-relay/config.sh new file mode 100755 index 000000000000..42146b0343bc --- /dev/null +++ b/dockers/docker-dhcp-relay/config.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/dhcp_relay.yml -t /usr/share/dhcp-relay/isc-dhcp-relay.j2 > /etc/default/isc-dhcp-relay + diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay b/dockers/docker-dhcp-relay/isc-dhcp-relay deleted file mode 100644 index 8aef56c7e19f..000000000000 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay +++ /dev/null @@ -1,6 +0,0 @@ -SERVERS="" - -INTERFACES="" - -#-a provides option 82 circuit id information -OPTIONS="-a" diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 new file mode 100644 index 000000000000..2d251172c543 --- /dev/null +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 @@ -0,0 +1,7 @@ +SERVERS="{{ dhcp_servers | join(' ') }}" + +INTERFACES="{{ minigraph_vlan_interfaces | join(' ') }}" + +# '-a' option provides option 82 circuit id information +OPTIONS="-a" + From 34ea91349c3d0172ac27b3d8525c46361d184c8c Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Sun, 29 Jan 2017 21:33:33 +0200 Subject: [PATCH 0211/1011] one image implementation (#215) * Single image * Fix review comments * Update syncd service. Add HW mgmt to Mellanox single image. * Add single image template for Broadcom platform. SKU should be provided during configure: make configure PLATFORM=broadcom SKU=Force10-S6000 * Add single image template for Cavium platform. SKU should be provided during configure: make configure PLATFORM=cavium SKU=AS7512 * Add description to sonic_debian_extension.j2 file. --- Makefile | 1 + build_debian.sh | 26 +- build_image.sh | 6 +- dockers/docker-snmp-sv2/config.sh | 2 +- files/build_templates/bgp.service.j2 | 12 + files/build_templates/database.service.j2 | 12 + files/build_templates/docker_image_ctl.j2 | 25 + files/build_templates/lldp.service.j2 | 12 + files/build_templates/snmp.service.j2 | 12 + .../build_templates/sonic_debian_extension.j2 | 124 ++ files/build_templates/swss.service.j2 | 13 + files/build_templates/syncd.service.j2 | 29 + files/build_templates/sysDescription.j2 | 1 + files/build_templates/teamd.service.j2 | 12 + files/image_config/apt/sonic-dev.gpg.key | 30 + .../image_config/apt/sources.list | 0 ...ian_archive_trafficmanager_net_debian.list | 1 + ...ackages_microsoft_com_repos_sonic_dev.list | 1 + files/image_config/environment/environment | 1 + files/image_config/environment/motd | 12 + .../interfaces/interfaces-config.service | 11 + .../interfaces/interfaces-config.sh | 5 + files/image_config/interfaces/interfaces.j2 | 50 + .../image_config/interfaces/lag_interfaces.j2 | 20 + .../interfaces/vlan_interfaces.j2 | 18 + .../minigraph/minigraph_ACS-MSN2700.xml | 1043 +++++++++++++++++ .../minigraph/minigraph_AS7512.xml | 1043 +++++++++++++++++ .../minigraph/minigraph_Force10-S6000.xml | 1043 +++++++++++++++++ files/image_config/ntp/ntp-config.service | 11 + files/image_config/ntp/ntp-config.sh | 3 + files/image_config/ntp/ntp.conf.j2 | 63 + files/image_config/ntp/ntp.yml | 6 + .../rsyslog/rsyslog-config.service | 11 + files/image_config/rsyslog/rsyslog-config.sh | 3 + files/image_config/rsyslog/rsyslog.conf.j2 | 71 ++ .../rsyslog/rsyslog.d/00-acs.conf | 46 + .../rsyslog/rsyslog.d/99-default.conf | 66 ++ files/image_config/rsyslog/rsyslog.yml | 1 + files/image_config/snmp/snmp.yml | 1 + files/image_config/sudoers/sudoers | 33 + installer/x86_64/install.sh | 4 + onie-image.conf | 3 + platform/broadcom/platform.conf | 0 platform/broadcom/rules.mk | 7 +- platform/broadcom/single-image.mk | 8 + platform/cavium/platform.conf | 0 platform/cavium/rules.mk | 6 +- platform/cavium/single-image.mk | 8 + platform/generic/aboot-image.mk | 9 + platform/generic/onie-image.mk | 8 + platform/generic/platform.conf | 0 platform/generic/rules.mk | 8 +- platform/mellanox/docker-orchagent-mlnx.mk | 10 + platform/mellanox/docker-syncd-mlnx.mk | 7 + platform/mellanox/platform.conf | 0 platform/mellanox/rules.mk | 14 +- platform/mellanox/single-image.mk | 8 + rules/docker-database.mk | 6 + rules/docker-fpm.mk | 6 + rules/docker-lldp-sv2.mk | 5 + rules/docker-snmp-sv2.mk | 6 + rules/docker-teamd.mk | 5 + rules/sonic-aboot.mk | 6 - rules/sonic-generic.mk | 6 - slave.mk | 62 +- .../platform/AS7512/alias_map.json | 1 + .../platform/AS7512/port_config.ini | 1 + .../platform/AS7512/sensors.conf | 1 + 68 files changed, 4025 insertions(+), 60 deletions(-) create mode 100644 files/build_templates/bgp.service.j2 create mode 100644 files/build_templates/database.service.j2 create mode 100644 files/build_templates/docker_image_ctl.j2 create mode 100644 files/build_templates/lldp.service.j2 create mode 100644 files/build_templates/snmp.service.j2 create mode 100644 files/build_templates/sonic_debian_extension.j2 create mode 100644 files/build_templates/swss.service.j2 create mode 100644 files/build_templates/syncd.service.j2 create mode 100644 files/build_templates/sysDescription.j2 create mode 100644 files/build_templates/teamd.service.j2 create mode 100644 files/image_config/apt/sonic-dev.gpg.key rename generic/platform.conf => files/image_config/apt/sources.list (100%) create mode 100644 files/image_config/apt/sources.list.d/debian_archive_trafficmanager_net_debian.list create mode 100644 files/image_config/apt/sources.list.d/packages_microsoft_com_repos_sonic_dev.list create mode 100644 files/image_config/environment/environment create mode 100644 files/image_config/environment/motd create mode 100644 files/image_config/interfaces/interfaces-config.service create mode 100755 files/image_config/interfaces/interfaces-config.sh create mode 100644 files/image_config/interfaces/interfaces.j2 create mode 100644 files/image_config/interfaces/lag_interfaces.j2 create mode 100644 files/image_config/interfaces/vlan_interfaces.j2 create mode 100644 files/image_config/minigraph/minigraph_ACS-MSN2700.xml create mode 100644 files/image_config/minigraph/minigraph_AS7512.xml create mode 100644 files/image_config/minigraph/minigraph_Force10-S6000.xml create mode 100644 files/image_config/ntp/ntp-config.service create mode 100755 files/image_config/ntp/ntp-config.sh create mode 100644 files/image_config/ntp/ntp.conf.j2 create mode 100644 files/image_config/ntp/ntp.yml create mode 100644 files/image_config/rsyslog/rsyslog-config.service create mode 100755 files/image_config/rsyslog/rsyslog-config.sh create mode 100644 files/image_config/rsyslog/rsyslog.conf.j2 create mode 100644 files/image_config/rsyslog/rsyslog.d/00-acs.conf create mode 100644 files/image_config/rsyslog/rsyslog.d/99-default.conf create mode 100644 files/image_config/rsyslog/rsyslog.yml create mode 100644 files/image_config/snmp/snmp.yml create mode 100644 files/image_config/sudoers/sudoers create mode 100644 platform/broadcom/platform.conf create mode 100644 platform/broadcom/single-image.mk create mode 100644 platform/cavium/platform.conf create mode 100644 platform/cavium/single-image.mk create mode 100644 platform/generic/aboot-image.mk create mode 100644 platform/generic/onie-image.mk create mode 100644 platform/generic/platform.conf create mode 100644 platform/mellanox/platform.conf create mode 100644 platform/mellanox/single-image.mk delete mode 100644 rules/sonic-aboot.mk delete mode 100644 rules/sonic-generic.mk create mode 100644 src/sonic-config-engine/platform/AS7512/alias_map.json create mode 100644 src/sonic-config-engine/platform/AS7512/port_config.ini create mode 100644 src/sonic-config-engine/platform/AS7512/sensors.conf diff --git a/Makefile b/Makefile index f68e8de4bbca..5c93afad6a91 100644 --- a/Makefile +++ b/Makefile @@ -30,6 +30,7 @@ DOCKER_BUILD = docker build --no-cache \ -C sonic \ -f slave.mk \ PLATFORM=$(PLATFORM) \ + SKU=$(SKU) \ $@ sonic-slave-build : diff --git a/build_debian.sh b/build_debian.sh index c4a0ab112c5c..11d8217ff8bf 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -132,15 +132,6 @@ sudo chroot $FILESYSTEM_ROOT update-initramfs -u ## Install latest intel igb driver sudo cp target/debs/igb.ko $FILESYSTEM_ROOT/lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/intel/igb/igb.ko -## Install package without starting service -## ref: https://wiki.debian.org/chroot -trap_push 'sudo rm -f $FILESYSTEM_ROOT/usr/sbin/policy-rc.d' -sudo tee -a $FILESYSTEM_ROOT/usr/sbin/policy-rc.d > /dev/null </etc/snmp/snmpd.conf hwsku=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` -/bin/cp -rf /usr/share/sonic/$hwsku/alias_map.json /etc/snmp/ +/bin/cp -rf /etc/ssw/$hwsku/alias_map.json /etc/snmp/ mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status diff --git a/files/build_templates/bgp.service.j2 b/files/build_templates/bgp.service.j2 new file mode 100644 index 000000000000..7fa3c0eb1150 --- /dev/null +++ b/files/build_templates/bgp.service.j2 @@ -0,0 +1,12 @@ +[Unit] +Description=BGP container +Requires=database.service +After=database.service + +[Service] +User={{ sonicadmin_user }} +ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStop=/usr/bin/{{docker_container_name}}.sh stop + +[Install] +WantedBy=multi-user.target diff --git a/files/build_templates/database.service.j2 b/files/build_templates/database.service.j2 new file mode 100644 index 000000000000..fd4f34435e6a --- /dev/null +++ b/files/build_templates/database.service.j2 @@ -0,0 +1,12 @@ +[Unit] +Description=Database container +Requires=docker.service +After=docker.service + +[Service] +User={{ sonicadmin_user }} +ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStop=/usr/bin/{{docker_container_name}}.sh stop + +[Install] +WantedBy=multi-user.target diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 new file mode 100644 index 000000000000..6f604c63aefb --- /dev/null +++ b/files/build_templates/docker_image_ctl.j2 @@ -0,0 +1,25 @@ +#!/bin/bash + +start() { + docker inspect --type container {{docker_container_name}} &>/dev/null + if [ "$?" -eq "0" ]; then + docker start -a {{docker_container_name}} + else + docker run {{docker_image_run_opt}} --name={{docker_container_name}} {{docker_image_name}} + fi +} + +stop() { + docker stop {{docker_container_name}} +} + +case "$1" in + start|stop) + $1 + ;; + *) + echo "Usage: $0 {start|stop}" + exit 1 + ;; +esac + diff --git a/files/build_templates/lldp.service.j2 b/files/build_templates/lldp.service.j2 new file mode 100644 index 000000000000..f66e9d682af6 --- /dev/null +++ b/files/build_templates/lldp.service.j2 @@ -0,0 +1,12 @@ +[Unit] +Description=LLDP container +Requires=database.service +After=database.service + +[Service] +User={{ sonicadmin_user }} +ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStop=/usr/bin/{{docker_container_name}}.sh stop + +[Install] +WantedBy=multi-user.target diff --git a/files/build_templates/snmp.service.j2 b/files/build_templates/snmp.service.j2 new file mode 100644 index 000000000000..3744c586896f --- /dev/null +++ b/files/build_templates/snmp.service.j2 @@ -0,0 +1,12 @@ +[Unit] +Description=SNMP container +Requires=database.service +After=database.service + +[Service] +User={{ sonicadmin_user }} +ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStop=/usr/bin/{{docker_container_name}}.sh stop + +[Install] +WantedBy=multi-user.target diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 new file mode 100644 index 000000000000..00fcf6732131 --- /dev/null +++ b/files/build_templates/sonic_debian_extension.j2 @@ -0,0 +1,124 @@ +#!/bin/bash +## This script is to automate loading of vendor specific docker images +## and instalation of configuration files and vendor specific packages +## to debian file system. +## +## USAGE: +## ./sonic_debian_extension.sh FILESYSTEM_ROOT +## PARAMETERS: +## FILESYSTEM_ROOT +## Path to debian file system root directory + +FILESYSTEM_ROOT=$1 +[ -n "$FILESYSTEM_ROOT" ] || { + echo "Error: no or empty FILESYSTEM_ROOT argument" + exit 1 +} + +## Enable debug output for script +set -x -e + +. functions.sh +BUILD_TEMPLATES=files/build_templates +IMAGE_CONFIGS=files/image_config +VENDOR_CONFIGS=src/sonic-config-engine/platform + +{% if installer_debs.strip() -%} +clean_sys() { + sudo umount $FILESYSTEM_ROOT/sys/fs/cgroup/* \ + $FILESYSTEM_ROOT/sys/fs/cgroup \ + $FILESYSTEM_ROOT/sys || true +} +trap_push clean_sys +sudo LANG=C chroot $FILESYSTEM_ROOT mount sysfs /sys -t sysfs + +sudo chroot $FILESYSTEM_ROOT service docker start +sudo chroot $FILESYSTEM_ROOT docker version + +# Install config engine dependencies +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install \ + python-lxml \ + python-jinja2 \ + python-netaddr \ + python-ipaddr \ + python-yaml + +sudo dpkg --root=$FILESYSTEM_ROOT -i {{config_engine}} + +# Create all needed directories +sudo mkdir -p $FILESYSTEM_ROOT/etc/ssw/ +sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/ +sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/templates/ + +# Apply apt configuration files +sudo cp $IMAGE_CONFIGS/apt/sources.list $FILESYSTEM_ROOT/etc/apt/ +sudo cp -R $IMAGE_CONFIGS/apt/sources.list.d/ $FILESYSTEM_ROOT/etc/apt/ +cat $IMAGE_CONFIGS/apt/sonic-dev.gpg.key | sudo LANG=C chroot $FILESYSTEM_ROOT apt-key add - + +# Apply environtment configuration files +sudo cp $IMAGE_CONFIGS/environment/environment $FILESYSTEM_ROOT/etc/ +sudo cp $IMAGE_CONFIGS/environment/motd $FILESYSTEM_ROOT/etc/ + +# Copy default minigraph +sudo cp $IMAGE_CONFIGS/minigraph/minigraph_{{sonic_hwsku}}.xml $FILESYSTEM_ROOT/etc/sonic/minigraph.xml + +# Copy NTP configuration files and templates +sudo cp $IMAGE_CONFIGS/ntp/ntp-config.service $FILESYSTEM_ROOT/etc/systemd/system/ +sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable ntp-config.service +sudo cp $IMAGE_CONFIGS/ntp/ntp-config.sh $FILESYSTEM_ROOT/usr/bin/ +sudo cp $IMAGE_CONFIGS/ntp/ntp.conf.j2 $FILESYSTEM_ROOT/etc/sonic/templates/ +sudo cp $IMAGE_CONFIGS/ntp/ntp.yml $FILESYSTEM_ROOT/etc/sonic/ + +# Copy rsyslog configuration files and templates +sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog-config.service $FILESYSTEM_ROOT/etc/systemd/system/ +sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable rsyslog-config.service +sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog-config.sh $FILESYSTEM_ROOT/usr/bin/ +sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.conf.j2 $FILESYSTEM_ROOT/etc/sonic/templates/ +sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.yml $FILESYSTEM_ROOT/etc/sonic/ +sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.d/* $FILESYSTEM_ROOT/etc/rsyslog.d/ + +# Copy interfaces configuration files and templates +sudo cp $IMAGE_CONFIGS/interfaces/interfaces-config.service $FILESYSTEM_ROOT/etc/systemd/system/ +sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable interfaces-config.service +sudo cp $IMAGE_CONFIGS/interfaces/interfaces-config.sh $FILESYSTEM_ROOT/usr/bin/ +sudo cp $IMAGE_CONFIGS/interfaces/*.j2 $FILESYSTEM_ROOT/etc/sonic/templates/ + +# Copy SNMP configuration files +sudo cp $IMAGE_CONFIGS/snmp/snmp.yml $FILESYSTEM_ROOT/etc/sonic/ + +# Generate system desription file +export git_revision=$(git rev-parse --short HEAD) +export sonic_hwsku={{sonic_hwsku}} +export debian_version=`cat $FILESYSTEM_ROOT/etc/debian_version` +export kernel_version={{kversion}} +j2 $BUILD_TEMPLATES/sysDescription.j2 > sysDescription +sudo mv sysDescription $FILESYSTEM_ROOT/etc/ssw/ + +# Copy sudoers configuration file +sudo cp $IMAGE_CONFIGS/sudoers/sudoers $FILESYSTEM_ROOT/etc/ + +# Copy vendor specific configuration files +sudo cp -R $VENDOR_CONFIGS/{{sonic_hwsku}}/ $FILESYSTEM_ROOT/etc/ssw/ + +{% for deb in installer_debs.strip().split(' ') -%} +sudo dpkg --extract {{deb}} $FILESYSTEM_ROOT +{% endfor %} +## Run depmod command for target kernel modules +sudo LANG=C chroot $FILESYSTEM_ROOT depmod -a {{kversion}} +{% endif %} +{% if installer_images.strip() -%} +{% for image in installer_images.strip().split(' ') -%} +sudo LANG=C chroot $FILESYSTEM_ROOT docker load < {{image}} +{% endfor %} +sudo chroot $FILESYSTEM_ROOT service docker stop +{% for script in installer_start_scrips.split(' ') -%} +sudo cp {{script}} $FILESYSTEM_ROOT/usr/bin/ +{% endfor %} +{% for service in installer_services.split(' ') -%} +sudo cp {{service}} $FILESYSTEM_ROOT/etc/systemd/system/ +sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable {{service}} +{% endfor %} +sudo LANG=C chroot $FILESYSTEM_ROOT fuser -km /sys || true +sudo LANG=C chroot $FILESYSTEM_ROOT umount -lf /sys +{% endif %} + diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 new file mode 100644 index 000000000000..3e7eb7cb68da --- /dev/null +++ b/files/build_templates/swss.service.j2 @@ -0,0 +1,13 @@ +[Unit] +Description=orchagent container +Requires=database.service +After=database.service + +[Service] +User={{ sonicadmin_user }} +ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStop=/usr/bin/{{docker_container_name}}.sh stop +ExecStopPost=/usr/bin/syncd.sh stop + +[Install] +WantedBy=multi-user.target diff --git a/files/build_templates/syncd.service.j2 b/files/build_templates/syncd.service.j2 new file mode 100644 index 000000000000..e0fdb7e270a5 --- /dev/null +++ b/files/build_templates/syncd.service.j2 @@ -0,0 +1,29 @@ +[Unit] +Description=syncd container +Requires=database.service +After=database.service + +[Service] +User=root +{% if sonic_hwsku == 'ACS-MSN2700' %} +ExecStartPre=/etc/init.d/sxdkernel start +ExecStartPre=/usr/bin/mst start +ExecStartPre=/etc/mlnx/msn2700 start +{% elif sonic_hwsku == 'AS7512' %} +ExecStartPre=-/etc/init.d/xpnet.sh stop +ExecStartPre=/etc/init.d/xpnet.sh start +{% endif %} +ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStop=/usr/bin/{{docker_container_name}}.sh stop +{% if sonic_hwsku == 'ACS-MSN2700' %} +ExecStopPost=/etc/mlnx/msn2700 stop +ExecStopPost=/etc/init.d/sxdkernel stop +ExecStopPost=/usr/bin/mst stop +{% elif sonic_hwsku == 'AS7512' %} +ExecStopPost=/etc/init.d/xpnet.sh stop +ExecStopPost=/etc/init.d/xpnet.sh start +{% endif %} +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/files/build_templates/sysDescription.j2 b/files/build_templates/sysDescription.j2 new file mode 100644 index 000000000000..cfbdca1333d1 --- /dev/null +++ b/files/build_templates/sysDescription.j2 @@ -0,0 +1 @@ +SONiC Software Version: SONiC-OS-{{git_revision}} HwSku: {{sonic_hwsku}} - Distribution: Debian {{debian_version}} - Kernel: {{kernel_version}} diff --git a/files/build_templates/teamd.service.j2 b/files/build_templates/teamd.service.j2 new file mode 100644 index 000000000000..49ecb640d895 --- /dev/null +++ b/files/build_templates/teamd.service.j2 @@ -0,0 +1,12 @@ +[Unit] +Description=TEAMD container +Requires=database.service +After=database.service + +[Service] +User={{ sonicadmin_user }} +ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStop=/usr/bin/{{docker_container_name}}.sh stop + +[Install] +WantedBy=multi-user.target diff --git a/files/image_config/apt/sonic-dev.gpg.key b/files/image_config/apt/sonic-dev.gpg.key new file mode 100644 index 000000000000..fb9a37901bc7 --- /dev/null +++ b/files/image_config/apt/sonic-dev.gpg.key @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQENBFQ1bTIBCAC7oGfkv/ck0XsLuG8cdcSB2ISqxFAcBvH9BitEtxmpW2uhykKk +xY4rVD/4Uys1s3PF1/64QfPR+hYcewueOwz0ZAcLyFXXk4McICXaPq3NrLiWYKKX +UZLnrPzcrGZoW/kHDDp4OmBiDmT1PGvZlpuimwkMCusUzIr7Cbbp2dIy8MERL5tA +LcgLu3KL6clJ+aTW2jgepI1D7sTepOeGd7eRSb5njKg2M7k/93v/7MipZxiVtyXH +B74YiK6jSbst5JpuYsLa/Dqryvx7Xq3n53oif892pv3euTduo1fYw8Hgh/OOYdeT +c9WCj03KA1jCSFURjdrug0kR8BPlfjqtRLXFABEBAAG0JE1TIE9wZW4gVGVjaCA8 +aW50ZXJvcEBtaWNyb3NvZnQuY29tPokBOAQTAQIAIgUCVDVtMgIbAwYLCQgHAwIG +FQgCCQoLBBYCAwECHgECF4AACgkQsCxG30F6CJO1uAf/cmL68bM8YgF/61hkaY56 +LqrppUTJH/w4fKq47Pf6KfgSLvxfNU6soi2KHYRjIvTRx3tV4vUM5n2plaQg2s8V +/Epg4FeIRTk75YwiHAzLhLnp5cdUaTvC4j4mwxoB6j9Ty+fXJwQ0MvpDhIZb9vM4 +GXw/fEQHCT4f3gx4nReeqE+FB2wVHleX9+Lpodu98JyJTKJRBRHYLqy6S+/lyp2W +aBlsI1LOqBcx1uRK24U7duIpbYwIyrx0cafSruqR2GjVdu+imkhHyUn52VbzYhq1 +af0rqYiZ1VOamVOG0By8+hVyNa1MLc1K2uWGs0o5fDe9F5/swbvLHVXI+M50Vs+m +J7kBDQRUNW0yAQgAu7DkTVj0ZQC4F7bFivAwrdby8gCakTXOl1kcK622hjRJ8nam +aZeW+eADfLRsTmdUmXgZu1YWS5Gn2ZVngC8SGPUBT071+oRETCz4uNB7IimB9QfP +++orI6o2vmnVVsq5wWCbEdNU+TCVv1zjrYev5lwckkKpjHt6o8MNoX2DFuQymSyR +eZKaqhdKmcji4Ke7OIYqwgPjch3wxzE1b5gNOR/iwxWyjjOffZPLr/VhIfIJRs86 +dSXrwjHtEh810SKDLghHM0VAdY34nyC5ZZ61yhts5HtQDFK+9mNpH1mkc4gDBlgG +266pVvknumK6lPNm/osF/cpjWmEw24ypcQIvOQARAQABiQEfBBgBAgAJBQJUNW0y +AhsMAAoJELAsRt9BegiTMBUH/0sZ6gZy7mCTSAYT+NSXLFtGC2zNUVL80SWvfgYm +k9XPVI22MrefZfQ6M01RylyxtWXjRM8UoN8SDKWPpXumzJf831f/7om5zwutaG7b +tjDPYqRKJSbAIFZu2mN+uLrNQ2SV6XK7FoV0dtcrEX9S7RICb6i19D+70+Oh/qgU +R04H1jqS29XBzqAlIzdBoA+sYAwbOIJsSL3YyNQcUv3B5+5yR/bo/L8pnUJt6iuL +nWW+mi7r8gWPHDSrcdYq1TmmlOM7CwZPgWRZzkQPSeZz52Tt7IP47eyGJ09U4PIf +FtMH1ElL2UgHoA/F9Q88e7LkztaTqE59uXWbIYyuSMJVvRU= +=sb3d +-----END PGP PUBLIC KEY BLOCK----- diff --git a/generic/platform.conf b/files/image_config/apt/sources.list similarity index 100% rename from generic/platform.conf rename to files/image_config/apt/sources.list diff --git a/files/image_config/apt/sources.list.d/debian_archive_trafficmanager_net_debian.list b/files/image_config/apt/sources.list.d/debian_archive_trafficmanager_net_debian.list new file mode 100644 index 000000000000..503897133ca3 --- /dev/null +++ b/files/image_config/apt/sources.list.d/debian_archive_trafficmanager_net_debian.list @@ -0,0 +1 @@ +deb http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free diff --git a/files/image_config/apt/sources.list.d/packages_microsoft_com_repos_sonic_dev.list b/files/image_config/apt/sources.list.d/packages_microsoft_com_repos_sonic_dev.list new file mode 100644 index 000000000000..468dcccc6eec --- /dev/null +++ b/files/image_config/apt/sources.list.d/packages_microsoft_com_repos_sonic_dev.list @@ -0,0 +1 @@ +deb [arch=amd64] http://packages.microsoft.com/repos/sonic-dev/ jessie main diff --git a/files/image_config/environment/environment b/files/image_config/environment/environment new file mode 100644 index 000000000000..6c85276371bf --- /dev/null +++ b/files/image_config/environment/environment @@ -0,0 +1 @@ +VTYSH_PAGER=more diff --git a/files/image_config/environment/motd b/files/image_config/environment/motd new file mode 100644 index 000000000000..47e32505aa51 --- /dev/null +++ b/files/image_config/environment/motd @@ -0,0 +1,12 @@ +You are on + ____ ___ _ _ _ ____ + / ___| / _ \| \ | (_)/ ___| + \___ \| | | | \| | | | + ___) | |_| | |\ | | |___ + |____/ \___/|_| \_|_|\____| + +-- Software for Open Networking In the Cloud -- + +Unauthorized access and/or use are prohibited. +All access and/or use are subject to monitoring. + diff --git a/files/image_config/interfaces/interfaces-config.service b/files/image_config/interfaces/interfaces-config.service new file mode 100644 index 000000000000..48d6ede42557 --- /dev/null +++ b/files/image_config/interfaces/interfaces-config.service @@ -0,0 +1,11 @@ +[Unit] +Description=Update interfaces configuration +Before=network.target + +[Service] +Type=oneshot +ExecStart=/usr/bin/interfaces-config.sh + +[Install] +WantedBy=multi-user.target + diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh new file mode 100755 index 000000000000..69d72e916477 --- /dev/null +++ b/files/image_config/interfaces/interfaces-config.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/sonic/templates/interfaces.j2 >/etc/network/interfaces +sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/sonic/templates/vlan_interfaces.j2 >/etc/network/interfaces.d/vlan_interfaces +sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/sonic/templates/lag_interfaces.j2 >/etc/network/interfaces.d/lag_interfaces diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 new file mode 100644 index 000000000000..6d1476963ed9 --- /dev/null +++ b/files/image_config/interfaces/interfaces.j2 @@ -0,0 +1,50 @@ +# +{% block banner %} +# =========== Managed by config engine DO NOT EDIT! ======================== +# generated by templates/interfaces.j2 using sonic-cfggen +# file: interfaces +{% endblock %} +# +{% block loopback %} +# The loopback network interface +auto lo +iface lo inet loopback +# Use command 'ip addr list dev lo' to check all addresses +{% for minigraph_lo_interface in minigraph_lo_interfaces %} +iface lo {{ 'inet' if minigraph_lo_interface['addr'] | ipv4 else 'inet6' }} static + address {{ minigraph_lo_interface['addr'] }} + netmask {{ minigraph_lo_interface['mask'] }} +# +{% endfor %} +{% endblock loopback %} +# +{% block mgmt_interface %} +# The management network interface +auto eth0 +{% if minigraph_mgmt_interface['addr'] %} +iface eth0 inet static + address {{ minigraph_mgmt_interface['addr'] }} + netmask {{ minigraph_mgmt_interface['mask'] }} + ################ management network policy routing rules + #### management port up rules" + up ip route add default via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 table default + up ip rule add from {{ minigraph_mgmt_interface['addr'] }}/32 table default + #### management port down rules" + down ip route delete default via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 table default + down ip rule delete from {{ minigraph_mgmt_interface['addr'] }}/32 table default + {# TODO: COPP policy type rules #} +{% else %} +iface eth0 inet dhcp +{% endif %} +{% endblock mgmt_interface %} +# +{% block front_panel_interface %} +# The switch front panel interfaces +{% for interface in minigraph_interfaces %} +auto {{ interface['alias'] }} +iface {{ interface['alias'] }} {{ 'inet' if interface['addr'] | ipv4 else 'inet6' }} static + address {{ interface['addr'] }} + netmask {{ interface['mask'] }} +# +{% endfor %} +{% endblock front_panel_interface %} diff --git a/files/image_config/interfaces/lag_interfaces.j2 b/files/image_config/interfaces/lag_interfaces.j2 new file mode 100644 index 000000000000..0b5e24b61893 --- /dev/null +++ b/files/image_config/interfaces/lag_interfaces.j2 @@ -0,0 +1,20 @@ +# +{% block banner %} +# =========== Managed by config engine DO NOT EDIT! ======================== +# generated by templates/lag_interfaces.j2 using sonic-cfggen +# file: lag_interfaces +{% endblock %} +# +{% block lag_interface %} +# The switch LAG interfaces +{% for interface in minigraph_interfaces %} +{% if 'PortChannel' in interface['alias'] %} +auto {{ interface['name'] }} +iface {{ interface['name'] }} {{ 'inet' if interface['addr'] | ipv4 else 'inet6' }} static + address {{ interface['addr'] }} + netmask {{ interface['mask'] }} +{% endif %} +{% endfor %} +{% endblock lag_interface %} +# + diff --git a/files/image_config/interfaces/vlan_interfaces.j2 b/files/image_config/interfaces/vlan_interfaces.j2 new file mode 100644 index 000000000000..6d85d7910ed8 --- /dev/null +++ b/files/image_config/interfaces/vlan_interfaces.j2 @@ -0,0 +1,18 @@ +# +{% block banner %} +# =========== Managed by config engine DO NOT EDIT! ======================== +# generated by templates/interfaces.j2 using sonic-cfggen +# file: vlan_interfaces +{% endblock %} +# +{% block vlan_interface %} +# The switch VLAN interfaces +{% for interface in minigraph_vlan_interfaces %} +auto {{ interface['name'] }} +iface {{ interface['name'] }} {{ 'inet' if interface['addr'] | ipv4 else 'inet6' }} static + bridge_ports {{ interface['members'] }} + address {{ interface['addr'] }} + netmask {{ interface['mask'] }} +{% endfor %} +{% endblock vlan_interface %} +# diff --git a/files/image_config/minigraph/minigraph_ACS-MSN2700.xml b/files/image_config/minigraph/minigraph_ACS-MSN2700.xml new file mode 100644 index 000000000000..5cfa271b19e2 --- /dev/null +++ b/files/image_config/minigraph/minigraph_ACS-MSN2700.xml @@ -0,0 +1,1043 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch2 + 10.0.0.32 + 1 + 180 + 60 + + + switch2 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch2 + 10.0.0.34 + 1 + 180 + 60 + + + switch2 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch2 + 10.0.0.36 + 1 + 180 + 60 + + + switch2 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch2 + 10.0.0.38 + 1 + 180 + 60 + + + switch2 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch2 + 10.0.0.40 + 1 + 180 + 60 + + + switch2 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch2 + 10.0.0.42 + 1 + 180 + 60 + + + switch2 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch2 + 10.0.0.44 + 1 + 180 + 60 + + + switch2 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch2 + 10.0.0.46 + 1 + 180 + 60 + + + switch2 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch2 + 10.0.0.48 + 1 + 180 + 60 + + + switch2 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch2 + 10.0.0.50 + 1 + 180 + 60 + + + switch2 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch2 + 10.0.0.52 + 1 + 180 + 60 + + + switch2 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch2 + 10.0.0.54 + 1 + 180 + 60 + + + switch2 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch2 + 10.0.0.56 + 1 + 180 + 60 + + + switch2 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch2 + 10.0.0.58 + 1 + 180 + 60 + + + switch2 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch2 + 10.0.0.60 + 1 + 180 + 60 + + + switch2 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch2 + 10.0.0.62 + 1 + 180 + 60 + + + switch2 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch2 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch2 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet60 + 10.0.0.30/31 + + + + Ethernet64 + 10.0.0.32/31 + + + + Ethernet68 + 10.0.0.34/31 + + + + Ethernet72 + 10.0.0.36/31 + + + + Ethernet76 + 10.0.0.38/31 + + + + Ethernet80 + 10.0.0.40/31 + + + + Ethernet84 + 10.0.0.42/31 + + + + Ethernet88 + 10.0.0.44/31 + + + + Ethernet92 + 10.0.0.46/31 + + + + Ethernet96 + 10.0.0.48/31 + + + + Ethernet100 + 10.0.0.50/31 + + + + Ethernet104 + 10.0.0.52/31 + + + + Ethernet108 + 10.0.0.54/31 + + + + Ethernet112 + 10.0.0.56/31 + + + + Ethernet116 + 10.0.0.58/31 + + + + Ethernet120 + 10.0.0.60/31 + + + + Ethernet124 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch2 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet60 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet64 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet68 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet72 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet76 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet80 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet84 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet88 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet92 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet96 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet100 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet104 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet108 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet112 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet116 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet120 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet124 + ARISTA16T0 + Ethernet1 + + + + switch2 + ACS-MSN2700 +
diff --git a/files/image_config/minigraph/minigraph_AS7512.xml b/files/image_config/minigraph/minigraph_AS7512.xml new file mode 100644 index 000000000000..5cfa271b19e2 --- /dev/null +++ b/files/image_config/minigraph/minigraph_AS7512.xml @@ -0,0 +1,1043 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch2 + 10.0.0.32 + 1 + 180 + 60 + + + switch2 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch2 + 10.0.0.34 + 1 + 180 + 60 + + + switch2 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch2 + 10.0.0.36 + 1 + 180 + 60 + + + switch2 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch2 + 10.0.0.38 + 1 + 180 + 60 + + + switch2 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch2 + 10.0.0.40 + 1 + 180 + 60 + + + switch2 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch2 + 10.0.0.42 + 1 + 180 + 60 + + + switch2 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch2 + 10.0.0.44 + 1 + 180 + 60 + + + switch2 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch2 + 10.0.0.46 + 1 + 180 + 60 + + + switch2 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch2 + 10.0.0.48 + 1 + 180 + 60 + + + switch2 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch2 + 10.0.0.50 + 1 + 180 + 60 + + + switch2 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch2 + 10.0.0.52 + 1 + 180 + 60 + + + switch2 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch2 + 10.0.0.54 + 1 + 180 + 60 + + + switch2 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch2 + 10.0.0.56 + 1 + 180 + 60 + + + switch2 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch2 + 10.0.0.58 + 1 + 180 + 60 + + + switch2 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch2 + 10.0.0.60 + 1 + 180 + 60 + + + switch2 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch2 + 10.0.0.62 + 1 + 180 + 60 + + + switch2 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch2 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch2 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet60 + 10.0.0.30/31 + + + + Ethernet64 + 10.0.0.32/31 + + + + Ethernet68 + 10.0.0.34/31 + + + + Ethernet72 + 10.0.0.36/31 + + + + Ethernet76 + 10.0.0.38/31 + + + + Ethernet80 + 10.0.0.40/31 + + + + Ethernet84 + 10.0.0.42/31 + + + + Ethernet88 + 10.0.0.44/31 + + + + Ethernet92 + 10.0.0.46/31 + + + + Ethernet96 + 10.0.0.48/31 + + + + Ethernet100 + 10.0.0.50/31 + + + + Ethernet104 + 10.0.0.52/31 + + + + Ethernet108 + 10.0.0.54/31 + + + + Ethernet112 + 10.0.0.56/31 + + + + Ethernet116 + 10.0.0.58/31 + + + + Ethernet120 + 10.0.0.60/31 + + + + Ethernet124 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch2 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet60 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet64 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet68 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet72 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet76 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet80 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet84 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet88 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet92 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet96 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet100 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet104 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet108 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet112 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet116 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet120 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet124 + ARISTA16T0 + Ethernet1 + + + + switch2 + ACS-MSN2700 +
diff --git a/files/image_config/minigraph/minigraph_Force10-S6000.xml b/files/image_config/minigraph/minigraph_Force10-S6000.xml new file mode 100644 index 000000000000..76ede4bc8ba5 --- /dev/null +++ b/files/image_config/minigraph/minigraph_Force10-S6000.xml @@ -0,0 +1,1043 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + fortyGigE0/0 + 10.0.0.0/31 + + + + fortyGigE0/4 + 10.0.0.2/31 + + + + fortyGigE0/8 + 10.0.0.4/31 + + + + fortyGigE0/12 + 10.0.0.6/31 + + + + fortyGigE0/16 + 10.0.0.8/31 + + + + fortyGigE0/20 + 10.0.0.10/31 + + + + fortyGigE0/24 + 10.0.0.12/31 + + + + fortyGigE0/28 + 10.0.0.14/31 + + + + fortyGigE0/32 + 10.0.0.16/31 + + + + fortyGigE0/36 + 10.0.0.18/31 + + + + fortyGigE0/40 + 10.0.0.20/31 + + + + fortyGigE0/44 + 10.0.0.22/31 + + + + fortyGigE0/48 + 10.0.0.24/31 + + + + fortyGigE0/52 + 10.0.0.26/31 + + + + fortyGigE0/56 + 10.0.0.28/31 + + + + fortyGigE0/60 + 10.0.0.30/31 + + + + fortyGigE0/64 + 10.0.0.32/31 + + + + fortyGigE0/68 + 10.0.0.34/31 + + + + fortyGigE0/72 + 10.0.0.36/31 + + + + fortyGigE0/76 + 10.0.0.38/31 + + + + fortyGigE0/80 + 10.0.0.40/31 + + + + fortyGigE0/84 + 10.0.0.42/31 + + + + fortyGigE0/88 + 10.0.0.44/31 + + + + fortyGigE0/92 + 10.0.0.46/31 + + + + fortyGigE0/96 + 10.0.0.48/31 + + + + fortyGigE0/100 + 10.0.0.50/31 + + + + fortyGigE0/104 + 10.0.0.52/31 + + + + fortyGigE0/108 + 10.0.0.54/31 + + + + fortyGigE0/112 + 10.0.0.56/31 + + + + fortyGigE0/116 + 10.0.0.58/31 + + + + fortyGigE0/120 + 10.0.0.60/31 + + + + fortyGigE0/124 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + fortyGigE0/0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/60 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/64 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/68 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/72 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/76 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/80 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/84 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/88 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/92 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/96 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/100 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/104 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/108 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/112 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/116 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/120 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fortyGigE0/124 + ARISTA16T0 + Ethernet1 + + + + switch1 + Force10-S6000 +
diff --git a/files/image_config/ntp/ntp-config.service b/files/image_config/ntp/ntp-config.service new file mode 100644 index 000000000000..5cfcc72f328d --- /dev/null +++ b/files/image_config/ntp/ntp-config.service @@ -0,0 +1,11 @@ +[Unit] +Description=Update NTP configuration +Before=ntp.service + +[Service] +Type=oneshot +ExecStart=/usr/bin/ntp-config.sh + +[Install] +WantedBy=multi-user.target + diff --git a/files/image_config/ntp/ntp-config.sh b/files/image_config/ntp/ntp-config.sh new file mode 100755 index 000000000000..0989dfae74be --- /dev/null +++ b/files/image_config/ntp/ntp-config.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/ntp.yml -t /etc/sonic/templates/ntp.conf.j2 >/etc/ntp.conf diff --git a/files/image_config/ntp/ntp.conf.j2 b/files/image_config/ntp/ntp.conf.j2 new file mode 100644 index 000000000000..3ae0c1804e52 --- /dev/null +++ b/files/image_config/ntp/ntp.conf.j2 @@ -0,0 +1,63 @@ +############################################################################### +# Managed by Ansible +# file: ansible/roles/acs/templates/ntp.conf.j2 +############################################################################### + +# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help + +driftfile /var/lib/ntp/ntp.drift + + +# Enable this if you want statistics to be logged. +#statsdir /var/log/ntpstats/ + +statistics loopstats peerstats clockstats +filegen loopstats file loopstats type day enable +filegen peerstats file peerstats type day enable +filegen clockstats file clockstats type day enable + + +# You do need to talk to an NTP server or two (or three). +#server ntp.your-provider.example + +# pool.ntp.org maps to about 1000 low-stratum NTP servers. Your server will +# pick a different set every time it starts up. Please consider joining the +# pool: +{% for ntp_server in ntp_servers %} +server {{ ntp_server }} iburst +{% endfor %} + +#only listen on localhost and eth0 ips (default is to listen on all ip addresses) +interface ignore wildcard +interface listen {{ minigraph_mgmt_interface.addr }} +interface listen 127.0.0.1 + +# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for +# details. The web page +# might also be helpful. +# +# Note that "restrict" applies to both servers and clients, so a configuration +# that might be intended to block requests from certain clients could also end +# up blocking replies from your own upstream servers. + +# By default, exchange time with everybody, but don't allow configuration. +restrict -4 default kod notrap nomodify nopeer noquery +restrict -6 default kod notrap nomodify nopeer noquery + +# Local users may interrogate the ntp server more closely. +restrict 127.0.0.1 +restrict ::1 + +# Clients from this (example!) subnet have unlimited access, but only if +# cryptographically authenticated. +#restrict 192.168.123.0 mask 255.255.255.0 notrust + + +# If you want to provide time to your local subnet, change the next line. +# (Again, the address is an example only.) +#broadcast 192.168.123.255 + +# If you want to listen to time broadcasts on your local subnet, de-comment the +# next lines. Please do this only if you trust everybody on the network! +#disable auth +#broadcastclient diff --git a/files/image_config/ntp/ntp.yml b/files/image_config/ntp/ntp.yml new file mode 100644 index 000000000000..efb3a5272fcc --- /dev/null +++ b/files/image_config/ntp/ntp.yml @@ -0,0 +1,6 @@ +ntp_servers: + - 0.debian.pool.ntp.org + - 1.debian.pool.ntp.org + - 2.debian.pool.ntp.org + - 3.debian.pool.ntp.org + diff --git a/files/image_config/rsyslog/rsyslog-config.service b/files/image_config/rsyslog/rsyslog-config.service new file mode 100644 index 000000000000..37f7bc04c650 --- /dev/null +++ b/files/image_config/rsyslog/rsyslog-config.service @@ -0,0 +1,11 @@ +[Unit] +Description=Update rsyslog configuration +Before=rsyslog.service + +[Service] +Type=oneshot +ExecStart=/usr/bin/rsyslog-config.sh + +[Install] +WantedBy=multi-user.target + diff --git a/files/image_config/rsyslog/rsyslog-config.sh b/files/image_config/rsyslog/rsyslog-config.sh new file mode 100755 index 000000000000..a5c46849183a --- /dev/null +++ b/files/image_config/rsyslog/rsyslog-config.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/rsyslog.yml -t /etc/sonic/templates/rsyslog.conf.j2 >/etc/rsyslog.conf diff --git a/files/image_config/rsyslog/rsyslog.conf.j2 b/files/image_config/rsyslog/rsyslog.conf.j2 new file mode 100644 index 000000000000..e00565f056eb --- /dev/null +++ b/files/image_config/rsyslog/rsyslog.conf.j2 @@ -0,0 +1,71 @@ +############################################################################### +# Managed by Ansible +# file: ansible/roles/acs/templates/rsyslog.conf.j2 +############################################################################### +# +# /etc/rsyslog.conf Configuration file for rsyslog. +# +# For more information see +# /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html + + +################# +#### MODULES #### +################# + +$ModLoad imuxsock # provides support for local system logging +$ModLoad imklog # provides kernel logging support +#$ModLoad immark # provides --MARK-- message capability + +# provides UDP syslog reception +$ModLoad imudp +$UDPServerAddress 127.0.0.1 # bind to localhost before udp server run +$UDPServerRun 514 + +# provides TCP syslog reception +#$ModLoad imtcp +#$InputTCPServerRun 514 + + +########################### +#### GLOBAL DIRECTIVES #### +########################### +#Set remote syslog server +{% for server in syslog_servers %} +*.* @{{ server }}:514 +{% endfor %} + +# +# Use traditional timestamp format. +# To enable high precision timestamps, comment out the following line. +# +#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat + +# Define a custom template +$template ACSFileFormat,"%TIMESTAMP% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" +$ActionFileDefaultTemplate ACSFileFormat + +# +# Set the default permissions for all log files. +# +$FileOwner root +$FileGroup adm +$FileCreateMode 0640 +$DirCreateMode 0755 +$Umask 0022 + +# +# Where to place spool and state files +# +$WorkDirectory /var/spool/rsyslog + +# +# Include all config files in /etc/rsyslog.d/ +# +$IncludeConfig /etc/rsyslog.d/*.conf + + +############### +#### RULES #### +############### + diff --git a/files/image_config/rsyslog/rsyslog.d/00-acs.conf b/files/image_config/rsyslog/rsyslog.d/00-acs.conf new file mode 100644 index 000000000000..ec8ce919f402 --- /dev/null +++ b/files/image_config/rsyslog/rsyslog.d/00-acs.conf @@ -0,0 +1,46 @@ +## Quagga rules + +if $programname == "zebra" then { + /var/log/quagga/zebra.log + stop +} + +if $programname == "bgpd" then { + /var/log/quagga/bgpd.log + stop +} + +if $programname == "quagga" then { + /var/log/quagga/zebra.log + stop +} + +if $programname == "watchquagga" then { + /var/log/quagga/zebra.log + stop +} + +## Platform modules rules +if $programname == "platform-modules" then { + /var/log/syslog + stop +} + +## Sensord rules +if $programname == "sensord" then { + /var/log/syslog + stop +} + +## Sswsyncd rules +if $programname == "sswsyncd" then { + /var/log/syslog + stop +} + +## Ansible rules +if $programname startswith "ansible" then { + /var/log/messages + stop +} + diff --git a/files/image_config/rsyslog/rsyslog.d/99-default.conf b/files/image_config/rsyslog/rsyslog.d/99-default.conf new file mode 100644 index 000000000000..a26ba7baf8e6 --- /dev/null +++ b/files/image_config/rsyslog/rsyslog.d/99-default.conf @@ -0,0 +1,66 @@ +# +# First some standard log files. Log by facility. +# +auth,authpriv.* /var/log/auth.log +*.*;auth,authpriv.none -/var/log/syslog +cron.* /var/log/cron.log +daemon.* -/var/log/daemon.log +kern.* -/var/log/kern.log +kern.* -/var/persist/log/kern.log +lpr.* -/var/log/lpr.log +mail.* -/var/log/mail.log +user.* -/var/log/user.log + +# +# Logging for the mail system. Split it up so that +# it is easy to write scripts to parse these files. +# +mail.info -/var/log/mail.info +mail.warn -/var/log/mail.warn +mail.err /var/log/mail.err + +# +# Logging for INN news system. +# +news.crit /var/log/news/news.crit +news.err /var/log/news/news.err +news.notice -/var/log/news/news.notice + +# +# Some "catch-all" log files. +# +*.=debug;\ + auth,authpriv.none;\ + news.none;mail.none -/var/log/debug +*.=info;*.=notice;*.=warn;\ + auth,authpriv.none;\ + cron,daemon.none;\ + mail,news.none -/var/log/messages +*.=crit;*.=alert;*.=emerg -/var/persist/log/alarms +# +# Emergencies are sent to everybody logged in. +# +*.emerg :omusrmsg:* + +# +# I like to have messages displayed on the console, but only on a virtual +# console I usually leave idle. +# +#daemon,mail.*;\ +# news.=crit;news.=err;news.=notice;\ +# *.=debug;*.=info;\ +# *.=notice;*.=warn /dev/tty8 + +# The named pipe /dev/xconsole is for the `xconsole' utility. To use it, +# you must invoke `xconsole' with the `-file' option: +# +# $ xconsole -file /dev/xconsole [...] +# +# NOTE: adjust the list below, or you'll go crazy if you have a reasonably +# busy site.. +# +daemon.*;mail.*;\ + news.err;\ + *.=debug;*.=info;\ + *.=notice;*.=warn |/dev/xconsole + diff --git a/files/image_config/rsyslog/rsyslog.yml b/files/image_config/rsyslog/rsyslog.yml new file mode 100644 index 000000000000..006271123b9d --- /dev/null +++ b/files/image_config/rsyslog/rsyslog.yml @@ -0,0 +1 @@ +syslog_servers: [] diff --git a/files/image_config/snmp/snmp.yml b/files/image_config/snmp/snmp.yml new file mode 100644 index 000000000000..13c9d7bd7d77 --- /dev/null +++ b/files/image_config/snmp/snmp.yml @@ -0,0 +1 @@ +snmp_rocommunity: public diff --git a/files/image_config/sudoers/sudoers b/files/image_config/sudoers/sudoers new file mode 100644 index 000000000000..57248ee8c1c4 --- /dev/null +++ b/files/image_config/sudoers/sudoers @@ -0,0 +1,33 @@ +# +# This file MUST be edited with the 'visudo' command as root. +# +# Please consider adding local content in /etc/sudoers.d/ instead of +# directly modifying this file. +# +# See the man page for details on how to write a sudoers file. +# +Defaults env_reset +#Defaults mail_badpass +Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" +Defaults env_keep += "VTYSH_PAGER" + +# Host alias specification + +# User alias specification + +# Cmnd alias specification +# Note: bcmcmd is dangerous for users in read only netgroups because it may operate ASIC +Cmnd_Alias READ_ONLY_CMDS = /usr/bin/portstat,\ + /usr/bin/vtysh -c "show.*" + +# User privilege specification +root ALL=(ALL:ALL) ALL + +# Allow members of group sudo to execute any command +%sudo ALL=(ALL:ALL) NOPASSWD: ALL + + +# See sudoers(5) for more information on "#include" directives: + +#includedir /etc/sudoers.d + diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 90253e56f26e..b8177462a55c 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -397,6 +397,10 @@ ${onie_bin} mount -t ext4 -o defaults,rw $demo_dev $demo_mnt || { # Decompress the file for the file system directly to the partition unzip $ONIE_INSTALLER_PAYLOAD -d $demo_mnt +if [ -f $demo_mnt/$FILESYSTEM_DOCKERFS ]; then + cd $demo_mnt && tar xf $FILESYSTEM_DOCKERFS; cd $OLDPWD +fi + # Store machine description in target file system cp /etc/machine.conf $demo_mnt diff --git a/onie-image.conf b/onie-image.conf index 389c4dd50256..61fad731b975 100644 --- a/onie-image.conf +++ b/onie-image.conf @@ -18,5 +18,8 @@ FILESYSTEM_SQUASHFS=fs.squashfs ## Filename for onie installer payload, will be the main part of onie installer ONIE_INSTALLER_PAYLOAD=fs.zip +## Filename for docker file system +FILESYSTEM_DOCKERFS=dockerfs.tar.gz + ## Output file name for onie installer OUTPUT_ONIE_IMAGE=target/sonic-$TARGET_MACHINE.bin diff --git a/platform/broadcom/platform.conf b/platform/broadcom/platform.conf new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index d1865d2eaf55..395d211d93d9 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -1,9 +1,8 @@ -include $(PLATFORM_GENERIC_PATH)/rules.mk - include $(PLATFORM_PATH)/sdk.mk include $(PLATFORM_PATH)/sai.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk +include $(PLATFORM_PATH)/single-image.mk BCMCMD = bcmcmd $(BCMCMD)_URL = "https://sonicstorage.blob.core.windows.net/packages/bcmcmd?sv=2015-04-05&sr=b&sig=X3bFApmsNFmcnWM9mSGRxBugPcg%2FgJCHh5hhSuV1M2c%3D&se=2030-08-23T14%3A41%3A56Z&sp=r" @@ -13,9 +12,7 @@ $(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/dsserve?sv SONIC_ONLINE_FILES += $(BCMCMD) $(DSSERVE) -SONIC_ALL += $(DOCKER_SYNCD_BRCM) \ - $(DOCKER_ORCHAGENT_BRCM) \ - debs/$(BRCM_OPENNSL_KERNEL) +SONIC_ALL += $(SONIC_SINGLE_IMAGE) # Inject brcm sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) diff --git a/platform/broadcom/single-image.mk b/platform/broadcom/single-image.mk new file mode 100644 index 000000000000..f1c9a88af767 --- /dev/null +++ b/platform/broadcom/single-image.mk @@ -0,0 +1,8 @@ +# sonic mellanox single image installer + +SONIC_SINGLE_IMAGE = sonic-broadcom.bin +$(SONIC_SINGLE_IMAGE)_MACHINE = broadcom +$(SONIC_SINGLE_IMAGE)_IMAGE_TYPE = onie +$(SONIC_SINGLE_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) +$(SONIC_SINGLE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_SINGLE_IMAGE) diff --git a/platform/cavium/platform.conf b/platform/cavium/platform.conf new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index 7ed8ea17e24b..e8d16cc73657 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -1,12 +1,10 @@ -include $(PLATFORM_GENERIC_PATH)/rules.mk - include $(PLATFORM_PATH)/cavm-sai.mk include $(PLATFORM_PATH)/docker-syncd-cavm.mk include $(PLATFORM_PATH)/docker-orchagent-cavm.mk include $(PLATFORM_PATH)/cavm_platform_modules.mk +include $(PLATFORM_PATH)/single-image.mk -SONIC_ALL += $(DOCKER_SYNCD_CAVM) \ - $(DOCKER_ORCHAGENT_CAVM) +SONIC_ALL += $(SONIC_SINGLE_IMAGE) # Inject cavium sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(CAVM_SAI) $(CAVM_LIBSAI) diff --git a/platform/cavium/single-image.mk b/platform/cavium/single-image.mk new file mode 100644 index 000000000000..f9f6fefe57dd --- /dev/null +++ b/platform/cavium/single-image.mk @@ -0,0 +1,8 @@ +# sonic mellanox single image installer + +SONIC_SINGLE_IMAGE = sonic-cavium.bin +$(SONIC_SINGLE_IMAGE)_MACHINE = cavium +$(SONIC_SINGLE_IMAGE)_IMAGE_TYPE = onie +$(SONIC_SINGLE_IMAGE)_DEPENDS += $(CAVM_PLATFORM_DEB) +$(SONIC_SINGLE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_SINGLE_IMAGE) diff --git a/platform/generic/aboot-image.mk b/platform/generic/aboot-image.mk new file mode 100644 index 000000000000..0f332eb75402 --- /dev/null +++ b/platform/generic/aboot-image.mk @@ -0,0 +1,9 @@ +# sonic aboot installer + +SONIC_GENERIC_ABOOT_IMAGE = sonic-aboot.bin +$(SONIC_GENERIC_ABOOT_IMAGE)_MACHINE = aboot +$(SONIC_GENERIC_ABOOT_IMAGE)_IMAGE_TYPE = aboot +$(SONIC_GENERIC_ABOOT_IMAGE)_DEPENDS = +$(SONIC_GENERIC_ABOOT_IMAGE)_DOCKERS = +SONIC_INSTALLERS += $(SONIC_GENERIC_ABOOT_IMAGE) + diff --git a/platform/generic/onie-image.mk b/platform/generic/onie-image.mk new file mode 100644 index 000000000000..67f8adba61e1 --- /dev/null +++ b/platform/generic/onie-image.mk @@ -0,0 +1,8 @@ +# sonic generic ONIE image installer + +SONIC_GENERIC_ONIE_IMAGE = sonic-generic.bin +$(SONIC_GENERIC_ONIE_IMAGE)_MACHINE = generic +$(SONIC_GENERIC_ONIE_IMAGE)_IMAGE_TYPE = onie +$(SONIC_GENERIC_ONIE_IMAGE)_DEPENDS = +$(SONIC_GENERIC_ONIE_IMAGE)_DOCKERS = +SONIC_INSTALLERS += $(SONIC_GENERIC_ONIE_IMAGE) diff --git a/platform/generic/platform.conf b/platform/generic/platform.conf new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/generic/rules.mk b/platform/generic/rules.mk index 0ce1f562c0ad..bc2507740277 100644 --- a/platform/generic/rules.mk +++ b/platform/generic/rules.mk @@ -1,8 +1,10 @@ +include $(PLATFORM_PATH)/aboot-image.mk +include $(PLATFORM_PATH)/onie-image.mk + SONIC_ALL += $(DOCKER_DATABASE) \ - $(DOCKER_FPM) \ - $(DOCKER_TEAMD) \ $(DOCKER_LLDP_SV2) \ $(DOCKER_SNMP_SV2) \ $(DOCKER_PLATFORM_MONITOR) \ $(DOCKER_DHCP_RELAY) \ - $(DOCKER_PTF) + $(DOCKER_PTF) \ + $(SONIC_GENERIC_ONIE_IMAGE) diff --git a/platform/mellanox/docker-orchagent-mlnx.mk b/platform/mellanox/docker-orchagent-mlnx.mk index a2138c029ff9..682c91f45c0d 100644 --- a/platform/mellanox/docker-orchagent-mlnx.mk +++ b/platform/mellanox/docker-orchagent-mlnx.mk @@ -5,3 +5,13 @@ $(DOCKER_ORCHAGENT_MLNX)_PATH = $(DOCKERS_PATH)/docker-orchagent $(DOCKER_ORCHAGENT_MLNX)_DEPENDS += $(SWSS) $(REDIS_TOOLS) $(DOCKER_ORCHAGENT_MLNX)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_MLNX) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_MLNX) + +$(DOCKER_ORCHAGENT_MLNX)_CONTAINER_NAME = swss +$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += --net=host --privileged -t +$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += --volumes-from database +$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/ssw/:/etc/ssw/:ro +$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro +$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro +$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /host/machine.conf:/host/machine.conf +$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/mellanox/docker-syncd-mlnx.mk b/platform/mellanox/docker-syncd-mlnx.mk index 81d27aacea46..ee15e9c3089f 100644 --- a/platform/mellanox/docker-syncd-mlnx.mk +++ b/platform/mellanox/docker-syncd-mlnx.mk @@ -6,3 +6,10 @@ $(DOCKER_SYNCD_MLNX)_DEPENDS += $(SYNCD) $(MFT) $(PYTHON_SDK_API) $(DOCKER_SYNCD_MLNX)_FILES += $(MLNX_FW) $(DOCKER_SYNCD_MLNX)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX) + +$(DOCKER_SYNCD_MLNX)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_MLNX)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_MLNX)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_MLNX)_RUN_OPT += --volumes-from database +$(DOCKER_SYNCD_MLNX)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/mellanox/platform.conf b/platform/mellanox/platform.conf new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index debf4a4606da..a881b7bee6ec 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -1,5 +1,3 @@ -include $(PLATFORM_GENERIC_PATH)/rules.mk - include $(PLATFORM_PATH)/sdk.mk include $(PLATFORM_PATH)/fw.mk include $(PLATFORM_PATH)/mft.mk @@ -7,17 +5,9 @@ include $(PLATFORM_PATH)/mlnx-sai.mk include $(PLATFORM_PATH)/hw-management.mk include $(PLATFORM_PATH)/docker-syncd-mlnx.mk include $(PLATFORM_PATH)/docker-orchagent-mlnx.mk +include $(PLATFORM_PATH)/single-image.mk -SONIC_ALL += $(DOCKER_SYNCD_MLNX) \ - $(DOCKER_ORCHAGENT_MLNX) \ - $(DOCKER_FPM) \ - $(DOCKER_DATABASE) \ - $(DOCKER_LLDP_SV2) \ - $(DOCKER_SNMP_SV2) \ - $(DOCKER_TEAMD) \ - $(DOCKER_PLATFORM_MONITOR) \ - debs/$(MLNX_HW_MANAGEMENT) \ - debs/$(SX_KERNEL) +SONIC_ALL += $(SONIC_SINGLE_IMAGE) # Inject mlnx sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) diff --git a/platform/mellanox/single-image.mk b/platform/mellanox/single-image.mk new file mode 100644 index 000000000000..7ed23da850ce --- /dev/null +++ b/platform/mellanox/single-image.mk @@ -0,0 +1,8 @@ +# sonic mellanox single image installer + +SONIC_SINGLE_IMAGE = sonic-mellanox.bin +$(SONIC_SINGLE_IMAGE)_MACHINE = mellanox +$(SONIC_SINGLE_IMAGE)_IMAGE_TYPE = onie +$(SONIC_SINGLE_IMAGE)_DEPENDS += $(SX_KERNEL) $(KERNEL_MFT) $(MFT) $(MLNX_HW_MANAGEMENT) +$(SONIC_SINGLE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_SINGLE_IMAGE) diff --git a/rules/docker-database.mk b/rules/docker-database.mk index 0bd7233acdc4..168164a02636 100644 --- a/rules/docker-database.mk +++ b/rules/docker-database.mk @@ -5,3 +5,9 @@ $(DOCKER_DATABASE)_PATH = $(DOCKERS_PATH)/docker-database $(DOCKER_DATABASE)_DEPENDS += $(REDIS_SERVER) $(REDIS_TOOLS) $(DOCKER_DATABASE)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_DATABASE) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DATABASE) + +$(DOCKER_DATABASE)_CONTAINER_NAME = database +$(DOCKER_DATABASE)_RUN_OPT += --net=host --privileged -t +$(DOCKER_DATABASE)_RUN_OPT += -v /var/run/redis + diff --git a/rules/docker-fpm.mk b/rules/docker-fpm.mk index 48d35592d402..090c2b61cc1f 100644 --- a/rules/docker-fpm.mk +++ b/rules/docker-fpm.mk @@ -5,3 +5,9 @@ $(DOCKER_FPM)_PATH = $(DOCKERS_PATH)/docker-fpm $(DOCKER_FPM)_DEPENDS += $(QUAGGA) $(SWSS) $(SONIC_CONFIG_ENGINE) $(DOCKER_FPM)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_FPM) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_FPM) + +$(DOCKER_FPM)_CONTAINER_NAME = bgp +$(DOCKER_FPM)_RUN_OPT += --net=host --privileged -t +$(DOCKER_FPM)_RUN_OPT += --volumes-from database +$(DOCKER_FPM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/rules/docker-lldp-sv2.mk b/rules/docker-lldp-sv2.mk index b2efe81e8b70..7041a24f81db 100644 --- a/rules/docker-lldp-sv2.mk +++ b/rules/docker-lldp-sv2.mk @@ -6,3 +6,8 @@ $(DOCKER_LLDP_SV2)_DEPENDS += $(LLDPD) $(SONIC_CONFIG_ENGINE) $(DOCKER_LLDP_SV2)_PYTHON_WHEELS += $(DBSYNCD_PY2) $(DOCKER_LLDP_SV2)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_LLDP_SV2) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_LLDP_SV2) + +$(DOCKER_LLDP_SV2)_CONTAINER_NAME = lldp +$(DOCKER_LLDP_SV2)_RUN_OPT += --net=host --privileged -t +$(DOCKER_LLDP_SV2)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/rules/docker-snmp-sv2.mk b/rules/docker-snmp-sv2.mk index 619e48f5591d..1d55cbded808 100644 --- a/rules/docker-snmp-sv2.mk +++ b/rules/docker-snmp-sv2.mk @@ -6,3 +6,9 @@ $(DOCKER_SNMP_SV2)_DEPENDS += $(SNMP) $(SNMPD) $(SONIC_CONFIG_ENGINE) $(DOCKER_SNMP_SV2)_PYTHON_WHEELS += $(ASYNCSNMP_PY3) $(DOCKER_SNMP_SV2)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SNMP_SV2) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SNMP_SV2) + +$(DOCKER_SNMP_SV2)_CONTAINER_NAME = snmp +$(DOCKER_SNMP_SV2)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SNMP_SV2)_RUN_OPT += -v /etc/ssw/:/etc/ssw/:ro +$(DOCKER_SNMP_SV2)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/rules/docker-teamd.mk b/rules/docker-teamd.mk index 4924b2b18891..ec242589b290 100644 --- a/rules/docker-teamd.mk +++ b/rules/docker-teamd.mk @@ -5,3 +5,8 @@ $(DOCKER_TEAMD)_PATH = $(DOCKERS_PATH)/docker-teamd $(DOCKER_TEAMD)_DEPENDS += $(SWSS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(SONIC_CONFIG_ENGINE) $(DOCKER_TEAMD)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_TEAMD) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_TEAMD) + +$(DOCKER_TEAMD)_CONTAINER_NAME = teamd +$(DOCKER_TEAMD)_RUN_OPT += --net=host --privileged -t +$(DOCKER_TEAMD)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/rules/sonic-aboot.mk b/rules/sonic-aboot.mk deleted file mode 100644 index c2762cfa012e..000000000000 --- a/rules/sonic-aboot.mk +++ /dev/null @@ -1,6 +0,0 @@ -# sonic aboot installer - -SONIC_ABOOT = sonic-aboot.bin -$(SONIC_ABOOT)_MACHINE = aboot -$(SONIC_ABOOT)_DEPENDS += $(LINUX_KERNEL) $(INITRAMFS_TOOLS) $(IGB_DRIVER) -SONIC_INSTALLERS += $(SONIC_ABOOT) diff --git a/rules/sonic-generic.mk b/rules/sonic-generic.mk deleted file mode 100644 index 807e26dbfd0e..000000000000 --- a/rules/sonic-generic.mk +++ /dev/null @@ -1,6 +0,0 @@ -# sonic generic installer - -SONIC_GENERIC = sonic-generic.bin -$(SONIC_GENERIC)_MACHINE = generic -$(SONIC_GENERIC)_DEPENDS += $(LINUX_KERNEL) $(INITRAMFS_TOOLS) $(IGB_DRIVER) -SONIC_INSTALLERS += $(SONIC_GENERIC) diff --git a/slave.mk b/slave.mk index a97f4d83f5ba..485f8ff9206c 100644 --- a/slave.mk +++ b/slave.mk @@ -24,9 +24,9 @@ DEBS_PATH = $(TARGET_PATH)/debs PYTHON_WHEELS_PATH = $(TARGET_PATH)/python-wheels PROJECT_ROOT = $(shell pwd) -CONFIGURED_PLATFORM := $(shell [ -f .platform ] && cat .platform || echo undefined) +CONFIGURED_PLATFORM := $(shell [ -f .platform ] && cat .platform || echo generic) +CONFIGURED_SKU := $(shell [ -f .sku ] && cat .sku || echo undefined) PLATFORM_PATH = platform/$(CONFIGURED_PLATFORM) -PLATFORM_GENERIC_PATH = platform/generic ############################################################################### ## Utility rules @@ -34,27 +34,38 @@ PLATFORM_GENERIC_PATH = platform/generic ############################################################################### .platform : +ifneq ($(CONFIGURED_PLATFORM),generic) @echo Build system is not configured, please run make configure @exit 1 +endif + +.sku : +ifneq ($(CONFIGURED_PLATFORM),generic) + @echo Build system is not configured, please run make configure + @exit 1 +endif configure : @mkdir -p target/debs @mkdir -p target/python-wheels @echo $(PLATFORM) > .platform + @echo $(SKU) > .sku -distclean : .platform clean - @rm -f .platform +distclean : .platform .sku clean + @rm -f .platform .sku ############################################################################### ## Include other rules ############################################################################### + include $(RULES_PATH)/config include $(RULES_PATH)/functions include $(RULES_PATH)/*.mk ifneq ($(CONFIGURED_PLATFORM), undefined) include $(PLATFORM_PATH)/rules.mk endif +export CONFIGURED_SKU MAKEFLAGS += -j $(SONIC_CONFIG_BUILD_JOBS) @@ -274,10 +285,47 @@ $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TA ############################################################################### # targets for building installers with base image -$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) +$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER)) $(addprefix $(DEBS_PATH)/,$(SONIC_CONFIG_ENGINE)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $(HEADER) + ## Pass initramfs and linux kernel explicitly. They are used for all platforms + export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" + export linux_kernel="$(DEBS_PATH)/$(LINUX_KERNEL)" + export kversion="$(KVERSION)" + export installer_debs="$(addprefix $(DEBS_PATH)/,$($*_DEPENDS))" + export installer_images="$(addprefix $(TARGET_PATH)/,$($*_DOCKERS))" + export config_engine="$(addprefix $(DEBS_PATH)/,$(SONIC_CONFIG_ENGINE))" + export image_type="$($*_IMAGE_TYPE)" + export sonicadmin_user="$(USERNAME)" + export sonic_hwsku="$(CONFIGURED_SKU)" + $(foreach docker, $($*_DOCKERS),\ + export docker_image="$(docker)" + export docker_image_name="$(basename $(docker))" + export docker_container_name="$($(docker)_CONTAINER_NAME)" + export docker_image_run_opt="$($(docker)_RUN_OPT)" + j2 files/build_templates/docker_image_ctl.j2 > $($(docker)_CONTAINER_NAME).sh + j2 files/build_templates/$($(docker)_CONTAINER_NAME).service.j2 > $($(docker)_CONTAINER_NAME).service + chmod +x $($(docker)_CONTAINER_NAME).sh + ) + + export installer_start_scrips="$(foreach docker, $($*_DOCKERS),$(addsuffix .sh, $($(docker)_CONTAINER_NAME)))" + export installer_services="$(foreach docker, $($*_DOCKERS),$(addsuffix .service, $($(docker)_CONTAINER_NAME)))" + + $(if $($*_DOCKERS), + j2 files/build_templates/sonic_debian_extension.j2 > sonic_debian_extension.sh + chmod +x sonic_debian_extension.sh, + ) + ./build_debian.sh "$(USERNAME)" "$(shell perl -e 'print crypt("$(PASSWORD)", "salt"),"\n"')" $(LOG) - TARGET_MACHINE=$($*_MACHINE) ./build_image.sh $(LOG) + TARGET_MACHINE=$($*_MACHINE) IMAGE_TYPE=$($*_IMAGE_TYPE) ./build_image.sh $(LOG) + + $(foreach docker, $($*_DOCKERS), \ + rm $($(docker)_CONTAINER_NAME).sh + rm $($(docker)_CONTAINER_NAME).service + ) + + $(if $($*_DOCKERS), + rm sonic_debian_extension.sh, + ) $(FOOTER) ############################################################################### @@ -326,4 +374,4 @@ all : .platform $$(addprefix $(TARGET_PATH)/,$$(SONIC_ALL)) .PHONY : $(SONIC_CLEAN_DEBS) $(SONIC_CLEAN_TARGETS) $(SONIC_CLEAN_WHEELS) clean distclean configure -.INTERMEDIATE : $(SONIC_INSTALL_TARGETS) $(SONIC_INSTALL_WHEELS) $(DOCKER_LOAD_TARGETS) docker-start +.INTERMEDIATE : $(SONIC_INSTALL_TARGETS) $(SONIC_INSTALL_WHEELS) $(DOCKER_LOAD_TARGETS) docker-start .platform .sku diff --git a/src/sonic-config-engine/platform/AS7512/alias_map.json b/src/sonic-config-engine/platform/AS7512/alias_map.json new file mode 100644 index 000000000000..53be265702cc --- /dev/null +++ b/src/sonic-config-engine/platform/AS7512/alias_map.json @@ -0,0 +1 @@ +#TODO: Add correct info here diff --git a/src/sonic-config-engine/platform/AS7512/port_config.ini b/src/sonic-config-engine/platform/AS7512/port_config.ini new file mode 100644 index 000000000000..1d60deaf60fc --- /dev/null +++ b/src/sonic-config-engine/platform/AS7512/port_config.ini @@ -0,0 +1 @@ +# TODO: Add correct info here diff --git a/src/sonic-config-engine/platform/AS7512/sensors.conf b/src/sonic-config-engine/platform/AS7512/sensors.conf new file mode 100644 index 000000000000..1d60deaf60fc --- /dev/null +++ b/src/sonic-config-engine/platform/AS7512/sensors.conf @@ -0,0 +1 @@ +# TODO: Add correct info here From f2eed8f8a027d840dfc28655aa900a7d07d4b47b Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Sun, 29 Jan 2017 21:34:12 +0200 Subject: [PATCH 0212/1011] Added support of ONIE version 2016.11-5.1.0001 for Mellanox platforms. (#218) --- dockers/docker-orchagent/start.sh | 2 +- installer/x86_64/platforms/x86_64-mlnx_msn2700-r0 | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 installer/x86_64/platforms/x86_64-mlnx_msn2700-r0 diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 9530f39261f5..ca97c03a12f5 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -46,7 +46,7 @@ elif [ "$aboot_platform" == "x86_64-arista_7050_qx32" ]; then PORTSYNCD_ARGS+="-p /etc/ssw/Arista-7050-QX32/port_config.ini" SWSSCONFIG_ARGS+="td2.32ports.qos.1.json td2.32ports.qos.2.json td2.32ports.qos.3.json td2.32ports.qos.4.json td2.32ports.qos.5.json td2.32ports.qos.6.json " SWSSCONFIG_ARGS+="td2.32ports.buffers.1.json td2.32ports.buffers.2.json td2.32ports.buffers.3.json " -elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ]; then +elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ] || [ "$onie_platform" == "x86_64-mlnx_msn2700-r0" ]; then PORTSYNCD_ARGS+="-p /etc/ssw/ACS-MSN2700/port_config.ini" elif [ "$onie_platform" == "x86_64-accton_as7512_32x-r0" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" diff --git a/installer/x86_64/platforms/x86_64-mlnx_msn2700-r0 b/installer/x86_64/platforms/x86_64-mlnx_msn2700-r0 new file mode 100644 index 000000000000..c9c9493a5404 --- /dev/null +++ b/installer/x86_64/platforms/x86_64-mlnx_msn2700-r0 @@ -0,0 +1 @@ +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="acpi_enforce_resources=lax acpi=noirq" From 4e3bbc8e1399e53fdb931f716204d6a10f542c6e Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 29 Jan 2017 16:10:35 -0800 Subject: [PATCH 0213/1011] update build instruction for one image --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c821fd47ecbc..3eae25214f93 100644 --- a/README.md +++ b/README.md @@ -27,14 +27,14 @@ If it is already cloned, however there is no files under ./dockers/docker-base/ To build NOS installer image and docker images, run command line - make configure PLATFORM=[VENDOR] + make configure PLATFORM=[ASIC_VENDOR] SKU=[HW_SKU] make -Supported VENDORs are: -- broadcom -- mellanox -- cavium -- p4 +Supported PLATFORM AND SKU are: +- PLATFORM=broadcom SKU=Force10-S6000 +- PLATFORM=mellanox SKU=ACS-MSN2700 +- PLATFORM=cavium SKU=AS7512 +- PLATFORM=p4 You can find rules/config file useful. It contains configuration options for build process, like adding more verbosity or showing dependencies, username and password for base image etc. From be8ed80554e74d40ea5b587f1c2d889e71e35801 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 30 Jan 2017 17:33:03 -0800 Subject: [PATCH 0214/1011] teamd: Use 75% links upperbound as min-links (#224) --- dockers/docker-teamd/teamd.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-teamd/teamd.j2 b/dockers/docker-teamd/teamd.j2 index 7c6e4b355e0b..ebc5bba43fd9 100644 --- a/dockers/docker-teamd/teamd.j2 +++ b/dockers/docker-teamd/teamd.j2 @@ -3,7 +3,8 @@ "runner": { "name": "lacp", "active": true, - "min_ports": 2, +{# Use 75% links upperbound as min-links #} + "min_ports": {{ minigraph_portchannel_interfaces[pc] | length * 0.75 | round(0, 'ceil') | int}}, "tx_hash": ["eth", "ipv4", "ipv6"] }, "link_watch": { From afe3fbf82fd70d1d06327793337a221d6b634d64 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 31 Jan 2017 11:47:52 -0800 Subject: [PATCH 0215/1011] make tty as an option in docker run (#225) --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 5c93afad6a91..b819d41cfb67 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ MAKEFLAGS += -B DOCKER_RUN := docker run --rm=true --privileged \ -v $(PWD):/sonic \ - -it sonic-slave-$(USER) + -i$(SONIC_SLAVE_TTY) DOCKER_BUILD = docker build --no-cache \ --build-arg user=$(USER) \ @@ -26,7 +26,7 @@ DOCKER_BUILD = docker build --no-cache \ %:: @docker inspect --type image sonic-slave-$(USER) &> /dev/null || $(DOCKER_BUILD) - @$(DOCKER_RUN) make \ + @$(DOCKER_RUN) sonic-slave-$(USER) make \ -C sonic \ -f slave.mk \ PLATFORM=$(PLATFORM) \ @@ -37,4 +37,4 @@ sonic-slave-build : @$(DOCKER_BUILD) sonic-slave-bash : - @$(DOCKER_RUN) bash + @$(DOCKER_RUN) -t sonic-slave-$(USER) bash From 5278f1a0e5b6583388ccc7fc8d32935a44caa62c Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 31 Jan 2017 12:04:06 -0800 Subject: [PATCH 0216/1011] add instructions to change git path to relative path --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 3eae25214f93..611ff644f06d 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,10 @@ If it is already cloned, however there is no files under ./dockers/docker-base/ git submodule update --init --recursive +You also need to change all git paths to relative path as we build all submodules inside the docker. + + git submodule foreach --recursive '[ -f .git ] && echo "gitdir: $(realpath --relative-to=. $(cut -d" " -f2 .git))" > .git' + # Usage **NOTE:** In order to be more familiar with build process and make some hanges to it, it is recommended to read this short [Documentation](README.buildsystem.md) From c2b4c870c682f5868faea536545dac313e301d95 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 31 Jan 2017 22:05:24 -0800 Subject: [PATCH 0217/1011] remove fsroot after build (#228) --- build_debian.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build_debian.sh b/build_debian.sh index 11d8217ff8bf..d79a05275b17 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -271,3 +271,6 @@ pushd $FILESYSTEM_ROOT && sudo tar czf $OLDPWD/$FILESYSTEM_DOCKERFS var/lib/dock ## Compress together with /boot and /var/lib/docker as an installer payload zip file pushd $FILESYSTEM_ROOT && sudo zip $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/; popd sudo zip -g $ONIE_INSTALLER_PAYLOAD $FILESYSTEM_SQUASHFS $FILESYSTEM_DOCKERFS + +## Remove fsroot +sudo rm -rf $FILESYSTEM_ROOT From 1786a3389d5e9f7987b857478d208edcac167e31 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 31 Jan 2017 22:06:12 -0800 Subject: [PATCH 0218/1011] rename single image to one image (#220) * rename single image to one image --- platform/broadcom/one-image.mk | 8 ++++++++ platform/broadcom/rules.mk | 4 ++-- platform/broadcom/single-image.mk | 8 -------- platform/cavium/one-image.mk | 8 ++++++++ platform/cavium/rules.mk | 4 ++-- platform/cavium/single-image.mk | 8 -------- platform/mellanox/one-image.mk | 8 ++++++++ platform/mellanox/rules.mk | 4 ++-- platform/mellanox/single-image.mk | 8 -------- 9 files changed, 30 insertions(+), 30 deletions(-) create mode 100644 platform/broadcom/one-image.mk delete mode 100644 platform/broadcom/single-image.mk create mode 100644 platform/cavium/one-image.mk delete mode 100644 platform/cavium/single-image.mk create mode 100644 platform/mellanox/one-image.mk delete mode 100644 platform/mellanox/single-image.mk diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk new file mode 100644 index 000000000000..0b91fdba3086 --- /dev/null +++ b/platform/broadcom/one-image.mk @@ -0,0 +1,8 @@ +# sonic broadcom one image installer + +SONIC_ONE_IMAGE = sonic-broadcom.bin +$(SONIC_ONE_IMAGE)_MACHINE = broadcom +$(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie +$(SONIC_ONE_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) +$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 395d211d93d9..80e2d3800455 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -2,7 +2,7 @@ include $(PLATFORM_PATH)/sdk.mk include $(PLATFORM_PATH)/sai.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk -include $(PLATFORM_PATH)/single-image.mk +include $(PLATFORM_PATH)/one-image.mk BCMCMD = bcmcmd $(BCMCMD)_URL = "https://sonicstorage.blob.core.windows.net/packages/bcmcmd?sv=2015-04-05&sr=b&sig=X3bFApmsNFmcnWM9mSGRxBugPcg%2FgJCHh5hhSuV1M2c%3D&se=2030-08-23T14%3A41%3A56Z&sp=r" @@ -12,7 +12,7 @@ $(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/dsserve?sv SONIC_ONLINE_FILES += $(BCMCMD) $(DSSERVE) -SONIC_ALL += $(SONIC_SINGLE_IMAGE) +SONIC_ALL += $(SONIC_ONE_IMAGE) # Inject brcm sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) diff --git a/platform/broadcom/single-image.mk b/platform/broadcom/single-image.mk deleted file mode 100644 index f1c9a88af767..000000000000 --- a/platform/broadcom/single-image.mk +++ /dev/null @@ -1,8 +0,0 @@ -# sonic mellanox single image installer - -SONIC_SINGLE_IMAGE = sonic-broadcom.bin -$(SONIC_SINGLE_IMAGE)_MACHINE = broadcom -$(SONIC_SINGLE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_SINGLE_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) -$(SONIC_SINGLE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) -SONIC_INSTALLERS += $(SONIC_SINGLE_IMAGE) diff --git a/platform/cavium/one-image.mk b/platform/cavium/one-image.mk new file mode 100644 index 000000000000..0b011f77ac48 --- /dev/null +++ b/platform/cavium/one-image.mk @@ -0,0 +1,8 @@ +# sonic cavium one image installer + +SONIC_ONE_IMAGE = sonic-cavium.bin +$(SONIC_ONE_IMAGE)_MACHINE = cavium +$(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie +$(SONIC_ONE_IMAGE)_DEPENDS += $(CAVM_PLATFORM_DEB) +$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index e8d16cc73657..6fb9d8c267ef 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -2,9 +2,9 @@ include $(PLATFORM_PATH)/cavm-sai.mk include $(PLATFORM_PATH)/docker-syncd-cavm.mk include $(PLATFORM_PATH)/docker-orchagent-cavm.mk include $(PLATFORM_PATH)/cavm_platform_modules.mk -include $(PLATFORM_PATH)/single-image.mk +include $(PLATFORM_PATH)/one-image.mk -SONIC_ALL += $(SONIC_SINGLE_IMAGE) +SONIC_ALL += $(SONIC_ONE_IMAGE) # Inject cavium sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(CAVM_SAI) $(CAVM_LIBSAI) diff --git a/platform/cavium/single-image.mk b/platform/cavium/single-image.mk deleted file mode 100644 index f9f6fefe57dd..000000000000 --- a/platform/cavium/single-image.mk +++ /dev/null @@ -1,8 +0,0 @@ -# sonic mellanox single image installer - -SONIC_SINGLE_IMAGE = sonic-cavium.bin -$(SONIC_SINGLE_IMAGE)_MACHINE = cavium -$(SONIC_SINGLE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_SINGLE_IMAGE)_DEPENDS += $(CAVM_PLATFORM_DEB) -$(SONIC_SINGLE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) -SONIC_INSTALLERS += $(SONIC_SINGLE_IMAGE) diff --git a/platform/mellanox/one-image.mk b/platform/mellanox/one-image.mk new file mode 100644 index 000000000000..1aa8da3928da --- /dev/null +++ b/platform/mellanox/one-image.mk @@ -0,0 +1,8 @@ +# sonic mellanox one image installer + +SONIC_ONE_IMAGE = sonic-mellanox.bin +$(SONIC_ONE_IMAGE)_MACHINE = mellanox +$(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie +$(SONIC_ONE_IMAGE)_DEPENDS += $(SX_KERNEL) $(KERNEL_MFT) $(MFT) $(MLNX_HW_MANAGEMENT) +$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index a881b7bee6ec..2c10cf3337c8 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -5,9 +5,9 @@ include $(PLATFORM_PATH)/mlnx-sai.mk include $(PLATFORM_PATH)/hw-management.mk include $(PLATFORM_PATH)/docker-syncd-mlnx.mk include $(PLATFORM_PATH)/docker-orchagent-mlnx.mk -include $(PLATFORM_PATH)/single-image.mk +include $(PLATFORM_PATH)/one-image.mk -SONIC_ALL += $(SONIC_SINGLE_IMAGE) +SONIC_ALL += $(SONIC_ONE_IMAGE) # Inject mlnx sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) diff --git a/platform/mellanox/single-image.mk b/platform/mellanox/single-image.mk deleted file mode 100644 index 7ed23da850ce..000000000000 --- a/platform/mellanox/single-image.mk +++ /dev/null @@ -1,8 +0,0 @@ -# sonic mellanox single image installer - -SONIC_SINGLE_IMAGE = sonic-mellanox.bin -$(SONIC_SINGLE_IMAGE)_MACHINE = mellanox -$(SONIC_SINGLE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_SINGLE_IMAGE)_DEPENDS += $(SX_KERNEL) $(KERNEL_MFT) $(MFT) $(MLNX_HW_MANAGEMENT) -$(SONIC_SINGLE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) -SONIC_INSTALLERS += $(SONIC_SINGLE_IMAGE) From 4ce17b100fc4d9cf3beb671fb27c55d4d1756d90 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Wed, 1 Feb 2017 10:09:02 +0200 Subject: [PATCH 0219/1011] Install orchagent and syncd containers to Broadcom and Cavium images (#227) --- platform/broadcom/docker-orchagent-brcm.mk | 10 ++++++++++ platform/broadcom/docker-syncd-brcm.mk | 7 +++++++ platform/cavium/docker-orchagent-cavm.mk | 10 ++++++++++ platform/cavium/docker-syncd-cavm.mk | 7 +++++++ 4 files changed, 34 insertions(+) diff --git a/platform/broadcom/docker-orchagent-brcm.mk b/platform/broadcom/docker-orchagent-brcm.mk index c847d93b748d..646626ff89dd 100644 --- a/platform/broadcom/docker-orchagent-brcm.mk +++ b/platform/broadcom/docker-orchagent-brcm.mk @@ -5,3 +5,13 @@ $(DOCKER_ORCHAGENT_BRCM)_PATH = $(DOCKERS_PATH)/docker-orchagent $(DOCKER_ORCHAGENT_BRCM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) $(DOCKER_ORCHAGENT_BRCM)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_BRCM) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_BRCM) + +$(DOCKER_ORCHAGENT_BRCM)_CONTAINER_NAME = swss +$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += --net=host --privileged -t +$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += --volumes-from database +$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/ssw/:/etc/ssw/:ro +$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro +$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro +$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf +$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/broadcom/docker-syncd-brcm.mk b/platform/broadcom/docker-syncd-brcm.mk index e1f02c59fa12..870cba30c854 100644 --- a/platform/broadcom/docker-syncd-brcm.mk +++ b/platform/broadcom/docker-syncd-brcm.mk @@ -6,3 +6,10 @@ $(DOCKER_SYNCD_BRCM)_DEPENDS += $(SYNCD) $(DOCKER_SYNCD_BRCM)_FILES += $(DSSERVE) $(BCMCMD) $(DOCKER_SYNCD_BRCM)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM) + +$(DOCKER_SYNCD_BRCM)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_BRCM)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_BRCM)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_BRCM)_RUN_OPT += --volumes-from database +$(DOCKER_SYNCD_BRCM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/cavium/docker-orchagent-cavm.mk b/platform/cavium/docker-orchagent-cavm.mk index b66c7dbf0395..9befdb11e87d 100644 --- a/platform/cavium/docker-orchagent-cavm.mk +++ b/platform/cavium/docker-orchagent-cavm.mk @@ -5,3 +5,13 @@ $(DOCKER_ORCHAGENT_CAVM)_PATH = $(DOCKERS_PATH)/docker-orchagent $(DOCKER_ORCHAGENT_CAVM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) $(DOCKER_ORCHAGENT_CAVM)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_CAVM) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_CAVM) + +$(DOCKER_ORCHAGENT_CAVM)_CONTAINER_NAME = swss +$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += --net=host --privileged -t +$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += --volumes-from database +$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/ssw/:/etc/ssw/:ro +$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro +$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro +$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf +$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/cavium/docker-syncd-cavm.mk b/platform/cavium/docker-syncd-cavm.mk index ec410ca3052d..b6efd184bd1f 100644 --- a/platform/cavium/docker-syncd-cavm.mk +++ b/platform/cavium/docker-syncd-cavm.mk @@ -5,3 +5,10 @@ $(DOCKER_SYNCD_CAVM)_PATH = $(PLATFORM_PATH)/docker-syncd-cavm $(DOCKER_SYNCD_CAVM)_DEPENDS += $(SYNCD) $(CAVM_LIBSAI) $(XP_TOOLS) $(REDIS_TOOLS) $(DOCKER_SYNCD_CAVM)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CAVM) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_CAVM) + +$(DOCKER_SYNCD_CAVM)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_CAVM)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_CAVM)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_CAVM)_RUN_OPT += --volumes-from database +$(DOCKER_SYNCD_CAVM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro From 1c074367a160f085f8085d0279ce1ed3c31f09d6 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 1 Feb 2017 00:10:40 -0800 Subject: [PATCH 0220/1011] Add daemon file which was missing in docker-fpm (#229) --- dockers/docker-fpm/Dockerfile.j2 | 1 + dockers/docker-fpm/daemons | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 dockers/docker-fpm/daemons diff --git a/dockers/docker-fpm/Dockerfile.j2 b/dockers/docker-fpm/Dockerfile.j2 index dfd3450743fc..ea4aa226badb 100644 --- a/dockers/docker-fpm/Dockerfile.j2 +++ b/dockers/docker-fpm/Dockerfile.j2 @@ -24,6 +24,7 @@ RUN rm -rf /debs COPY ["*.j2", "/etc/swss/bgp/"] COPY ["start.sh", "config.sh", "/usr/bin/"] +COPY ["daemons", "/etc/quagga/"] ENTRYPOINT /usr/bin/config.sh \ && /usr/bin/start.sh \ diff --git a/dockers/docker-fpm/daemons b/dockers/docker-fpm/daemons new file mode 100644 index 000000000000..cb7c2322c9fb --- /dev/null +++ b/dockers/docker-fpm/daemons @@ -0,0 +1,31 @@ +# This file tells the quagga package which daemons to start. +# +# Entries are in the format: =(yes|no|priority) +# 0, "no" = disabled +# 1, "yes" = highest priority +# 2 .. 10 = lower priorities +# Read /usr/share/doc/quagga/README.Debian for details. +# +# Sample configurations for these daemons can be found in +# /usr/share/doc/quagga/examples/. +# +# ATTENTION: +# +# When activation a daemon at the first time, a config file, even if it is +# empty, has to be present *and* be owned by the user and group "quagga", else +# the daemon will not be started by /etc/init.d/quagga. The permissions should +# be u=rw,g=r,o=. +# When using "vtysh" such a config file is also needed. It should be owned by +# group "quaggavty" and set to ug=rw,o= though. Check /etc/pam.d/quagga, too. +# +# The watchquagga daemon is always started. Per default in monitoring-only but +# that can be changed via /etc/quagga/debian.conf. +# +zebra=yes +bgpd=yes +ospfd=no +ospf6d=no +ripd=no +ripngd=no +isisd=no +babeld=no From fbe272154357e759290fc4c121627f8de929cddb Mon Sep 17 00:00:00 2001 From: Petro Karashchenko Date: Wed, 1 Feb 2017 21:56:50 +0200 Subject: [PATCH 0221/1011] [sonic-slave]: Fix issue "no space left on disk" while trying to add user in docker (#233) Note: related to https://github.com/docker/docker/issues/5419 Signed-off-by: Petro Karashchenko --- sonic-slave/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 2a06770dfed9..41c65e3465b2 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -99,7 +99,7 @@ ARG guid RUN groupadd -f -r -g $guid g$user -RUN useradd $user -u $uid -g $guid -d /var/$user -m -s /bin/bash +RUN useradd $user -l -u $uid -g $guid -d /var/$user -m -s /bin/bash RUN gpasswd -a $user docker From ddbda4ce2ebc8a72cb91b8352ebfde4ce02a7501 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Wed, 1 Feb 2017 22:49:43 +0200 Subject: [PATCH 0222/1011] docker: Add ipaddress python module to the PTF docker (#231) Needed for the FIB test --- dockers/docker-ptf/Dockerfile.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 78f2eb260480..3f2f1cad8276 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -66,6 +66,7 @@ RUN rm -rf /debs \ && pip install --upgrade cffi==1.7.0 \ && pip install nnpy \ && pip install dpkt \ + && pip install ipaddress \ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py From d6f0c4611bf70255eed59cb406d64d4f98a31bac Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Wed, 1 Feb 2017 23:02:08 +0200 Subject: [PATCH 0223/1011] Add platform-monitor container to one image. (#232) --- files/build_templates/pmon.service.j2 | 12 ++++++++++++ rules/docker-platform-monitor.mk | 5 +++++ 2 files changed, 17 insertions(+) create mode 100644 files/build_templates/pmon.service.j2 diff --git a/files/build_templates/pmon.service.j2 b/files/build_templates/pmon.service.j2 new file mode 100644 index 000000000000..d50f5be628de --- /dev/null +++ b/files/build_templates/pmon.service.j2 @@ -0,0 +1,12 @@ +[Unit] +Description=Platform monitor container +Requires=database.service +After=database.service + +[Service] +User={{ sonicadmin_user }} +ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStop=/usr/bin/{{docker_container_name}}.sh stop + +[Install] +WantedBy=multi-user.target diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index 51997cc41516..223e87bfac78 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -6,3 +6,8 @@ $(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(SONIC_CONFIG_ENGINE) $(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) + +$(DOCKER_PLATFORM_MONITOR)_CONTAINER_NAME = pmon +$(DOCKER_PLATFORM_MONITOR)_RUN_OPT += --net=host --privileged -t +$(DOCKER_PLATFORM_MONITOR)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro From 921db0511a90096c42abdb890e4aec018258c492 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Wed, 1 Feb 2017 13:02:29 -0800 Subject: [PATCH 0224/1011] Update boot0 (#202) - Refactor of the whole script for readability purpose - Now detect the root= partition automatically - Allow more parameters to be passed to the cmdline using /mnt/flash/kernel-params - /host/machine.conf file will have to be generated at a later stage since Aboot doesn't have enough information about the platform here --- files/Aboot/boot0 | 99 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 30 deletions(-) diff --git a/files/Aboot/boot0 b/files/Aboot/boot0 index 8a0d0b77cf11..8318ccc0e071 100644 --- a/files/Aboot/boot0 +++ b/files/Aboot/boot0 @@ -18,9 +18,20 @@ set -x +kernel=boot/vmlinuz-3.16.0-4-amd64 +initrd=boot/initrd.img-3.16.0-4-amd64 +kernel_params=kernel-params + +aboot_machine="arista_unknown" + +target_path=/mnt/flash + +# expect the swi to be a non empty file +[ -s "$swipath" ] || exit 1 + bootconfigvars="SWI SWI_COPY POST_LEVEL CONSOLESPEED PASSWORD NETDEV NETAUTO NETIP NETMASK NETGW NETDOMAIN NETDNS NETHW memtest" -parseenvironmentconfig() { +parse_environment_config() { for n in ${bootconfigvars}; do eval v="\$$n" if [ "$v" ]; then @@ -29,34 +40,19 @@ parseenvironmentconfig() { done } -kernel=boot/vmlinuz-3.16.0-4-amd64 -initrd=boot/initrd.img-3.16.0-4-amd64 - -TARGET_PATH=/mnt/flash -if [ -d "${swipath}" ]; then - # Not expect a directory name for swipath - exit 1 -fi - -## Check the hash file in the image, and determine to install or just skip -GIT_REVISION=$(unzip -p ${swipath} .imagehash) -LOCAL_IMAGEHASH=$(cat $TARGET_PATH/.imagehash 2>/dev/null || true) -if [ "$GIT_REVISION" != "$LOCAL_IMAGEHASH" ]; then +extract_image() { ## Clean old directory for read-write layer - rm -rf ${TARGET_PATH}/rw + rm -rf "$target_path/rw" ## Unzip the image - unzip -oq ${swipath} -x boot0 -d ${TARGET_PATH} + unzip -oq "$swipath" -x boot0 -d "$target_path" +} +write_machine_config() { ## Detect SKU and create a hardware description file - aboot_version=`grep ^Aboot /etc/cmdline | sed 's/^.*norcal.-//'` - aboot_build_date=`stat -c %y /bin/sysinit | sed 's/ /T/'` - if `grep -q platform=raven /etc/cmdline`; then - aboot_machine=arista_7050_qx32 - else - aboot_machine=arista_7050_qx32s - fi - cat < ${TARGET_PATH}/machine.conf + aboot_version=$(grep ^Aboot /etc/cmdline | sed 's/^.*norcal.-//') + aboot_build_date=$(stat -c %y /bin/sysinit | sed 's/ /T/') + cat < ${target_path}/machine.conf aboot_version=$aboot_version aboot_vendor=arista aboot_platform=x86_64-$aboot_machine @@ -64,15 +60,58 @@ aboot_machine=$aboot_machine aboot_arch=x86_64 aboot_build_date=$aboot_build_date EOF +} -fi +platform_specific() { + local platform="$(grep -Eo 'platform=[^ ]+' /etc/cmdline | cut -f2 -d=)" + # This is temporary as the platform= parameter doesn't provide enough + # information to identify the SKU + # An initramfs hook or a later processing done by the initscripts will be + # required + if [ "$platform" = "raven" ]; then + aboot_machine=arista_7050_qx32 + echo "modprobe.blacklist=radeon" >>/tmp/append + fi + if [ "$platform" = "crow" ]; then + aboot_machine=arista_7050_qx32s + fi +} -echo "${append}" >/tmp/append -parseenvironmentconfig >>/tmp/append +echo "$append" >/tmp/append +parse_environment_config >>/tmp/append cat /etc/cmdline | sed "/^\(${bootconfigvars// /\|}\|crashkernel\|loglevel\|ignore_loglevel\)\(\$\|=\)/d;/^\$/d" >>/tmp/append -echo "root=/dev/sda1 rw loop=fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor quiet" >>/tmp/append +echo "rw loop=fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor quiet" >>/tmp/append + +# process platform specific operations +platform_specific + +# use extra parameters from kernel-params hook if the file exists +if [ -f "$target_path/$kernel_params" ]; then + cat "$target_path/$kernel_params" >>/tmp/append +fi + +# setting root partition if not overridden by kernel-params +if ! grep -q "root=" /tmp/append; then + rootdev=$(mount | grep '/mnt/flash' | cut -f1 -d' ') + rootfstype=$(mount | grep '/mnt/flash' | cut -f5 -d' ') + # reformat if vfat? + echo "root=$rootdev" >>/tmp/append +fi + +# check the hash file in the image, and determine to install or just skip +GIT_REVISION=$(unzip -p "$swipath" .imagehash) +LOCAL_IMAGEHASH=$(cat $target_path/.imagehash 2>/dev/null || true) +if [ "$GIT_REVISION" != "$LOCAL_IMAGEHASH" ]; then + extract_image + write_machine_config +fi + +# chainloading using kexec +initrd_path="$target_path/$initrd" +kernel_path="$target_path/$kernel" +cmdline="$(tr '\n' ' ' Date: Wed, 1 Feb 2017 19:44:54 -0800 Subject: [PATCH 0225/1011] Update submodule sonic-snmpagent (#236) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 2e7fe1b2a9c3..fabc4412d5df 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 2e7fe1b2a9c3fafdc49d0063d1fb9e5396fd3649 +Subproject commit fabc4412d5dfa3eb04796352ac20681eb09298c3 From 61d4509f0b44b06a542000720175ca7a3738e29e Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 1 Feb 2017 21:29:50 -0800 Subject: [PATCH 0226/1011] Add new sonic-config dependencies to dhcp_relay Dockerfile (#237) --- dockers/docker-dhcp-relay/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile index 6ff95da88d7c..fdb00bc1e211 100644 --- a/dockers/docker-dhcp-relay/Dockerfile +++ b/dockers/docker-dhcp-relay/Dockerfile @@ -1,5 +1,8 @@ FROM docker-base +# Dependencies for sonic-cfggen +RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml + ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive From caab516ea752ae771f83934a711024bec7b2461a Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 2 Feb 2017 07:53:46 -0800 Subject: [PATCH 0227/1011] [snmpd]: download source files from azure storage blob (#239) --- src/snmpd/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/snmpd/Makefile b/src/snmpd/Makefile index 4cd036655af4..ace9fa6d4b87 100644 --- a/src/snmpd/Makefile +++ b/src/snmpd/Makefile @@ -17,9 +17,9 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : rm -rf net-snmp-$(SNMPD_VERSION) # download debian net-snmp - wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_$(SNMPD_VERSION_FULL).dsc - wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_$(SNMPD_VERSION).orig.tar.xz - wget http://http.debian.net/debian/pool/main/n/net-snmp/net-snmp_$(SNMPD_VERSION_FULL).debian.tar.xz + wget -NO net-snmp_$(SNMPD_VERSION_FULL).dsc "https://sonicstorage.blob.core.windows.net/packages/net-snmp_5.7.3+dfsg-1.5.dsc?sv=2015-04-05&sr=b&sig=vDAYAKlwi7JjF%2FesdJUyf4VIEXPsCfLhqqTqNr75zBs%3D&se=2030-10-12T13%3A59%3A45Z&sp=r" + wget -NO net-snmp_$(SNMPD_VERSION).orig.tar.xz "https://sonicstorage.blob.core.windows.net/packages/net-snmp_5.7.3+dfsg.orig.tar.xz?sv=2015-04-05&sr=b&sig=UjIh%2FTcHrIEzEV7a%2BV2ZP4ks3xHlAA3wqyxkyV7Ms8I%3D&se=2030-10-12T13%3A58%3A19Z&sp=r" + wget -NO net-snmp_$(SNMPD_VERSION_FULL).debian.tar.xz "https://sonicstorage.blob.core.windows.net/packages/net-snmp_5.7.3+dfsg-1.5.debian.tar.xz?sv=2015-04-05&sr=b&sig=xJkmxjtKXYcPe4yR%2FuCA0TXUfT40rj4XUMBaiK9CjsA%3D&se=2030-10-12T14%3A00%3A15Z&sp=r" dpkg-source -x net-snmp_$(SNMPD_VERSION_FULL).dsc pushd net-snmp-$(SNMPD_VERSION) From 4cd3d31946398e49ad4c5f93754eef78f95ff8b7 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 2 Feb 2017 11:12:04 -0800 Subject: [PATCH 0228/1011] Update APT package lists before first attempt to install (#241) * Update APT package lists before first attempt to install * Move setting of environment variable before first call to apt-get --- dockers/docker-dhcp-relay/Dockerfile | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile index fdb00bc1e211..f664d89a4a2e 100644 --- a/dockers/docker-dhcp-relay/Dockerfile +++ b/dockers/docker-dhcp-relay/Dockerfile @@ -1,16 +1,18 @@ FROM docker-base -# Dependencies for sonic-cfggen -RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml - ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive +# Update APT package lists +RUN apt-get update + +# Dependencies for sonic-cfggen +RUN apt-get -y install python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml + ## Install isc-dhcp-relay and clean up afterward -RUN apt-get update \ - && apt-get -y install isc-dhcp-relay \ - && apt-get clean -y \ - && apt-get autoclean -y \ +RUN apt-get -y install isc-dhcp-relay \ + && apt-get clean -y \ + && apt-get autoclean -y \ && apt-get autoremove -y COPY ["isc-dhcp-relay.j2", "/usr/share/dhcp-relay/"] From 793b842d600c8c29f49f04df16127e403a49df10 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Thu, 2 Feb 2017 21:19:48 +0200 Subject: [PATCH 0229/1011] Add DHCP client hook to update hostname. (#235) * Add DHCP client hook to update hostname. * Remove interface checking * Update hostname in /etc/hosts file --- build_debian.sh | 1 + files/dhcp/sethostname | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 files/dhcp/sethostname diff --git a/build_debian.sh b/build_debian.sh index d79a05275b17..e113e6925107 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -240,6 +240,7 @@ iface eth0 inet dhcp EOF sudo cp files/dhcp/rfc3442-classless-routes $FILESYSTEM_ROOT/etc/dhcp/dhclient-exit-hooks.d +sudo cp files/dhcp/sethostname $FILESYSTEM_ROOT/etc/dhcp/dhclient-exit-hooks.d/ if [ -f sonic_debian_extension.sh ]; then ./sonic_debian_extension.sh $FILESYSTEM_ROOT diff --git a/files/dhcp/sethostname b/files/dhcp/sethostname new file mode 100644 index 000000000000..81bd458935fc --- /dev/null +++ b/files/dhcp/sethostname @@ -0,0 +1,20 @@ +#!/bin/bash +# This script is to update hostname of the system. + +if [ "$reason" != BOUND ] && [ "$reason" != RENEW ] \ + && [ "$reason" != REBIND ] && [ "$reason" != REBOOT ] +then + exit 0 +fi + +current_host_name=`hostname -s` + +if [ "$current_host_name" != "$new_host_name" ] +then + echo $new_host_name > /etc/hostname + line_to_replace=`grep 127.0.0.1.*$current_host_name /etc/hosts` + new_line=`echo $line_to_replace | sed "s/$current_host_name/$new_host_name/"` + sed -i "s/$line_to_replace/$new_line/" /etc/hosts + + hostname -F /etc/hostname +fi From c05a9f2fd87da6c318e70c8132b75f9a00060b41 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 2 Feb 2017 18:11:39 -0800 Subject: [PATCH 0230/1011] Update submodule sonic-snmpagent (#244) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index fabc4412d5df..5c30a369a94b 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit fabc4412d5dfa3eb04796352ac20681eb09298c3 +Subproject commit 5c30a369a94b9312a8858c3bc9a3db083d835900 From 523a738068bc1975edc44b6954c028b23d02077d Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 2 Feb 2017 18:28:06 -0800 Subject: [PATCH 0231/1011] add dell platform driver to broadcom one image (#242) --- .gitmodules | 3 +++ platform/broadcom/one-image.mk | 2 +- platform/broadcom/platform-modules-s6000.mk | 10 ++++++++++ platform/broadcom/rules.mk | 1 + .../broadcom/sonic-platform-modules-s6000 | 1 + platform/mellanox/hw-management.mk | 1 + platform/mellanox/mft.mk | 1 + rules/linux-kernel.mk | 19 ++++++++++++++----- src/sonic-linux-kernel | 2 +- 9 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 platform/broadcom/platform-modules-s6000.mk create mode 160000 platform/broadcom/sonic-platform-modules-s6000 diff --git a/.gitmodules b/.gitmodules index c8b1acdb78ec..d9188126bf7a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -47,3 +47,6 @@ [submodule "src/sonic-utilities"] path = src/sonic-utilities url = https://github.com/Azure/sonic-utilities +[submodule "platform/broadcom/sonic-platform-modules-s6000"] + path = platform/broadcom/sonic-platform-modules-s6000 + url = https://github.com/Azure/sonic-platform-modules-s6000 diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 0b91fdba3086..59939fb72e7c 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -3,6 +3,6 @@ SONIC_ONE_IMAGE = sonic-broadcom.bin $(SONIC_ONE_IMAGE)_MACHINE = broadcom $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_ONE_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) +$(SONIC_ONE_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) $(DELL_S6000_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/broadcom/platform-modules-s6000.mk b/platform/broadcom/platform-modules-s6000.mk new file mode 100644 index 000000000000..a32ab67c7aa8 --- /dev/null +++ b/platform/broadcom/platform-modules-s6000.mk @@ -0,0 +1,10 @@ +# Dell S6000 Platform modules + +DELL_S6000_PLATFORM_MODULE_VERSION = 1.0 + +export DELL_S6000_PLATFORM_MODULE_VERSION + +DELL_S6000_PLATFORM_MODULE = platform-modules-s6000_$(DELL_S6000_PLATFORM_MODULE_VERSION)_amd64.deb +$(DELL_S6000_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-s6000 +$(DELL_S6000_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +SONIC_DPKG_DEBS += $(DELL_S6000_PLATFORM_MODULE) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 80e2d3800455..cd34b9c23bf6 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -1,5 +1,6 @@ include $(PLATFORM_PATH)/sdk.mk include $(PLATFORM_PATH)/sai.mk +include $(PLATFORM_PATH)/platform-modules-s6000.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk include $(PLATFORM_PATH)/one-image.mk diff --git a/platform/broadcom/sonic-platform-modules-s6000 b/platform/broadcom/sonic-platform-modules-s6000 new file mode 160000 index 000000000000..1f6c70e7db89 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-s6000 @@ -0,0 +1 @@ +Subproject commit 1f6c70e7db890851510a36892b602c534e4f41a7 diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk index 1aa63862306e..47863d180dbf 100644 --- a/platform/mellanox/hw-management.mk +++ b/platform/mellanox/hw-management.mk @@ -6,4 +6,5 @@ export MLNX_HW_MANAGEMENT_VERSION MLNX_HW_MANAGEMENT = hw-management_1.mlnx.$(MLNX_HW_MANAGEMENT_VERSION)_amd64.deb $(MLNX_HW_MANAGEMENT)_SRC_PATH = $(PLATFORM_PATH)/hw-management +$(MLNX_HW_MANAGEMENT)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) SONIC_MAKE_DEBS += $(MLNX_HW_MANAGEMENT) diff --git a/platform/mellanox/mft.mk b/platform/mellanox/mft.mk index 7dea01789af2..966cb48c013f 100644 --- a/platform/mellanox/mft.mk +++ b/platform/mellanox/mft.mk @@ -2,6 +2,7 @@ MFT = mft-4.5.0-31.amd64.deb $(MFT)_SRC_PATH = $(PLATFORM_PATH)/mft +$(MFT)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) SONIC_MAKE_DEBS += $(MFT) KERNEL_MFT = kernel-mft-dkms_4.5.0-3.16.0-4-amd64_all.deb diff --git a/rules/linux-kernel.mk b/rules/linux-kernel.mk index 46467666539e..228b48a9d34b 100644 --- a/rules/linux-kernel.mk +++ b/rules/linux-kernel.mk @@ -1,9 +1,18 @@ # linux kernel package -KVERSION = 3.16.0-4-amd64 +KVERSION_SHORT = 3.16.0-4 +KVERSION = $(KVERSION_SHORT)-amd64 +KERNEL_VERSION = 3.16.36 +KERNEL_SUBVERSION = 1+deb8u2 -export KVERSION +export KVERSION_SHORT KVERSION KERNEL_VERSION KERNEL_SUBVERSION -LINUX_KERNEL = linux-image-3.16.0-4-amd64_3.16.36-1+deb8u2_amd64.deb -$(LINUX_KERNEL)_SRC_PATH = $(SRC_PATH)/sonic-linux-kernel -SONIC_MAKE_DEBS += $(LINUX_KERNEL) +LINUX_HEADERS_COMMON = linux-headers-$(KVERSION_SHORT)-common_$(KERNEL_VERSION)-$(KERNEL_SUBVERSION)_amd64.deb +$(LINUX_HEADERS_COMMON)_SRC_PATH = $(SRC_PATH)/sonic-linux-kernel +SONIC_MAKE_DEBS += $(LINUX_HEADERS_COMMON) + +LINUX_HEADERS = linux-headers-$(KVERSION)_$(KERNEL_VERSION)-$(KERNEL_SUBVERSION)_amd64.deb +$(eval $(call add_derived_package,$(LINUX_HEADERS_COMMON),$(LINUX_HEADERS))) + +LINUX_KERNEL = linux-image-$(KVERSION)_$(KERNEL_VERSION)-$(KERNEL_SUBVERSION)_amd64.deb +$(eval $(call add_derived_package,$(LINUX_HEADERS_COMMON),$(LINUX_KERNEL))) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 7f3b4e4949aa..777792e7e8fc 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 7f3b4e4949aa39481221a0ebf88d055676091916 +Subproject commit 777792e7e8fcdcd4b994f4dfca8ea5369855960c From 60e1fc3c9812a48caf9724dd4cae1858eb4c9a93 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 2 Feb 2017 20:34:34 -0800 Subject: [PATCH 0232/1011] ONEImage - Read all platform dependent information from sonic-config-engine (#238) Read all platform dependent information from sonic-config-engine --- dockers/docker-orchagent/Dockerfile.j2 | 3 ++ dockers/docker-orchagent/start.sh | 18 ++++------ dockers/docker-snmp-sv2/config.sh | 7 ++-- dockers/docker-snmp-sv2/sysDescription.j2 | 2 +- .../build_templates/sonic_debian_extension.j2 | 11 ++---- files/build_templates/sonic_version.yml.j2 | 4 +++ files/build_templates/sysDescription.j2 | 1 - platform/broadcom/docker-orchagent-brcm.mk | 3 +- platform/cavium/docker-orchagent-cavm.mk | 3 +- platform/mellanox/docker-orchagent-mlnx.mk | 3 +- rules/docker-snmp-sv2.mk | 1 - .../platform/AS7512/alias_map.json | 1 - .../platform/AS7512/port_config.ini | 34 ++++++++++++++++++- .../platform/AS7512/sensors.conf | 1 - src/sonic-config-engine/setup.py | 5 +-- 15 files changed, 61 insertions(+), 36 deletions(-) create mode 100644 files/build_templates/sonic_version.yml.j2 delete mode 100644 files/build_templates/sysDescription.j2 delete mode 100644 src/sonic-config-engine/platform/AS7512/alias_map.json delete mode 100644 src/sonic-config-engine/platform/AS7512/sensors.conf diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index cea7cb1a3a0e..9a72faf333f2 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -8,6 +8,9 @@ RUN apt-get install -f -y ifupdown bridge-utils libdbus-1-3 libdaemon0 libjansso ## TODO: implicitly install dependencies RUN apt-get -y install libjemalloc1 +# Dependencies for sonic-cfggen +RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml + COPY \ {% for deb in docker_orchagent_debs.split(' ') -%} debs/{{ deb }}{{' '}} diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index ca97c03a12f5..4ef7638809e5 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -25,32 +25,28 @@ trap clean_up SIGTERM SIGKILL . /host/machine.conf +HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` + MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` ORCHAGENT_ARGS="" -PORTSYNCD_ARGS="" +PORTSYNCD_ARGS="-p /usr/share/sonic/$HWSKU/port_config.ini" SWSSCONFIG_ARGS="00-copp.config.json " -if [ "$onie_platform" == "x86_64-dell_s6000_s1220-r0" ]; then +if [ "$HWSKU" == "Force10-S6000" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - PORTSYNCD_ARGS+="-p /etc/ssw/Force10-S6000/port_config.ini" SWSSCONFIG_ARGS+="td2.32ports.qos.1.json td2.32ports.qos.2.json td2.32ports.qos.3.json td2.32ports.qos.4.json td2.32ports.qos.5.json td2.32ports.qos.6.json " SWSSCONFIG_ARGS+="td2.32ports.buffers.1.json td2.32ports.buffers.2.json td2.32ports.buffers.3.json " -elif [ "$onie_platform" == "x86_64-dell_s6100_c2538-r0" ]; then +elif [ "$HWSKU" == "Force10-S6100" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - PORTSYNCD_ARGS+="-p /etc/ssw/Force10-S6100/port_config.ini" -elif [ "$aboot_platform" == "x86_64-arista_7050_qx32" ]; then +elif [ "$HWSKU" == "Arista-7050-QX32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - PORTSYNCD_ARGS+="-p /etc/ssw/Arista-7050-QX32/port_config.ini" SWSSCONFIG_ARGS+="td2.32ports.qos.1.json td2.32ports.qos.2.json td2.32ports.qos.3.json td2.32ports.qos.4.json td2.32ports.qos.5.json td2.32ports.qos.6.json " SWSSCONFIG_ARGS+="td2.32ports.buffers.1.json td2.32ports.buffers.2.json td2.32ports.buffers.3.json " -elif [ "$onie_platform" == "x86_64-mlnx_x86-r5.0.1400" ] || [ "$onie_platform" == "x86_64-mlnx_msn2700-r0" ]; then - PORTSYNCD_ARGS+="-p /etc/ssw/ACS-MSN2700/port_config.ini" -elif [ "$onie_platform" == "x86_64-accton_as7512_32x-r0" ]; then +elif [ "$HWSKU" == "AS7512" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - PORTSYNCD_ARGS+="-p /etc/ssw/AS7512/port_config.ini" fi service rsyslog start diff --git a/dockers/docker-snmp-sv2/config.sh b/dockers/docker-snmp-sv2/config.sh index d100573d931b..0681416b1acb 100755 --- a/dockers/docker-snmp-sv2/config.sh +++ b/dockers/docker-snmp-sv2/config.sh @@ -1,14 +1,15 @@ #!/bin/bash -#sysDescription is currently mounted, uncomment this line and provide version.yml instead if use copying instead of mounting -#sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/version.yml -t /etc/swss/snmp/sysDescription.j2 >/etc/ssw/sysDescription +mkdir -p /etc/ssw + +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/sonic_version.yml -t /etc/swss/snmp/sysDescription.j2 >/etc/ssw/sysDescription mkdir -p /etc/snmp sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/snmp.yml -t /etc/swss/snmp/snmpd.conf.j2 >/etc/snmp/snmpd.conf hwsku=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` -/bin/cp -rf /etc/ssw/$hwsku/alias_map.json /etc/snmp/ +/bin/cp -rf /usr/share/sonic/$hwsku/alias_map.json /etc/snmp/ mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status diff --git a/dockers/docker-snmp-sv2/sysDescription.j2 b/dockers/docker-snmp-sv2/sysDescription.j2 index a4871a6ffd44..54860a229d8b 100644 --- a/dockers/docker-snmp-sv2/sysDescription.j2 +++ b/dockers/docker-snmp-sv2/sysDescription.j2 @@ -1 +1 @@ -SONiC Software Version: {{ sonic_baseimage_version}}.SONiC.{{ sonic_version }} - HwSku: {{ minigraph_hwsku }} +SONiC Software Version: {{ build_version }}.SONiC.v2 - HwSku: {{ minigraph_hwsku }} - Distribution: Debian {{ debian_version }} - Kernel: {{ kernel_version }} diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 00fcf6732131..4cebcb2227e9 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -21,7 +21,6 @@ set -x -e . functions.sh BUILD_TEMPLATES=files/build_templates IMAGE_CONFIGS=files/image_config -VENDOR_CONFIGS=src/sonic-config-engine/platform {% if installer_debs.strip() -%} clean_sys() { @@ -46,7 +45,6 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in sudo dpkg --root=$FILESYSTEM_ROOT -i {{config_engine}} # Create all needed directories -sudo mkdir -p $FILESYSTEM_ROOT/etc/ssw/ sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/ sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/templates/ @@ -86,20 +84,17 @@ sudo cp $IMAGE_CONFIGS/interfaces/*.j2 $FILESYSTEM_ROOT/etc/sonic/templates/ # Copy SNMP configuration files sudo cp $IMAGE_CONFIGS/snmp/snmp.yml $FILESYSTEM_ROOT/etc/sonic/ -# Generate system desription file +# Generate build version file export git_revision=$(git rev-parse --short HEAD) export sonic_hwsku={{sonic_hwsku}} export debian_version=`cat $FILESYSTEM_ROOT/etc/debian_version` export kernel_version={{kversion}} -j2 $BUILD_TEMPLATES/sysDescription.j2 > sysDescription -sudo mv sysDescription $FILESYSTEM_ROOT/etc/ssw/ +j2 $BUILD_TEMPLATES/sonic_version.yml.j2 > sonic_version.yml +sudo mv sonic_version.yml $FILESYSTEM_ROOT/etc/sonic/ # Copy sudoers configuration file sudo cp $IMAGE_CONFIGS/sudoers/sudoers $FILESYSTEM_ROOT/etc/ -# Copy vendor specific configuration files -sudo cp -R $VENDOR_CONFIGS/{{sonic_hwsku}}/ $FILESYSTEM_ROOT/etc/ssw/ - {% for deb in installer_debs.strip().split(' ') -%} sudo dpkg --extract {{deb}} $FILESYSTEM_ROOT {% endfor %} diff --git a/files/build_templates/sonic_version.yml.j2 b/files/build_templates/sonic_version.yml.j2 new file mode 100644 index 000000000000..d0dd45aea56d --- /dev/null +++ b/files/build_templates/sonic_version.yml.j2 @@ -0,0 +1,4 @@ +build_version: {{git_revision}} +build_hwsku: {{sonic_hwsku}} +debian_version: {{debian_version}} +kernel_version: {{kernel_version}} diff --git a/files/build_templates/sysDescription.j2 b/files/build_templates/sysDescription.j2 deleted file mode 100644 index cfbdca1333d1..000000000000 --- a/files/build_templates/sysDescription.j2 +++ /dev/null @@ -1 +0,0 @@ -SONiC Software Version: SONiC-OS-{{git_revision}} HwSku: {{sonic_hwsku}} - Distribution: Debian {{debian_version}} - Kernel: {{kernel_version}} diff --git a/platform/broadcom/docker-orchagent-brcm.mk b/platform/broadcom/docker-orchagent-brcm.mk index 646626ff89dd..f04103ef15b8 100644 --- a/platform/broadcom/docker-orchagent-brcm.mk +++ b/platform/broadcom/docker-orchagent-brcm.mk @@ -2,7 +2,7 @@ DOCKER_ORCHAGENT_BRCM = docker-orchagent-brcm.gz $(DOCKER_ORCHAGENT_BRCM)_PATH = $(DOCKERS_PATH)/docker-orchagent -$(DOCKER_ORCHAGENT_BRCM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) +$(DOCKER_ORCHAGENT_BRCM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) $(SONIC_CONFIG_ENGINE) $(DOCKER_ORCHAGENT_BRCM)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_BRCM) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_BRCM) @@ -10,7 +10,6 @@ SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_BRCM) $(DOCKER_ORCHAGENT_BRCM)_CONTAINER_NAME = swss $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += --net=host --privileged -t $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += --volumes-from database -$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/ssw/:/etc/ssw/:ro $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf diff --git a/platform/cavium/docker-orchagent-cavm.mk b/platform/cavium/docker-orchagent-cavm.mk index 9befdb11e87d..e4ea73054921 100644 --- a/platform/cavium/docker-orchagent-cavm.mk +++ b/platform/cavium/docker-orchagent-cavm.mk @@ -2,7 +2,7 @@ DOCKER_ORCHAGENT_CAVM = docker-orchagent-cavm.gz $(DOCKER_ORCHAGENT_CAVM)_PATH = $(DOCKERS_PATH)/docker-orchagent -$(DOCKER_ORCHAGENT_CAVM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) +$(DOCKER_ORCHAGENT_CAVM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) $(SONIC_CONFIG_ENGINE) $(DOCKER_ORCHAGENT_CAVM)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_CAVM) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_CAVM) @@ -10,7 +10,6 @@ SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_CAVM) $(DOCKER_ORCHAGENT_CAVM)_CONTAINER_NAME = swss $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += --net=host --privileged -t $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += --volumes-from database -$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/ssw/:/etc/ssw/:ro $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf diff --git a/platform/mellanox/docker-orchagent-mlnx.mk b/platform/mellanox/docker-orchagent-mlnx.mk index 682c91f45c0d..5b526cc6f35d 100644 --- a/platform/mellanox/docker-orchagent-mlnx.mk +++ b/platform/mellanox/docker-orchagent-mlnx.mk @@ -2,7 +2,7 @@ DOCKER_ORCHAGENT_MLNX = docker-orchagent-mlnx.gz $(DOCKER_ORCHAGENT_MLNX)_PATH = $(DOCKERS_PATH)/docker-orchagent -$(DOCKER_ORCHAGENT_MLNX)_DEPENDS += $(SWSS) $(REDIS_TOOLS) +$(DOCKER_ORCHAGENT_MLNX)_DEPENDS += $(SWSS) $(REDIS_TOOLS) $(SONIC_CONFIG_ENGINE) $(DOCKER_ORCHAGENT_MLNX)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_MLNX) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_MLNX) @@ -10,7 +10,6 @@ SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_MLNX) $(DOCKER_ORCHAGENT_MLNX)_CONTAINER_NAME = swss $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += --net=host --privileged -t $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += --volumes-from database -$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/ssw/:/etc/ssw/:ro $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /host/machine.conf:/host/machine.conf diff --git a/rules/docker-snmp-sv2.mk b/rules/docker-snmp-sv2.mk index 1d55cbded808..e3ed0cf1eac8 100644 --- a/rules/docker-snmp-sv2.mk +++ b/rules/docker-snmp-sv2.mk @@ -10,5 +10,4 @@ SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SNMP_SV2) $(DOCKER_SNMP_SV2)_CONTAINER_NAME = snmp $(DOCKER_SNMP_SV2)_RUN_OPT += --net=host --privileged -t -$(DOCKER_SNMP_SV2)_RUN_OPT += -v /etc/ssw/:/etc/ssw/:ro $(DOCKER_SNMP_SV2)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/src/sonic-config-engine/platform/AS7512/alias_map.json b/src/sonic-config-engine/platform/AS7512/alias_map.json deleted file mode 100644 index 53be265702cc..000000000000 --- a/src/sonic-config-engine/platform/AS7512/alias_map.json +++ /dev/null @@ -1 +0,0 @@ -#TODO: Add correct info here diff --git a/src/sonic-config-engine/platform/AS7512/port_config.ini b/src/sonic-config-engine/platform/AS7512/port_config.ini index 1d60deaf60fc..c35776dcfcc5 100644 --- a/src/sonic-config-engine/platform/AS7512/port_config.ini +++ b/src/sonic-config-engine/platform/AS7512/port_config.ini @@ -1 +1,33 @@ -# TODO: Add correct info here +# alias lanes +Ethernet0 16,17,18,19 +Ethernet4 20,21,22,23 +Ethernet8 24,25,26,27 +Ethernet12 28,29,30,31 +Ethernet16 32,33,34,35 +Ethernet20 36,37,38,39 +Ethernet24 40,41,42,43 +Ethernet28 44,45,46,47 +Ethernet32 0,1,2,3 +Ethernet36 4,5,6,7 +Ethernet40 8,9,10,11 +Ethernet44 12,13,14,15 +Ethernet48 48,49,50,51 +Ethernet52 52,53,54,55 +Ethernet56 56,57,58,59 +Ethernet60 60,61,62,63 +Ethernet64 127,126,125,124 +Ethernet68 123,122,121,120 +Ethernet72 115,114,113,112 +Ethernet76 119,118,117,116 +Ethernet80 79,78,77,76 +Ethernet84 75,74,73,72 +Ethernet88 64,65,66,67 +Ethernet92 71,70,68,69 +Ethernet96 111,110,109,108 +Ethernet100 107,106,105,104 +Ethernet104 103,102,101,100 +Ethernet108 99,98,97,96 +Ethernet112 95,94,93,92 +Ethernet116 91,90,89,88 +Ethernet120 87,86,85,84 +Ethernet124 83,82,81,80 diff --git a/src/sonic-config-engine/platform/AS7512/sensors.conf b/src/sonic-config-engine/platform/AS7512/sensors.conf deleted file mode 100644 index 1d60deaf60fc..000000000000 --- a/src/sonic-config-engine/platform/AS7512/sensors.conf +++ /dev/null @@ -1 +0,0 @@ -# TODO: Add correct info here diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py index 4c11ceb604ca..92f1b2f84869 100644 --- a/src/sonic-config-engine/setup.py +++ b/src/sonic-config-engine/setup.py @@ -9,8 +9,9 @@ def get_platform_file_list(): data_path = os.path.join(repo_path, 'platform') platforms = os.listdir(data_path) for platform in platforms: - files = ['platform/' + platform + '/alias_map.json', - 'platform/' + platform + '/port_config.ini'] + files = ['platform/' + platform + '/port_config.ini'] + if os.path.isfile( os.path.join(data_path, platform, 'alias_map.json') ): + files.append('platform/' + platform + '/alias_map.json') #If a platform doesnot have alias_map.json minigraph.py will fall back to no alias mapping if os.path.isfile( os.path.join(data_path, platform, 'sensors.conf') ): files.append('platform/' + platform + '/sensors.conf') #Not all platforms need to have a sensors.conf file data_files.append( (os.path.join('/usr/share/sonic', platform), files) ) From b85c8dc89e25d02c2ac1d7628e5b2c9c7e917111 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 2 Feb 2017 21:10:07 -0800 Subject: [PATCH 0233/1011] Fix isc-dhcp-relay template (#246) --- dockers/docker-dhcp-relay/isc-dhcp-relay.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 index 2d251172c543..07df5e1f9a76 100644 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 @@ -1,6 +1,6 @@ -SERVERS="{{ dhcp_servers | join(' ') }}" +SERVERS="{{ dhcp_servers }}" -INTERFACES="{{ minigraph_vlan_interfaces | join(' ') }}" +INTERFACES="{{ minigraph_vlan_interfaces[0]['name'] }}" # '-a' option provides option 82 circuit id information OPTIONS="-a" From 76cfd672d13538e3606e562c27392f99b8f1e2b3 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 3 Feb 2017 14:21:57 -0800 Subject: [PATCH 0234/1011] Conform with new Docker build method (#250) --- dockers/docker-dhcp-relay/Dockerfile | 25 ----------------- dockers/docker-dhcp-relay/Dockerfile.j2 | 37 +++++++++++++++++++++++++ rules/docker-dhcp-relay.mk | 10 +++++-- 3 files changed, 45 insertions(+), 27 deletions(-) delete mode 100644 dockers/docker-dhcp-relay/Dockerfile create mode 100644 dockers/docker-dhcp-relay/Dockerfile.j2 diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile deleted file mode 100644 index f664d89a4a2e..000000000000 --- a/dockers/docker-dhcp-relay/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM docker-base - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -# Update APT package lists -RUN apt-get update - -# Dependencies for sonic-cfggen -RUN apt-get -y install python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml - -## Install isc-dhcp-relay and clean up afterward -RUN apt-get -y install isc-dhcp-relay \ - && apt-get clean -y \ - && apt-get autoclean -y \ - && apt-get autoremove -y - -COPY ["isc-dhcp-relay.j2", "/usr/share/dhcp-relay/"] -COPY ["config.sh", "/usr/bin/"] - -ENTRYPOINT /usr/bin/config.sh \ - && service rsyslog start \ - && service isc-dhcp-relay start \ - && /bin/bash - diff --git a/dockers/docker-dhcp-relay/Dockerfile.j2 b/dockers/docker-dhcp-relay/Dockerfile.j2 new file mode 100644 index 000000000000..85ea74a4b164 --- /dev/null +++ b/dockers/docker-dhcp-relay/Dockerfile.j2 @@ -0,0 +1,37 @@ +FROM docker-base + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +## Update APT package lists +RUN apt-get update + +## Dependencies for sonic-cfggen +RUN apt-get -y install python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml + + +COPY \ +{% for deb in docker_dhcp_relay_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -i \ +{% for deb in docker_dhcp_relay_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +## Install isc-dhcp-relay Debian package +RUN apt-get -y install isc-dhcp-relay + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +COPY ["isc-dhcp-relay.j2", "/usr/share/dhcp-relay/"] +COPY ["config.sh", "/usr/bin/"] + +ENTRYPOINT /usr/bin/config.sh \ + && service rsyslog start \ + && service isc-dhcp-relay start \ + && /bin/bash diff --git a/rules/docker-dhcp-relay.mk b/rules/docker-dhcp-relay.mk index 1c68e8468a30..c0d88e595fd8 100644 --- a/rules/docker-dhcp-relay.mk +++ b/rules/docker-dhcp-relay.mk @@ -1,7 +1,13 @@ -# docker dhcp relay image +# Docker image for DHCP relay DOCKER_DHCP_RELAY = docker-dhcp-relay.gz $(DOCKER_DHCP_RELAY)_PATH = $(DOCKERS_PATH)/docker-dhcp-relay +$(DOCKER_DHCP_RELAY)_DEPENDS += $(SONIC_CONFIG_ENGINE) $(DOCKER_DHCP_RELAY)_LOAD_DOCKERS = $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) -SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) + +$(DOCKER_DHCP_RELAY)_CONTAINER_NAME = dhcp_relay +$(DOCKER_DHCP_RELAY)_RUN_OPT += --net=host --privileged -t +$(DOCKER_DHCP_RELAY)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro From 92b32fd9102f61fcfdbb75c179bd5bd5b3bcd381 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 3 Feb 2017 16:32:42 -0800 Subject: [PATCH 0235/1011] Add DCS-7060CX-32S support in boot0 (#243) --- files/Aboot/boot0 | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/files/Aboot/boot0 b/files/Aboot/boot0 index 8318ccc0e071..79161e33806f 100644 --- a/files/Aboot/boot0 +++ b/files/Aboot/boot0 @@ -64,16 +64,22 @@ EOF platform_specific() { local platform="$(grep -Eo 'platform=[^ ]+' /etc/cmdline | cut -f2 -d=)" - # This is temporary as the platform= parameter doesn't provide enough + local sid="$(grep -Eo 'sid=[^ ]+' /etc/cmdline | cut -f2 -d=)" + # This is temporary as the platform= and sid= parameters don't provide enough # information to identify the SKU # An initramfs hook or a later processing done by the initscripts will be - # required + # required to read the system eeprom if [ "$platform" = "raven" ]; then aboot_machine=arista_7050_qx32 echo "modprobe.blacklist=radeon" >>/tmp/append fi if [ "$platform" = "crow" ]; then aboot_machine=arista_7050_qx32s + echo "modprobe.blacklist=radeon" >>/tmp/append + fi + if [ "$sid" = "Upperlake" ]; then + aboot_machine=arista_7060_cx32s + echo "amd_iommu=off" >> /tmp/append fi } @@ -95,7 +101,6 @@ fi if ! grep -q "root=" /tmp/append; then rootdev=$(mount | grep '/mnt/flash' | cut -f1 -d' ') rootfstype=$(mount | grep '/mnt/flash' | cut -f5 -d' ') - # reformat if vfat? echo "root=$rootdev" >>/tmp/append fi From e4ed979b831e348a0d5502349885b837fe5420b2 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 3 Feb 2017 16:33:33 -0800 Subject: [PATCH 0236/1011] Add version file to the SWI required by newer Aboot (#254) --- build_image.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build_image.sh b/build_image.sh index 5373b8da72c1..dc8d796ca8d9 100755 --- a/build_image.sh +++ b/build_image.sh @@ -35,6 +35,9 @@ elif [ "$IMAGE_TYPE" = "aboot" ]; then echo "$GIT_REVISION" >> .imagehash zip -g $OUTPUT_ONIE_IMAGE .imagehash rm .imagehash + echo "SWI_VERSION=42.0.0" > version + zip -g $OUTPUT_ONIE_IMAGE version + rm version else echo "Error: Non supported target platform: $TARGET_PLATFORM" exit 1 From 6f5262bc2c986d7cb98ff8a7a4f5cf447e7872e4 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 3 Feb 2017 17:39:09 -0800 Subject: [PATCH 0237/1011] Fix config bug in snmp (#252) 1. Modify snmp user to Debian-snmp to fit snmpd 5.7.3 2. Fix a bug that cause sysLocation to be missing from snmpd.conf --- dockers/docker-snmp-sv2/snmpd | 2 +- files/image_config/snmp/snmp.yml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/dockers/docker-snmp-sv2/snmpd b/dockers/docker-snmp-sv2/snmpd index 4b35c6cc936a..576c366d2ba1 100644 --- a/dockers/docker-snmp-sv2/snmpd +++ b/dockers/docker-snmp-sv2/snmpd @@ -8,4 +8,4 @@ export MIBS= SNMPDRUN=yes # snmpd options (use syslog, close stdin/out/err). -SNMPDOPTS='-LS4d -Lf /dev/null -u snmp -g snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable -p /run/snmpd.pid' +SNMPDOPTS='-LS4d -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable -p /run/snmpd.pid' diff --git a/files/image_config/snmp/snmp.yml b/files/image_config/snmp/snmp.yml index 13c9d7bd7d77..86f76c3a5cc3 100644 --- a/files/image_config/snmp/snmp.yml +++ b/files/image_config/snmp/snmp.yml @@ -1 +1,3 @@ snmp_rocommunity: public +snmp_location: public + From 5890204e42b7bf81899b607b6709d7f9c2377c4b Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 3 Feb 2017 18:09:56 -0800 Subject: [PATCH 0238/1011] Update port_config.ini (#256) --- .../platform/Force10-S6100/port_config.ini | 128 +++++++++--------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/src/sonic-config-engine/platform/Force10-S6100/port_config.ini b/src/sonic-config-engine/platform/Force10-S6100/port_config.ini index d0af86ad1a4f..67e558963f36 100644 --- a/src/sonic-config-engine/platform/Force10-S6100/port_config.ini +++ b/src/sonic-config-engine/platform/Force10-S6100/port_config.ini @@ -1,65 +1,65 @@ # alias lanes -Ethernet0 1,2 -Ethernet1 3,4 -Ethernet2 5,6 -Ethernet3 7,8 -Ethernet4 9,10 -Ethernet5 11,12 -Ethernet6 13,14 -Ethernet7 15,16 -Ethernet8 17,18 -Ethernet9 19,20 -Ethernet10 21,22 -Ethernet11 23,24 -Ethernet12 25,26 -Ethernet13 27,28 -Ethernet14 29,30 -Ethernet15 31,32 -Ethernet16 33,34 -Ethernet17 35,36 -Ethernet18 37,38 -Ethernet19 39,40 -Ethernet20 41,42 -Ethernet21 43,44 -Ethernet22 45,46 -Ethernet23 47,48 -Ethernet24 49,50 -Ethernet25 51,52 -Ethernet26 53,54 -Ethernet27 55,56 -Ethernet28 57,58 -Ethernet29 59,60 -Ethernet30 61,62 -Ethernet31 63,64 -Ethernet32 65,66 -Ethernet33 67,68 -Ethernet34 69,70 -Ethernet35 71,72 -Ethernet36 73,74 -Ethernet37 75,76 -Ethernet38 77,78 -Ethernet39 79,80 -Ethernet40 81,82 -Ethernet41 83,84 -Ethernet42 85,86 -Ethernet43 87,88 -Ethernet44 89,90 -Ethernet45 91,92 -Ethernet46 93,94 -Ethernet47 95,96 -Ethernet48 97,98 -Ethernet49 99,100 -Ethernet50 101,102 -Ethernet51 103,104 -Ethernet52 105,106 -Ethernet53 107,108 -Ethernet54 109,110 -Ethernet55 111,112 -Ethernet56 113,114 -Ethernet57 115,116 -Ethernet58 117,118 -Ethernet59 119,120 -Ethernet60 121,122 -Ethernet61 123,124 -Ethernet62 125,126 -Ethernet63 127,128 +Ethernet0 101,102 +Ethernet1 103,104 +Ethernet2 97,98 +Ethernet3 99,100 +Ethernet4 69,70 +Ethernet5 71,72 +Ethernet6 65,66 +Ethernet7 67,68 +Ethernet8 53,54 +Ethernet9 55,56 +Ethernet10 49,50 +Ethernet11 51,52 +Ethernet12 21,22 +Ethernet13 23,24 +Ethernet14 17,18 +Ethernet15 19,20 +Ethernet16 25,26 +Ethernet17 27,28 +Ethernet18 29,30 +Ethernet19 31,32 +Ethernet20 57,58 +Ethernet21 59,60 +Ethernet22 61,62 +Ethernet23 63,64 +Ethernet24 73,74 +Ethernet25 75,76 +Ethernet26 77,78 +Ethernet27 79,80 +Ethernet28 105,106 +Ethernet29 107,108 +Ethernet30 109,110 +Ethernet31 111,112 +Ethernet32 13,14 +Ethernet33 15,16 +Ethernet34 9,10 +Ethernet35 11,12 +Ethernet36 125,126 +Ethernet37 127,128 +Ethernet38 121,122 +Ethernet39 123,124 +Ethernet40 93,94 +Ethernet41 95,96 +Ethernet42 89,90 +Ethernet43 91,92 +Ethernet44 45,46 +Ethernet45 47,48 +Ethernet46 41,42 +Ethernet47 43,44 +Ethernet48 113,114 +Ethernet49 115,116 +Ethernet50 117,118 +Ethernet51 119,120 +Ethernet52 1,2 +Ethernet53 3,4 +Ethernet54 5,6 +Ethernet55 7,8 +Ethernet56 33,34 +Ethernet57 35,36 +Ethernet58 37,38 +Ethernet59 39,40 +Ethernet60 81,82 +Ethernet61 83,84 +Ethernet62 85,86 +Ethernet63 87,88 From 00fe0784b4e16009a177aa6e0dec415fd3983d78 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 3 Feb 2017 19:44:00 -0800 Subject: [PATCH 0239/1011] [Broadcom]: Update Broadcom debian packages and m3000-r0 m3000-r1 config.bcm files (#251) Signed-off-by: Shuotian Cheng --- dockers/docker-orchagent/Dockerfile.j2 | 4 ++-- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 9a72faf333f2..f085da93a55f 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -8,8 +8,8 @@ RUN apt-get install -f -y ifupdown bridge-utils libdbus-1-3 libdaemon0 libjansso ## TODO: implicitly install dependencies RUN apt-get -y install libjemalloc1 -# Dependencies for sonic-cfggen -RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml +# Dependencies for sonic-cfggen +RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml COPY \ {% for deb in docker_orchagent_debs.split(' ') -%} diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 6e768856e772..89a838d872de 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.0.3.7-3-20170118215303.119_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.0.3.7-3-20170118215303.119_amd64.deb?sv=2015-04-05&sr=b&sig=lmAbkYBRtlEDUwFxAGK0bpGOZ3QIrgzrF3WD%2Ba2tvvY%3D&se=2030-09-27T22%3A51%3A39Z&sp=r" +BRCM_SAI = libsaibcm_2.1.3.1+0-20170203082839.11-1.gbp995de3_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.3.1+0-20170203082839.11-1.gbp995de3_amd64.deb?sv=2015-04-05&sr=b&sig=q%2Byg1WtnhhGHBeOjyO7LfMZejwqER%2F7Hdr%2F%2Bxs%2FUFSA%3D&se=2030-10-13T19%3A49%3A10Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.0.3.7-3-20170118215303.119_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.3.1+0-20170203082839.11-1.gbp995de3_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.0.3.7-3-20170118215303.119_amd64.deb?sv=2015-04-05&sr=b&sig=e8tPGsXcOfVtMpQdwZKNOpHplezroAkIfxASfK%2BJDR8%3D&se=2030-09-27T22%3A49%3A47Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.3.1+0-20170203082839.11-1.gbp995de3_amd64.deb?sv=2015-04-05&sr=b&sig=ihcuduBFhzV5yj%2F2kI%2BzTshm85KFtm2XGqHcXo%2FwD5U%3D&se=2030-10-13T19%3A50%3A07Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 05c4b814d57c..c9f9662a72e5 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.1.5-3-20170118205520.58_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-3-20170118205520.58_amd64.deb?sv=2015-04-05&sr=b&sig=R3hWzXrbe4IMSBImAUwK30iSSTIfEtXku6ZYWDX5WhI%3D&se=2030-09-27T22%3A45%3A59Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.1.5-5-20170203072429.19_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-5-20170203072429.19_amd64.deb?sv=2015-04-05&sr=b&sig=ay3U2TMBqVOlDmT75PlLCn0olcjixH96whjjdPM4IGI%3D&se=2030-10-13T19%3A50%3A48Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-3-20170118205520.58_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-3-20170118205520.58_amd64.deb?sv=2015-04-05&sr=b&sig=RArOfg5ll6uVbrD0a4VLADHvpJktcJsMSOGYwQ7RZnQ%3D&se=2030-09-27T22%3A49%3A11Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-5-20170203072429.19_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-5-20170203072429.19_amd64.deb?sv=2015-04-05&sr=b&sig=WttrjSL1EtqPA50ZZEn52pOUojMqmP9e7Gdcrj9a%2FVI%3D&se=2030-10-13T19%3A51%3A16Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 68270f36df66fbe2713c837798ac3f663eeb0f03 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 3 Feb 2017 20:15:55 -0800 Subject: [PATCH 0240/1011] [build break]: Revert "Conform with new Docker build method" (#257) --- dockers/docker-dhcp-relay/Dockerfile | 25 +++++++++++++++++ dockers/docker-dhcp-relay/Dockerfile.j2 | 37 ------------------------- rules/docker-dhcp-relay.mk | 10 ++----- 3 files changed, 27 insertions(+), 45 deletions(-) create mode 100644 dockers/docker-dhcp-relay/Dockerfile delete mode 100644 dockers/docker-dhcp-relay/Dockerfile.j2 diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile new file mode 100644 index 000000000000..f664d89a4a2e --- /dev/null +++ b/dockers/docker-dhcp-relay/Dockerfile @@ -0,0 +1,25 @@ +FROM docker-base + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +# Update APT package lists +RUN apt-get update + +# Dependencies for sonic-cfggen +RUN apt-get -y install python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml + +## Install isc-dhcp-relay and clean up afterward +RUN apt-get -y install isc-dhcp-relay \ + && apt-get clean -y \ + && apt-get autoclean -y \ + && apt-get autoremove -y + +COPY ["isc-dhcp-relay.j2", "/usr/share/dhcp-relay/"] +COPY ["config.sh", "/usr/bin/"] + +ENTRYPOINT /usr/bin/config.sh \ + && service rsyslog start \ + && service isc-dhcp-relay start \ + && /bin/bash + diff --git a/dockers/docker-dhcp-relay/Dockerfile.j2 b/dockers/docker-dhcp-relay/Dockerfile.j2 deleted file mode 100644 index 85ea74a4b164..000000000000 --- a/dockers/docker-dhcp-relay/Dockerfile.j2 +++ /dev/null @@ -1,37 +0,0 @@ -FROM docker-base - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -## Update APT package lists -RUN apt-get update - -## Dependencies for sonic-cfggen -RUN apt-get -y install python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml - - -COPY \ -{% for deb in docker_dhcp_relay_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ - -RUN dpkg -i \ -{% for deb in docker_dhcp_relay_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor %} - -## Install isc-dhcp-relay Debian package -RUN apt-get -y install isc-dhcp-relay - -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs - -COPY ["isc-dhcp-relay.j2", "/usr/share/dhcp-relay/"] -COPY ["config.sh", "/usr/bin/"] - -ENTRYPOINT /usr/bin/config.sh \ - && service rsyslog start \ - && service isc-dhcp-relay start \ - && /bin/bash diff --git a/rules/docker-dhcp-relay.mk b/rules/docker-dhcp-relay.mk index c0d88e595fd8..1c68e8468a30 100644 --- a/rules/docker-dhcp-relay.mk +++ b/rules/docker-dhcp-relay.mk @@ -1,13 +1,7 @@ -# Docker image for DHCP relay +# docker dhcp relay image DOCKER_DHCP_RELAY = docker-dhcp-relay.gz $(DOCKER_DHCP_RELAY)_PATH = $(DOCKERS_PATH)/docker-dhcp-relay -$(DOCKER_DHCP_RELAY)_DEPENDS += $(SONIC_CONFIG_ENGINE) $(DOCKER_DHCP_RELAY)_LOAD_DOCKERS = $(DOCKER_BASE) -SONIC_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) -SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) - -$(DOCKER_DHCP_RELAY)_CONTAINER_NAME = dhcp_relay -$(DOCKER_DHCP_RELAY)_RUN_OPT += --net=host --privileged -t -$(DOCKER_DHCP_RELAY)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) From b2e44834f1ea363d0f7203713fda0e9d3dc686d3 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 3 Feb 2017 21:01:34 -0800 Subject: [PATCH 0241/1011] SNMP will now bind on 0.0.0.0 if mgmt ip not specified in minigraph (#253) Fix an issue that snmp will fail to start if mgmt ip is not specified in minigraph (e.g. default graph in oneimage where mgmt ip is from DHCP) --- dockers/docker-snmp-sv2/snmpd.conf.j2 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dockers/docker-snmp-sv2/snmpd.conf.j2 b/dockers/docker-snmp-sv2/snmpd.conf.j2 index 1f1691f987b5..fe3c5cadbb47 100644 --- a/dockers/docker-snmp-sv2/snmpd.conf.j2 +++ b/dockers/docker-snmp-sv2/snmpd.conf.j2 @@ -1,6 +1,5 @@ ############################################################################### -# Managed by Ansible -# file: ansible/roles/acs/templates/snmpd.conf.j2 +# Managed by sonic-config-engine ############################################################################### # # EXAMPLE.conf: @@ -14,6 +13,7 @@ # AGENT BEHAVIOUR # +{% if minigraph_mgmt_interface.addr | ipv4 %} # Listen for connections on localhost, loopback ip and mgmt (eth0) ip agentAddress udp:127.0.0.1:161 agentAddress udp:{{ minigraph_mgmt_interface.addr }}:161 @@ -23,6 +23,11 @@ agentAddress udp:{{ minigraph_mgmt_interface.addr }}:161 agentAddress udp:{{ minigraph_lo_interface.addr }}:161 {% endif %} {% endfor %} +{% else %} +# Listen on all addresses as mgmt ip not specified in minigraph +agentAddress udp:161 +{% endif %} + ############################################################################### # # ACCESS CONTROL From 2b113c4175d92e62e542dda9b894a68af4adb8b7 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Sat, 4 Feb 2017 07:35:48 +0200 Subject: [PATCH 0242/1011] Add FLUSH DB commands to swss service missed during merge (#248) * Add FLUSH DB commands to swss service missed during merge * Update swss.service.j2 --- files/build_templates/swss.service.j2 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index 3e7eb7cb68da..b7e34335f5fe 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -1,10 +1,13 @@ [Unit] -Description=orchagent container +Description=switch state service container Requires=database.service After=database.service [Service] User={{ sonicadmin_user }} +ExecStartPre=/usr/bin/docker exec database redis-cli -n 0 FLUSHDB +ExecStartPre=/usr/bin/docker exec database redis-cli -n 1 FLUSHDB +ExecStartPre=/usr/bin/docker exec database redis-cli -n 2 FLUSHDB ExecStart=/usr/bin/{{docker_container_name}}.sh start ExecStop=/usr/bin/{{docker_container_name}}.sh stop ExecStopPost=/usr/bin/syncd.sh stop From 26f4c85825a25f6b3da5ab46ba711e4de7705b3a Mon Sep 17 00:00:00 2001 From: antonpatenko Date: Sat, 4 Feb 2017 07:38:32 +0200 Subject: [PATCH 0243/1011] Add possibility to install debug packages during build. (#234) * Enabled common debug packages installation. * Update gitignore. * Make debug-packages installation disabled by default. --- .gitignore | 1 + rules/config | 3 +++ rules/docker-base.mk | 10 +++++++++- slave.mk | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1e87c52e6f71..5483ddb6e9fe 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ dockers/docker-orchagent/Dockerfile dockers/docker-snmp-sv2/Dockerfile dockers/docker-team/Dockerfile dockers/docker-platform-monitor/Dockerfile +dockers/docker-base/Dockerfile diff --git a/rules/config b/rules/config index d76477ce5adc..5ae09a1bc96d 100644 --- a/rules/config +++ b/rules/config @@ -31,3 +31,6 @@ USERNAME = admin # PASSWORD - password for installer build PASSWORD = YourPaSsWoRd + +# SONIC_CONFIG_DEBUG - install debug packages +SONIC_CONFIG_DEBUG = n diff --git a/rules/docker-base.mk b/rules/docker-base.mk index 56e42ac97b45..f041f7d05cdd 100644 --- a/rules/docker-base.mk +++ b/rules/docker-base.mk @@ -3,4 +3,12 @@ DOCKER_BASE = docker-base.gz $(DOCKER_BASE)_PATH = $(DOCKERS_PATH)/docker-base -SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_BASE) +ifeq ($(SONIC_CONFIG_DEBUG),y) +GDB = gdb +VIM = vim +OPENSSH = openssh-client +SSHPASS = sshpass +$(DOCKER_BASE)_DBG_PACKAGES += $(GDB) $(VIM) $(OPENSSH) $(SSHPASS) +endif + +SONIC_DOCKER_IMAGES += $(DOCKER_BASE) diff --git a/slave.mk b/slave.mk index 485f8ff9206c..5617a936f714 100644 --- a/slave.mk +++ b/slave.mk @@ -267,6 +267,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .pl sudo mount --bind $(PYTHON_WHEELS_PATH) $($*.gz_PATH)/python-wheels $(LOG) # Export variables for j2. Use path for unique variable names, e.g. docker_orchagent_debs $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_debs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DEPENDS),RDEPENDS))\n" | awk '!a[$$0]++')) + $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_dbgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DBG_PACKAGES)))\n" | awk '!a[$$0]++')) j2 $($*.gz_PATH)/Dockerfile.j2 > $($*.gz_PATH)/Dockerfile docker build --no-cache -t $* $($*.gz_PATH) $(LOG) docker save $* | gzip -c > $@ From f6a509cbb7b57a3a608857d8bdb2f225ade4817d Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 3 Feb 2017 22:14:47 -0800 Subject: [PATCH 0244/1011] Revert "Add possibility to install debug packages during build." (#259) --- .gitignore | 1 - rules/config | 3 --- rules/docker-base.mk | 10 +--------- slave.mk | 1 - 4 files changed, 1 insertion(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 5483ddb6e9fe..1e87c52e6f71 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,3 @@ dockers/docker-orchagent/Dockerfile dockers/docker-snmp-sv2/Dockerfile dockers/docker-team/Dockerfile dockers/docker-platform-monitor/Dockerfile -dockers/docker-base/Dockerfile diff --git a/rules/config b/rules/config index 5ae09a1bc96d..d76477ce5adc 100644 --- a/rules/config +++ b/rules/config @@ -31,6 +31,3 @@ USERNAME = admin # PASSWORD - password for installer build PASSWORD = YourPaSsWoRd - -# SONIC_CONFIG_DEBUG - install debug packages -SONIC_CONFIG_DEBUG = n diff --git a/rules/docker-base.mk b/rules/docker-base.mk index f041f7d05cdd..56e42ac97b45 100644 --- a/rules/docker-base.mk +++ b/rules/docker-base.mk @@ -3,12 +3,4 @@ DOCKER_BASE = docker-base.gz $(DOCKER_BASE)_PATH = $(DOCKERS_PATH)/docker-base -ifeq ($(SONIC_CONFIG_DEBUG),y) -GDB = gdb -VIM = vim -OPENSSH = openssh-client -SSHPASS = sshpass -$(DOCKER_BASE)_DBG_PACKAGES += $(GDB) $(VIM) $(OPENSSH) $(SSHPASS) -endif - -SONIC_DOCKER_IMAGES += $(DOCKER_BASE) +SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_BASE) diff --git a/slave.mk b/slave.mk index 5617a936f714..485f8ff9206c 100644 --- a/slave.mk +++ b/slave.mk @@ -267,7 +267,6 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .pl sudo mount --bind $(PYTHON_WHEELS_PATH) $($*.gz_PATH)/python-wheels $(LOG) # Export variables for j2. Use path for unique variable names, e.g. docker_orchagent_debs $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_debs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DEPENDS),RDEPENDS))\n" | awk '!a[$$0]++')) - $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_dbgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DBG_PACKAGES)))\n" | awk '!a[$$0]++')) j2 $($*.gz_PATH)/Dockerfile.j2 > $($*.gz_PATH)/Dockerfile docker build --no-cache -t $* $($*.gz_PATH) $(LOG) docker save $* | gzip -c > $@ From e75acfe6d77899cb90c35ada0a300ee9caad9a44 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Sat, 4 Feb 2017 19:42:41 +0000 Subject: [PATCH 0245/1011] Add 'One Image' implementation for DHCP relay (hopefully fix builds) --- files/build_templates/dhcp_relay.service.j2 | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 files/build_templates/dhcp_relay.service.j2 diff --git a/files/build_templates/dhcp_relay.service.j2 b/files/build_templates/dhcp_relay.service.j2 new file mode 100644 index 000000000000..ee0c444ccce5 --- /dev/null +++ b/files/build_templates/dhcp_relay.service.j2 @@ -0,0 +1,12 @@ +[Unit] +Description=DHCP relay container +Requires=docker.service +After=docker.service + +[Service] +User={{ sonicadmin_user }} +ExecStart=/usr/bin/{{ docker_container_name }}.sh start +ExecStop=/usr/bin/{{ docker_container_name }}.sh stop + +[Install] +WantedBy=multi-user.target From 7abb48abff42b64810b4c6c93321cd0f09444872 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 4 Feb 2017 12:02:58 -0800 Subject: [PATCH 0246/1011] [kernel]: update kernel for arista 7260cx-32 (#258) --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 777792e7e8fc..cf93afcc12cb 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 777792e7e8fcdcd4b994f4dfca8ea5369855960c +Subproject commit cf93afcc12cb77a94fafd7f828d7549fdc346027 From 7c2c5f7f422f8c011dbbd54ac512211447c6c0da Mon Sep 17 00:00:00 2001 From: krambn Date: Sat, 4 Feb 2017 18:38:05 -0800 Subject: [PATCH 0247/1011] [p4]: Update the SAI header files to v0.9.4 (#260) * change refpoints to local repos (p4) * update refpoint to different fork * added missing bm link for platform p4 --- .gitmodules | 4 ++-- platform/p4/p4-bmv/behavioral-model | 2 +- platform/p4/p4-switch/switch | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitmodules b/.gitmodules index d9188126bf7a..9e92d29e50ad 100644 --- a/.gitmodules +++ b/.gitmodules @@ -15,10 +15,10 @@ url = https://github.com/Azure/sonic-swss [submodule "src/p4-switch/switch"] path = platform/p4/p4-switch/switch - url = https://github.com/lguohan/switch + url = https://github.com/krambn/switch [submodule "src/p4-bmv2/behavioral-model"] path = platform/p4/p4-bmv/behavioral-model - url = https://github.com/lguohan/behavioral-model + url = https://github.com/krambn/behavioral-model [submodule "src/p4c-bm/p4c-bm"] path = platform/p4/p4c-bm/p4c-bm url = https://github.com/krambn/p4c-bm diff --git a/platform/p4/p4-bmv/behavioral-model b/platform/p4/p4-bmv/behavioral-model index 0eb0d51736ee..ee3615eb155f 160000 --- a/platform/p4/p4-bmv/behavioral-model +++ b/platform/p4/p4-bmv/behavioral-model @@ -1 +1 @@ -Subproject commit 0eb0d51736eeadd75384edfa8589e43a9ba734f4 +Subproject commit ee3615eb155f61c8d165281fd4f36b9ea78ba71a diff --git a/platform/p4/p4-switch/switch b/platform/p4/p4-switch/switch index 21adcdddac59..584571b17dda 160000 --- a/platform/p4/p4-switch/switch +++ b/platform/p4/p4-switch/switch @@ -1 +1 @@ -Subproject commit 21adcdddac59b75e4627255a12f1ed1a4369bb62 +Subproject commit 584571b17ddafcaa45a3d46eacc403b7e18cac1b From 8bc559eccaf1a93603825a42c72164835ecbce1d Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 4 Feb 2017 22:32:45 -0800 Subject: [PATCH 0248/1011] [sonic-aboot]: restore docker archive on arista platform (#261) --- files/Aboot/boot0 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/files/Aboot/boot0 b/files/Aboot/boot0 index 79161e33806f..b326f0e289a6 100644 --- a/files/Aboot/boot0 +++ b/files/Aboot/boot0 @@ -46,6 +46,15 @@ extract_image() { ## Unzip the image unzip -oq "$swipath" -x boot0 -d "$target_path" + + ## Clean old directory for docker + rm -rf "$target_path/var/lib/docker" + + ## Further extract docker archive + tar xf "$target_path/dockerfs.tar.gz" -C "$target_path" + + ## clean up docker archive + rm -f "$target_path/dockerfs.tar.gz" } write_machine_config() { From d41877f4ff6b849de60edfab4fab6c7ce24c7500 Mon Sep 17 00:00:00 2001 From: Kram Date: Sat, 4 Feb 2017 19:48:36 -0800 Subject: [PATCH 0249/1011] [p4]: update p4 behaviro-model refpoint --- platform/p4/p4-bmv/behavioral-model | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/p4/p4-bmv/behavioral-model b/platform/p4/p4-bmv/behavioral-model index ee3615eb155f..a6ccf267bc9c 160000 --- a/platform/p4/p4-bmv/behavioral-model +++ b/platform/p4/p4-bmv/behavioral-model @@ -1 +1 @@ -Subproject commit ee3615eb155f61c8d165281fd4f36b9ea78ba71a +Subproject commit a6ccf267bc9c5c31fd40fe5841893e38e03abeb4 From 64f26beb42c88f8815c6d6e129c88f4daeed74a2 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Sun, 5 Feb 2017 14:37:34 -0800 Subject: [PATCH 0250/1011] Update PTF submodule to point to current head of master branch (#255) --- src/ptf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ptf b/src/ptf index ec33433f0276..9e762c9cdb63 160000 --- a/src/ptf +++ b/src/ptf @@ -1 +1 @@ -Subproject commit ec33433f027625f4ba85c4eba8258e29f1dd6496 +Subproject commit 9e762c9cdb63d7ab9be017a41f638e776f4f0575 From 27a0b7c1fd52b49d103a487481c66f8079b8a725 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 5 Feb 2017 15:59:59 -0800 Subject: [PATCH 0251/1011] build one aboot image on arista platform (#263) --- .gitmodules | 3 +++ build_image.sh | 27 ++++++++++++++----- files/Aboot/{boot0 => boot0.j2} | 16 +++++++---- onie-image.conf | 6 +++++ platform/broadcom/one-aboot.mk | 8 ++++++ platform/broadcom/platform-modules-arista.mk | 10 +++++++ platform/broadcom/rules.mk | 4 ++- .../broadcom/sonic-platform-modules-arista | 1 + platform/generic/aboot-image.mk | 4 +-- 9 files changed, 64 insertions(+), 15 deletions(-) rename files/Aboot/{boot0 => boot0.j2} (91%) create mode 100644 platform/broadcom/one-aboot.mk create mode 100644 platform/broadcom/platform-modules-arista.mk create mode 160000 platform/broadcom/sonic-platform-modules-arista diff --git a/.gitmodules b/.gitmodules index 9e92d29e50ad..35e7290b8000 100644 --- a/.gitmodules +++ b/.gitmodules @@ -50,3 +50,6 @@ [submodule "platform/broadcom/sonic-platform-modules-s6000"] path = platform/broadcom/sonic-platform-modules-s6000 url = https://github.com/Azure/sonic-platform-modules-s6000 +[submodule "sonic-platform-modules-arista"] + path = platform/broadcom/sonic-platform-modules-arista + url = https://github.com/lguohan/sonic-1 diff --git a/build_image.sh b/build_image.sh index dc8d796ca8d9..03e518a5fb9c 100755 --- a/build_image.sh +++ b/build_image.sh @@ -19,9 +19,10 @@ } GIT_REVISION=$(git rev-parse --short HEAD) -mkdir -p `dirname $OUTPUT_ONIE_IMAGE` -sudo rm -f $OUTPUT_ONIE_IMAGE if [ "$IMAGE_TYPE" = "onie" ]; then + echo "Build ONIE installer" + mkdir -p `dirname $OUTPUT_ONIE_IMAGE` + sudo rm -f $OUTPUT_ONIE_IMAGE ## Generate an ONIE installer image ## Note: Don't leave blank between lines. It is single line command. ./onie-mk-demo.sh $TARGET_PLATFORM $TARGET_MACHINE $TARGET_PLATFORM-$TARGET_MACHINE-$ONIEIMAGE_VERSION \ @@ -29,15 +30,27 @@ if [ "$IMAGE_TYPE" = "onie" ]; then $ONIE_INSTALLER_PAYLOAD ## Use 'aboot' as target machine category which includes Aboot as bootloader elif [ "$IMAGE_TYPE" = "aboot" ]; then - ## Add Aboot boot0 file into the image - cp $ONIE_INSTALLER_PAYLOAD $OUTPUT_ONIE_IMAGE - pushd files/Aboot && sudo zip -g $OLDPWD/$OUTPUT_ONIE_IMAGE boot0; popd + echo "Build Aboot installer" + mkdir -p `dirname $OUTPUT_ABOOT_IMAGE` + sudo rm -f $OUTPUT_ABOOT_IMAGE + sudo rm -f $ABOOT_BOOT_IMAGE + ## Add main payload + cp $ONIE_INSTALLER_PAYLOAD $OUTPUT_ABOOT_IMAGE + ## Add Aboot boot0 file + j2 -f env files/Aboot/boot0.j2 ./onie-image.conf > files/Aboot/boot0 + pushd files/Aboot && zip -g $OLDPWD/$OUTPUT_ABOOT_IMAGE boot0; popd + pushd files/Aboot && zip -g $OLDPWD/$ABOOT_BOOT_IMAGE boot0; popd echo "$GIT_REVISION" >> .imagehash - zip -g $OUTPUT_ONIE_IMAGE .imagehash + zip -g $OUTPUT_ABOOT_IMAGE .imagehash + zip -g $ABOOT_BOOT_IMAGE .imagehash rm .imagehash echo "SWI_VERSION=42.0.0" > version - zip -g $OUTPUT_ONIE_IMAGE version + zip -g $OUTPUT_ABOOT_IMAGE version + zip -g $ABOOT_BOOT_IMAGE version rm version + + zip -g $OUTPUT_ABOOT_IMAGE $ABOOT_BOOT_IMAGE + rm $ABOOT_BOOT_IMAGE else echo "Error: Non supported target platform: $TARGET_PLATFORM" exit 1 diff --git a/files/Aboot/boot0 b/files/Aboot/boot0.j2 similarity index 91% rename from files/Aboot/boot0 rename to files/Aboot/boot0.j2 index b326f0e289a6..6836f780ac44 100644 --- a/files/Aboot/boot0 +++ b/files/Aboot/boot0.j2 @@ -44,17 +44,23 @@ extract_image() { ## Clean old directory for read-write layer rm -rf "$target_path/rw" + ## Clean docker directory + rm -rf "$target_path/var" + ## Unzip the image unzip -oq "$swipath" -x boot0 -d "$target_path" - ## Clean old directory for docker - rm -rf "$target_path/var/lib/docker" + ## Remove installer swi as it has lots of redundunt contents + rm -f $swipath - ## Further extract docker archive - tar xf "$target_path/dockerfs.tar.gz" -C "$target_path" + ## Further extract docker archive + tar xf "$target_path/{{ FILESYSTEM_DOCKERFS }}" -C "$target_path" ## clean up docker archive - rm -f "$target_path/dockerfs.tar.gz" + rm -f "$target_path/{{ FILESYSTEM_DOCKERFS }}" + + ## replace with boot swi + mv "$target_path/{{ ABOOT_BOOT_IMAGE }}" "$swipath" } write_machine_config() { diff --git a/onie-image.conf b/onie-image.conf index 61fad731b975..70228bbf2498 100644 --- a/onie-image.conf +++ b/onie-image.conf @@ -23,3 +23,9 @@ FILESYSTEM_DOCKERFS=dockerfs.tar.gz ## Output file name for onie installer OUTPUT_ONIE_IMAGE=target/sonic-$TARGET_MACHINE.bin + +## Output file name for aboot installer +OUTPUT_ABOOT_IMAGE=target/sonic-aboot-$TARGET_MACHINE.swi + +## Aboot boot image name +ABOOT_BOOT_IMAGE=.sonic-boot.swi diff --git a/platform/broadcom/one-aboot.mk b/platform/broadcom/one-aboot.mk new file mode 100644 index 000000000000..fde8e06ff787 --- /dev/null +++ b/platform/broadcom/one-aboot.mk @@ -0,0 +1,8 @@ +# sonic broadcom one image installer + +SONIC_ONE_ABOOT_IMAGE = sonic-aboot-broadcom.swi +$(SONIC_ONE_ABOOT_IMAGE)_MACHINE = broadcom +$(SONIC_ONE_ABOOT_IMAGE)_IMAGE_TYPE = aboot +$(SONIC_ONE_ABOOT_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) $(ARISTA_PLATFORM_MODULE) +$(SONIC_ONE_ABOOT_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_ONE_ABOOT_IMAGE) diff --git a/platform/broadcom/platform-modules-arista.mk b/platform/broadcom/platform-modules-arista.mk new file mode 100644 index 000000000000..46f8709f53e9 --- /dev/null +++ b/platform/broadcom/platform-modules-arista.mk @@ -0,0 +1,10 @@ +# Arista Platform modules + +ARISTA_PLATFORM_MODULE_VERSION = 1.0 + +export ARISTA_PLATFORM_MODULE_VERSION + +ARISTA_PLATFORM_MODULE = sonic-platform-arista_$(ARISTA_PLATFORM_MODULE_VERSION)_amd64.deb +$(ARISTA_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-arista +$(ARISTA_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +SONIC_DPKG_DEBS += $(ARISTA_PLATFORM_MODULE) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index cd34b9c23bf6..e783f3cdbf9b 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -1,9 +1,11 @@ include $(PLATFORM_PATH)/sdk.mk include $(PLATFORM_PATH)/sai.mk include $(PLATFORM_PATH)/platform-modules-s6000.mk +include $(PLATFORM_PATH)/platform-modules-arista.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk include $(PLATFORM_PATH)/one-image.mk +include $(PLATFORM_PATH)/one-aboot.mk BCMCMD = bcmcmd $(BCMCMD)_URL = "https://sonicstorage.blob.core.windows.net/packages/bcmcmd?sv=2015-04-05&sr=b&sig=X3bFApmsNFmcnWM9mSGRxBugPcg%2FgJCHh5hhSuV1M2c%3D&se=2030-08-23T14%3A41%3A56Z&sp=r" @@ -13,7 +15,7 @@ $(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/dsserve?sv SONIC_ONLINE_FILES += $(BCMCMD) $(DSSERVE) -SONIC_ALL += $(SONIC_ONE_IMAGE) +SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT_IMAGE) # Inject brcm sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista new file mode 160000 index 000000000000..5a1871d8070b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-arista @@ -0,0 +1 @@ +Subproject commit 5a1871d8070b1fea0fbc30fcf91ff984ac6ec295 diff --git a/platform/generic/aboot-image.mk b/platform/generic/aboot-image.mk index 0f332eb75402..64b841f856ea 100644 --- a/platform/generic/aboot-image.mk +++ b/platform/generic/aboot-image.mk @@ -1,7 +1,7 @@ # sonic aboot installer -SONIC_GENERIC_ABOOT_IMAGE = sonic-aboot.bin -$(SONIC_GENERIC_ABOOT_IMAGE)_MACHINE = aboot +SONIC_GENERIC_ABOOT_IMAGE = sonic-aboot-generic.swi +$(SONIC_GENERIC_ABOOT_IMAGE)_MACHINE = generic $(SONIC_GENERIC_ABOOT_IMAGE)_IMAGE_TYPE = aboot $(SONIC_GENERIC_ABOOT_IMAGE)_DEPENDS = $(SONIC_GENERIC_ABOOT_IMAGE)_DOCKERS = From 0bbde7b91a0975bfbb4c413bd26c63ce6cf9f8ee Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 5 Feb 2017 22:11:52 -0800 Subject: [PATCH 0252/1011] [aboot]: extract dockerfs in initramfs stage when the root fs is vfat (#266) vfat does not support symbol links used in aufs --- files/Aboot/boot0.j2 | 18 +++++++++++++----- files/initramfs-tools/arista-convertfs | 5 ++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 6836f780ac44..edd052450ed2 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -53,11 +53,19 @@ extract_image() { ## Remove installer swi as it has lots of redundunt contents rm -f $swipath - ## Further extract docker archive - tar xf "$target_path/{{ FILESYSTEM_DOCKERFS }}" -C "$target_path" - - ## clean up docker archive - rm -f "$target_path/{{ FILESYSTEM_DOCKERFS }}" + ## detect rootfs type + rootfs_type=`grep /mnt/flash /proc/mounts | cut -d' ' -f3` + + ## vfat does not support symbol link + if [ $rootfs_type != "vfat" ]; then + ## Further extract docker archive + tar xf "$target_path/{{ FILESYSTEM_DOCKERFS }}" -C "$target_path" + + ## clean up docker archive + rm -f "$target_path/{{ FILESYSTEM_DOCKERFS }}" + else + echo "/mnt/flash is $rootfs_type, extract {{ FILESYSTEM_DOCKERFS }} in later stage" + fi ## replace with boot swi mv "$target_path/{{ ABOOT_BOOT_IMAGE }}" "$swipath" diff --git a/files/initramfs-tools/arista-convertfs b/files/initramfs-tools/arista-convertfs index 1aab6fa7d765..676cbab4cc8b 100644 --- a/files/initramfs-tools/arista-convertfs +++ b/files/initramfs-tools/arista-convertfs @@ -164,7 +164,10 @@ err_msg="Error: mounting $root_dev to $root_mnt failed" cmd="mount -t ext4 $root_dev $root_mnt" run_cmd "$cmd" "$err_msg" +err_msg="Error: extract docker directory" +cmd="[ -f $tmp_mnt/dockerfs.tar.gz ] && rm -rf $tmp_mnt/var && tar xzf $tmp_mnt/dockerfs.tar.gz -C $root_mnt && rm -f $tmp_mnt/dockerfs.tar.gz" +run_cmd "$cmd" "$err_msg" + err_msg="Error: copying files form $tmp_mnt to $root_mnt failed" cmd="cp -a $tmp_mnt/. $root_mnt/" run_cmd "$cmd" "$err_msg" - From 235867849708fb6bd22c54523286d613a2319846 Mon Sep 17 00:00:00 2001 From: Nadiya Date: Mon, 6 Feb 2017 08:17:25 +0200 Subject: [PATCH 0253/1011] Add operational script, accton_as7512_util.py, for device initializatian and peripheral accessing (#265) Signed-off-by: Nadiya.Stetskovych --- platform/cavium/cavm_platform_modules/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platform/cavium/cavm_platform_modules/Makefile b/platform/cavium/cavm_platform_modules/Makefile index 5d2624acbebb..515c1571abde 100644 --- a/platform/cavium/cavm_platform_modules/Makefile +++ b/platform/cavium/cavm_platform_modules/Makefile @@ -4,6 +4,7 @@ SHELL = /bin/bash MAIN_TARGET = cavm_platform_modules.deb DEB_BUILD_DIR = cavm-platform-modules-deb +SCRIPT_SRC = $(DEB_BUILD_DIR)/ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # get sources @@ -16,8 +17,10 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : KERNEL_SRC=/lib/modules/$(KVERSION)/build make popd mkdir -p $(DEB_BUILD_DIR)/lib/modules/$(KVERSION) + mkdir -p $(DEB_BUILD_DIR)/usr/bin cp SONiC/AS7512-32X/module/*.ko $(DEB_BUILD_DIR)/lib/modules/$(KVERSION) + cp SONiC/AS7512-32X/accton_as7512_util.py $(DEB_BUILD_DIR)/usr/bin cp -r DEBIAN $(DEB_BUILD_DIR) dpkg-deb -b $(DEB_BUILD_DIR) $(MAIN_TARGET) From 8826beb5978537d0a2352fc8aaadedf4dfc9fb5f Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 6 Feb 2017 08:17:16 -0800 Subject: [PATCH 0254/1011] [docker]: change hardcoded value to DOCKERFS_DIR for docker directory on the disk (#269) --- build_debian.sh | 2 +- files/Aboot/boot0.j2 | 8 +++++--- .../{arista-convertfs => arista-convertfs.j2} | 2 +- files/initramfs-tools/{union-mount => union-mount.j2} | 2 +- installer/x86_64/install.sh | 2 +- onie-image.conf | 3 +++ slave.mk | 5 ++++- 7 files changed, 16 insertions(+), 8 deletions(-) rename files/initramfs-tools/{arista-convertfs => arista-convertfs.j2} (94%) rename files/initramfs-tools/{union-mount => union-mount.j2} (88%) diff --git a/build_debian.sh b/build_debian.sh index e113e6925107..76cd4467ce10 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -267,7 +267,7 @@ sudo du -hs $FILESYSTEM_ROOT sudo mksquashfs $FILESYSTEM_ROOT $FILESYSTEM_SQUASHFS -e boot -e var/lib/docker ## Compress docker files -pushd $FILESYSTEM_ROOT && sudo tar czf $OLDPWD/$FILESYSTEM_DOCKERFS var/lib/docker; popd +pushd $FILESYSTEM_ROOT && sudo tar czf $OLDPWD/$FILESYSTEM_DOCKERFS -C var/lib/docker .; popd ## Compress together with /boot and /var/lib/docker as an installer payload zip file pushd $FILESYSTEM_ROOT && sudo zip $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/; popd diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index edd052450ed2..8ec50ef7f9e3 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -45,7 +45,7 @@ extract_image() { rm -rf "$target_path/rw" ## Clean docker directory - rm -rf "$target_path/var" + rm -rf "$target_path/{{ DOCKERFS_DIR }}" ## Unzip the image unzip -oq "$swipath" -x boot0 -d "$target_path" @@ -58,8 +58,10 @@ extract_image() { ## vfat does not support symbol link if [ $rootfs_type != "vfat" ]; then - ## Further extract docker archive - tar xf "$target_path/{{ FILESYSTEM_DOCKERFS }}" -C "$target_path" + mkdir -p "$target_path/{{ DOCKERFS_DIR }}" + + ## extract docker archive + tar xf "$target_path/{{ FILESYSTEM_DOCKERFS }}" -C "$target_path/{{ DOCKERFS_DIR }}" ## clean up docker archive rm -f "$target_path/{{ FILESYSTEM_DOCKERFS }}" diff --git a/files/initramfs-tools/arista-convertfs b/files/initramfs-tools/arista-convertfs.j2 similarity index 94% rename from files/initramfs-tools/arista-convertfs rename to files/initramfs-tools/arista-convertfs.j2 index 676cbab4cc8b..8847bc69bdfa 100644 --- a/files/initramfs-tools/arista-convertfs +++ b/files/initramfs-tools/arista-convertfs.j2 @@ -165,7 +165,7 @@ cmd="mount -t ext4 $root_dev $root_mnt" run_cmd "$cmd" "$err_msg" err_msg="Error: extract docker directory" -cmd="[ -f $tmp_mnt/dockerfs.tar.gz ] && rm -rf $tmp_mnt/var && tar xzf $tmp_mnt/dockerfs.tar.gz -C $root_mnt && rm -f $tmp_mnt/dockerfs.tar.gz" +cmd="[ -f $tmp_mnt/{{ FILESYSTEM_DOCKERFS }} ] && rm -rf $root_mnt/{{ DOCKERFS_DIR }} && mkdir $root_mnt/{{ DOCKERFS_DIR }} && tar xzf $tmp_mnt/{{ FILESYSTEM_DOCKERFS }} -C $root_mnt/{{ DOCKERFS_DIR }} && rm -f $tmp_mnt/{{ FILESYSTEM_DOCKERFS }}" run_cmd "$cmd" "$err_msg" err_msg="Error: copying files form $tmp_mnt to $root_mnt failed" diff --git a/files/initramfs-tools/union-mount b/files/initramfs-tools/union-mount.j2 similarity index 88% rename from files/initramfs-tools/union-mount rename to files/initramfs-tools/union-mount.j2 index b343d56c6e22..531436c39a2f 100644 --- a/files/initramfs-tools/union-mount +++ b/files/initramfs-tools/union-mount.j2 @@ -12,7 +12,7 @@ mount -n -o dirs=${rootmnt}/host/rw:${rootmnt}=ro -t aufs root-aufs ${rootmnt} mount ${ROOT} ${rootmnt}/host ## Mount the working directory of docker engine in the raw partition, bypass the aufs mkdir -p ${rootmnt}/var/lib/docker -mount --bind ${rootmnt}/host/var/lib/docker ${rootmnt}/var/lib/docker +mount --bind ${rootmnt}/host/{{ DOCKERFS_DIR }} ${rootmnt}/var/lib/docker ## Mount the boot directory in the raw partition, bypass the aufs mkdir -p ${rootmnt}/boot mount --bind ${rootmnt}/host/boot ${rootmnt}/boot diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index b8177462a55c..2ff663c188eb 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -398,7 +398,7 @@ ${onie_bin} mount -t ext4 -o defaults,rw $demo_dev $demo_mnt || { unzip $ONIE_INSTALLER_PAYLOAD -d $demo_mnt if [ -f $demo_mnt/$FILESYSTEM_DOCKERFS ]; then - cd $demo_mnt && tar xf $FILESYSTEM_DOCKERFS; cd $OLDPWD + cd $demo_mnt && mkdir -p $DOCKERFS_DIR && tar xf $FILESYSTEM_DOCKERFS -C $DOCKERFS_DIR; cd $OLDPWD fi # Store machine description in target file system diff --git a/onie-image.conf b/onie-image.conf index 70228bbf2498..f12e23f7414b 100644 --- a/onie-image.conf +++ b/onie-image.conf @@ -21,6 +21,9 @@ ONIE_INSTALLER_PAYLOAD=fs.zip ## Filename for docker file system FILESYSTEM_DOCKERFS=dockerfs.tar.gz +## docker directory on the root filesystem +DOCKERFS_DIR=docker + ## Output file name for onie installer OUTPUT_ONIE_IMAGE=target/sonic-$TARGET_MACHINE.bin diff --git a/slave.mk b/slave.mk index 485f8ff9206c..68ed227cdc6a 100644 --- a/slave.mk +++ b/slave.mk @@ -285,7 +285,7 @@ $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TA ############################################################################### # targets for building installers with base image -$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER)) $(addprefix $(DEBS_PATH)/,$(SONIC_CONFIG_ENGINE)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) +$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER)) $(addprefix $(DEBS_PATH)/,$(SONIC_CONFIG_ENGINE)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $(HEADER) ## Pass initramfs and linux kernel explicitly. They are used for all platforms export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" @@ -310,6 +310,9 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export installer_start_scrips="$(foreach docker, $($*_DOCKERS),$(addsuffix .sh, $($(docker)_CONTAINER_NAME)))" export installer_services="$(foreach docker, $($*_DOCKERS),$(addsuffix .service, $($(docker)_CONTAINER_NAME)))" + j2 -f env files/initramfs-tools/union-mount.j2 onie-image.conf > files/initramfs-tools/union-mount + j2 -f env files/initramfs-tools/arista-convertfs.j2 onie-image.conf > files/initramfs-tools/arista-convertfs + $(if $($*_DOCKERS), j2 files/build_templates/sonic_debian_extension.j2 > sonic_debian_extension.sh chmod +x sonic_debian_extension.sh, From 12fa107645bd2f357ab5a3c60c273a7f394976d7 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 6 Feb 2017 08:40:57 -0800 Subject: [PATCH 0255/1011] Revert "Revert "Conform with new Docker build method"" (#264) --- dockers/docker-dhcp-relay/Dockerfile | 25 ----------------- dockers/docker-dhcp-relay/Dockerfile.j2 | 37 +++++++++++++++++++++++++ rules/docker-dhcp-relay.mk | 10 +++++-- 3 files changed, 45 insertions(+), 27 deletions(-) delete mode 100644 dockers/docker-dhcp-relay/Dockerfile create mode 100644 dockers/docker-dhcp-relay/Dockerfile.j2 diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile deleted file mode 100644 index f664d89a4a2e..000000000000 --- a/dockers/docker-dhcp-relay/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM docker-base - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -# Update APT package lists -RUN apt-get update - -# Dependencies for sonic-cfggen -RUN apt-get -y install python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml - -## Install isc-dhcp-relay and clean up afterward -RUN apt-get -y install isc-dhcp-relay \ - && apt-get clean -y \ - && apt-get autoclean -y \ - && apt-get autoremove -y - -COPY ["isc-dhcp-relay.j2", "/usr/share/dhcp-relay/"] -COPY ["config.sh", "/usr/bin/"] - -ENTRYPOINT /usr/bin/config.sh \ - && service rsyslog start \ - && service isc-dhcp-relay start \ - && /bin/bash - diff --git a/dockers/docker-dhcp-relay/Dockerfile.j2 b/dockers/docker-dhcp-relay/Dockerfile.j2 new file mode 100644 index 000000000000..85ea74a4b164 --- /dev/null +++ b/dockers/docker-dhcp-relay/Dockerfile.j2 @@ -0,0 +1,37 @@ +FROM docker-base + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +## Update APT package lists +RUN apt-get update + +## Dependencies for sonic-cfggen +RUN apt-get -y install python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml + + +COPY \ +{% for deb in docker_dhcp_relay_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -i \ +{% for deb in docker_dhcp_relay_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +## Install isc-dhcp-relay Debian package +RUN apt-get -y install isc-dhcp-relay + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +COPY ["isc-dhcp-relay.j2", "/usr/share/dhcp-relay/"] +COPY ["config.sh", "/usr/bin/"] + +ENTRYPOINT /usr/bin/config.sh \ + && service rsyslog start \ + && service isc-dhcp-relay start \ + && /bin/bash diff --git a/rules/docker-dhcp-relay.mk b/rules/docker-dhcp-relay.mk index 1c68e8468a30..c0d88e595fd8 100644 --- a/rules/docker-dhcp-relay.mk +++ b/rules/docker-dhcp-relay.mk @@ -1,7 +1,13 @@ -# docker dhcp relay image +# Docker image for DHCP relay DOCKER_DHCP_RELAY = docker-dhcp-relay.gz $(DOCKER_DHCP_RELAY)_PATH = $(DOCKERS_PATH)/docker-dhcp-relay +$(DOCKER_DHCP_RELAY)_DEPENDS += $(SONIC_CONFIG_ENGINE) $(DOCKER_DHCP_RELAY)_LOAD_DOCKERS = $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) -SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) + +$(DOCKER_DHCP_RELAY)_CONTAINER_NAME = dhcp_relay +$(DOCKER_DHCP_RELAY)_RUN_OPT += --net=host --privileged -t +$(DOCKER_DHCP_RELAY)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro From 8b5d05eeef15fbfdc90a6626c78c8b7da31fe365 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 6 Feb 2017 21:11:18 -0800 Subject: [PATCH 0256/1011] [sonic-slave]: upgrade docker engine in sonic-slave to 1.13.0 (#272) --- sonic-slave/Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 41c65e3465b2..0398581dcd47 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -89,8 +89,9 @@ RUN pip install j2cli RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /usr/share/depot_tools ENV PATH /usr/share/depot_tools:$PATH -# Install docker engine 1.11.2 inside docker -RUN curl -sSL https://get.docker.com/ | sh && apt-get install -y --force-yes -q docker-engine=1.11.2-0~jessie +# Install docker engine 1.13.0 inside docker and enable experimental feature +RUN curl -sSL https://get.docker.com/ | sh && apt-get install -y --force-yes -q docker-engine=1.13.0-0~debian-jessie +RUN echo "DOCKER_OPTS=\"--experimental\"" >> /etc/default/docker # Add user ARG user From 8901112bf6631a58504a7ee504170fe9a5ce5179 Mon Sep 17 00:00:00 2001 From: Guohan Lu Date: Tue, 7 Feb 2017 05:25:23 +0000 Subject: [PATCH 0257/1011] [git]: add more Dockerfile in .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 1e87c52e6f71..268e1f6c7d28 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,6 @@ dockers/docker-orchagent/Dockerfile dockers/docker-snmp-sv2/Dockerfile dockers/docker-team/Dockerfile dockers/docker-platform-monitor/Dockerfile +dockers/docker-dhcp-relay/Dockerfile +dockers/docker-teamd/Dockerfile +platform/broadcom/docker-syncd-brcm/Dockerfile From 522585aadf89d2f712eace7cf68f1f59f65ff475 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 7 Feb 2017 00:28:30 -0800 Subject: [PATCH 0258/1011] [docker-fpm]: T0 devices receive routes containing one occurrence of their own ASN (#271) --- dockers/docker-fpm/bgpd.conf.j2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dockers/docker-fpm/bgpd.conf.j2 b/dockers/docker-fpm/bgpd.conf.j2 index 25839864fbb7..0e03561f82fe 100644 --- a/dockers/docker-fpm/bgpd.conf.j2 +++ b/dockers/docker-fpm/bgpd.conf.j2 @@ -46,6 +46,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 minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} + neighbor {{ bgp_session['addr'] }} allowas-in 1 +{% endif %} {% if bgp_session['addr'] | ipv6 %} address-family ipv6 neighbor {{ bgp_session['addr'] }} activate From 53a9792014d4780e7f988bca23e0ac536fdaea00 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Tue, 7 Feb 2017 10:33:20 +0200 Subject: [PATCH 0259/1011] [Makefile]: Add possibility for docker containers to install files to base image (#240) - Add vtysh/lldpctl/sensors to baseimage --- dockers/docker-fpm/base_image_files/vtysh | 2 ++ dockers/docker-lldp-sv2/base_image_files/lldpctl | 2 ++ dockers/docker-platform-monitor/base_image_files/sensors | 2 ++ files/build_templates/sonic_debian_extension.j2 | 8 ++++++++ rules/docker-fpm.mk | 2 ++ rules/docker-lldp-sv2.mk | 2 ++ rules/docker-platform-monitor.mk | 2 ++ slave.mk | 1 + 8 files changed, 21 insertions(+) create mode 100755 dockers/docker-fpm/base_image_files/vtysh create mode 100755 dockers/docker-lldp-sv2/base_image_files/lldpctl create mode 100755 dockers/docker-platform-monitor/base_image_files/sensors diff --git a/dockers/docker-fpm/base_image_files/vtysh b/dockers/docker-fpm/base_image_files/vtysh new file mode 100755 index 000000000000..359101c06c61 --- /dev/null +++ b/dockers/docker-fpm/base_image_files/vtysh @@ -0,0 +1,2 @@ +#!/bin/bash +docker exec -i bgp vtysh "$@" diff --git a/dockers/docker-lldp-sv2/base_image_files/lldpctl b/dockers/docker-lldp-sv2/base_image_files/lldpctl new file mode 100755 index 000000000000..c55e5ce8e2fb --- /dev/null +++ b/dockers/docker-lldp-sv2/base_image_files/lldpctl @@ -0,0 +1,2 @@ +#!/bin/bash +docker exec -it lldp lldpctl "$@" diff --git a/dockers/docker-platform-monitor/base_image_files/sensors b/dockers/docker-platform-monitor/base_image_files/sensors new file mode 100755 index 000000000000..af1e57941861 --- /dev/null +++ b/dockers/docker-platform-monitor/base_image_files/sensors @@ -0,0 +1,2 @@ +#!/bin/bash +docker exec -i pmon sensors "$@" diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 4cebcb2227e9..be7f338dae81 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -117,3 +117,11 @@ sudo LANG=C chroot $FILESYSTEM_ROOT fuser -km /sys || true sudo LANG=C chroot $FILESYSTEM_ROOT umount -lf /sys {% endif %} +{% for file in installer_extra_files.split(' ') -%} +{% if file.strip() -%} +{% set src = file.split(':')[0] -%} +{% set dst = file.split(':')[1] -%} +sudo cp {{src}} $FILESYSTEM_ROOT/{{dst}} +{% endif -%} +{% endfor -%} + diff --git a/rules/docker-fpm.mk b/rules/docker-fpm.mk index 090c2b61cc1f..4c9c09ffd45e 100644 --- a/rules/docker-fpm.mk +++ b/rules/docker-fpm.mk @@ -11,3 +11,5 @@ $(DOCKER_FPM)_CONTAINER_NAME = bgp $(DOCKER_FPM)_RUN_OPT += --net=host --privileged -t $(DOCKER_FPM)_RUN_OPT += --volumes-from database $(DOCKER_FPM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +$(DOCKER_FPM)_BASE_IMAGE_FILES += vtysh:/usr/bin/vtysh diff --git a/rules/docker-lldp-sv2.mk b/rules/docker-lldp-sv2.mk index 7041a24f81db..e9f701a49580 100644 --- a/rules/docker-lldp-sv2.mk +++ b/rules/docker-lldp-sv2.mk @@ -11,3 +11,5 @@ SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_LLDP_SV2) $(DOCKER_LLDP_SV2)_CONTAINER_NAME = lldp $(DOCKER_LLDP_SV2)_RUN_OPT += --net=host --privileged -t $(DOCKER_LLDP_SV2)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +$(DOCKER_LLDP_SV2)_BASE_IMAGE_FILES += lldpctl:/usr/bin/lldpctl diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index 223e87bfac78..92b64bf15b40 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -11,3 +11,5 @@ SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) $(DOCKER_PLATFORM_MONITOR)_CONTAINER_NAME = pmon $(DOCKER_PLATFORM_MONITOR)_RUN_OPT += --net=host --privileged -t $(DOCKER_PLATFORM_MONITOR)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +$(DOCKER_PLATFORM_MONITOR)_BASE_IMAGE_FILES += sensors:/usr/bin/sensors diff --git a/slave.mk b/slave.mk index 68ed227cdc6a..e34d932c1af1 100644 --- a/slave.mk +++ b/slave.mk @@ -309,6 +309,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export installer_start_scrips="$(foreach docker, $($*_DOCKERS),$(addsuffix .sh, $($(docker)_CONTAINER_NAME)))" export installer_services="$(foreach docker, $($*_DOCKERS),$(addsuffix .service, $($(docker)_CONTAINER_NAME)))" + export installer_extra_files="$(foreach docker, $($*_DOCKERS), $(foreach file, $($(docker)_BASE_IMAGE_FILES), $($(docker)_PATH)/base_image_files/$(file)))" j2 -f env files/initramfs-tools/union-mount.j2 onie-image.conf > files/initramfs-tools/union-mount j2 -f env files/initramfs-tools/arista-convertfs.j2 onie-image.conf > files/initramfs-tools/arista-convertfs From a412fe16c4f03f1a33858756815195c8089e130b Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 7 Feb 2017 08:36:19 -0800 Subject: [PATCH 0260/1011] [dockers]: use docker --squash to build dockers (#273) --- slave.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slave.mk b/slave.mk index e34d932c1af1..a13178bb58e3 100644 --- a/slave.mk +++ b/slave.mk @@ -254,7 +254,7 @@ docker-start : # targets for building simple docker images that do not depend on any debian packages $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) $(HEADER) - docker build --no-cache -t $* $($*.gz_PATH) $(LOG) + docker build --squash --no-cache -t $* $($*.gz_PATH) $(LOG) docker save $* | gzip -c > $@ $(FOOTER) @@ -268,7 +268,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .pl # Export variables for j2. Use path for unique variable names, e.g. docker_orchagent_debs $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_debs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DEPENDS),RDEPENDS))\n" | awk '!a[$$0]++')) j2 $($*.gz_PATH)/Dockerfile.j2 > $($*.gz_PATH)/Dockerfile - docker build --no-cache -t $* $($*.gz_PATH) $(LOG) + docker build --squash --no-cache -t $* $($*.gz_PATH) $(LOG) docker save $* | gzip -c > $@ $(FOOTER) From b6753e7960530213623a296d0216695834ab4166 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 7 Feb 2017 18:11:19 -0800 Subject: [PATCH 0261/1011] [docker-config-engine]: introduce docker sonic config engine (#274) * [docker-config-engine]: introduce docker sonic config engine sonic config engine provide the sonic configure engine for all sonic dockers that rely on the engine to generate runtime configuration. --- .gitignore | 3 +- dockers/docker-config-engine/Dockerfile.j2 | 21 ++++++++++++ .../{Dockerfile.j2 => Dockerfile} | 17 +--------- dockers/docker-fpm/Dockerfile.j2 | 5 +-- dockers/docker-lldp-sv2/Dockerfile.j2 | 5 +-- dockers/docker-orchagent/Dockerfile.j2 | 5 +-- dockers/docker-platform-monitor/Dockerfile | 18 ++++++++++ dockers/docker-platform-monitor/Dockerfile.j2 | 33 ------------------- dockers/docker-snmp-sv2/Dockerfile.j2 | 5 +-- dockers/docker-teamd/Dockerfile.j2 | 6 +--- platform/broadcom/docker-orchagent-brcm.mk | 4 +-- platform/cavium/docker-orchagent-cavm.mk | 4 +-- platform/mellanox/docker-orchagent-mlnx.mk | 4 +-- rules/docker-config-engine.mk | 7 ++++ rules/docker-dhcp-relay.mk | 5 ++- rules/docker-fpm.mk | 4 +-- rules/docker-lldp-sv2.mk | 4 +-- rules/docker-platform-monitor.mk | 5 ++- rules/docker-snmp-sv2.mk | 4 +-- rules/docker-teamd.mk | 4 +-- 20 files changed, 71 insertions(+), 92 deletions(-) create mode 100644 dockers/docker-config-engine/Dockerfile.j2 rename dockers/docker-dhcp-relay/{Dockerfile.j2 => Dockerfile} (59%) create mode 100755 dockers/docker-platform-monitor/Dockerfile delete mode 100755 dockers/docker-platform-monitor/Dockerfile.j2 create mode 100644 rules/docker-config-engine.mk diff --git a/.gitignore b/.gitignore index 268e1f6c7d28..e9c5da1caacf 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,6 @@ dockers/docker-lldp-sv2/Dockerfile dockers/docker-orchagent/Dockerfile dockers/docker-snmp-sv2/Dockerfile dockers/docker-team/Dockerfile -dockers/docker-platform-monitor/Dockerfile -dockers/docker-dhcp-relay/Dockerfile dockers/docker-teamd/Dockerfile +dockers/docker-config-engine/Dockerfile platform/broadcom/docker-syncd-brcm/Dockerfile diff --git a/dockers/docker-config-engine/Dockerfile.j2 b/dockers/docker-config-engine/Dockerfile.j2 new file mode 100644 index 000000000000..56ed38f10f90 --- /dev/null +++ b/dockers/docker-config-engine/Dockerfile.j2 @@ -0,0 +1,21 @@ +FROM docker-base + +RUN apt-get update + +# Dependencies for sonic-cfggen +RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml + +COPY \ +{% for deb in docker_config_engine_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -i \ +{% for deb in docker_config_engine_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs diff --git a/dockers/docker-dhcp-relay/Dockerfile.j2 b/dockers/docker-dhcp-relay/Dockerfile similarity index 59% rename from dockers/docker-dhcp-relay/Dockerfile.j2 rename to dockers/docker-dhcp-relay/Dockerfile index 85ea74a4b164..af7bdcb830c1 100644 --- a/dockers/docker-dhcp-relay/Dockerfile.j2 +++ b/dockers/docker-dhcp-relay/Dockerfile @@ -1,4 +1,4 @@ -FROM docker-base +FROM docker-config-engine ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -6,21 +6,6 @@ ENV DEBIAN_FRONTEND=noninteractive ## Update APT package lists RUN apt-get update -## Dependencies for sonic-cfggen -RUN apt-get -y install python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml - - -COPY \ -{% for deb in docker_dhcp_relay_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ - -RUN dpkg -i \ -{% for deb in docker_dhcp_relay_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor %} - ## Install isc-dhcp-relay Debian package RUN apt-get -y install isc-dhcp-relay diff --git a/dockers/docker-fpm/Dockerfile.j2 b/dockers/docker-fpm/Dockerfile.j2 index ea4aa226badb..5cdbff3a0646 100644 --- a/dockers/docker-fpm/Dockerfile.j2 +++ b/dockers/docker-fpm/Dockerfile.j2 @@ -1,12 +1,9 @@ -FROM docker-base +FROM docker-config-engine RUN apt-get update RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4 -# Dependencies for sonic-cfggen -RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml - COPY \ {% for deb in docker_fpm_debs.split(' ') -%} debs/{{ deb }}{{' '}} diff --git a/dockers/docker-lldp-sv2/Dockerfile.j2 b/dockers/docker-lldp-sv2/Dockerfile.j2 index 399d2ca6e732..32d73ecf32c5 100644 --- a/dockers/docker-lldp-sv2/Dockerfile.j2 +++ b/dockers/docker-lldp-sv2/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-base +FROM docker-config-engine COPY \ {% for deb in docker_lldp_sv2_debs.split(' ') -%} @@ -10,9 +10,6 @@ COPY python-wheels /python-wheels RUN apt-get update && apt-get install -y python-pip supervisor libbsd0 libevent-2.0-5 libjansson4 libwrap0 libxml2 libpci3 libperl5.20 -# Dependencies for sonic-cfggen -RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml - ## Pre-install the fundamental packages ## Install Python SSWSDK ## Install LLDP Sync Daemon diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index f085da93a55f..dd04379f57e0 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-base +FROM docker-config-engine RUN apt-get update @@ -8,9 +8,6 @@ RUN apt-get install -f -y ifupdown bridge-utils libdbus-1-3 libdaemon0 libjansso ## TODO: implicitly install dependencies RUN apt-get -y install libjemalloc1 -# Dependencies for sonic-cfggen -RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml - COPY \ {% for deb in docker_orchagent_debs.split(' ') -%} debs/{{ deb }}{{' '}} diff --git a/dockers/docker-platform-monitor/Dockerfile b/dockers/docker-platform-monitor/Dockerfile new file mode 100755 index 000000000000..0d5a5dcb45e9 --- /dev/null +++ b/dockers/docker-platform-monitor/Dockerfile @@ -0,0 +1,18 @@ +FROM docker-config-engine + +RUN apt-get update + +RUN apt-get install -y smartmontools sensord + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +COPY ["config.sh", "/usr/bin/"] + +ENTRYPOINT /usr/bin/config.sh \ + && service rsyslog start \ + && service lm-sensors start \ + && service smartmontools start \ + && service sensord start \ + && /bin/bash diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 deleted file mode 100755 index c6020d113ba6..000000000000 --- a/dockers/docker-platform-monitor/Dockerfile.j2 +++ /dev/null @@ -1,33 +0,0 @@ -FROM docker-base - -RUN apt-get update - -RUN apt-get install -y smartmontools sensord - -# Dependencies for sonic-cfggen -RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml - -COPY \ -{% for deb in docker_platform_monitor_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ - - -RUN dpkg -i \ -{% for deb in docker_platform_monitor_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor %} - -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs - -COPY ["config.sh", "/usr/bin/"] - -ENTRYPOINT /usr/bin/config.sh \ - && service rsyslog start \ - && service lm-sensors start \ - && service smartmontools start \ - && service sensord start \ - && /bin/bash diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index f975fbf845da..33a2bdaa74a8 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-base +FROM docker-config-engine COPY \ {% for deb in docker_snmp_sv2_debs.split(' ') -%} @@ -17,9 +17,6 @@ ENV PYTHONOPTIMIZE 1 ## Clean up RUN apt-get update && apt-get install -y libmysqlclient-dev libmysqld-dev libperl-dev libpci-dev libpci3 libsensors4 libsensors4-dev libwrap0-dev -# Dependencies for sonic-cfggen -RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml - RUN dpkg -i \ {% for deb in docker_snmp_sv2_debs.split(' ') -%} debs/{{ deb }}{{' '}} diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index e663b9d7d1f7..bff5ef11d4f5 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -1,11 +1,7 @@ -FROM docker-base +FROM docker-config-engine RUN apt-get update && apt-get install -f -y libdbus-1-3 libdaemon0 libjansson4 - -# Dependencies for sonic-cfggen -RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml - COPY \ {% for deb in docker_teamd_debs.split(' ') -%} debs/{{ deb }}{{' '}} diff --git a/platform/broadcom/docker-orchagent-brcm.mk b/platform/broadcom/docker-orchagent-brcm.mk index f04103ef15b8..2278d89cb832 100644 --- a/platform/broadcom/docker-orchagent-brcm.mk +++ b/platform/broadcom/docker-orchagent-brcm.mk @@ -2,8 +2,8 @@ DOCKER_ORCHAGENT_BRCM = docker-orchagent-brcm.gz $(DOCKER_ORCHAGENT_BRCM)_PATH = $(DOCKERS_PATH)/docker-orchagent -$(DOCKER_ORCHAGENT_BRCM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) $(SONIC_CONFIG_ENGINE) -$(DOCKER_ORCHAGENT_BRCM)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_ORCHAGENT_BRCM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) +$(DOCKER_ORCHAGENT_BRCM)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_BRCM) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_BRCM) diff --git a/platform/cavium/docker-orchagent-cavm.mk b/platform/cavium/docker-orchagent-cavm.mk index e4ea73054921..d9460d1c88db 100644 --- a/platform/cavium/docker-orchagent-cavm.mk +++ b/platform/cavium/docker-orchagent-cavm.mk @@ -2,8 +2,8 @@ DOCKER_ORCHAGENT_CAVM = docker-orchagent-cavm.gz $(DOCKER_ORCHAGENT_CAVM)_PATH = $(DOCKERS_PATH)/docker-orchagent -$(DOCKER_ORCHAGENT_CAVM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) $(SONIC_CONFIG_ENGINE) -$(DOCKER_ORCHAGENT_CAVM)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_ORCHAGENT_CAVM)_DEPENDS += $(SWSS) $(REDIS_TOOLS) +$(DOCKER_ORCHAGENT_CAVM)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_CAVM) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_CAVM) diff --git a/platform/mellanox/docker-orchagent-mlnx.mk b/platform/mellanox/docker-orchagent-mlnx.mk index 5b526cc6f35d..c193a7754185 100644 --- a/platform/mellanox/docker-orchagent-mlnx.mk +++ b/platform/mellanox/docker-orchagent-mlnx.mk @@ -2,8 +2,8 @@ DOCKER_ORCHAGENT_MLNX = docker-orchagent-mlnx.gz $(DOCKER_ORCHAGENT_MLNX)_PATH = $(DOCKERS_PATH)/docker-orchagent -$(DOCKER_ORCHAGENT_MLNX)_DEPENDS += $(SWSS) $(REDIS_TOOLS) $(SONIC_CONFIG_ENGINE) -$(DOCKER_ORCHAGENT_MLNX)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_ORCHAGENT_MLNX)_DEPENDS += $(SWSS) $(REDIS_TOOLS) +$(DOCKER_ORCHAGENT_MLNX)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_MLNX) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_MLNX) diff --git a/rules/docker-config-engine.mk b/rules/docker-config-engine.mk new file mode 100644 index 000000000000..8f168cc441ac --- /dev/null +++ b/rules/docker-config-engine.mk @@ -0,0 +1,7 @@ +# docker image for sonic config engine + +DOCKER_CONFIG_ENGINE = docker-config-engine.gz +$(DOCKER_CONFIG_ENGINE)_PATH = $(DOCKERS_PATH)/docker-config-engine +$(DOCKER_CONFIG_ENGINE)_DEPENDS += $(SONIC_CONFIG_ENGINE) +$(DOCKER_CONFIG_ENGINE)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_CONFIG_ENGINE) diff --git a/rules/docker-dhcp-relay.mk b/rules/docker-dhcp-relay.mk index c0d88e595fd8..7a7a1afeb4db 100644 --- a/rules/docker-dhcp-relay.mk +++ b/rules/docker-dhcp-relay.mk @@ -2,9 +2,8 @@ DOCKER_DHCP_RELAY = docker-dhcp-relay.gz $(DOCKER_DHCP_RELAY)_PATH = $(DOCKERS_PATH)/docker-dhcp-relay -$(DOCKER_DHCP_RELAY)_DEPENDS += $(SONIC_CONFIG_ENGINE) -$(DOCKER_DHCP_RELAY)_LOAD_DOCKERS = $(DOCKER_BASE) -SONIC_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) +$(DOCKER_DHCP_RELAY)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE) +SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) diff --git a/rules/docker-fpm.mk b/rules/docker-fpm.mk index 4c9c09ffd45e..d7f4d96005cf 100644 --- a/rules/docker-fpm.mk +++ b/rules/docker-fpm.mk @@ -2,8 +2,8 @@ DOCKER_FPM = docker-fpm.gz $(DOCKER_FPM)_PATH = $(DOCKERS_PATH)/docker-fpm -$(DOCKER_FPM)_DEPENDS += $(QUAGGA) $(SWSS) $(SONIC_CONFIG_ENGINE) -$(DOCKER_FPM)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_FPM)_DEPENDS += $(QUAGGA) $(SWSS) +$(DOCKER_FPM)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_FPM) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_FPM) diff --git a/rules/docker-lldp-sv2.mk b/rules/docker-lldp-sv2.mk index e9f701a49580..d9500d1d077a 100644 --- a/rules/docker-lldp-sv2.mk +++ b/rules/docker-lldp-sv2.mk @@ -2,9 +2,9 @@ DOCKER_LLDP_SV2 = docker-lldp-sv2.gz $(DOCKER_LLDP_SV2)_PATH = $(DOCKERS_PATH)/docker-lldp-sv2 -$(DOCKER_LLDP_SV2)_DEPENDS += $(LLDPD) $(SONIC_CONFIG_ENGINE) +$(DOCKER_LLDP_SV2)_DEPENDS += $(LLDPD) $(DOCKER_LLDP_SV2)_PYTHON_WHEELS += $(DBSYNCD_PY2) -$(DOCKER_LLDP_SV2)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_LLDP_SV2)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_LLDP_SV2) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_LLDP_SV2) diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index 92b64bf15b40..09bec7125c08 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -2,10 +2,9 @@ DOCKER_PLATFORM_MONITOR = docker-platform-monitor.gz $(DOCKER_PLATFORM_MONITOR)_PATH = $(DOCKERS_PATH)/docker-platform-monitor -$(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(SONIC_CONFIG_ENGINE) -$(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_BASE) +$(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE) -SONIC_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) +SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) $(DOCKER_PLATFORM_MONITOR)_CONTAINER_NAME = pmon diff --git a/rules/docker-snmp-sv2.mk b/rules/docker-snmp-sv2.mk index e3ed0cf1eac8..0cad7cb43407 100644 --- a/rules/docker-snmp-sv2.mk +++ b/rules/docker-snmp-sv2.mk @@ -2,9 +2,9 @@ DOCKER_SNMP_SV2 = docker-snmp-sv2.gz $(DOCKER_SNMP_SV2)_PATH = $(DOCKERS_PATH)/docker-snmp-sv2 -$(DOCKER_SNMP_SV2)_DEPENDS += $(SNMP) $(SNMPD) $(SONIC_CONFIG_ENGINE) +$(DOCKER_SNMP_SV2)_DEPENDS += $(SNMP) $(SNMPD) $(DOCKER_SNMP_SV2)_PYTHON_WHEELS += $(ASYNCSNMP_PY3) -$(DOCKER_SNMP_SV2)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_SNMP_SV2)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SNMP_SV2) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SNMP_SV2) diff --git a/rules/docker-teamd.mk b/rules/docker-teamd.mk index ec242589b290..f023c3598fa1 100644 --- a/rules/docker-teamd.mk +++ b/rules/docker-teamd.mk @@ -2,8 +2,8 @@ DOCKER_TEAMD = docker-teamd.gz $(DOCKER_TEAMD)_PATH = $(DOCKERS_PATH)/docker-teamd -$(DOCKER_TEAMD)_DEPENDS += $(SWSS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(SONIC_CONFIG_ENGINE) -$(DOCKER_TEAMD)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_TEAMD)_DEPENDS += $(SWSS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) +$(DOCKER_TEAMD)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_TEAMD) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_TEAMD) From 49042c0a9c1e025e6eb80df5a6ec679c2cfe656b Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Wed, 8 Feb 2017 14:13:44 -0800 Subject: [PATCH 0262/1011] Add more version information for newer aboot (#279) --- build_image.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build_image.sh b/build_image.sh index 03e518a5fb9c..c6349e927eb4 100755 --- a/build_image.sh +++ b/build_image.sh @@ -45,6 +45,8 @@ elif [ "$IMAGE_TYPE" = "aboot" ]; then zip -g $ABOOT_BOOT_IMAGE .imagehash rm .imagehash echo "SWI_VERSION=42.0.0" > version + echo "SWI_MAX_HWEPOCH=1" >> version + echo "SWI_VARIANT=US" >> version zip -g $OUTPUT_ABOOT_IMAGE version zip -g $ABOOT_BOOT_IMAGE version rm version From e6753fe6f052d65303c343d48d2b751a205b3feb Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 8 Feb 2017 19:02:18 -0800 Subject: [PATCH 0263/1011] [doc]: add build space recommendation --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 611ff644f06d..5e3cffec91dc 100644 --- a/README.md +++ b/README.md @@ -27,13 +27,13 @@ You also need to change all git paths to relative path as we build all submodule # Usage -**NOTE:** In order to be more familiar with build process and make some hanges to it, it is recommended to read this short [Documentation](README.buildsystem.md) - To build NOS installer image and docker images, run command line make configure PLATFORM=[ASIC_VENDOR] SKU=[HW_SKU] make + **NOTE**: We recommend to reserve 50G free space to build one platform. + Supported PLATFORM AND SKU are: - PLATFORM=broadcom SKU=Force10-S6000 - PLATFORM=mellanox SKU=ACS-MSN2700 @@ -55,7 +55,7 @@ Every target has a clean target, so in order to clean swss, execute make target/debs/swss_1.0.0_amd64.deb-clean -It is recommended to use clean targets to clean all packages, that are built together, like dev packages for instance. +It is recommended to use clean targets to clean all packages, that are built together, like dev packages for instance. In order to be more familiar with build process and make some changes to it, it is recommended to read this short [Documentation](README.buildsystem.md). # Note: If you are running make for the first time, a sonic-slave-${USER} docker image will be built automatically. From 822680d21b7b58ed5f870c3f4a405dc0230a49cb Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 8 Feb 2017 22:02:21 -0800 Subject: [PATCH 0264/1011] Build python3.6 deb packages and install them into docker-snmp-sv2 (#245) --- dockers/docker-snmp-sv2/Dockerfile.j2 | 60 +++++++++++------------- dockers/docker-snmp-sv2/supervisord.conf | 2 +- rules/docker-snmp-sv2.mk | 3 +- rules/python3.mk | 36 ++++++++++++++ src/python3.5/build.sh | 18 ------- src/python3/Makefile | 34 ++++++++++++++ 6 files changed, 100 insertions(+), 53 deletions(-) create mode 100644 rules/python3.mk delete mode 100755 src/python3.5/build.sh create mode 100644 src/python3/Makefile diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index 33a2bdaa74a8..4e440d7f5e3a 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -1,45 +1,39 @@ FROM docker-config-engine -COPY \ +COPY [ \ {% for deb in docker_snmp_sv2_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor -%} -debs/ + "debs/{{ deb }}", +{%- endfor %} \ + "/debs/"] -COPY python-wheels /python-wheels +COPY python-wheels/sswsdk-*-py3-*.whl /python-wheels/ +COPY python-wheels/asyncsnmp-*-py3-*.whl /python-wheels/ # enable -O for all Python calls ENV PYTHONOPTIMIZE 1 -## Pre-install the fundamental packages -## Install Python SSWSDK (SNMP subagent dependency) -## Install SNMP subagent -## Clean up -RUN apt-get update && apt-get install -y libmysqlclient-dev libmysqld-dev libperl-dev libpci-dev libpci3 libsensors4 libsensors4-dev libwrap0-dev - -RUN dpkg -i \ -{% for deb in docker_snmp_sv2_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor %} - -RUN rm -rf /debs - +# install supervisor +# install libsnmp30 dependencies +# install libpython3.6-dev dependencies +# install pip dependencies +# TODO: remove libpython3.6-dev, its and pip's dependencies if we can get pip3 directly # install subagent -RUN apt-get -y install build-essential wget libssl-dev openssl supervisor && \ - rm -rf /var/lib/apt/lists/* && \ - wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz && \ - tar xvf Python-3.5.2.tgz && cd Python-3.5.2 && \ - ./configure --without-doc-strings --prefix=/usr --without-pymalloc --enable-shared && \ - make && make install && \ - ldconfig && \ - cd .. && rm -rf Python-3.5.2 && rm Python-3.5.2.tgz && \ - pip3 install --no-cache-dir /python-wheels/*py3*.whl hiredis && \ +# clean up +RUN apt-get update && apt-get install -y supervisor \ + libperl5.20 libpci3 libwrap0 \ + libexpat1-dev \ + curl gcc && \ + dpkg -i \ +{% for deb in docker_snmp_sv2_debs.split(' ') -%} + debs/{{ deb }}{{' '}} +{%- endfor %} && \ + rm -rf /debs && \ + curl https://bootstrap.pypa.io/get-pip.py | python3.6 && \ + python3.6 -m pip install --no-cache-dir /python-wheels/*py3*.whl hiredis && \ rm -rf /python-wheels && \ - python3 -m sonic_ax_impl install && \ - python3 -m pip uninstall -y pip setuptools && \ - /bin/bash -c "rm -rf /usr/lib/python3.5/{unittest,lib2to3,tkinter,idlelib,email,test}" && \ - apt-get -y purge build-essential libssl-dev openssl && \ - apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ + python3.6 -m sonic_ax_impl install && \ + apt-get -y purge libpython3.6-dev libexpat1-dev curl gcc && \ + apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y --purge && \ find / | grep -E "__pycache__" | xargs rm -rf && \ rm -rf ~/.cache @@ -51,4 +45,4 @@ COPY ["config.sh", "/usr/bin/"] ## Although exposing ports is not need for host net mode, keep it for possible bridge mode EXPOSE 161/udp 162/udp -ENTRYPOINT /usr/bin/config.sh && /usr/bin/supervisord +ENTRYPOINT /usr/bin/config.sh && /usr/bin/supervisord diff --git a/dockers/docker-snmp-sv2/supervisord.conf b/dockers/docker-snmp-sv2/supervisord.conf index 50b510063d75..689cf5d91948 100644 --- a/dockers/docker-snmp-sv2/supervisord.conf +++ b/dockers/docker-snmp-sv2/supervisord.conf @@ -6,7 +6,7 @@ command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigg priority=100 [program:snmp-subagent] -command=/usr/bin/env python3 -m sonic_ax_impl +command=/usr/bin/env python3.6 -m sonic_ax_impl priority=200 [program:rsyslogd] diff --git a/rules/docker-snmp-sv2.mk b/rules/docker-snmp-sv2.mk index 0cad7cb43407..95fdcc25775c 100644 --- a/rules/docker-snmp-sv2.mk +++ b/rules/docker-snmp-sv2.mk @@ -2,7 +2,8 @@ DOCKER_SNMP_SV2 = docker-snmp-sv2.gz $(DOCKER_SNMP_SV2)_PATH = $(DOCKERS_PATH)/docker-snmp-sv2 -$(DOCKER_SNMP_SV2)_DEPENDS += $(SNMP) $(SNMPD) +## TODO: remove LIBPY3_DEV if we can get pip3 directly +$(DOCKER_SNMP_SV2)_DEPENDS += $(SNMP) $(SNMPD) $(PY3) $(LIBPY3_DEV) $(DOCKER_SNMP_SV2)_PYTHON_WHEELS += $(ASYNCSNMP_PY3) $(DOCKER_SNMP_SV2)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SNMP_SV2) diff --git a/rules/python3.mk b/rules/python3.mk new file mode 100644 index 000000000000..8fa02a26a462 --- /dev/null +++ b/rules/python3.mk @@ -0,0 +1,36 @@ +PYTHON_VER=3.6.0-1 +PYTHON_PNAME=python3.6 + +export PYTHON_VER +export PYTHON_PNAME + +LIBPY3_MIN = lib$(PYTHON_PNAME)-minimal_$(PYTHON_VER)_amd64.deb +$(LIBPY3_MIN)_SRC_PATH = $(SRC_PATH)/python3 +$(LIBPY3_MIN)_DEPENDS += +$(LIBPY3_MIN)_RDEPENDS += +SONIC_MAKE_DEBS += $(LIBPY3_MIN) + +LIBPY3_STD = lib$(PYTHON_PNAME)-stdlib_$(PYTHON_VER)_amd64.deb +$(eval $(call add_derived_package,$(LIBPY3_MIN),$(LIBPY3_STD))) +$(LIBPY3_STD)_DEPENDS += $(LIBMPDECIMAL) +$(LIBPY3_STD)_RDEPENDS += $(LIBPY3_MIN) $(LIBMPDECIMAL) + +LIBPY3 = lib$(PYTHON_PNAME)_$(PYTHON_VER)_amd64.deb +$(eval $(call add_derived_package,$(LIBPY3_MIN),$(LIBPY3))) +$(LIBPY3)_DEPENDS += $(LIBPY3_STD) +$(LIBPY3)_RDEPENDS += $(LIBPY3_MIN) $(LIBPY3_STD) + +PY3_MIN = $(PYTHON_PNAME)-minimal_$(PYTHON_VER)_amd64.deb +$(eval $(call add_derived_package,$(LIBPY3_MIN),$(PY3_MIN))) +$(PY3_MIN)_RDEPENDS += $(LIBPY3_MIN) + +PY3 = $(PYTHON_PNAME)_$(PYTHON_VER)_amd64.deb +$(eval $(call add_derived_package,$(LIBPY3_MIN),$(PY3))) +$(PY3)_DEPENDS += $(PY3_MIN) $(LIBPY3) +$(PY3)_RDEPENDS += $(PY3_MIN) $(LIBPY3) $(LIBPY3_MIN) + +LIBPY3_DEV = lib$(PYTHON_PNAME)-dev_$(PYTHON_VER)_amd64.deb +$(eval $(call add_derived_package,$(LIBPY3_MIN),$(LIBPY3_DEV))) +$(LIBPY3_DEV)_DEPENDS += $(LIBPY3) $($(LIBPY3)_DEPENDS) +$(LIBPY3_DEV)_RDEPENDS += $(LIBPY3) $($(LIBPY3)_RDEPENDS) + diff --git a/src/python3.5/build.sh b/src/python3.5/build.sh deleted file mode 100755 index ebada5397e1b..000000000000 --- a/src/python3.5/build.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -PYTHON_VER=3.5.2 -PYTHON_DEB_VER=8 - -wget -N http://http.debian.net/debian/pool/main/p/python3.5/python3.5_${PYTHON_VER}.orig.tar.xz -wget -N http://http.debian.net/debian/pool/main/p/python3.5/python3.5_${PYTHON_VER}-${PYTHON_DEB_VER}.debian.tar.xz -wget -N http://http.debian.net/debian/pool/main/p/python3.5/python3.5_${PYTHON_VER}-${PYTHON_DEB_VER}.dsc - -dpkg-source -x python3.5_${PYTHON_VER}-${PYTHON_DEB_VER}.dsc - -pushd python3.5-${PYTHON_VER} - -dpkg-buildpackage -us -uc -b - -popd - -cp *.deb ../ diff --git a/src/python3/Makefile b/src/python3/Makefile new file mode 100644 index 000000000000..63941810677b --- /dev/null +++ b/src/python3/Makefile @@ -0,0 +1,34 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +PYTHON_VER=3.6.0 +PYTHON_DEB_VER=1 +PYTHON_PNAME=python3.6 + +MAIN_TARGET = lib$(PYTHON_PNAME)-minimal_$(PYTHON_VER)-$(PYTHON_DEB_VER)_amd64.deb +DERIVED_TARGETS = lib$(PYTHON_PNAME)-stdlib_$(PYTHON_VER)-$(PYTHON_DEB_VER)_amd64.deb \ + lib$(PYTHON_PNAME)_$(PYTHON_VER)-$(PYTHON_DEB_VER)_amd64.deb \ + $(PYTHON_PNAME)-minimal_$(PYTHON_VER)-$(PYTHON_DEB_VER)_amd64.deb \ + $(PYTHON_PNAME)_$(PYTHON_VER)-$(PYTHON_DEB_VER)_amd64.deb \ + lib$(PYTHON_PNAME)-dev_$(PYTHON_VER)-$(PYTHON_DEB_VER)_amd64.deb + #$(PYTHON_PNAME)-dev_$(PYTHON_VER)-$(PYTHON_DEB_VER)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + ## Obtaining the python3 + wget 'https://sonicstorage.blob.core.windows.net/packages/$(PYTHON_PNAME)_$(PYTHON_VER).orig.tar.xz?sv=2015-04-05&sr=b&sig=d42Wh1CA9NZvlskhW4fpWcHVgc7N3IKhdFzyeO2zbRA%3D&se=2027-02-02T01%3A00%3A57Z&sp=r' -O $(PYTHON_PNAME)_$(PYTHON_VER).orig.tar.xz + wget 'https://sonicstorage.blob.core.windows.net/packages/$(PYTHON_PNAME)_$(PYTHON_VER)-$(PYTHON_DEB_VER).debian.tar.xz?sv=2015-04-05&sr=b&sig=KLX9pMJ3zpQvGBo6ZjzoZXgooMJRUUwMx8ZaTJtywK0%3D&se=2027-02-02T00%3A59%3A34Z&sp=r' -O $(PYTHON_PNAME)_$(PYTHON_VER)-$(PYTHON_DEB_VER).debian.tar.xz + wget 'https://sonicstorage.blob.core.windows.net/packages/$(PYTHON_PNAME)_$(PYTHON_VER)-$(PYTHON_DEB_VER).dsc?sv=2015-04-05&sr=b&sig=95s%2FC4vKY6bRKtkUTz%2BmHLqOllBOYbfP3zV5ayAuzSM%3D&se=2027-02-02T01%3A00%3A26Z&sp=r' -O $(PYTHON_PNAME)_$(PYTHON_VER)-$(PYTHON_DEB_VER).dsc + + ## Build + dpkg-source -x $(PYTHON_PNAME)_$(PYTHON_VER)-$(PYTHON_DEB_VER).dsc + pushd $(PYTHON_PNAME)-$(PYTHON_VER) + sudo apt-get install devscripts + mk-build-deps + sudo dpkg -i $(PYTHON_PNAME)-build-deps_$(PYTHON_VER)-$(PYTHON_DEB_VER)_amd64.deb || sudo apt-get install -f + dpkg-buildpackage -us -uc -b + popd + + cp $(DERIVED_TARGETS) $* $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) From 064dab606fe445fe1cc862d4b825984f7735249a Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 9 Feb 2017 16:24:52 +0200 Subject: [PATCH 0265/1011] [gitignore] Add .sku (#283) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e9c5da1caacf..ee80cf8d6c5c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Build system related .platform +.sku # Build artifacts fsroot/ From e5616f236d480fdc8116ec0db5ccaafc8d197c7c Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 9 Feb 2017 06:52:20 -0800 Subject: [PATCH 0266/1011] [swss]: Wait for redis server start before database clean (#281) picked this change from sonic-mgmt repo. https://github.com/Azure/sonic-mgmt/pull/110 --- files/build_templates/swss.service.j2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index b7e34335f5fe..f60ef6712dd8 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -5,6 +5,8 @@ After=database.service [Service] User={{ sonicadmin_user }} +# Wait for redis server start before database clean +ExecStartPre=/bin/bash -c "while true; do if [ \"$(/usr/bin/docker exec database redis-cli ping)\" == \"PONG\" ]; then break; fi; sleep 1; done" ExecStartPre=/usr/bin/docker exec database redis-cli -n 0 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 1 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 2 FLUSHDB From 55acd9e9e3de63f95891b0b636ced2f268d4ff50 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 9 Feb 2017 13:36:26 -0800 Subject: [PATCH 0267/1011] [python3]: add dpkg_lock in python3 build (#285) --- src/python3/Makefile | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/python3/Makefile b/src/python3/Makefile index 63941810677b..80f977ff579d 100644 --- a/src/python3/Makefile +++ b/src/python3/Makefile @@ -23,10 +23,16 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : ## Build dpkg-source -x $(PYTHON_PNAME)_$(PYTHON_VER)-$(PYTHON_DEB_VER).dsc pushd $(PYTHON_PNAME)-$(PYTHON_VER) - sudo apt-get install devscripts mk-build-deps - sudo dpkg -i $(PYTHON_PNAME)-build-deps_$(PYTHON_VER)-$(PYTHON_DEB_VER)_amd64.deb || sudo apt-get install -f - dpkg-buildpackage -us -uc -b + + # put a lock here because dpkg does not allow installing packages in parallel + while true; do + if mkdir $(DEST)/dpkg_lock &> /dev/null; then + { echo here && (sudo dpkg -i $(PYTHON_PNAME)-build-deps_$(PYTHON_VER)-$(PYTHON_DEB_VER)_amd64.deb || sudo apt-get install -f) && rm -d $(DEST)/dpkg_lock && break; } || { rm -d $(DEST)/dpkg_lock && exit 1 ; } + fi + done + + dpkg-buildpackage -rfakeroot -us -uc -b popd cp $(DERIVED_TARGETS) $* $(DEST)/ From 6119a58e4a93f8a15de48baa7132b2b8feb5eebc Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 10 Feb 2017 07:39:05 -0800 Subject: [PATCH 0268/1011] [build_debian]: install deps in rootfs instead of just extracting the packages (#280) packages contains post-install that needs to be performed --- .gitmodules | 4 ++-- build_debian.sh | 5 +---- files/build_templates/sonic_debian_extension.j2 | 15 +++++++++++++++ platform/broadcom/docker-syncd-brcm.mk | 1 + platform/broadcom/sonic-platform-modules-arista | 2 +- slave.mk | 1 + 6 files changed, 21 insertions(+), 7 deletions(-) diff --git a/.gitmodules b/.gitmodules index 35e7290b8000..472c4bc60186 100644 --- a/.gitmodules +++ b/.gitmodules @@ -50,6 +50,6 @@ [submodule "platform/broadcom/sonic-platform-modules-s6000"] path = platform/broadcom/sonic-platform-modules-s6000 url = https://github.com/Azure/sonic-platform-modules-s6000 -[submodule "sonic-platform-modules-arista"] +[submodule "platform/broadcom/sonic-platform-modules-arista"] path = platform/broadcom/sonic-platform-modules-arista - url = https://github.com/lguohan/sonic-1 + url = https://github.com/aristanetworks/sonic diff --git a/build_debian.sh b/build_debian.sh index 76cd4467ce10..46d23355dd63 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -58,7 +58,7 @@ DEFAULT_USERINFO="Default admin user,,," ## Prepare the file system directory if [[ -d $FILESYSTEM_ROOT ]]; then - sudo rm -r $FILESYSTEM_ROOT || die "Failed to clean chroot directory" + sudo rm -rf $FILESYSTEM_ROOT || die "Failed to clean chroot directory" fi mkdir -p $FILESYSTEM_ROOT @@ -272,6 +272,3 @@ pushd $FILESYSTEM_ROOT && sudo tar czf $OLDPWD/$FILESYSTEM_DOCKERFS -C var/lib/d ## Compress together with /boot and /var/lib/docker as an installer payload zip file pushd $FILESYSTEM_ROOT && sudo zip $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/; popd sudo zip -g $ONIE_INSTALLER_PAYLOAD $FILESYSTEM_SQUASHFS $FILESYSTEM_DOCKERFS - -## Remove fsroot -sudo rm -rf $FILESYSTEM_ROOT diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index be7f338dae81..edb941c01904 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -95,9 +95,24 @@ sudo mv sonic_version.yml $FILESYSTEM_ROOT/etc/sonic/ # Copy sudoers configuration file sudo cp $IMAGE_CONFIGS/sudoers/sudoers $FILESYSTEM_ROOT/etc/ +## Install package without starting service +## ref: https://wiki.debian.org/chroot +sudo tee -a $FILESYSTEM_ROOT/usr/sbin/policy-rc.d > /dev/null < Date: Fri, 10 Feb 2017 10:36:39 -0800 Subject: [PATCH 0269/1011] Update submodule sonic-snmpagent (#287) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 5c30a369a94b..a3391a9c709a 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 5c30a369a94b9312a8858c3bc9a3db083d835900 +Subproject commit a3391a9c709a1160dd7d261ac1da2013127c3d45 From 815bf53de71df10f97ebd0ba8d72c9b5db44523f Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 10 Feb 2017 10:40:09 -0800 Subject: [PATCH 0270/1011] snmpd disables inetCidrRouteTable module (#286) --- dockers/docker-snmp-sv2/supervisord.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-snmp-sv2/supervisord.conf b/dockers/docker-snmp-sv2/supervisord.conf index 689cf5d91948..eed4bf83cb0e 100644 --- a/dockers/docker-snmp-sv2/supervisord.conf +++ b/dockers/docker-snmp-sv2/supervisord.conf @@ -2,7 +2,7 @@ nodaemon=true [program:snmpd] -command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable -p /run/snmpd.pid +command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable,inetCidrRouteTable -p /run/snmpd.pid priority=100 [program:snmp-subagent] From ec584a2cc02caa1fc11ae832f215345c2c656429 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 13 Feb 2017 01:05:12 +0200 Subject: [PATCH 0271/1011] [sonic-utilities]: integrate into base image (#282) Signed-off-by: marian-pritsak --- files/build_templates/sonic_debian_extension.j2 | 13 +++++++++++++ slave.mk | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index edb941c01904..d0d4fc7849a4 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -44,6 +44,19 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in sudo dpkg --root=$FILESYSTEM_ROOT -i {{config_engine}} +# Python tabulate required for sonic-utilities +python_tabulate_url=http://packages.microsoft.com/repos/sonic-dev/pool/main/p/python-tabulate/python-tabulate_0.7.7-1_all.deb +python_template_deb_temp=`mktemp` +trap_push "rm -f $python_template_deb_temp" +wget $python_tabulate_url -qO $python_template_deb_temp && { \ + sudo dpkg --root=$FILESYSTEM_ROOT -i $python_template_deb_temp || \ + sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f; \ +} + +# Sonic utilities +sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/sonic-utilities_*.deb || \ + sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f + # Create all needed directories sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/ sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/templates/ diff --git a/slave.mk b/slave.mk index 27698094657b..80ed530960c1 100644 --- a/slave.mk +++ b/slave.mk @@ -285,7 +285,7 @@ $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TA ############################################################################### # targets for building installers with base image -$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER)) $(addprefix $(DEBS_PATH)/,$(SONIC_CONFIG_ENGINE)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) +$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_UTILS)) $(addprefix $(DEBS_PATH)/,$(SONIC_CONFIG_ENGINE)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $(HEADER) ## Pass initramfs and linux kernel explicitly. They are used for all platforms export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" From 6a6f5a66a8d8ed4861b1a775a8f0887e407a84f4 Mon Sep 17 00:00:00 2001 From: antonpatenko Date: Mon, 13 Feb 2017 04:02:04 +0200 Subject: [PATCH 0272/1011] [docker-base]: unsubmodule docker-base. (#275) Convert docker-base from submodule into a regular directory. --- .gitmodules | 3 -- dockers/docker-base | 1 - dockers/docker-base/Dockerfile | 41 +++++++++++++++++++ dockers/docker-base/LICENSE | 14 +++++++ dockers/docker-base/dpkg_01_drop | 22 +++++++++++ dockers/docker-base/rsyslog.conf | 68 ++++++++++++++++++++++++++++++++ dockers/docker-base/sources.list | 7 ++++ 7 files changed, 152 insertions(+), 4 deletions(-) delete mode 160000 dockers/docker-base create mode 100644 dockers/docker-base/Dockerfile create mode 100644 dockers/docker-base/LICENSE create mode 100644 dockers/docker-base/dpkg_01_drop create mode 100644 dockers/docker-base/rsyslog.conf create mode 100644 dockers/docker-base/sources.list diff --git a/.gitmodules b/.gitmodules index 472c4bc60186..5b542b1499ef 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "docker-base"] - path = dockers/docker-base - url = https://github.com/Azure/sonic-docker-base.git [submodule "sonic-swss-common"] path = src/sonic-swss-common url = https://github.com/Azure/sonic-swss-common diff --git a/dockers/docker-base b/dockers/docker-base deleted file mode 160000 index 4b42689e8c5b..000000000000 --- a/dockers/docker-base +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4b42689e8c5b14deda6ef64a287e4641bd999bf5 diff --git a/dockers/docker-base/Dockerfile b/dockers/docker-base/Dockerfile new file mode 100644 index 000000000000..b5f6b7c855c5 --- /dev/null +++ b/dockers/docker-base/Dockerfile @@ -0,0 +1,41 @@ +FROM debian:jessie + +## Clean documentation in FROM image +RUN find /usr/share/doc -depth \( -type f -o -type l \) ! -name copyright | xargs rm || true +## Clean doc directories that are empty or only contain empty directories +RUN while [ -n "$(find /usr/share/doc -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done +RUN rm -rf \ + /usr/share/man/* \ + /usr/share/groff/* \ + /usr/share/info/* \ + /usr/share/lintian/* \ + /usr/share/linda/* \ + /var/cache/man/* \ + /usr/share/locale/* + +## Set the apt source +COPY sources.list /etc/apt/sources.list +COPY dpkg_01_drop /etc/dpkg/dpkg.cfg.d/01_drop +RUN apt-get clean && apt-get update + +## Pre-install the fundamental packages +RUN apt-get -y install \ + rsyslog \ + vim-tiny \ + perl \ + python + +COPY rsyslog.conf /etc/rsyslog.conf + +RUN apt-get -y purge \ + exim4 \ + exim4-base \ + exim4-config \ + exim4-daemon-light + +## Clean up apt +## Remove /var/lib/apt/lists/*, could be obsoleted for derived images +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y; \ + rm -rf /var/lib/apt/lists/*; \ + rm -rf /tmp/*; + diff --git a/dockers/docker-base/LICENSE b/dockers/docker-base/LICENSE new file mode 100644 index 000000000000..1d7131f729e9 --- /dev/null +++ b/dockers/docker-base/LICENSE @@ -0,0 +1,14 @@ +Copyright 2016 Microsoft, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + diff --git a/dockers/docker-base/dpkg_01_drop b/dockers/docker-base/dpkg_01_drop new file mode 100644 index 000000000000..e75ef3147158 --- /dev/null +++ b/dockers/docker-base/dpkg_01_drop @@ -0,0 +1,22 @@ +## Drop unnecessary files +## ref: https://wiki.ubuntu.com/ReducingDiskFootprint + +## Documentation +path-exclude /usr/share/doc/* +# we need to keep copyright files for legal reasons +path-include /usr/share/doc/*/copyright +path-exclude /usr/share/man/* +path-exclude /usr/share/groff/* +path-exclude /usr/share/info/* +# lintian stuff is small, but really unnecessary +path-exclude /usr/share/lintian/* +path-exclude /usr/share/linda/* + +## Translations +path-exclude /usr/share/locale/* + +## Landscape +path-exclude /usr/share/pyshared/twisted/test* +path-exclude /usr/lib/python*/dist-packages/twisted/test* +path-exclude /usr/share/pyshared/twisted/*/test* +path-exclude /usr/lib/python*/dist-packages/twisted/*/test* diff --git a/dockers/docker-base/rsyslog.conf b/dockers/docker-base/rsyslog.conf new file mode 100644 index 000000000000..e03df1f741c2 --- /dev/null +++ b/dockers/docker-base/rsyslog.conf @@ -0,0 +1,68 @@ +############################################################################### +# Managed by Ansible +# file: ansible/roles/acs/templates/rsyslog.conf.j2 +############################################################################### +# +# /etc/rsyslog.conf Configuration file for rsyslog. +# +# For more information see +# /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html + + +################# +#### MODULES #### +################# + +$ModLoad imuxsock # provides support for local system logging +#$ModLoad imklog # provides kernel logging support +#$ModLoad immark # provides --MARK-- message capability + +# provides UDP syslog reception +#$ModLoad imudp +#$UDPServerRun 514 + +# provides TCP syslog reception +#$ModLoad imtcp +#$InputTCPServerRun 514 + + +########################### +#### GLOBAL DIRECTIVES #### +########################### +#Set remote syslog server +*.* @127.0.0.1:514 + +# +# Use traditional timestamp format. +# To enable high precision timestamps, comment out the following line. +# +#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat + +# Define a custom template +$template ACSFileFormat,"%TIMESTAMP% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" +$ActionFileDefaultTemplate ACSFileFormat + +# +# Set the default permissions for all log files. +# +$FileOwner root +$FileGroup adm +$FileCreateMode 0640 +$DirCreateMode 0755 +$Umask 0022 + +# +# Where to place spool and state files +# +$WorkDirectory /var/spool/rsyslog + +# +# Include all config files in /etc/rsyslog.d/ +# +$IncludeConfig /etc/rsyslog.d/*.conf + + +############### +#### RULES #### +############### + diff --git a/dockers/docker-base/sources.list b/dockers/docker-base/sources.list new file mode 100644 index 000000000000..2ed195cff416 --- /dev/null +++ b/dockers/docker-base/sources.list @@ -0,0 +1,7 @@ +## Debian mirror on Microsoft Azure +## Ref: http://debian-archive.trafficmanager.net/ + +deb http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free +deb-src http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free +deb http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free +deb-src http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free From 0a6565d6a490cc28c24c6409ec7bf242618965f1 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 12 Feb 2017 21:18:09 -0800 Subject: [PATCH 0273/1011] [config]: add device type in minigraph (#290) --- files/image_config/minigraph/minigraph_ACS-MSN2700.xml | 6 ++++++ files/image_config/minigraph/minigraph_AS7512.xml | 6 ++++++ files/image_config/minigraph/minigraph_Force10-S6000.xml | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/files/image_config/minigraph/minigraph_ACS-MSN2700.xml b/files/image_config/minigraph/minigraph_ACS-MSN2700.xml index 5cfa271b19e2..0fa570c7a0a8 100644 --- a/files/image_config/minigraph/minigraph_ACS-MSN2700.xml +++ b/files/image_config/minigraph/minigraph_ACS-MSN2700.xml @@ -1037,6 +1037,12 @@ Ethernet1 + + + switch2 + ACS-MSN2700 + + ` switch2 ACS-MSN2700 diff --git a/files/image_config/minigraph/minigraph_AS7512.xml b/files/image_config/minigraph/minigraph_AS7512.xml index 5cfa271b19e2..0fbd853220b2 100644 --- a/files/image_config/minigraph/minigraph_AS7512.xml +++ b/files/image_config/minigraph/minigraph_AS7512.xml @@ -1037,6 +1037,12 @@ Ethernet1 + + + switch2 + ACS-MSN2700 + + switch2 ACS-MSN2700 diff --git a/files/image_config/minigraph/minigraph_Force10-S6000.xml b/files/image_config/minigraph/minigraph_Force10-S6000.xml index 76ede4bc8ba5..436f6880da4f 100644 --- a/files/image_config/minigraph/minigraph_Force10-S6000.xml +++ b/files/image_config/minigraph/minigraph_Force10-S6000.xml @@ -1037,6 +1037,12 @@ Ethernet1 + + + switch1 + Force10-S6000 + + switch1 Force10-S6000 From ecc9f0c6d8e16fa071c62bf51b12fe53196642e7 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 13 Feb 2017 14:17:22 -0800 Subject: [PATCH 0274/1011] Properly pull vlan subnet from minigraph when writing bgpd.conf (#293) --- dockers/docker-fpm/bgpd.conf.j2 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/dockers/docker-fpm/bgpd.conf.j2 b/dockers/docker-fpm/bgpd.conf.j2 index 0e03561f82fe..ed9afe0c3388 100644 --- a/dockers/docker-fpm/bgpd.conf.j2 +++ b/dockers/docker-fpm/bgpd.conf.j2 @@ -35,10 +35,8 @@ router bgp {{ minigraph_bgp_asn }} {% endfor %} {% endblock bgp_init %} {% block vlan_advertisement %} -{% for interface in minigraph_interfaces %} -{% if interface['name'].startswith('Vlan') %} - network {{ interface['subnet'] }} -{% endif %} +{% for vlan_interface in minigraph_vlan_interfaces %} + network {{ vlan_interface['subnet'] }} {% endfor %} {% endblock vlan_advertisement %} {% block bgp_sessions %} From 7e9f6b4e12a47ed58c688aceafdac8862514962e Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 13 Feb 2017 17:52:29 -0800 Subject: [PATCH 0275/1011] Remove /etc/default/snmpd from snmp docker (#294) --- dockers/docker-snmp-sv2/Dockerfile.j2 | 1 - dockers/docker-snmp-sv2/snmpd | 11 ----------- 2 files changed, 12 deletions(-) delete mode 100644 dockers/docker-snmp-sv2/snmpd diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index 4e440d7f5e3a..21d1573f0e10 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -39,7 +39,6 @@ RUN apt-get update && apt-get install -y supervisor \ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ["*.j2", "/etc/swss/snmp/"] -COPY ["snmpd", "/etc/default/"] COPY ["config.sh", "/usr/bin/"] ## Although exposing ports is not need for host net mode, keep it for possible bridge mode diff --git a/dockers/docker-snmp-sv2/snmpd b/dockers/docker-snmp-sv2/snmpd deleted file mode 100644 index 576c366d2ba1..000000000000 --- a/dockers/docker-snmp-sv2/snmpd +++ /dev/null @@ -1,11 +0,0 @@ -# This file controls the activity of snmpd - -# Don't load any MIBs by default. -# You might comment this lines once you have the MIBs downloaded. -export MIBS= - -# snmpd control (yes means start daemon). -SNMPDRUN=yes - -# snmpd options (use syslog, close stdin/out/err). -SNMPDOPTS='-LS4d -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable -p /run/snmpd.pid' From f5b2dccee9c2908ba22fb6ca916da300988291f4 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 14 Feb 2017 16:56:08 -0800 Subject: [PATCH 0276/1011] Allow build image with local changes for debug purpose (#247) * Allow build with local change for debug purpose Uncomment DEBUG_BUILD = y in rule.mk/config to enable local build --- Makefile | 1 + build_image.sh | 12 ++++++++---- rules/config | 4 ++++ slave.mk | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index b819d41cfb67..070c540509cf 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,7 @@ DOCKER_BUILD = docker build --no-cache \ -f slave.mk \ PLATFORM=$(PLATFORM) \ SKU=$(SKU) \ + DEBUG_BUILD=$(DEBUG_BUILD) \ $@ sonic-slave-build : diff --git a/build_image.sh b/build_image.sh index c6349e927eb4..ab2e85b4836d 100755 --- a/build_image.sh +++ b/build_image.sh @@ -13,11 +13,15 @@ } ## Retrieval short version of Git revision hash for partition metadata -[ -z "$(git status --untracked-files=no -s --ignore-submodules)" ] || { - echo "Error: There is local changes not committed to git repo. Cannot get a revision hash for partition metadata." +if [ -z "$(git status --untracked-files=no -s --ignore-submodules)" ]; then + GIT_REVISION=$(git rev-parse --short HEAD) +elif [ ! "$DEBUG_BUILD" = "y" ]; then + echo "Error: There are local changes not committed to git repo. Cannot get a revision hash for partition metadata." exit 1 -} -GIT_REVISION=$(git rev-parse --short HEAD) +else + echo "Warning: There are local changes not committed to git repo, revision hash won't be tracked. Never deploy this image for other than debugging purpose." + GIT_REVISION=$(git rev-parse --short HEAD)"_local_debug" +fi if [ "$IMAGE_TYPE" = "onie" ]; then echo "Build ONIE installer" diff --git a/rules/config b/rules/config index d76477ce5adc..142a7c0d10f7 100644 --- a/rules/config +++ b/rules/config @@ -11,6 +11,10 @@ # Uncomment next line to enable: # SONIC_CONFIG_PRINT_DEPENDENCIES = y +# DEBUG_BUILD - enable building image with uncommitted local changes. +# Uncomment next line to enable: +# DEBUG_BUILD = y + # SONIC_CONFIG_BUILD_JOBS - set number of jobs for parallel build. # Corresponding -j argument will be passed to make command inside docker # container. diff --git a/slave.mk b/slave.mk index 80ed530960c1..c2d4fe983b0b 100644 --- a/slave.mk +++ b/slave.mk @@ -321,7 +321,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform ) ./build_debian.sh "$(USERNAME)" "$(shell perl -e 'print crypt("$(PASSWORD)", "salt"),"\n"')" $(LOG) - TARGET_MACHINE=$($*_MACHINE) IMAGE_TYPE=$($*_IMAGE_TYPE) ./build_image.sh $(LOG) + TARGET_MACHINE=$($*_MACHINE) IMAGE_TYPE=$($*_IMAGE_TYPE) DEBUG_BUILD=$(DEBUG_BUILD) ./build_image.sh $(LOG) $(foreach docker, $($*_DOCKERS), \ rm $($(docker)_CONTAINER_NAME).sh From e439ee3152540a412912add5a429729f03922499 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 14 Feb 2017 18:51:24 -0800 Subject: [PATCH 0277/1011] [installer]: add console override for z9100 (#295) --- installer/x86_64/platforms/x86_64-dell_z9100_c2538-r0 | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 installer/x86_64/platforms/x86_64-dell_z9100_c2538-r0 diff --git a/installer/x86_64/platforms/x86_64-dell_z9100_c2538-r0 b/installer/x86_64/platforms/x86_64-dell_z9100_c2538-r0 new file mode 100644 index 000000000000..26ee5ef89de6 --- /dev/null +++ b/installer/x86_64/platforms/x86_64-dell_z9100_c2538-r0 @@ -0,0 +1,2 @@ +CONSOLE_PORT=0x2f8 +CONSOLE_DEV=1 From fe519be94102f4a02d6faec3f0ce9edcb921a7b5 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Wed, 15 Feb 2017 18:48:37 +0200 Subject: [PATCH 0278/1011] [src]: Update sonic-swss submodule reference (#297) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 5d31f9d6db40..1ceb354a6742 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 5d31f9d6db407882323ce5484a1a1e5f7648121a +Subproject commit 1ceb354a6742a35d65e31fb28ea68a2e6b9643dd From e702fc07328e63a7f82c229904a47ccb0c70ab58 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 15 Feb 2017 08:48:52 -0800 Subject: [PATCH 0279/1011] [Broadcom]: Update debian packages (#296) Signed-off-by: Shuotian Cheng --- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 89a838d872de..9e07ccf4b91c 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.3.1+0-20170203082839.11-1.gbp995de3_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.3.1+0-20170203082839.11-1.gbp995de3_amd64.deb?sv=2015-04-05&sr=b&sig=q%2Byg1WtnhhGHBeOjyO7LfMZejwqER%2F7Hdr%2F%2Bxs%2FUFSA%3D&se=2030-10-13T19%3A49%3A10Z&sp=r" +BRCM_SAI = libsaibcm_2.1.3.1-1-20170208221802.12_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.3.1-1-20170208221802.12_amd64.deb?sv=2015-04-05&sr=b&sig=RpHs7rvOiM%2FzBHeaA2BwP4CYRmiJFhPGBn88Hx9V5Rg%3D&se=2030-10-25T02%3A43%3A53Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.3.1+0-20170203082839.11-1.gbp995de3_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.3.1-1-20170208221802.12_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.3.1+0-20170203082839.11-1.gbp995de3_amd64.deb?sv=2015-04-05&sr=b&sig=ihcuduBFhzV5yj%2F2kI%2BzTshm85KFtm2XGqHcXo%2FwD5U%3D&se=2030-10-13T19%3A50%3A07Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.3.1-1-20170208221802.12_amd64.deb?sv=2015-04-05&sr=b&sig=DNOUenzhSfCHR4QdxkNwf5zdoecCblClau4rjoa0oJE%3D&se=2030-10-25T02%3A47%3A33Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index c9f9662a72e5..a4f2dbfeb79d 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.1.5-5-20170203072429.19_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-5-20170203072429.19_amd64.deb?sv=2015-04-05&sr=b&sig=ay3U2TMBqVOlDmT75PlLCn0olcjixH96whjjdPM4IGI%3D&se=2030-10-13T19%3A50%3A48Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.1.5-6-20170208212127.20_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-6-20170208212127.20_amd64.deb?sv=2015-04-05&sr=b&sig=VrkDUWofqRz7G70C8%2BGIVtimvNPgnSkCkZccEVPmiIM%3D&se=2030-10-25T02%3A46%3A20Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-5-20170203072429.19_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-5-20170203072429.19_amd64.deb?sv=2015-04-05&sr=b&sig=WttrjSL1EtqPA50ZZEn52pOUojMqmP9e7Gdcrj9a%2FVI%3D&se=2030-10-13T19%3A51%3A16Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-6-20170208212127.20_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-6-20170208212127.20_amd64.deb?sv=2015-04-05&sr=b&sig=FUNtA7GYpHPoP9QH72VdwLk0yxCUAmEqNmZm%2FEMOUf8%3D&se=2030-10-25T02%3A45%3A34Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 877291ae91cfa94e1125826c00b86815920b4b79 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 15 Feb 2017 08:54:10 -0800 Subject: [PATCH 0280/1011] [docker-teamd]: Automatically start the processes after host interfaces are created (#278) Signed-off-by: Shuotian Cheng --- dockers/docker-teamd/Dockerfile.j2 | 3 ++- dockers/docker-teamd/start.sh | 38 ++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index bff5ef11d4f5..35492bdb4670 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -19,4 +19,5 @@ COPY ["teamd.j2", "/etc/swss/teamd/"] RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -ENTRYPOINT /usr/bin/config.sh && /usr/bin/start.sh +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/config.sh && /usr/bin/start.sh"] diff --git a/dockers/docker-teamd/start.sh b/dockers/docker-teamd/start.sh index 61251cd82d86..268217272f6e 100755 --- a/dockers/docker-teamd/start.sh +++ b/dockers/docker-teamd/start.sh @@ -2,23 +2,35 @@ TEAMD_CONF_PATH=/etc/teamd +function start_app { + if [ -d $TEAMD_CONF_PATH ]; then + for f in $TEAMD_CONF_PATH/*; do + teamd -f $f -d + done + fi + teamsyncd & +} + function clean_up { - pkill -9 teamd - pkill -9 teamsyncd - service rsyslog stop - exit + pkill -9 teamd + pkill -9 teamsyncd + service rsyslog stop + exit } trap clean_up SIGTERM SIGKILL service rsyslog start -if [ -d $TEAMD_CONF_PATH ]; then - for f in $TEAMD_CONF_PATH/*; do - teamd -f $f -d - done -fi - -teamsyncd & - -read +# Before teamd could automatically add newly created host interfaces into the +# LAG, this workaround will wait until the host interfaces are created and then +# the processes will be started. +while true; do + # Check if front-panel ports are configured + result=`echo -en "SELECT 0\nHGETALL PORT_TABLE:ConfigDone" | redis-cli | sed -n 3p` + if [ "$result" != "0" ]; then + start_app + read + fi + sleep 1 +done From 89a695a5e79d1c4811ce3a476b672b97900f4a2a Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Wed, 15 Feb 2017 23:18:02 -0800 Subject: [PATCH 0281/1011] [union-mount] Rescan dev if root partition disapear (#298) On some platforms after the initramfs init scripts have mounted the root device its block device disapear from /dev. The union-mount script therefore can't mount the root device over the aufs. If this case happen, issue a rescan of the devices to repopulate the /dev filesystem. --- files/initramfs-tools/union-mount.j2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/files/initramfs-tools/union-mount.j2 b/files/initramfs-tools/union-mount.j2 index 531436c39a2f..037a9c240333 100644 --- a/files/initramfs-tools/union-mount.j2 +++ b/files/initramfs-tools/union-mount.j2 @@ -8,6 +8,8 @@ esac ## Mount the aufs file system: rw layer over squashfs mkdir -p ${rootmnt}/host/rw mount -n -o dirs=${rootmnt}/host/rw:${rootmnt}=ro -t aufs root-aufs ${rootmnt} +## Check if the root block device is still there +[ -b ${ROOT} ] || mdev -s ## Mount the raw partition again mount ${ROOT} ${rootmnt}/host ## Mount the working directory of docker engine in the raw partition, bypass the aufs From 8a24c05f045436427a89f94158cfc58dc0bcf47e Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 16 Feb 2017 21:03:59 -0800 Subject: [PATCH 0282/1011] [src]: Update submodule sonic-py-swsssdk (#302) --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 7bbe8419f719..e5cbe0c8b65b 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 7bbe8419f719f577fdf923c8eadd0d462a9ce72a +Subproject commit e5cbe0c8b65bcdb1cf35cf05261521dcea0a2e3a From a845740543699ea6eeed999709d4bb6af098e190 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 16 Feb 2017 21:48:49 -0800 Subject: [PATCH 0283/1011] [All Dockerfiles]: Prevent apt asking questions on the console (#300) Add noninteractive setting into every Dockerfile in the repo Signed-off-by: Pavel Shirshov pavelsh@microsoft.com --- dockers/docker-base/Dockerfile | 3 +++ dockers/docker-basic_router/Dockerfile | 4 ++++ dockers/docker-bgp/Dockerfile | 3 +++ dockers/docker-config-engine/Dockerfile.j2 | 3 +++ dockers/docker-database/Dockerfile.j2 | 3 +++ dockers/docker-fpm/Dockerfile.j2 | 3 +++ dockers/docker-lldp-sv2/Dockerfile.j2 | 3 +++ dockers/docker-lldp/Dockerfile | 3 +++ dockers/docker-mlnx-sswsyncd/Dockerfile | 3 +++ dockers/docker-orchagent/Dockerfile.j2 | 3 +++ dockers/docker-platform-monitor/Dockerfile | 3 +++ dockers/docker-ptf-saithrift/Dockerfile | 3 +++ dockers/docker-saiserver-brcm/Dockerfile | 3 +++ dockers/docker-saiserver-mlnx/Dockerfile | 3 +++ dockers/docker-snmp-sv2/Dockerfile.j2 | 3 +++ dockers/docker-snmp/Dockerfile | 3 +++ dockers/docker-sswsyncd/Dockerfile | 3 +++ dockers/docker-teamd/Dockerfile.j2 | 3 +++ dockers/docker-vas/Dockerfile | 3 +++ platform/broadcom/docker-syncd-brcm/Dockerfile.j2 | 3 +++ platform/cavium/docker-syncd-cavm/Dockerfile.j2 | 3 +++ platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 | 3 +++ platform/p4/docker-sonic-p4/Dockerfile.j2 | 3 +++ sonic-slave/Dockerfile | 3 +++ 24 files changed, 73 insertions(+) diff --git a/dockers/docker-base/Dockerfile b/dockers/docker-base/Dockerfile index b5f6b7c855c5..59af1f3ac6a3 100644 --- a/dockers/docker-base/Dockerfile +++ b/dockers/docker-base/Dockerfile @@ -13,6 +13,9 @@ RUN rm -rf \ /var/cache/man/* \ /usr/share/locale/* +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + ## Set the apt source COPY sources.list /etc/apt/sources.list COPY dpkg_01_drop /etc/dpkg/dpkg.cfg.d/01_drop diff --git a/dockers/docker-basic_router/Dockerfile b/dockers/docker-basic_router/Dockerfile index 095de44b02e2..8bf1875ab98c 100644 --- a/dockers/docker-basic_router/Dockerfile +++ b/dockers/docker-basic_router/Dockerfile @@ -2,10 +2,14 @@ FROM docker-base MAINTAINER Xudong Wu +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + ## Set the apt source RUN apt-get clean && apt-get update COPY deps /deps + RUN dpkg -i /deps/libopennsl_*.deb; \ dpkg -i /deps/libsaibcm_*.deb; \ apt-get -y install -f diff --git a/dockers/docker-bgp/Dockerfile b/dockers/docker-bgp/Dockerfile index b01698e31118..17c58524a079 100755 --- a/dockers/docker-bgp/Dockerfile +++ b/dockers/docker-bgp/Dockerfile @@ -1,5 +1,8 @@ FROM docker-base +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + COPY deps/quagga_*.deb /deps/ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ dpkg_apt /deps/quagga_*.deb && \ diff --git a/dockers/docker-config-engine/Dockerfile.j2 b/dockers/docker-config-engine/Dockerfile.j2 index 56ed38f10f90..067983724014 100644 --- a/dockers/docker-config-engine/Dockerfile.j2 +++ b/dockers/docker-config-engine/Dockerfile.j2 @@ -1,5 +1,8 @@ FROM docker-base +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update # Dependencies for sonic-cfggen diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index cca7cd535933..af77177c58d0 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -1,5 +1,8 @@ FROM docker-base +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update COPY \ diff --git a/dockers/docker-fpm/Dockerfile.j2 b/dockers/docker-fpm/Dockerfile.j2 index 5cdbff3a0646..3f7445bd862c 100644 --- a/dockers/docker-fpm/Dockerfile.j2 +++ b/dockers/docker-fpm/Dockerfile.j2 @@ -1,5 +1,8 @@ FROM docker-config-engine +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4 diff --git a/dockers/docker-lldp-sv2/Dockerfile.j2 b/dockers/docker-lldp-sv2/Dockerfile.j2 index 32d73ecf32c5..79cdbb172f66 100644 --- a/dockers/docker-lldp-sv2/Dockerfile.j2 +++ b/dockers/docker-lldp-sv2/Dockerfile.j2 @@ -8,6 +8,9 @@ debs/ COPY python-wheels /python-wheels +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update && apt-get install -y python-pip supervisor libbsd0 libevent-2.0-5 libjansson4 libwrap0 libxml2 libpci3 libperl5.20 ## Pre-install the fundamental packages diff --git a/dockers/docker-lldp/Dockerfile b/dockers/docker-lldp/Dockerfile index 528ac65a4080..044e16953e83 100644 --- a/dockers/docker-lldp/Dockerfile +++ b/dockers/docker-lldp/Dockerfile @@ -2,6 +2,9 @@ FROM docker-base COPY deps/sswsdk*.whl deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + ## Pre-install the fundamental packages ## Install Python SSWSDK (lldpsyncd dependency) ## Install LLDP Sync Daemon diff --git a/dockers/docker-mlnx-sswsyncd/Dockerfile b/dockers/docker-mlnx-sswsyncd/Dockerfile index 4ce980aee35f..631ff2e18030 100755 --- a/dockers/docker-mlnx-sswsyncd/Dockerfile +++ b/dockers/docker-mlnx-sswsyncd/Dockerfile @@ -1,5 +1,8 @@ FROM docker-base +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update ## Pre-install the fundamental packages diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index dd04379f57e0..0376c2c4d86d 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -1,5 +1,8 @@ FROM docker-config-engine +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update RUN apt-get install -f -y ifupdown bridge-utils libdbus-1-3 libdaemon0 libjansson4 diff --git a/dockers/docker-platform-monitor/Dockerfile b/dockers/docker-platform-monitor/Dockerfile index 0d5a5dcb45e9..ea73830f8e6c 100755 --- a/dockers/docker-platform-monitor/Dockerfile +++ b/dockers/docker-platform-monitor/Dockerfile @@ -1,5 +1,8 @@ FROM docker-config-engine +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update RUN apt-get install -y smartmontools sensord diff --git a/dockers/docker-ptf-saithrift/Dockerfile b/dockers/docker-ptf-saithrift/Dockerfile index 88176faffb5f..0aa494757711 100644 --- a/dockers/docker-ptf-saithrift/Dockerfile +++ b/dockers/docker-ptf-saithrift/Dockerfile @@ -1,5 +1,8 @@ FROM docker-ptf +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update COPY ["deps/saithrift-0.9.tar.gz", "/deps/"] diff --git a/dockers/docker-saiserver-brcm/Dockerfile b/dockers/docker-saiserver-brcm/Dockerfile index 054da7866fbf..3482c2068bc5 100755 --- a/dockers/docker-saiserver-brcm/Dockerfile +++ b/dockers/docker-saiserver-brcm/Dockerfile @@ -1,5 +1,8 @@ FROM docker-base +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update COPY ["deps/libsaibcm_*.deb","deps/libopennsl_*.deb","deps/python-sdk-api_*.deb", "deps/iproute2_*.deb", "deps/libthrift-0.9.3_*.deb", "deps/libnl-3-200_*.deb", "deps/libnl-genl-3-200_*.deb", "deps/libnl-route-3-200_*.deb", "/deps/"] diff --git a/dockers/docker-saiserver-mlnx/Dockerfile b/dockers/docker-saiserver-mlnx/Dockerfile index 49f7842c7a41..5f51f5598b18 100755 --- a/dockers/docker-saiserver-mlnx/Dockerfile +++ b/dockers/docker-saiserver-mlnx/Dockerfile @@ -1,5 +1,8 @@ FROM docker-base +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update COPY ["deps/applibs_*.deb", "/deps/applibs-dev_*.deb", "/deps/sx-complib_*.deb", "/deps/sxd-libs_*.deb", "/deps/sx-scew_*.deb", "/deps/sx-examples_*.deb", "/deps/sx-gen-utils_*.deb", "/deps/python-sdk-api_*.deb", "/deps/iproute2_*.deb", "/deps/mlnx-sai_*.deb", "/deps/libthrift-0.9.3_*.deb", "/deps/libnl-3-200_*.deb", "/deps/libnl-genl-3-200_*.deb", "/deps/libnl-route-3-200_*.deb", "/deps/"] diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index 21d1573f0e10..332f485f72e6 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -12,6 +12,9 @@ COPY python-wheels/asyncsnmp-*-py3-*.whl /python-wheels/ # enable -O for all Python calls ENV PYTHONOPTIMIZE 1 +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + # install supervisor # install libsnmp30 dependencies # install libpython3.6-dev dependencies diff --git a/dockers/docker-snmp/Dockerfile b/dockers/docker-snmp/Dockerfile index 7ffc0b122870..c13428563e33 100644 --- a/dockers/docker-snmp/Dockerfile +++ b/dockers/docker-snmp/Dockerfile @@ -6,6 +6,9 @@ COPY deps/python3/*.whl /python3/ # enable -O for all Python calls ENV PYTHONOPTIMIZE 1 +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + ## Pre-install the fundamental packages ## Install Python SSWSDK (SNMP subagent dependency) ## Install SNMP subagent diff --git a/dockers/docker-sswsyncd/Dockerfile b/dockers/docker-sswsyncd/Dockerfile index 7d83c67a259b..0f555d8b51bf 100755 --- a/dockers/docker-sswsyncd/Dockerfile +++ b/dockers/docker-sswsyncd/Dockerfile @@ -8,6 +8,9 @@ COPY deps/sswsyncd_*.deb \ /deps/ +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + ## Install packages ## Clean up RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index 35492bdb4670..7cb86e5b7e69 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -16,6 +16,9 @@ debs/{{ deb }}{{' '}} COPY ["start.sh", "config.sh", "/usr/bin/"] COPY ["teamd.j2", "/etc/swss/teamd/"] +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs diff --git a/dockers/docker-vas/Dockerfile b/dockers/docker-vas/Dockerfile index 84b5eb46d40e..fb207d07199e 100755 --- a/dockers/docker-vas/Dockerfile +++ b/dockers/docker-vas/Dockerfile @@ -3,6 +3,9 @@ FROM docker-base COPY deps/vasclnt_*.deb deps/vasgp_*.deb /deps/ COPY user-override /etc/opt/quest/vas/user-override +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + ## Pre-install the fundamental packages ## Clean up RUN apt-get update && \ diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index 0050cf9b1bf3..ffe7b6c57397 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -1,5 +1,8 @@ FROM docker-base +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update COPY \ diff --git a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 index 9c66649420c0..45b71e85129c 100755 --- a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 +++ b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 @@ -1,5 +1,8 @@ FROM docker-base +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update COPY \ diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index d296ab4e8210..cd686802f907 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -1,5 +1,8 @@ FROM docker-base +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update COPY \ diff --git a/platform/p4/docker-sonic-p4/Dockerfile.j2 b/platform/p4/docker-sonic-p4/Dockerfile.j2 index f285f8f0750f..97e3a56817e4 100644 --- a/platform/p4/docker-sonic-p4/Dockerfile.j2 +++ b/platform/p4/docker-sonic-p4/Dockerfile.j2 @@ -1,5 +1,8 @@ FROM docker-base +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get update RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils python-ply libqt5core5a libqt5network5 libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0 libgmp10 libjudydebian1 libnanomsg0 libdaemon0 libjansson4 libjemalloc1 diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 0398581dcd47..03f38a06c2ca 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -7,6 +7,9 @@ RUN echo "deb-src http://debian-archive.trafficmanager.net/debian/ jessie main c RUN echo "deb http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list RUN echo "deb-src http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + RUN apt-get clean && apt-get update && apt-get install -y apt-utils default-jre-headless openssh-server curl wget unzip git build-essential libtool lintian RUN apt-get update && apt-get install -y sudo dh-make dh-exec kmod libtinyxml2-2 libboost-program-options1.55-dev libtinyxml2-dev python python-pip libncurses5-dev texinfo dh-autoreconf python3-pip From a962c0b38666f7cebde02f2ca8e4792110493eaa Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Thu, 16 Feb 2017 22:10:29 -0800 Subject: [PATCH 0284/1011] [boot0] sync filesystem before kexec (#301) --- files/Aboot/boot0.j2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 8ec50ef7f9e3..d30a44e520c2 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -71,6 +71,9 @@ extract_image() { ## replace with boot swi mv "$target_path/{{ ABOOT_BOOT_IMAGE }}" "$swipath" + + ## sync disk operations + sync } write_machine_config() { From f9f31ed2969bc471066162c76fd682791a45f47b Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Fri, 17 Feb 2017 09:28:09 +0200 Subject: [PATCH 0285/1011] [installer]: limit size of /var/log (#284) Create loop device during installation of size soecified in config file for machine Signed-off-by: marian-pritsak --- files/initramfs-tools/union-mount.j2 | 2 ++ installer/x86_64/install.sh | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/files/initramfs-tools/union-mount.j2 b/files/initramfs-tools/union-mount.j2 index 037a9c240333..2ff58ec949f9 100644 --- a/files/initramfs-tools/union-mount.j2 +++ b/files/initramfs-tools/union-mount.j2 @@ -18,3 +18,5 @@ mount --bind ${rootmnt}/host/{{ DOCKERFS_DIR }} ${rootmnt}/var/lib/docker ## Mount the boot directory in the raw partition, bypass the aufs mkdir -p ${rootmnt}/boot mount --bind ${rootmnt}/host/boot ${rootmnt}/boot +## Mount loop device for /var/log +[ -f ${rootmnt}/host/disk-img/var-log.ext4 ] && mount -t ext4 -o loop,rw ${rootmnt}/host/disk-img/var-log.ext4 ${rootmnt}/var/log diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 2ff663c188eb..0d2d76a2cd9e 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -51,6 +51,10 @@ CONSOLE_SPEED=9600 # Get platform specific linux kernel command line arguments ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="" + +# Default var/log device size in MB +VAR_LOG_SIZE=4096 + [ -r platforms/$onie_platform ] && source platforms/$onie_platform # Install demo on same block device as ONIE @@ -401,6 +405,13 @@ if [ -f $demo_mnt/$FILESYSTEM_DOCKERFS ]; then cd $demo_mnt && mkdir -p $DOCKERFS_DIR && tar xf $FILESYSTEM_DOCKERFS -C $DOCKERFS_DIR; cd $OLDPWD fi +# Create loop device for /var/log to limit its size to $VAR_LOG_SIZE MB +if [ "$VAR_LOG_SIZE" != "0" ]; then + mkdir -p $demo_mnt/disk-img + dd if=/dev/zero of=$demo_mnt/disk-img/var-log.ext4 count=$((2048*$VAR_LOG_SIZE)) + mkfs.ext4 -q $demo_mnt/disk-img/var-log.ext4 -F +fi + # Store machine description in target file system cp /etc/machine.conf $demo_mnt From 2d0b41a340e3b03f423a75e7687e9bf7436aa1e4 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 17 Feb 2017 13:03:42 -0800 Subject: [PATCH 0286/1011] Combine alias_map.json with port_config.ini (#304) * Combine alias_map.json with port_config.ini --- src/sonic-config-engine/minigraph.py | 35 +++-- .../platform/ACS-MSN2700/alias_map.json | 34 ----- .../platform/ACS-MSN2700/port_config.ini | 2 +- .../platform/AS7512/port_config.ini | 2 +- .../platform/Arista-7050-QX32/alias_map.json | 34 ----- .../platform/Arista-7050-QX32/port_config.ini | 66 ++++----- .../platform/Force10-S6000/alias_map.json | 34 ----- .../platform/Force10-S6000/port_config.ini | 66 ++++----- .../platform/Force10-S6100/alias_map.json | 66 --------- .../platform/Force10-S6100/port_config.ini | 130 +++++++++--------- src/sonic-config-engine/setup.py | 2 - src/sonic-config-engine/sonic-cfggen | 23 +++- 12 files changed, 180 insertions(+), 314 deletions(-) delete mode 100644 src/sonic-config-engine/platform/ACS-MSN2700/alias_map.json delete mode 100644 src/sonic-config-engine/platform/Arista-7050-QX32/alias_map.json delete mode 100644 src/sonic-config-engine/platform/Force10-S6000/alias_map.json delete mode 100644 src/sonic-config-engine/platform/Force10-S6100/alias_map.json diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 8560b850c179..317d9c963a33 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -285,18 +285,33 @@ def get_mgmt_info(devices, dev, port): return ret_val -def get_alias_map_list(hwsku): - alias_map_json = os.path.join('/usr/share/sonic', hwsku, 'alias_map.json') - if not os.path.isfile(alias_map_json): +def get_alias_map_list(hwsku, platform=None): + port_config_candidates = [] + port_config_candidates.append('/usr/share/sonic/sku/port_config.ini') + if platform != None: + port_config_candidates.append(os.path.join('/usr/share/sonic/device', platform, hwsku, 'port_config.ini')) + port_config_candidates.append(os.path.join('/usr/share/sonic/device', hwsku, 'port_config.ini')) + port_config_candidates.append(os.path.join('/usr/share/sonic', hwsku, 'port_config.ini')) + port_config = None + for candidate in port_config_candidates: + if os.path.isfile(candidate): + port_config = candidate + break + if port_config == None: return None - with open(alias_map_json) as data: - alias_map_dict = json.load(data) + alias_map_list = [] - for k,v in alias_map_dict.items(): - alias_map_list.append({'sonic': k, 'origin': v}) + with open(port_config) as data: + for line in data: + if line.startswith('#'): + continue + tokens = line.split() + if len(tokens) < 3: + continue + alias_map_list.append({'sonic': tokens[0], 'origin': tokens[2].strip()}) return alias_map_list -def parse_xml(filename): +def parse_xml(filename, platform=None): root = ET.parse(filename).getroot() mini_graph_path = filename @@ -322,8 +337,7 @@ def parse_xml(filename): if child.tag == str(hostname_qn): hostname = child.text - # port_alias_map maps ngs port name to sonic port name - alias_map_list = get_alias_map_list(hwsku) + alias_map_list = get_alias_map_list(hwsku, platform) if alias_map_list != None: for item in alias_map_list: port_alias_map[item['origin']] = item['sonic'] @@ -373,6 +387,7 @@ def parse_xml(filename): results['minigraph_as_xml'] = mini_graph_path results['minigraph_console'] = get_console_info(devices, console_dev, console_port) results['minigraph_mgmt'] = get_mgmt_info(devices, mgmt_dev, mgmt_port) + results['minigraph_hostname'] = hostname results['inventory_hostname'] = hostname results['alias_map'] = alias_map_list diff --git a/src/sonic-config-engine/platform/ACS-MSN2700/alias_map.json b/src/sonic-config-engine/platform/ACS-MSN2700/alias_map.json deleted file mode 100644 index dd1324ae4360..000000000000 --- a/src/sonic-config-engine/platform/ACS-MSN2700/alias_map.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "Ethernet8": "Ethernet8", - "Ethernet0": "Ethernet0", - "Ethernet4": "Ethernet4", - "Ethernet108": "Ethernet108", - "Ethernet100": "Ethernet100", - "Ethernet104": "Ethernet104", - "Ethernet96": "Ethernet96", - "Ethernet124": "Ethernet124", - "Ethernet120": "Ethernet120", - "Ethernet92": "Ethernet92", - "Ethernet28": "Ethernet28", - "Ethernet52": "Ethernet52", - "Ethernet56": "Ethernet56", - "Ethernet76": "Ethernet76", - "Ethernet72": "Ethernet72", - "Ethernet32": "Ethernet32", - "Ethernet16": "Ethernet16", - "Ethernet36": "Ethernet36", - "Ethernet12": "Ethernet12", - "Ethernet88": "Ethernet88", - "Ethernet24": "Ethernet24", - "Ethernet116": "Ethernet116", - "Ethernet80": "Ethernet80", - "Ethernet112": "Ethernet112", - "Ethernet84": "Ethernet84", - "Ethernet48": "Ethernet48", - "Ethernet44": "Ethernet44", - "Ethernet40": "Ethernet40", - "Ethernet64": "Ethernet64", - "Ethernet60": "Ethernet60", - "Ethernet20": "Ethernet20", - "Ethernet68": "Ethernet68" -} \ No newline at end of file diff --git a/src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini b/src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini index ae703f020de6..816bb0e94a70 100644 --- a/src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini +++ b/src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini @@ -1,4 +1,4 @@ -# alias lanes +# name lanes Ethernet0 0,1,2,3 Ethernet4 4,5,6,7 Ethernet8 8,9,10,11 diff --git a/src/sonic-config-engine/platform/AS7512/port_config.ini b/src/sonic-config-engine/platform/AS7512/port_config.ini index c35776dcfcc5..c10cd2786941 100644 --- a/src/sonic-config-engine/platform/AS7512/port_config.ini +++ b/src/sonic-config-engine/platform/AS7512/port_config.ini @@ -1,4 +1,4 @@ -# alias lanes +# name lanes Ethernet0 16,17,18,19 Ethernet4 20,21,22,23 Ethernet8 24,25,26,27 diff --git a/src/sonic-config-engine/platform/Arista-7050-QX32/alias_map.json b/src/sonic-config-engine/platform/Arista-7050-QX32/alias_map.json deleted file mode 100644 index 90b35011e2c5..000000000000 --- a/src/sonic-config-engine/platform/Arista-7050-QX32/alias_map.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "Ethernet8": "Ethernet3/1", - "Ethernet0": "Ethernet1/1", - "Ethernet4": "Ethernet2/1", - "Ethernet108": "Ethernet28", - "Ethernet100": "Ethernet26", - "Ethernet104": "Ethernet27", - "Ethernet96": "Ethernet25", - "Ethernet124": "Ethernet32", - "Ethernet120": "Ethernet31", - "Ethernet92": "Ethernet24/1", - "Ethernet28": "Ethernet8/1", - "Ethernet52": "Ethernet14/1", - "Ethernet56": "Ethernet15/1", - "Ethernet76": "Ethernet20/1", - "Ethernet72": "Ethernet19/1", - "Ethernet32": "Ethernet9/1", - "Ethernet16": "Ethernet5/1", - "Ethernet36": "Ethernet10/1", - "Ethernet12": "Ethernet4/1", - "Ethernet88": "Ethernet23/1", - "Ethernet24": "Ethernet7/1", - "Ethernet116": "Ethernet30", - "Ethernet80": "Ethernet21/1", - "Ethernet112": "Ethernet29", - "Ethernet84": "Ethernet22/1", - "Ethernet48": "Ethernet13/1", - "Ethernet44": "Ethernet12/1", - "Ethernet40": "Ethernet11/1", - "Ethernet64": "Ethernet17/1", - "Ethernet60": "Ethernet16/1", - "Ethernet20": "Ethernet6/1", - "Ethernet68": "Ethernet18/1" -} \ No newline at end of file diff --git a/src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini b/src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini index ec12639d72bf..b9ab8854a2ec 100644 --- a/src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini +++ b/src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini @@ -1,33 +1,33 @@ -# alias lanes -Ethernet0 125,126,127,128 -Ethernet4 121,122,123,124 -Ethernet8 13,14,15,16 -Ethernet12 9,10,11,12 -Ethernet16 17,18,19,20 -Ethernet20 21,22,23,24 -Ethernet24 25,26,27,28 -Ethernet28 29,30,31,32 -Ethernet32 37,38,39,40 -Ethernet36 33,34,35,36 -Ethernet40 45,46,47,48 -Ethernet44 41,42,43,44 -Ethernet48 53,54,55,56 -Ethernet52 49,50,51,52 -Ethernet56 69,70,71,72 -Ethernet60 65,66,67,68 -Ethernet64 77,78,79,80 -Ethernet68 73,74,75,76 -Ethernet72 93,94,95,96 -Ethernet76 89,90,91,92 -Ethernet80 101,102,103,104 -Ethernet84 97,98,99,100 -Ethernet88 109,110,111,112 -Ethernet92 105,106,107,108 -Ethernet96 61,62,63,64 -Ethernet100 57,58,59,60 -Ethernet104 81,82,83,84 -Ethernet108 85,86,87,88 -Ethernet112 117,118,119,120 -Ethernet116 113,114,115,116 -Ethernet120 5,6,7,8 -Ethernet124 1,2,3,4 +# name lanes alias +Ethernet0 125,126,127,128 Ethernet1/1 +Ethernet4 121,122,123,124 Ethernet2/1 +Ethernet8 13,14,15,16 Ethernet3/1 +Ethernet12 9,10,11,12 Ethernet4/1 +Ethernet16 17,18,19,20 Ethernet5/1 +Ethernet20 21,22,23,24 Ethernet6/1 +Ethernet24 25,26,27,28 Ethernet7/1 +Ethernet28 29,30,31,32 Ethernet8/1 +Ethernet32 37,38,39,40 Ethernet9/1 +Ethernet36 33,34,35,36 Ethernet10/1 +Ethernet40 45,46,47,48 Ethernet11/1 +Ethernet44 41,42,43,44 Ethernet12/1 +Ethernet48 53,54,55,56 Ethernet13/1 +Ethernet52 49,50,51,52 Ethernet14/1 +Ethernet56 69,70,71,72 Ethernet15/1 +Ethernet60 65,66,67,68 Ethernet16/1 +Ethernet64 77,78,79,80 Ethernet17/1 +Ethernet68 73,74,75,76 Ethernet18/1 +Ethernet72 93,94,95,96 Ethernet19/1 +Ethernet76 89,90,91,92 Ethernet20/1 +Ethernet80 101,102,103,104 Ethernet21/1 +Ethernet84 97,98,99,100 Ethernet22/1 +Ethernet88 109,110,111,112 Ethernet23/1 +Ethernet92 105,106,107,108 Ethernet24/1 +Ethernet96 61,62,63,64 Ethernet25 +Ethernet100 57,58,59,60 Ethernet26 +Ethernet104 81,82,83,84 Ethernet27 +Ethernet108 85,86,87,88 Ethernet28 +Ethernet112 117,118,119,120 Ethernet29 +Ethernet116 113,114,115,116 Ethernet30 +Ethernet120 5,6,7,8 Ethernet31 +Ethernet124 1,2,3,4 Ethernet32 diff --git a/src/sonic-config-engine/platform/Force10-S6000/alias_map.json b/src/sonic-config-engine/platform/Force10-S6000/alias_map.json deleted file mode 100644 index b58d147f70c3..000000000000 --- a/src/sonic-config-engine/platform/Force10-S6000/alias_map.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "Ethernet8": "fortyGigE0/8", - "Ethernet0": "fortyGigE0/0", - "Ethernet4": "fortyGigE0/4", - "Ethernet108": "fortyGigE0/108", - "Ethernet100": "fortyGigE0/100", - "Ethernet104": "fortyGigE0/104", - "Ethernet96": "fortyGigE0/96", - "Ethernet124": "fortyGigE0/124", - "Ethernet120": "fortyGigE0/120", - "Ethernet92": "fortyGigE0/92", - "Ethernet28": "fortyGigE0/28", - "Ethernet52": "fortyGigE0/52", - "Ethernet56": "fortyGigE0/56", - "Ethernet76": "fortyGigE0/76", - "Ethernet72": "fortyGigE0/72", - "Ethernet32": "fortyGigE0/32", - "Ethernet16": "fortyGigE0/16", - "Ethernet36": "fortyGigE0/36", - "Ethernet12": "fortyGigE0/12", - "Ethernet88": "fortyGigE0/88", - "Ethernet24": "fortyGigE0/24", - "Ethernet116": "fortyGigE0/116", - "Ethernet80": "fortyGigE0/80", - "Ethernet112": "fortyGigE0/112", - "Ethernet84": "fortyGigE0/84", - "Ethernet48": "fortyGigE0/48", - "Ethernet44": "fortyGigE0/44", - "Ethernet40": "fortyGigE0/40", - "Ethernet64": "fortyGigE0/64", - "Ethernet60": "fortyGigE0/60", - "Ethernet20": "fortyGigE0/20", - "Ethernet68": "fortyGigE0/68" -} \ No newline at end of file diff --git a/src/sonic-config-engine/platform/Force10-S6000/port_config.ini b/src/sonic-config-engine/platform/Force10-S6000/port_config.ini index 7161416e4d4c..06898f1d7964 100644 --- a/src/sonic-config-engine/platform/Force10-S6000/port_config.ini +++ b/src/sonic-config-engine/platform/Force10-S6000/port_config.ini @@ -1,33 +1,33 @@ -# alias lanes -Ethernet0 29,30,31,32 -Ethernet4 25,26,27,28 -Ethernet8 37,38,39,40 -Ethernet12 33,34,35,36 -Ethernet16 41,42,43,44 -Ethernet20 45,46,47,48 -Ethernet24 5,6,7,8 -Ethernet28 1,2,3,4 -Ethernet32 9,10,11,12 -Ethernet36 13,14,15,16 -Ethernet40 21,22,23,24 -Ethernet44 17,18,19,20 -Ethernet48 49,50,51,52 -Ethernet52 53,54,55,56 -Ethernet56 61,62,63,64 -Ethernet60 57,58,59,60 -Ethernet64 65,66,67,68 -Ethernet68 69,70,71,72 -Ethernet72 77,78,79,80 -Ethernet76 73,74,75,76 -Ethernet80 105,106,107,108 -Ethernet84 109,110,111,112 -Ethernet88 117,118,119,120 -Ethernet92 113,114,115,116 -Ethernet96 121,122,123,124 -Ethernet100 125,126,127,128 -Ethernet104 85,86,87,88 -Ethernet108 81,82,83,84 -Ethernet112 89,90,91,92 -Ethernet116 93,94,95,96 -Ethernet120 97,98,99,100 -Ethernet124 101,102,103,104 +# name lanes alias +Ethernet0 29,30,31,32 fortyGigE0/0 +Ethernet4 25,26,27,28 fortyGigE0/4 +Ethernet8 37,38,39,40 fortyGigE0/8 +Ethernet12 33,34,35,36 fortyGigE0/12 +Ethernet16 41,42,43,44 fortyGigE0/16 +Ethernet20 45,46,47,48 fortyGigE0/20 +Ethernet24 5,6,7,8 fortyGigE0/24 +Ethernet28 1,2,3,4 fortyGigE0/28 +Ethernet32 9,10,11,12 fortyGigE0/32 +Ethernet36 13,14,15,16 fortyGigE0/36 +Ethernet40 21,22,23,24 fortyGigE0/40 +Ethernet44 17,18,19,20 fortyGigE0/44 +Ethernet48 49,50,51,52 fortyGigE0/48 +Ethernet52 53,54,55,56 fortyGigE0/52 +Ethernet56 61,62,63,64 fortyGigE0/56 +Ethernet60 57,58,59,60 fortyGigE0/60 +Ethernet64 65,66,67,68 fortyGigE0/64 +Ethernet68 69,70,71,72 fortyGigE0/68 +Ethernet72 77,78,79,80 fortyGigE0/72 +Ethernet76 73,74,75,76 fortyGigE0/76 +Ethernet80 105,106,107,108 fortyGigE0/80 +Ethernet84 109,110,111,112 fortyGigE0/84 +Ethernet88 117,118,119,120 fortyGigE0/88 +Ethernet92 113,114,115,116 fortyGigE0/92 +Ethernet96 121,122,123,124 fortyGigE0/96 +Ethernet100 125,126,127,128 fortyGigE0/100 +Ethernet104 85,86,87,88 fortyGigE0/104 +Ethernet108 81,82,83,84 fortyGigE0/108 +Ethernet112 89,90,91,92 fortyGigE0/112 +Ethernet116 93,94,95,96 fortyGigE0/116 +Ethernet120 97,98,99,100 fortyGigE0/120 +Ethernet124 101,102,103,104 fortyGigE0/124 diff --git a/src/sonic-config-engine/platform/Force10-S6100/alias_map.json b/src/sonic-config-engine/platform/Force10-S6100/alias_map.json deleted file mode 100644 index 19a1ef662d37..000000000000 --- a/src/sonic-config-engine/platform/Force10-S6100/alias_map.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "Ethernet0": "fortyGigE1/1/1", - "Ethernet1": "fortyGigE1/1/2", - "Ethernet2": "fortyGigE1/1/3", - "Ethernet3": "fortyGigE1/1/4", - "Ethernet4": "fortyGigE1/1/5", - "Ethernet5": "fortyGigE1/1/6", - "Ethernet6": "fortyGigE1/1/7", - "Ethernet7": "fortyGigE1/1/8", - "Ethernet8": "fortyGigE1/1/9", - "Ethernet9": "fortyGigE1/1/10", - "Ethernet10": "fortyGigE1/1/11", - "Ethernet11": "fortyGigE1/1/12", - "Ethernet12": "fortyGigE1/1/13", - "Ethernet13": "fortyGigE1/1/14", - "Ethernet14": "fortyGigE1/1/15", - "Ethernet15": "fortyGigE1/1/16", - "Ethernet16": "fortyGigE1/2/1", - "Ethernet17": "fortyGigE1/2/2", - "Ethernet18": "fortyGigE1/2/3", - "Ethernet19": "fortyGigE1/2/4", - "Ethernet20": "fortyGigE1/2/5", - "Ethernet21": "fortyGigE1/2/6", - "Ethernet22": "fortyGigE1/2/7", - "Ethernet23": "fortyGigE1/2/8", - "Ethernet24": "fortyGigE1/2/9", - "Ethernet25": "fortyGigE1/2/10", - "Ethernet26": "fortyGigE1/2/11", - "Ethernet27": "fortyGigE1/2/12", - "Ethernet28": "fortyGigE1/2/13", - "Ethernet29": "fortyGigE1/2/14", - "Ethernet30": "fortyGigE1/2/15", - "Ethernet31": "fortyGigE1/2/16", - "Ethernet32": "fortyGigE1/3/1", - "Ethernet33": "fortyGigE1/3/2", - "Ethernet34": "fortyGigE1/3/3", - "Ethernet34": "fortyGigE1/3/4", - "Ethernet36": "fortyGigE1/3/5", - "Ethernet37": "fortyGigE1/3/6", - "Ethernet38": "fortyGigE1/3/7", - "Ethernet39": "fortyGigE1/3/8", - "Ethernet40": "fortyGigE1/3/9", - "Ethernet41": "fortyGigE1/3/10", - "Ethernet42": "fortyGigE1/3/11", - "Ethernet43": "fortyGigE1/3/12", - "Ethernet44": "fortyGigE1/3/13", - "Ethernet45": "fortyGigE1/3/14", - "Ethernet46": "fortyGigE1/3/15", - "Ethernet47": "fortyGigE1/3/16", - "Ethernet48": "fortyGigE1/4/1", - "Ethernet49": "fortyGigE1/4/2", - "Ethernet50": "fortyGigE1/4/3", - "Ethernet51": "fortyGigE1/4/4", - "Ethernet52": "fortyGigE1/4/5", - "Ethernet53": "fortyGigE1/4/6", - "Ethernet54": "fortyGigE1/4/7", - "Ethernet55": "fortyGigE1/4/8", - "Ethernet56": "fortyGigE1/4/9", - "Ethernet57": "fortyGigE1/4/10", - "Ethernet58": "fortyGigE1/4/11", - "Ethernet59": "fortyGigE1/4/12", - "Ethernet60": "fortyGigE1/4/13", - "Ethernet61": "fortyGigE1/4/14", - "Ethernet62": "fortyGigE1/4/15", - "Ethernet63": "fortyGigE1/4/16" -} diff --git a/src/sonic-config-engine/platform/Force10-S6100/port_config.ini b/src/sonic-config-engine/platform/Force10-S6100/port_config.ini index 67e558963f36..dcdd6548c198 100644 --- a/src/sonic-config-engine/platform/Force10-S6100/port_config.ini +++ b/src/sonic-config-engine/platform/Force10-S6100/port_config.ini @@ -1,65 +1,65 @@ -# alias lanes -Ethernet0 101,102 -Ethernet1 103,104 -Ethernet2 97,98 -Ethernet3 99,100 -Ethernet4 69,70 -Ethernet5 71,72 -Ethernet6 65,66 -Ethernet7 67,68 -Ethernet8 53,54 -Ethernet9 55,56 -Ethernet10 49,50 -Ethernet11 51,52 -Ethernet12 21,22 -Ethernet13 23,24 -Ethernet14 17,18 -Ethernet15 19,20 -Ethernet16 25,26 -Ethernet17 27,28 -Ethernet18 29,30 -Ethernet19 31,32 -Ethernet20 57,58 -Ethernet21 59,60 -Ethernet22 61,62 -Ethernet23 63,64 -Ethernet24 73,74 -Ethernet25 75,76 -Ethernet26 77,78 -Ethernet27 79,80 -Ethernet28 105,106 -Ethernet29 107,108 -Ethernet30 109,110 -Ethernet31 111,112 -Ethernet32 13,14 -Ethernet33 15,16 -Ethernet34 9,10 -Ethernet35 11,12 -Ethernet36 125,126 -Ethernet37 127,128 -Ethernet38 121,122 -Ethernet39 123,124 -Ethernet40 93,94 -Ethernet41 95,96 -Ethernet42 89,90 -Ethernet43 91,92 -Ethernet44 45,46 -Ethernet45 47,48 -Ethernet46 41,42 -Ethernet47 43,44 -Ethernet48 113,114 -Ethernet49 115,116 -Ethernet50 117,118 -Ethernet51 119,120 -Ethernet52 1,2 -Ethernet53 3,4 -Ethernet54 5,6 -Ethernet55 7,8 -Ethernet56 33,34 -Ethernet57 35,36 -Ethernet58 37,38 -Ethernet59 39,40 -Ethernet60 81,82 -Ethernet61 83,84 -Ethernet62 85,86 -Ethernet63 87,88 +# name lanes alias +Ethernet0 101,102 fortyGigE1/1/1 +Ethernet1 103,104 fortyGigE1/1/2 +Ethernet2 97,98 fortyGigE1/1/3 +Ethernet3 99,100 fortyGigE1/1/4 +Ethernet4 69,70 fortyGigE1/1/5 +Ethernet5 71,72 fortyGigE1/1/6 +Ethernet6 65,66 fortyGigE1/1/7 +Ethernet7 67,68 fortyGigE1/1/8 +Ethernet8 53,54 fortyGigE1/1/9 +Ethernet9 55,56 fortyGigE1/1/10 +Ethernet10 49,50 fortyGigE1/1/11 +Ethernet11 51,52 fortyGigE1/1/12 +Ethernet12 21,22 fortyGigE1/1/13 +Ethernet13 23,24 fortyGigE1/1/14 +Ethernet14 17,18 fortyGigE1/1/15 +Ethernet15 19,20 fortyGigE1/1/16 +Ethernet16 25,26 fortyGigE1/2/1 +Ethernet17 27,28 fortyGigE1/2/2 +Ethernet18 29,30 fortyGigE1/2/3 +Ethernet19 31,32 fortyGigE1/2/4 +Ethernet20 57,58 fortyGigE1/2/5 +Ethernet21 59,60 fortyGigE1/2/6 +Ethernet22 61,62 fortyGigE1/2/7 +Ethernet23 63,64 fortyGigE1/2/8 +Ethernet24 73,74 fortyGigE1/2/9 +Ethernet25 75,76 fortyGigE1/2/10 +Ethernet26 77,78 fortyGigE1/2/11 +Ethernet27 79,80 fortyGigE1/2/12 +Ethernet28 105,106 fortyGigE1/2/13 +Ethernet29 107,108 fortyGigE1/2/14 +Ethernet30 109,110 fortyGigE1/2/15 +Ethernet31 111,112 fortyGigE1/2/16 +Ethernet32 13,14 fortyGigE1/3/1 +Ethernet33 15,16 fortyGigE1/3/2 +Ethernet34 9,10 fortyGigE1/3/3 +Ethernet35 11,12 fortyGigE1/3/4 +Ethernet36 125,126 fortyGigE1/3/5 +Ethernet37 127,128 fortyGigE1/3/6 +Ethernet38 121,122 fortyGigE1/3/7 +Ethernet39 123,124 fortyGigE1/3/8 +Ethernet40 93,94 fortyGigE1/3/9 +Ethernet41 95,96 fortyGigE1/3/10 +Ethernet42 89,90 fortyGigE1/3/11 +Ethernet43 91,92 fortyGigE1/3/12 +Ethernet44 45,46 fortyGigE1/3/13 +Ethernet45 47,48 fortyGigE1/3/14 +Ethernet46 41,42 fortyGigE1/3/15 +Ethernet47 43,44 fortyGigE1/3/16 +Ethernet48 113,114 fortyGigE1/4/1 +Ethernet49 115,116 fortyGigE1/4/2 +Ethernet50 117,118 fortyGigE1/4/3 +Ethernet51 119,120 fortyGigE1/4/4 +Ethernet52 1,2 fortyGigE1/4/5 +Ethernet53 3,4 fortyGigE1/4/6 +Ethernet54 5,6 fortyGigE1/4/7 +Ethernet55 7,8 fortyGigE1/4/8 +Ethernet56 33,34 fortyGigE1/4/9 +Ethernet57 35,36 fortyGigE1/4/10 +Ethernet58 37,38 fortyGigE1/4/11 +Ethernet59 39,40 fortyGigE1/4/12 +Ethernet60 81,82 fortyGigE1/4/13 +Ethernet61 83,84 fortyGigE1/4/14 +Ethernet62 85,86 fortyGigE1/4/15 +Ethernet63 87,88 fortyGigE1/4/16 diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py index 92f1b2f84869..37c61b84ae5f 100644 --- a/src/sonic-config-engine/setup.py +++ b/src/sonic-config-engine/setup.py @@ -10,8 +10,6 @@ def get_platform_file_list(): platforms = os.listdir(data_path) for platform in platforms: files = ['platform/' + platform + '/port_config.ini'] - if os.path.isfile( os.path.join(data_path, platform, 'alias_map.json') ): - files.append('platform/' + platform + '/alias_map.json') #If a platform doesnot have alias_map.json minigraph.py will fall back to no alias mapping if os.path.isfile( os.path.join(data_path, platform, 'sensors.conf') ): files.append('platform/' + platform + '/sensors.conf') #Not all platforms need to have a sensors.conf file data_files.append( (os.path.join('/usr/share/sonic', platform), files) ) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 01774885b578..18540a548338 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -34,6 +34,18 @@ def is_ipv6(value): return False return addr.version == 6 +def get_machine_info(): + if not os.path.isfile('/host/machine.conf'): + return None + machine_vars = {} + with open('/host/machine.conf') as machine_file: + for line in machine_file: + tokens = line.split('=') + if len(tokens) < 2: + continue + machine_vars[tokens[0]] = tokens[1].strip() + return machine_vars + def main(): parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") @@ -49,10 +61,19 @@ def main(): args = parser.parse_args() data = {} + machine_info = get_machine_info() + data.update(machine_info) + if machine_info.has_key('onie_platform'): + data['platform'] = machine_info['onie_platform'] + elif machine_info.has_key('aboot_platform'): + data['platform'] = machine_info['aboot_platform'] if args.minigraph != None: minigraph = args.minigraph - data.update(parse_xml(minigraph)) + if data.has_key('platform'): + data.update(parse_xml(minigraph, data['platform'])) + else: + data.update(parse_xml(minigraph)) if args.yaml != None: with open(args.yaml, 'r') as stream: From ea372cc7c16115ab617905eb648e81dc48aff69a Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 17 Feb 2017 13:47:01 -0800 Subject: [PATCH 0287/1011] Add get_graph service to fetch minigraph automatically (#288) - Add a functionality to get SNMP community from DHCP (option 224) - Add a functionality to get minigraph from http service instead of using default minigraph - The url for graph service is passed through DHCP option 225 - This feature is by default disabled. Modify rule/config to enable it on build time, or modify /etc/sonic/graph_service_url on run time. - Fix a bug that getting hostname from DHCP is not working correctly --- build_debian.sh | 6 ++- .../build_templates/sonic_debian_extension.j2 | 15 ++++++ files/dhcp/dhclient.conf | 24 +++++++++ files/dhcp/graphserviceurl | 9 ++++ files/dhcp/sethostname | 31 +++++------- files/dhcp/snmpcommunity | 11 ++++ files/image_config/interfaces/init_interfaces | 11 ++++ .../interfaces/interfaces-config.service | 2 +- .../interfaces/interfaces-config.sh | 3 ++ files/image_config/updategraph/updategraph | 50 +++++++++++++++++++ .../updategraph/updategraph.service | 12 +++++ rules/config | 7 +++ slave.mk | 2 + 13 files changed, 162 insertions(+), 21 deletions(-) create mode 100644 files/dhcp/dhclient.conf create mode 100644 files/dhcp/graphserviceurl create mode 100644 files/dhcp/snmpcommunity create mode 100644 files/image_config/interfaces/init_interfaces create mode 100755 files/image_config/updategraph/updategraph create mode 100644 files/image_config/updategraph/updategraph.service diff --git a/build_debian.sh b/build_debian.sh index 46d23355dd63..2d6cc35533f6 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -188,7 +188,8 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in usbutils \ pciutils \ iptables-persistent \ - logrotate + logrotate \ + curl ## Remove sshd host keys, and will regenerate on first sshd start sudo rm -f $FILESYSTEM_ROOT/etc/ssh/ssh_host_*_key* @@ -241,6 +242,9 @@ EOF sudo cp files/dhcp/rfc3442-classless-routes $FILESYSTEM_ROOT/etc/dhcp/dhclient-exit-hooks.d sudo cp files/dhcp/sethostname $FILESYSTEM_ROOT/etc/dhcp/dhclient-exit-hooks.d/ +sudo cp files/dhcp/graphserviceurl $FILESYSTEM_ROOT/etc/dhcp/dhclient-exit-hooks.d/ +sudo cp files/dhcp/snmpcommunity $FILESYSTEM_ROOT/etc/dhcp/dhclient-exit-hooks.d/ +sudo cp files/dhcp/dhclient.conf $FILESYSTEM_ROOT/etc/dhcp/ if [ -f sonic_debian_extension.sh ]; then ./sonic_debian_extension.sh $FILESYSTEM_ROOT diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index d0d4fc7849a4..ad7541fe0fc1 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -94,6 +94,21 @@ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable interfaces-config.service sudo cp $IMAGE_CONFIGS/interfaces/interfaces-config.sh $FILESYSTEM_ROOT/usr/bin/ sudo cp $IMAGE_CONFIGS/interfaces/*.j2 $FILESYSTEM_ROOT/etc/sonic/templates/ +# Copy initial interfaces configuration file, will be overwritten on first boot +sudo cp $IMAGE_CONFIGS/interfaces/init_interfaces $FILESYSTEM_ROOT/etc/network + +# Copy updategraph script and service file +sudo cp $IMAGE_CONFIGS/updategraph/updategraph.service $FILESYSTEM_ROOT/etc/systemd/system/ +sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable updategraph.service +sudo cp $IMAGE_CONFIGS/updategraph/updategraph $FILESYSTEM_ROOT/usr/bin/ +{% if enable_dhcp_graph_service == "y" %} +sudo bash -c "echo enabled=true > $FILESYSTEM_ROOT/etc/sonic/updategraph.conf" +sudo bash -c "echo src=dhcp >> $FILESYSTEM_ROOT/etc/sonic/updategraph.conf" +sudo bash -c "echo dhcp_as_static=true >> $FILESYSTEM_ROOT/etc/sonic/updategraph.conf" +{% else %} +sudo bash -c "echo enabled=false > $FILESYSTEM_ROOT/etc/sonic/updategraph.conf" +{% endif %} + # Copy SNMP configuration files sudo cp $IMAGE_CONFIGS/snmp/snmp.yml $FILESYSTEM_ROOT/etc/sonic/ diff --git a/files/dhcp/dhclient.conf b/files/dhcp/dhclient.conf new file mode 100644 index 000000000000..ce4ac4d9f445 --- /dev/null +++ b/files/dhcp/dhclient.conf @@ -0,0 +1,24 @@ +# Configuration file for /sbin/dhclient, which is included in Debian's +# dhcp3-client package. +# +# This is a sample configuration file for dhclient. See dhclient.conf's +# man page for more information about the syntax of this file +# and a more comprehensive list of the parameters understood by +# dhclient. +# +# Normally, if the DHCP server provides reasonable information and does +# not leave anything out (like the domain name, for example), then +# few changes must be made to this file, if any. +# + +option rfc3442-classless-static-routes code 121 = array of unsigned integer 8; +option snmp-community code 224 = text; +option minigraph-url code 225 = text; + +send host-name = gethostname(); +request subnet-mask, broadcast-address, time-offset, routers, + domain-name, domain-name-servers, domain-search, host-name, + dhcp6.name-servers, dhcp6.domain-search, + netbios-name-servers, netbios-scope, interface-mtu, + rfc3442-classless-static-routes, ntp-servers, snmp-community, minigraph-url; + diff --git a/files/dhcp/graphserviceurl b/files/dhcp/graphserviceurl new file mode 100644 index 000000000000..0e8b1b83e141 --- /dev/null +++ b/files/dhcp/graphserviceurl @@ -0,0 +1,9 @@ +case $reason in + BOUND|RENEW|REBIND|REBOOT) + if [ -n "$new_minigraph_url" ]; then + echo $new_minigraph_url > /tmp/dhcp_graph_url + else + echo "N/A" > /tmp/dhcp_graph_url + fi + ;; +esac diff --git a/files/dhcp/sethostname b/files/dhcp/sethostname index 81bd458935fc..57f96ce63612 100644 --- a/files/dhcp/sethostname +++ b/files/dhcp/sethostname @@ -1,20 +1,13 @@ -#!/bin/bash -# This script is to update hostname of the system. +case $reason in + BOUND|RENEW|REBIND|REBOOT) + current_host_name=`hostname -s` + if [ "$current_host_name" != "$new_host_name" ] && [ -n "$new_host_name" ] + then + echo $new_host_name > /etc/hostname + hostname -F /etc/hostname + sed -i "/\s$current_host_name$/d" /etc/hosts + echo "127.0.0.1 $new_host_name" >> /etc/hosts + fi + ;; +esac -if [ "$reason" != BOUND ] && [ "$reason" != RENEW ] \ - && [ "$reason" != REBIND ] && [ "$reason" != REBOOT ] -then - exit 0 -fi - -current_host_name=`hostname -s` - -if [ "$current_host_name" != "$new_host_name" ] -then - echo $new_host_name > /etc/hostname - line_to_replace=`grep 127.0.0.1.*$current_host_name /etc/hosts` - new_line=`echo $line_to_replace | sed "s/$current_host_name/$new_host_name/"` - sed -i "s/$line_to_replace/$new_line/" /etc/hosts - - hostname -F /etc/hostname -fi diff --git a/files/dhcp/snmpcommunity b/files/dhcp/snmpcommunity new file mode 100644 index 000000000000..63924e01fc5f --- /dev/null +++ b/files/dhcp/snmpcommunity @@ -0,0 +1,11 @@ +case $reason in + BOUND|RENEW|REBIND|REBOOT) + if [ -n "${new_snmp_community}" ]; then + if [ -f /etc/sonic/snmp.yml ]; then + sed -i "s/^snmp_rocommunity:.*/snmp_rocommunity: $new_snmp_community/g" /etc/sonic/snmp.yml + else + echo "snmp_rocommunity: "$new_snmp_community > /etc/sonic/snmp.yml + fi + fi + ;; +esac diff --git a/files/image_config/interfaces/init_interfaces b/files/image_config/interfaces/init_interfaces new file mode 100644 index 000000000000..b13a36df47f8 --- /dev/null +++ b/files/image_config/interfaces/init_interfaces @@ -0,0 +1,11 @@ +# Initial /etc/network/interface file for first boot +# Will be overwritten based on minigraph information by interfaces-config service + +# The loopback network interface +auto lo +iface lo inet loopback +# +# The management network interface +auto eth0 +iface eth0 inet dhcp + diff --git a/files/image_config/interfaces/interfaces-config.service b/files/image_config/interfaces/interfaces-config.service index 48d6ede42557..92a82aeee0b8 100644 --- a/files/image_config/interfaces/interfaces-config.service +++ b/files/image_config/interfaces/interfaces-config.service @@ -1,6 +1,6 @@ [Unit] Description=Update interfaces configuration -Before=network.target +Before=database.service [Service] Type=oneshot diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index 69d72e916477..286c94796952 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -3,3 +3,6 @@ sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/sonic/templates/interfaces.j2 >/etc/network/interfaces sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/sonic/templates/vlan_interfaces.j2 >/etc/network/interfaces.d/vlan_interfaces sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/sonic/templates/lag_interfaces.j2 >/etc/network/interfaces.d/lag_interfaces +ifdown eth0 && ifup eth0 +ifdown lo && ifup lo + diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph new file mode 100755 index 000000000000..203905b85c7c --- /dev/null +++ b/files/image_config/updategraph/updategraph @@ -0,0 +1,50 @@ +#!/bin/bash + +if [ ! -f /etc/sonic/updategraph.conf ]; then + echo "No updategraph.conf found, generating a default one." + echo "enabled=false" >/etc/sonic/updategraph.conf +fi + +. /etc/sonic/updategraph.conf + +if [ "$enabled" != "true" ]; then + echo "Disabled in updategraph.conf. Skipping graph update." + exit 0 +fi + +if [ "$src" = "dhcp" ]; then + while [ ! -f /tmp/dhcp_graph_url ]; do + echo "Waiting for DHCP response..." + sleep 1 + done + + if [ "`cat /tmp/dhcp_graph_url`" = "N/A" ]; then + echo "No graph_url option in DHCP response. Skipping graph update." + if [ "$dhcp_as_static" = "true" ]; then + sed -i "/enabled=/d" /etc/sonic/updategraph.conf + echo "enabled=false" >> /etc/sonic/updategraph.conf + fi + exit 0 + fi + + HOSTNAME=`hostname -s` + GRAPH_URL=`sonic-cfggen -t /tmp/dhcp_graph_url -a "{\"hostname\": \"$HOSTNAME\"}"` + if [ "$dhcp_as_static" = "true" ]; then + sed -i "/src=d/d" /etc/sonic/updategraph.conf + echo "src=$GRAPH_URL" >> /etc/sonic/updategraph.conf + fi +else + GRAPH_URL=$src +fi + +if [ -f /etc/sonic/minigraph.xml ]; then + echo "Renaming minigraph.xml to minigraph.old" + mv /etc/sonic/minigraph.xml /etc/sonic/minigraph.old +fi + +echo "Getting minigraph from $GRAPH_URL" + +while true; do + curl -f $GRAPH_URL -o /etc/sonic/minigraph.xml --connect-timeout 15 && break + sleep 5 +done diff --git a/files/image_config/updategraph/updategraph.service b/files/image_config/updategraph/updategraph.service new file mode 100644 index 000000000000..ba0b5dcb85e2 --- /dev/null +++ b/files/image_config/updategraph/updategraph.service @@ -0,0 +1,12 @@ +[Unit] +Description=download minigraph from graph service +Before=ntp-config.service +Before=rsyslog-config.service +Before=interfaces-config.service + +[Service] +Type=oneshot +ExecStart=/usr/bin/updategraph + +[Install] +WantedBy=multi-user.target diff --git a/rules/config b/rules/config index 142a7c0d10f7..ea4f32de1481 100644 --- a/rules/config +++ b/rules/config @@ -35,3 +35,10 @@ USERNAME = admin # PASSWORD - password for installer build PASSWORD = YourPaSsWoRd + +# ENABLE_DHCP_GRAPH_SERVICE - specify the source of minigraph to generate configuration file. +# If set to y SONiC will get the minigraph from graph service. Graph service URL need to be +# passed through DHCP option 225. +# If not set (default behavior) the default minigraph built into the image will be used. +# ENABLE_DHCP_GRAPH_SERVICE = y + diff --git a/slave.mk b/slave.mk index c2d4fe983b0b..4ea96d1f4c80 100644 --- a/slave.mk +++ b/slave.mk @@ -298,6 +298,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export sonicadmin_user="$(USERNAME)" export sonic_hwsku="$(CONFIGURED_SKU)" export sonic_asic_platform="$(CONFIGURED_PLATFORM)" + export enable_dhcp_graph_service="$(ENABLE_DHCP_GRAPH_SERVICE)" + $(foreach docker, $($*_DOCKERS),\ export docker_image="$(docker)" export docker_image_name="$(basename $(docker))" From 5573a8204eeb1209701b3d2253aa4227199be65d Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 17 Feb 2017 19:47:50 -0800 Subject: [PATCH 0288/1011] Allow sonic-cfggen to work in environment without /host/machine.conf (#307) --- src/sonic-config-engine/sonic-cfggen | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 18540a548338..02518b3ea364 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -62,11 +62,12 @@ def main(): data = {} machine_info = get_machine_info() - data.update(machine_info) - if machine_info.has_key('onie_platform'): - data['platform'] = machine_info['onie_platform'] - elif machine_info.has_key('aboot_platform'): - data['platform'] = machine_info['aboot_platform'] + if machine_info != None: + data.update(machine_info) + if machine_info.has_key('onie_platform'): + data['platform'] = machine_info['onie_platform'] + elif machine_info.has_key('aboot_platform'): + data['platform'] = machine_info['aboot_platform'] if args.minigraph != None: minigraph = args.minigraph From 81d7119c579cb056b3c7524dabc91ee6b666e566 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 18 Feb 2017 14:10:13 -0800 Subject: [PATCH 0289/1011] [platform]: change baudrate for wedge100 platform (#308) --- installer/x86_64/platforms/x86_64-facebook_wedge100-r0 | 1 + 1 file changed, 1 insertion(+) create mode 100644 installer/x86_64/platforms/x86_64-facebook_wedge100-r0 diff --git a/installer/x86_64/platforms/x86_64-facebook_wedge100-r0 b/installer/x86_64/platforms/x86_64-facebook_wedge100-r0 new file mode 100644 index 000000000000..3714ff053bb0 --- /dev/null +++ b/installer/x86_64/platforms/x86_64-facebook_wedge100-r0 @@ -0,0 +1 @@ +CONSOLE_SPEED=57600 From 073c28bf15a3a1a99ca4d30455e971f695893a13 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Sat, 18 Feb 2017 17:50:29 -0800 Subject: [PATCH 0290/1011] Move template files to /usr/share/sonic/templates (#305) --- dockers/docker-dhcp-relay/Dockerfile | 2 +- dockers/docker-dhcp-relay/config.sh | 2 +- dockers/docker-fpm/Dockerfile.j2 | 2 +- dockers/docker-fpm/config.sh | 8 ++++---- dockers/docker-lldp-sv2/Dockerfile.j2 | 2 +- dockers/docker-lldp-sv2/config.sh | 2 +- dockers/docker-snmp-sv2/Dockerfile.j2 | 2 +- dockers/docker-snmp-sv2/config.sh | 4 ++-- dockers/docker-teamd/Dockerfile.j2 | 2 +- dockers/docker-teamd/config.sh | 2 +- files/build_templates/sonic_debian_extension.j2 | 8 ++++---- files/image_config/interfaces/interfaces-config.sh | 6 +++--- files/image_config/ntp/ntp-config.sh | 2 +- files/image_config/rsyslog/rsyslog-config.sh | 2 +- 14 files changed, 23 insertions(+), 23 deletions(-) diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile index af7bdcb830c1..fbdabe333e6e 100644 --- a/dockers/docker-dhcp-relay/Dockerfile +++ b/dockers/docker-dhcp-relay/Dockerfile @@ -13,7 +13,7 @@ RUN apt-get -y install isc-dhcp-relay RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -COPY ["isc-dhcp-relay.j2", "/usr/share/dhcp-relay/"] +COPY ["isc-dhcp-relay.j2", "/usr/share/sonic/templates/"] COPY ["config.sh", "/usr/bin/"] ENTRYPOINT /usr/bin/config.sh \ diff --git a/dockers/docker-dhcp-relay/config.sh b/dockers/docker-dhcp-relay/config.sh index 42146b0343bc..f0a861cfb997 100755 --- a/dockers/docker-dhcp-relay/config.sh +++ b/dockers/docker-dhcp-relay/config.sh @@ -1,4 +1,4 @@ #!/bin/bash -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/dhcp_relay.yml -t /usr/share/dhcp-relay/isc-dhcp-relay.j2 > /etc/default/isc-dhcp-relay +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/dhcp_relay.yml -t /usr/share/sonic/templates/isc-dhcp-relay.j2 > /etc/default/isc-dhcp-relay diff --git a/dockers/docker-fpm/Dockerfile.j2 b/dockers/docker-fpm/Dockerfile.j2 index 3f7445bd862c..65b9cfa3121a 100644 --- a/dockers/docker-fpm/Dockerfile.j2 +++ b/dockers/docker-fpm/Dockerfile.j2 @@ -22,7 +22,7 @@ debs/{{ deb }}{{' '}} RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -COPY ["*.j2", "/etc/swss/bgp/"] +COPY ["*.j2", "/usr/share/sonic/templates/"] COPY ["start.sh", "config.sh", "/usr/bin/"] COPY ["daemons", "/etc/quagga/"] diff --git a/dockers/docker-fpm/config.sh b/dockers/docker-fpm/config.sh index c1d3db29a1bd..b7fbb90344e9 100755 --- a/dockers/docker-fpm/config.sh +++ b/dockers/docker-fpm/config.sh @@ -1,14 +1,14 @@ #!/bin/bash mkdir -p /etc/quagga -sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/bgp/bgpd.conf.j2 >/etc/quagga/bgpd.conf -sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/bgp/zebra.conf.j2 >/etc/quagga/zebra.conf +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 -t /usr/share/sonic/templates/zebra.conf.j2 >/etc/quagga/zebra.conf -sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/bgp/isolate.j2 >/usr/sbin/bgp-isolate +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/isolate.j2 >/usr/sbin/bgp-isolate chown root:root /usr/sbin/bgp-isolate chmod 0755 /usr/sbin/bgp-isolate -sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/bgp/unisolate.j2 >/usr/sbin/bgp-unisolate +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/unisolate.j2 >/usr/sbin/bgp-unisolate chown root:root /usr/sbin/bgp-unisolate chmod 0755 /usr/sbin/bgp-unisolate diff --git a/dockers/docker-lldp-sv2/Dockerfile.j2 b/dockers/docker-lldp-sv2/Dockerfile.j2 index 79cdbb172f66..4ff66944fe07 100644 --- a/dockers/docker-lldp-sv2/Dockerfile.j2 +++ b/dockers/docker-lldp-sv2/Dockerfile.j2 @@ -31,7 +31,7 @@ RUN pip install /python-wheels/sswsdk-2.0.1-py2-none-any.whl && \ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY reconfigure.sh /opt/reconfigure.sh COPY ["config.sh", "/usr/bin/"] -COPY ["lldpd.conf.j2", "/etc/swss/lldp/"] +COPY ["lldpd.conf.j2", "/usr/share/sonic/templates/"] COPY ["lldpd", "/etc/default/"] ENTRYPOINT /usr/bin/config.sh && /usr/bin/supervisord diff --git a/dockers/docker-lldp-sv2/config.sh b/dockers/docker-lldp-sv2/config.sh index 29c9b11f8ed5..842a10306c4f 100755 --- a/dockers/docker-lldp-sv2/config.sh +++ b/dockers/docker-lldp-sv2/config.sh @@ -1,6 +1,6 @@ #!/bin/bash -sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/swss/lldp/lldpd.conf.j2 >/etc/lldpd.conf +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/lldpd.conf.j2 >/etc/lldpd.conf mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index 332f485f72e6..db5a6a574f48 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -41,7 +41,7 @@ RUN apt-get update && apt-get install -y supervisor \ rm -rf ~/.cache COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY ["*.j2", "/etc/swss/snmp/"] +COPY ["*.j2", "/usr/share/sonic/templates/"] COPY ["config.sh", "/usr/bin/"] ## Although exposing ports is not need for host net mode, keep it for possible bridge mode diff --git a/dockers/docker-snmp-sv2/config.sh b/dockers/docker-snmp-sv2/config.sh index 0681416b1acb..f22dcd23b0d3 100755 --- a/dockers/docker-snmp-sv2/config.sh +++ b/dockers/docker-snmp-sv2/config.sh @@ -2,11 +2,11 @@ mkdir -p /etc/ssw -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/sonic_version.yml -t /etc/swss/snmp/sysDescription.j2 >/etc/ssw/sysDescription +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/sonic_version.yml -t /usr/share/sonic/templates/sysDescription.j2 >/etc/ssw/sysDescription mkdir -p /etc/snmp -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/snmp.yml -t /etc/swss/snmp/snmpd.conf.j2 >/etc/snmp/snmpd.conf +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/snmp.yml -t /usr/share/sonic/templates/snmpd.conf.j2 >/etc/snmp/snmpd.conf hwsku=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` /bin/cp -rf /usr/share/sonic/$hwsku/alias_map.json /etc/snmp/ diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index 7cb86e5b7e69..42d8758638af 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -14,7 +14,7 @@ debs/{{ deb }}{{' '}} {%- endfor %} COPY ["start.sh", "config.sh", "/usr/bin/"] -COPY ["teamd.j2", "/etc/swss/teamd/"] +COPY ["teamd.j2", "/usr/share/sonic/templates"] ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-teamd/config.sh b/dockers/docker-teamd/config.sh index 085a3d405af2..8259e2faf312 100755 --- a/dockers/docker-teamd/config.sh +++ b/dockers/docker-teamd/config.sh @@ -3,7 +3,7 @@ mkdir -p /etc/teamd for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml --var-keys minigraph_portchannel_interfaces`; do - sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'"}' -t /etc/swss/teamd/teamd.j2 >/etc/teamd/$pc.conf + sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'"}' -t /usr/share/sonic/templates/teamd.j2 >/etc/teamd/$pc.conf done mkdir -p /var/sonic diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index ad7541fe0fc1..f69d9ff87372 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -59,7 +59,7 @@ sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/sonic-utilities_*.deb || \ # Create all needed directories sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/ -sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/templates/ +sudo mkdir -p $FILESYSTEM_ROOT/usr/share/sonic/templates/ # Apply apt configuration files sudo cp $IMAGE_CONFIGS/apt/sources.list $FILESYSTEM_ROOT/etc/apt/ @@ -77,14 +77,14 @@ sudo cp $IMAGE_CONFIGS/minigraph/minigraph_{{sonic_hwsku}}.xml $FILESYSTEM_ROOT/ sudo cp $IMAGE_CONFIGS/ntp/ntp-config.service $FILESYSTEM_ROOT/etc/systemd/system/ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable ntp-config.service sudo cp $IMAGE_CONFIGS/ntp/ntp-config.sh $FILESYSTEM_ROOT/usr/bin/ -sudo cp $IMAGE_CONFIGS/ntp/ntp.conf.j2 $FILESYSTEM_ROOT/etc/sonic/templates/ +sudo cp $IMAGE_CONFIGS/ntp/ntp.conf.j2 $FILESYSTEM_ROOT/usr/share/sonic/templates/ sudo cp $IMAGE_CONFIGS/ntp/ntp.yml $FILESYSTEM_ROOT/etc/sonic/ # Copy rsyslog configuration files and templates sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog-config.service $FILESYSTEM_ROOT/etc/systemd/system/ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable rsyslog-config.service sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog-config.sh $FILESYSTEM_ROOT/usr/bin/ -sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.conf.j2 $FILESYSTEM_ROOT/etc/sonic/templates/ +sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.conf.j2 $FILESYSTEM_ROOT/usr/share/sonic/templates/ sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.yml $FILESYSTEM_ROOT/etc/sonic/ sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.d/* $FILESYSTEM_ROOT/etc/rsyslog.d/ @@ -92,7 +92,7 @@ sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.d/* $FILESYSTEM_ROOT/etc/rsyslog.d/ sudo cp $IMAGE_CONFIGS/interfaces/interfaces-config.service $FILESYSTEM_ROOT/etc/systemd/system/ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable interfaces-config.service sudo cp $IMAGE_CONFIGS/interfaces/interfaces-config.sh $FILESYSTEM_ROOT/usr/bin/ -sudo cp $IMAGE_CONFIGS/interfaces/*.j2 $FILESYSTEM_ROOT/etc/sonic/templates/ +sudo cp $IMAGE_CONFIGS/interfaces/*.j2 $FILESYSTEM_ROOT/usr/share/sonic/templates/ # Copy initial interfaces configuration file, will be overwritten on first boot sudo cp $IMAGE_CONFIGS/interfaces/init_interfaces $FILESYSTEM_ROOT/etc/network diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index 286c94796952..f8b54790c931 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -1,8 +1,8 @@ #!/bin/bash -sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/sonic/templates/interfaces.j2 >/etc/network/interfaces -sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/sonic/templates/vlan_interfaces.j2 >/etc/network/interfaces.d/vlan_interfaces -sonic-cfggen -m /etc/sonic/minigraph.xml -t /etc/sonic/templates/lag_interfaces.j2 >/etc/network/interfaces.d/lag_interfaces +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/interfaces.j2 >/etc/network/interfaces +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/vlan_interfaces.j2 >/etc/network/interfaces.d/vlan_interfaces +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/lag_interfaces.j2 >/etc/network/interfaces.d/lag_interfaces ifdown eth0 && ifup eth0 ifdown lo && ifup lo diff --git a/files/image_config/ntp/ntp-config.sh b/files/image_config/ntp/ntp-config.sh index 0989dfae74be..55a048a71328 100755 --- a/files/image_config/ntp/ntp-config.sh +++ b/files/image_config/ntp/ntp-config.sh @@ -1,3 +1,3 @@ #!/bin/bash -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/ntp.yml -t /etc/sonic/templates/ntp.conf.j2 >/etc/ntp.conf +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/ntp.yml -t /usr/share/sonic/templates/ntp.conf.j2 >/etc/ntp.conf diff --git a/files/image_config/rsyslog/rsyslog-config.sh b/files/image_config/rsyslog/rsyslog-config.sh index a5c46849183a..8c14b9adce9f 100755 --- a/files/image_config/rsyslog/rsyslog-config.sh +++ b/files/image_config/rsyslog/rsyslog-config.sh @@ -1,3 +1,3 @@ #!/bin/bash -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/rsyslog.yml -t /etc/sonic/templates/rsyslog.conf.j2 >/etc/rsyslog.conf +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/rsyslog.yml -t /usr/share/sonic/templates/rsyslog.conf.j2 >/etc/rsyslog.conf From 89d052dc0fab5290fb35a798e11dada29a75175f Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 18 Feb 2017 21:24:03 -0800 Subject: [PATCH 0291/1011] [platform]: update to latest arista platform driver (#310) --- platform/broadcom/sonic-platform-modules-arista | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index db1bf4b8be53..76dddcf648ce 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit db1bf4b8be53d612a98d9468bebc3b3704ae42b1 +Subproject commit 76dddcf648cec1305eeb0ff4ba00ff234e986fd5 From 06ee8b6550a4ce9024ee431ff0f3f45d4287ebe5 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 20 Feb 2017 22:22:18 +0200 Subject: [PATCH 0292/1011] [sonic-utilities]: Update submodule pointer. (#312) Signed-off-by: marian-pritsak --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index a3f98cdb8f07..be32ae1646ce 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit a3f98cdb8f073b567c3d4f552ea53e110da960bb +Subproject commit be32ae1646ce3f98e6fbe15f70aa0629fba0735c From f57fd0bee8e9f3a40e984caabf96f38ffbb9c16a Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Tue, 21 Feb 2017 13:37:07 -0800 Subject: [PATCH 0293/1011] [platform] Add support configurations files for DCS-7060CX-32S (#313) --- dockers/docker-orchagent/start.sh | 2 + .../Arista-7060-CX32S/port_config.ini | 33 +++++++++++++ .../platform/Arista-7060-CX32S/sensors.conf | 47 +++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 src/sonic-config-engine/platform/Arista-7060-CX32S/port_config.ini create mode 100644 src/sonic-config-engine/platform/Arista-7060-CX32S/sensors.conf diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 4ef7638809e5..1a42f5146a8e 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -45,6 +45,8 @@ elif [ "$HWSKU" == "Arista-7050-QX32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" SWSSCONFIG_ARGS+="td2.32ports.qos.1.json td2.32ports.qos.2.json td2.32ports.qos.3.json td2.32ports.qos.4.json td2.32ports.qos.5.json td2.32ports.qos.6.json " SWSSCONFIG_ARGS+="td2.32ports.buffers.1.json td2.32ports.buffers.2.json td2.32ports.buffers.3.json " +elif [ "$HWSKU" == "Arista-7060-CX32S" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "AS7512" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" fi diff --git a/src/sonic-config-engine/platform/Arista-7060-CX32S/port_config.ini b/src/sonic-config-engine/platform/Arista-7060-CX32S/port_config.ini new file mode 100644 index 000000000000..414fb94efbc1 --- /dev/null +++ b/src/sonic-config-engine/platform/Arista-7060-CX32S/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 33,34,35,36 Ethernet1/1 +Ethernet4 37,38,39,40 Ethernet2/1 +Ethernet8 41,42,43,44 Ethernet3/1 +Ethernet12 45,46,47,48 Ethernet4/1 +Ethernet16 49,50,51,52 Ethernet5/1 +Ethernet20 53,54,55,56 Ethernet6/1 +Ethernet24 57,58,59,60 Ethernet7/1 +Ethernet28 61,62,63,64 Ethernet8/1 +Ethernet32 65,66,67,68 Ethernet9/1 +Ethernet36 69,70,71,72 Ethernet10/1 +Ethernet40 73,74,75,76 Ethernet11/1 +Ethernet44 77,78,79,80 Ethernet12/1 +Ethernet48 81,82,83,84 Ethernet13/1 +Ethernet52 85,86,87,88 Ethernet14/1 +Ethernet56 89,90,91,92 Ethernet15/1 +Ethernet60 93,94,95,96 Ethernet16/1 +Ethernet64 97,98,99,100 Ethernet17/1 +Ethernet68 101,102,103,104 Ethernet18/1 +Ethernet72 105,106,107,108 Ethernet19/1 +Ethernet76 109,110,111,112 Ethernet20/1 +Ethernet80 113,114,115,116 Ethernet21/1 +Ethernet84 117,118,119,120 Ethernet22/1 +Ethernet88 121,122,123,124 Ethernet23/1 +Ethernet92 125,126,127,128 Ethernet24/1 +Ethernet96 1,2,3,4 Ethernet25/1 +Ethernet100 5,6,7,8 Ethernet26/1 +Ethernet104 9,10,11,12 Ethernet27/1 +Ethernet108 13,14,15,16 Ethernet28/1 +Ethernet112 17,18,19,20 Ethernet29/1 +Ethernet116 21,22,23,24 Ethernet30/1 +Ethernet120 25,26,27,28 Ethernet31/1 +Ethernet124 29,30,31,32 Ethernet32/1 diff --git a/src/sonic-config-engine/platform/Arista-7060-CX32S/sensors.conf b/src/sonic-config-engine/platform/Arista-7060-CX32S/sensors.conf new file mode 100644 index 000000000000..3b4dd2385322 --- /dev/null +++ b/src/sonic-config-engine/platform/Arista-7060-CX32S/sensors.conf @@ -0,0 +1,47 @@ +# libsensors configuration file for DCS-7060CX-32S +# ------------------------------------------------ +# + +bus "i2c-2" "SCD SMBus master 0 bus 0" +bus "i2c-3" "SCD SMBus master 0 bus 1" +bus "i2c-5" "SCD SMBus master 0 bus 3" +bus "i2c-6" "SCD SMBus master 0 bus 4" +bus "i2c-7" "SCD SMBus master 0 bus 5" + +chip "k10temp-pci-00c3" + label temp1 "Cpu temp sensor" + +# missing support for +# chip "max6697-i2c-2-1a" +# board sensor 65 75 +# (1) switch chip left sensor 95 105 +# (5) switch chip right sensor 95 105 +# (6) front panel temp sensor 65 75 + +chip "max6658-i2c-3-4c" + label temp1 "Cpu board temp sensor" + set temp1_max 75 + set temp1_crit 80 + + label temp2 "Back panel temp sensor" + set temp2_max 75 + set temp2_crit 80 + +chip "pmbus-i2c-3-4e" + label temp1 "Power controller 1 sensor 1" + label temp2 "Power controller 1 sensor 2" + +chip "pmbus-i2c-7-4e" + label temp1 "Power controller 2 sensor 1" + label temp2 "Power controller 2 sensor 2" + +chip "pmbus-i2c-6-58" + label temp1 "Power supply 1 hotspot sensor" + label temp2 "Power supply 1 inlet temp sensor" + label temp3 "Power supply 1 sensor" + +chip "pmbus-i2c-5-58" + label temp1 "Power supply 2 hotspot sensor" + label temp2 "Power supply 2 inlet temp sensor" + label temp3 "Power supply 2 sensor" + From a2b4bcbb615ccd847799155d4216c1c3f17b56da Mon Sep 17 00:00:00 2001 From: antonpatenko Date: Wed, 22 Feb 2017 05:04:43 +0200 Subject: [PATCH 0294/1011] [docker-base]: Enabled common debug packages installation. (#292) --- .gitignore | 1 + dockers/docker-base/{Dockerfile => Dockerfile.j2} | 9 ++++++++- rules/config | 3 +++ rules/docker-base.mk | 10 +++++++++- slave.mk | 1 + 5 files changed, 22 insertions(+), 2 deletions(-) rename dockers/docker-base/{Dockerfile => Dockerfile.j2} (89%) diff --git a/.gitignore b/.gitignore index ee80cf8d6c5c..96a073d67fc0 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,5 @@ dockers/docker-snmp-sv2/Dockerfile dockers/docker-team/Dockerfile dockers/docker-teamd/Dockerfile dockers/docker-config-engine/Dockerfile +dockers/docker-base/Dockerfile platform/broadcom/docker-syncd-brcm/Dockerfile diff --git a/dockers/docker-base/Dockerfile b/dockers/docker-base/Dockerfile.j2 similarity index 89% rename from dockers/docker-base/Dockerfile rename to dockers/docker-base/Dockerfile.j2 index 59af1f3ac6a3..5bdbf8b3d5ae 100644 --- a/dockers/docker-base/Dockerfile +++ b/dockers/docker-base/Dockerfile.j2 @@ -36,9 +36,16 @@ RUN apt-get -y purge \ exim4-config \ exim4-daemon-light +{% if docker_base_dbgs %} +## Install common debug-packages +RUN apt-get -y install \ +{% for dbg_pkg in docker_base_dbgs.split(' ') -%} + {{ dbg_pkg }}{{' '}} +{%- endfor %} +{% endif %} + ## Clean up apt ## Remove /var/lib/apt/lists/*, could be obsoleted for derived images RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y; \ rm -rf /var/lib/apt/lists/*; \ rm -rf /tmp/*; - diff --git a/rules/config b/rules/config index ea4f32de1481..be8b7a9d77fb 100644 --- a/rules/config +++ b/rules/config @@ -42,3 +42,6 @@ PASSWORD = YourPaSsWoRd # If not set (default behavior) the default minigraph built into the image will be used. # ENABLE_DHCP_GRAPH_SERVICE = y +# SONIC_CONFIG_DEBUG - install debug packages +# Uncomment next line to enable: +# SONIC_CONFIG_DEBUG = y diff --git a/rules/docker-base.mk b/rules/docker-base.mk index 56e42ac97b45..f041f7d05cdd 100644 --- a/rules/docker-base.mk +++ b/rules/docker-base.mk @@ -3,4 +3,12 @@ DOCKER_BASE = docker-base.gz $(DOCKER_BASE)_PATH = $(DOCKERS_PATH)/docker-base -SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_BASE) +ifeq ($(SONIC_CONFIG_DEBUG),y) +GDB = gdb +VIM = vim +OPENSSH = openssh-client +SSHPASS = sshpass +$(DOCKER_BASE)_DBG_PACKAGES += $(GDB) $(VIM) $(OPENSSH) $(SSHPASS) +endif + +SONIC_DOCKER_IMAGES += $(DOCKER_BASE) diff --git a/slave.mk b/slave.mk index 4ea96d1f4c80..2484e323c194 100644 --- a/slave.mk +++ b/slave.mk @@ -267,6 +267,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .pl sudo mount --bind $(PYTHON_WHEELS_PATH) $($*.gz_PATH)/python-wheels $(LOG) # Export variables for j2. Use path for unique variable names, e.g. docker_orchagent_debs $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_debs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DEPENDS),RDEPENDS))\n" | awk '!a[$$0]++')) + $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_dbgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DBG_PACKAGES)))\n" | awk '!a[$$0]++')) j2 $($*.gz_PATH)/Dockerfile.j2 > $($*.gz_PATH)/Dockerfile docker build --squash --no-cache -t $* $($*.gz_PATH) $(LOG) docker save $* | gzip -c > $@ From b5f9fcae99d2c756ce8b1d5cae0a1eb4c6eb32c9 Mon Sep 17 00:00:00 2001 From: kaiyu22 Date: Wed, 22 Feb 2017 18:15:39 +0800 Subject: [PATCH 0295/1011] [platform]: ingrasys-s9100: Add ingrasys switch s9100 (#318) Signed-off-by: Sam Yang --- dockers/docker-orchagent/start.sh | 2 + .../minigraph/minigraph_ingrasys-s9100.xml | 115 ++++++++++++++++++ .../x86_64/platforms/x86_64-ingrasys_s9100-r0 | 3 + .../platform/ingrasys-s9100/port_config.ini | 33 +++++ .../platform/ingrasys-s9100/sensors.conf | 35 ++++++ 5 files changed, 188 insertions(+) create mode 100644 files/image_config/minigraph/minigraph_ingrasys-s9100.xml create mode 100644 installer/x86_64/platforms/x86_64-ingrasys_s9100-r0 create mode 100644 src/sonic-config-engine/platform/ingrasys-s9100/port_config.ini create mode 100644 src/sonic-config-engine/platform/ingrasys-s9100/sensors.conf diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 1a42f5146a8e..9e51111927c6 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -49,6 +49,8 @@ elif [ "$HWSKU" == "Arista-7060-CX32S" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "AS7512" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "ingrasys-s9100" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" fi service rsyslog start diff --git a/files/image_config/minigraph/minigraph_ingrasys-s9100.xml b/files/image_config/minigraph/minigraph_ingrasys-s9100.xml new file mode 100644 index 000000000000..c67990fc7305 --- /dev/null +++ b/files/image_config/minigraph/minigraph_ingrasys-s9100.xml @@ -0,0 +1,115 @@ + + + + + + OCPSCH0104001MS + 10.10.1.26 + OCPSCH01040GGLF + 10.10.1.25 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.26 + OCPSCH01040GGLF + 10.10.2.25 + 1 + 10 + 3 + + + + + 64536 + OCPSCH01040GGLF + + +
10.10.1.26
+ + +
+ +
10.10.2.26
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.9/32 + + 100.0.0.9/32 + + + + + + + + OCPSCH01040GGLF + + + + + + Ethernet0 + 10.10.1.25/30 + + + + Ethernet4 + 10.10.2.25/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet24 + OCPSCH01040GGLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104002MS + Ethernet24 + OCPSCH01040GGLF + Ethernet4 + + + + OCPSCH01040GGLF + ingrasys-s9100 +
diff --git a/installer/x86_64/platforms/x86_64-ingrasys_s9100-r0 b/installer/x86_64/platforms/x86_64-ingrasys_s9100-r0 new file mode 100644 index 000000000000..14404194ef53 --- /dev/null +++ b/installer/x86_64/platforms/x86_64-ingrasys_s9100-r0 @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x2f8 +CONSOLE_DEV=1 +CONSOLE_SPEED=115200 diff --git a/src/sonic-config-engine/platform/ingrasys-s9100/port_config.ini b/src/sonic-config-engine/platform/ingrasys-s9100/port_config.ini new file mode 100644 index 000000000000..d2b36ebf5e2a --- /dev/null +++ b/src/sonic-config-engine/platform/ingrasys-s9100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 5,6,7,8 Ethernet0 +Ethernet4 1,2,3,4 Ethernet4 +Ethernet8 13,14,15,16 Ethernet8 +Ethernet12 9,10,11,12 Ethernet12 +Ethernet16 21,22,23,24 Ethernet16 +Ethernet20 17,18,19,20 Ethernet20 +Ethernet24 29,30,31,32 Ethernet24 +Ethernet28 25,26,27,28 Ethernet28 +Ethernet32 37,38,39,40 Ethernet32 +Ethernet36 33,34,35,36 Ethernet36 +Ethernet40 45,46,47,48 Ethernet40 +Ethernet44 41,42,43,44 Ethernet44 +Ethernet48 53,54,55,56 Ethernet48 +Ethernet52 49,50,51,52 Ethernet52 +Ethernet56 61,62,63,64 Ethernet56 +Ethernet60 57,58,59,60 Ethernet60 +Ethernet64 69,70,71,72 Ethernet64 +Ethernet68 65,66,67,68 Ethernet68 +Ethernet72 77,78,79,80 Ethernet72 +Ethernet76 73,74,75,76 Ethernet76 +Ethernet80 85,86,87,88 Ethernet80 +Ethernet84 81,82,83,84 Ethernet84 +Ethernet88 93,94,95,96 Ethernet88 +Ethernet92 89,90,91,92 Ethernet92 +Ethernet96 101,102,103,104 Ethernet96 +Ethernet100 97,98,99,100 Ethernet100 +Ethernet104 109,110,111,112 Ethernet104 +Ethernet108 105,106,107,108 Ethernet108 +Ethernet112 117,118,119,120 Ethernet112 +Ethernet116 113,114,115,116 Ethernet116 +Ethernet120 125,126,127,128 Ethernet120 +Ethernet124 121,122,123,124 Ethernet124 diff --git a/src/sonic-config-engine/platform/ingrasys-s9100/sensors.conf b/src/sonic-config-engine/platform/ingrasys-s9100/sensors.conf new file mode 100644 index 000000000000..44eedb4b11b0 --- /dev/null +++ b/src/sonic-config-engine/platform/ingrasys-s9100/sensors.conf @@ -0,0 +1,35 @@ +# libsensors configuration file +chip "i350bb-*" + ignore loc1 + +chip "jc42-*" + label temp1 "DIMM Temp" + set temp1_max 50 + set temp1_crit 85 + +chip "w83795adg-*" + label in0 "1.0V" + label in1 "1.0V_ROV" + label in2 "1.25V" + label in3 "1.8V" + ignore in4 + ignore in5 + ignore in6 + ignore in7 + label in12 "+3.3V" + ignore in14 + ignore in15 + ignore in16 + label fan1 "FANTRAY 1-A" + label fan2 "FANTRAY 1-B" + label fan3 "FANTRAY 2-A" + label fan4 "FANTRAY 2-B" + label fan5 "FANTRAY 3-A" + label fan6 "FANTRAY 3-B" + label fan7 "FANTRAY 4-A" + label fan8 "FANTRAY 4-B" + label temp1 "Front MAC Temp" + label temp2 "Rear MAC Temp" + ignore temp3 + ignore temp4 + ignore intrusion0 From 4feec05cf824e15c2a92504d7338e209c0e6b0d2 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 22 Feb 2017 02:16:24 -0800 Subject: [PATCH 0296/1011] [swss]: update sonic-swss to fix buffer configuration on mlnx platform (#317) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 1ceb354a6742..3c3908654ba1 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 1ceb354a6742a35d65e31fb28ea68a2e6b9643dd +Subproject commit 3c3908654ba10ad2307f2b0ac07bff55c577a47c From f087f1317bd3e3b79d821af1ca676e36f927223c Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Wed, 22 Feb 2017 12:17:33 +0200 Subject: [PATCH 0297/1011] [sonic-sairedis]: Update submodule pointer. (#314) Update Mellanox platform ONIE version. --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index d6e7827a16af..84f6221f340e 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit d6e7827a16af97f0fadbcf0f2da9b2d80a135cb6 +Subproject commit 84f6221f340ec6618b3a72da41fff4047af7eec9 From 95ad5c79fd7297205554a444c32d0c0daa9cae5b Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 22 Feb 2017 14:28:37 -0800 Subject: [PATCH 0298/1011] Fix the reference in docker-snmp-sv2 to deprecated alias_map.json (#320) --- dockers/docker-snmp-sv2/config.sh | 3 +-- src/sonic-config-engine/sonic-cfggen | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/dockers/docker-snmp-sv2/config.sh b/dockers/docker-snmp-sv2/config.sh index f22dcd23b0d3..b6216e8353b0 100755 --- a/dockers/docker-snmp-sv2/config.sh +++ b/dockers/docker-snmp-sv2/config.sh @@ -8,8 +8,7 @@ mkdir -p /etc/snmp sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/snmp.yml -t /usr/share/sonic/templates/snmpd.conf.j2 >/etc/snmp/snmpd.conf -hwsku=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` -/bin/cp -rf /usr/share/sonic/$hwsku/alias_map.json /etc/snmp/ +sonic-cfggen -m /etc/sonic/minigraph.xml -s >/etc/snmp/alias_map.json mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 02518b3ea364..3cd269805b84 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -54,6 +54,7 @@ def main(): parser.add_argument("-a", "--additional-data", help="addition data, in json string") group = parser.add_mutually_exclusive_group() group.add_argument("-t", "--template", help="render the data with the template file") + group.add_argument("-s", "--alias-mapping", help="print alias mapping json if available", action='store_true') group.add_argument("-v", "--var", help="print the value of a variable") group.add_argument("--var-json", help="print the value of a variable, in json format") group.add_argument("--var-keys", help="print all keys of a map variable") @@ -101,6 +102,13 @@ def main(): if args.var_keys != None: for key in data[args.var_keys].keys(): print key + + if args.alias_mapping != None: + mapping = {} + if data.has_key('alias_map'): + for item in data['alias_map']: + mapping[item['sonic']] = item['origin'] + print json.dumps(mapping) if args.print_data: print data From 40fdde5749fde3b5538cf3adf35cffec99edb27b Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 22 Feb 2017 17:21:03 -0800 Subject: [PATCH 0299/1011] Allow enabling dhcp graph service by cmdline input (#322) --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 070c540509cf..d17b002e66b1 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,7 @@ DOCKER_BUILD = docker build --no-cache \ PLATFORM=$(PLATFORM) \ SKU=$(SKU) \ DEBUG_BUILD=$(DEBUG_BUILD) \ + ENABLE_DHCP_GRAPH_SERVICE=$(ENABLE_DHCP_GRAPH_SERVICE) \ $@ sonic-slave-build : From dc7c7b1de2243a14637de7259afb60d6c660eedb Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 22 Feb 2017 19:25:30 -0800 Subject: [PATCH 0300/1011] Fix an issue in cfggen that always printing alias mapping (#323) --- src/sonic-config-engine/sonic-cfggen | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 3cd269805b84..169967075473 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -103,7 +103,7 @@ def main(): for key in data[args.var_keys].keys(): print key - if args.alias_mapping != None: + if args.alias_mapping: mapping = {} if data.has_key('alias_map'): for item in data['alias_map']: From 496a03bfee713aac7d6c92ba4b26306b49060729 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 23 Feb 2017 03:37:29 -0800 Subject: [PATCH 0301/1011] [platform]: add port_config.ini for dell z9100 (#328) --- .../platform/Force10-Z9100/port_config.ini | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/sonic-config-engine/platform/Force10-Z9100/port_config.ini diff --git a/src/sonic-config-engine/platform/Force10-Z9100/port_config.ini b/src/sonic-config-engine/platform/Force10-Z9100/port_config.ini new file mode 100644 index 000000000000..e06a68fadce6 --- /dev/null +++ b/src/sonic-config-engine/platform/Force10-Z9100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes +Ethernet0 49,50,51,52 +Ethernet4 53,54,55,56 +Ethernet8 57,58,59,60 +Ethernet12 61,62,63,64 +Ethernet16 65,66,67,68 +Ethernet20 69,70,71,72 +Ethernet24 73,74,75,76 +Ethernet28 77,78,79,80 +Ethernet32 37,38,39,40 +Ethernet36 33,34,35,36 +Ethernet40 45,46,47,48 +Ethernet44 41,42,43,44 +Ethernet48 81,82,83,84 +Ethernet52 85,86,87,88 +Ethernet56 89,90,91,92 +Ethernet60 93,94,95,96 +Ethernet64 97,98,99,100 +Ethernet68 101,102,103,104 +Ethernet72 105,106,107,108 +Ethernet76 109,110,111,112 +Ethernet80 21,22,23,24 +Ethernet84 17,18,19,20 +Ethernet88 29,30,31,32 +Ethernet92 25,26,27,28 +Ethernet96 117,118,119,120 +Ethernet100 113,114,115,116 +Ethernet104 125,126,127.128 +Ethernet108 121,122,123,124 +Ethernet112 5,6,7,8 +Ethernet116 1,2,3,4 +Ethernet120 13,14,15,16 +Ethernet124 9,10,11,12 From acb909c989ba3c1d779c8c02d87d17f18faf2d36 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Thu, 23 Feb 2017 13:52:26 +0200 Subject: [PATCH 0302/1011] Update Mellanox SAI git reference (#326) New SAI commits include some fixes for ACLs on LAG member support --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 3b8db59e7fc5..b9396e2f3421 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = 161120 -MLNX_SAI_REVISION = 35e5e8739bec80c19053b7bb9cf6d083b8144fb5 +MLNX_SAI_REVISION = b2137c6d66f7f1bcdec4a0d0d17264ec5695d31b export MLNX_SAI_VERSION MLNX_SAI_REVISION From 151a7d2a90ddf2cd08601aea96e0a9b4be96725e Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 23 Feb 2017 11:21:11 -0800 Subject: [PATCH 0303/1011] Apply buffer/qos configuration for mlnx platform (#321) --- dockers/docker-orchagent/start.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 9e51111927c6..fff118f0effd 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -51,6 +51,8 @@ elif [ "$HWSKU" == "AS7512" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "ingrasys-s9100" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "ACS-MSN2700" ]; then + SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json " fi service rsyslog start From 873f6f8fb6b7ee06f02dedd8f351f93b237ea456 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 23 Feb 2017 13:12:54 -0800 Subject: [PATCH 0304/1011] [oneimage] Check if graph service address got from dhcp is valid url (#324) * [oneimage] Check if graph service address got from dhcp is valid url --- files/image_config/updategraph/updategraph | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index 203905b85c7c..68fbe6eb9c19 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -29,9 +29,14 @@ if [ "$src" = "dhcp" ]; then HOSTNAME=`hostname -s` GRAPH_URL=`sonic-cfggen -t /tmp/dhcp_graph_url -a "{\"hostname\": \"$HOSTNAME\"}"` + URL_REGEX='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]$' + if [[ ! $GRAPH_URL =~ $URL_REGEX ]]; then + echo "\"$GRAPH_URL\" is not a valid url. Skipping graph update." + exit 0 + fi if [ "$dhcp_as_static" = "true" ]; then - sed -i "/src=d/d" /etc/sonic/updategraph.conf - echo "src=$GRAPH_URL" >> /etc/sonic/updategraph.conf + sed -i "/src=/d" /etc/sonic/updategraph.conf + echo "src=\"$GRAPH_URL\"" >> /etc/sonic/updategraph.conf fi else GRAPH_URL=$src From a16c780285e5d6acfef818b26cb198a9a4b3d5e9 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 23 Feb 2017 14:47:51 -0800 Subject: [PATCH 0305/1011] [teamd] Fix a bug in #305 that will break teamd (#329) --- dockers/docker-teamd/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index 42d8758638af..e1e41c33ba17 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -14,7 +14,7 @@ debs/{{ deb }}{{' '}} {%- endfor %} COPY ["start.sh", "config.sh", "/usr/bin/"] -COPY ["teamd.j2", "/usr/share/sonic/templates"] +COPY ["teamd.j2", "/usr/share/sonic/templates/"] ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive From 5e42d2abb4eb1f949da8809d4b0ab69039f23289 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 23 Feb 2017 20:40:21 -0800 Subject: [PATCH 0306/1011] [platform]: add z9100 platform modules (#331) --- .gitmodules | 3 +++ platform/broadcom/platform-modules-dell.mk | 10 ++++++++++ platform/broadcom/rules.mk | 1 + platform/broadcom/sonic-platform-modules-dell | 1 + 4 files changed, 15 insertions(+) create mode 100644 platform/broadcom/platform-modules-dell.mk create mode 160000 platform/broadcom/sonic-platform-modules-dell diff --git a/.gitmodules b/.gitmodules index 5b542b1499ef..619688265221 100644 --- a/.gitmodules +++ b/.gitmodules @@ -50,3 +50,6 @@ [submodule "platform/broadcom/sonic-platform-modules-arista"] path = platform/broadcom/sonic-platform-modules-arista url = https://github.com/aristanetworks/sonic +[submodule "platform/broadcom/sonic-platform-modules-dell"] + path = platform/broadcom/sonic-platform-modules-dell + url = https://github.com/Azure/sonic-platform-modules-dell diff --git a/platform/broadcom/platform-modules-dell.mk b/platform/broadcom/platform-modules-dell.mk new file mode 100644 index 000000000000..36ca217f56ca --- /dev/null +++ b/platform/broadcom/platform-modules-dell.mk @@ -0,0 +1,10 @@ +# Dell Z9100 Platform modules + +DELL_Z9100_PLATFORM_MODULE_VERSION = 1.1 + +export DELL_Z9100_PLATFORM_MODULE_VERSION + +DELL_Z9100_PLATFORM_MODULE = platform-modules-z9100_$(DELL_Z9100_PLATFORM_MODULE_VERSION)_amd64.deb +$(DELL_Z9100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-dell +$(DELL_Z9100_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +SONIC_DPKG_DEBS += $(DELL_Z9100_PLATFORM_MODULE) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index e783f3cdbf9b..533354cdb8bb 100644 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -1,6 +1,7 @@ include $(PLATFORM_PATH)/sdk.mk include $(PLATFORM_PATH)/sai.mk include $(PLATFORM_PATH)/platform-modules-s6000.mk +include $(PLATFORM_PATH)/platform-modules-dell.mk include $(PLATFORM_PATH)/platform-modules-arista.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk diff --git a/platform/broadcom/sonic-platform-modules-dell b/platform/broadcom/sonic-platform-modules-dell new file mode 160000 index 000000000000..af6556c488e7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell @@ -0,0 +1 @@ +Subproject commit af6556c488e7fbe0f0c074fb6cc32d27bf40cc83 From b04e3e7084334227692e313bcdabb48078338d8f Mon Sep 17 00:00:00 2001 From: wadelnn Date: Fri, 24 Feb 2017 20:10:19 +0800 Subject: [PATCH 0307/1011] Add Ingrasys S9100 platform submodule (#333) * Add Ingrasys S9100 platform submodule and .mk files. Signed-off-by: Wade He --- .gitmodules | 3 +++ platform/broadcom/platform-modules-ingrasys-s9100.mk | 10 ++++++++++ platform/broadcom/rules.mk | 1 + .../broadcom/sonic-platform-modules-ingrasys-s9100 | 1 + 4 files changed, 15 insertions(+) create mode 100755 platform/broadcom/platform-modules-ingrasys-s9100.mk mode change 100644 => 100755 platform/broadcom/rules.mk create mode 160000 platform/broadcom/sonic-platform-modules-ingrasys-s9100 diff --git a/.gitmodules b/.gitmodules index 619688265221..c8fb78edcdff 100644 --- a/.gitmodules +++ b/.gitmodules @@ -53,3 +53,6 @@ [submodule "platform/broadcom/sonic-platform-modules-dell"] path = platform/broadcom/sonic-platform-modules-dell url = https://github.com/Azure/sonic-platform-modules-dell +[submodule "platform/broadcom/sonic-platform-modules-ingrasys-s9100"] + path = platform/broadcom/sonic-platform-modules-ingrasys-s9100 + url = https://github.com/Ingrasys-sonic/sonic-platform-ingrasys-s9100 diff --git a/platform/broadcom/platform-modules-ingrasys-s9100.mk b/platform/broadcom/platform-modules-ingrasys-s9100.mk new file mode 100755 index 000000000000..1802290008b0 --- /dev/null +++ b/platform/broadcom/platform-modules-ingrasys-s9100.mk @@ -0,0 +1,10 @@ +# Ingrasys S9100 Platform modules + +INGRASYS_S9100_PLATFORM_MODULE_VERSION = 1.0.0 + +export INGRASYS_S9100_PLATFORM_MODULE_VERSION + +INGRASYS_S9100_PLATFORM_MODULE = sonic-platform-ingrasys-s9100_$(INGRASYS_S9100_PLATFORM_MODULE_VERSION)_amd64.deb +$(INGRASYS_S9100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ingrasys-s9100 +$(INGRASYS_S9100_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +SONIC_DPKG_DEBS += $(INGRASYS_S9100_PLATFORM_MODULE) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk old mode 100644 new mode 100755 index 533354cdb8bb..d9dc0eccc1da --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -3,6 +3,7 @@ include $(PLATFORM_PATH)/sai.mk include $(PLATFORM_PATH)/platform-modules-s6000.mk include $(PLATFORM_PATH)/platform-modules-dell.mk include $(PLATFORM_PATH)/platform-modules-arista.mk +include $(PLATFORM_PATH)/platform-modules-ingrasys-s9100.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk include $(PLATFORM_PATH)/one-image.mk diff --git a/platform/broadcom/sonic-platform-modules-ingrasys-s9100 b/platform/broadcom/sonic-platform-modules-ingrasys-s9100 new file mode 160000 index 000000000000..287f78d69417 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ingrasys-s9100 @@ -0,0 +1 @@ +Subproject commit 287f78d694174fb60e61420ca8e9de24ea300fd8 From b21d26dfe0b63c1525d5e32a1818aa8774854d04 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 24 Feb 2017 08:35:11 -0800 Subject: [PATCH 0308/1011] [platform]: add support for Force10-Z9100 32x100G (#332) * [platform]: add support for Force10-Z9100 32x100G * update sonic-swss submodule * [broadcom]: update broadcom sai/sdk --- dockers/docker-orchagent/start.sh | 2 + .../minigraph/minigraph_Force10-Z9100.xml | 1049 +++++++++++++++++ platform/broadcom/sai.mk | 8 +- platform/broadcom/sdk.mk | 8 +- .../platform/Force10-Z9100/port_config.ini | 66 +- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- 7 files changed, 1094 insertions(+), 43 deletions(-) create mode 100644 files/image_config/minigraph/minigraph_Force10-Z9100.xml diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index fff118f0effd..51073fde00f4 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -41,6 +41,8 @@ if [ "$HWSKU" == "Force10-S6000" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.1.json td2.32ports.buffers.2.json td2.32ports.buffers.3.json " elif [ "$HWSKU" == "Force10-S6100" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "Force10-Z9100" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "Arista-7050-QX32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" SWSSCONFIG_ARGS+="td2.32ports.qos.1.json td2.32ports.qos.2.json td2.32ports.qos.3.json td2.32ports.qos.4.json td2.32ports.qos.5.json td2.32ports.qos.6.json " diff --git a/files/image_config/minigraph/minigraph_Force10-Z9100.xml b/files/image_config/minigraph/minigraph_Force10-Z9100.xml new file mode 100644 index 000000000000..44cffcdd4378 --- /dev/null +++ b/files/image_config/minigraph/minigraph_Force10-Z9100.xml @@ -0,0 +1,1049 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + hundredGigE1/1 + 10.0.0.0/31 + + + + hundredGigE1/2 + 10.0.0.2/31 + + + + hundredGigE1/3 + 10.0.0.4/31 + + + + hundredGigE1/4 + 10.0.0.6/31 + + + + hundredGigE1/5 + 10.0.0.8/31 + + + + hundredGigE1/6 + 10.0.0.10/31 + + + + hundredGigE1/7 + 10.0.0.12/31 + + + + hundredGigE1/8 + 10.0.0.14/31 + + + + hundredGigE1/9 + 10.0.0.16/31 + + + + hundredGigE1/10 + 10.0.0.18/31 + + + + hundredGigE1/11 + 10.0.0.20/31 + + + + hundredGigE1/12 + 10.0.0.22/31 + + + + hundredGigE1/13 + 10.0.0.24/31 + + + + hundredGigE1/14 + 10.0.0.26/31 + + + + hundredGigE1/15 + 10.0.0.28/31 + + + + hundredGigE1/16 + 10.0.0.30/31 + + + + hundredGigE1/17 + 10.0.0.32/31 + + + + hundredGigE1/18 + 10.0.0.34/31 + + + + hundredGigE1/19 + 10.0.0.36/31 + + + + hundredGigE1/20 + 10.0.0.38/31 + + + + hundredGigE1/21 + 10.0.0.40/31 + + + + hundredGigE1/22 + 10.0.0.42/31 + + + + hundredGigE1/23 + 10.0.0.44/31 + + + + hundredGigE1/24 + 10.0.0.46/31 + + + + hundredGigE1/25 + 10.0.0.48/31 + + + + hundredGigE1/26 + 10.0.0.50/31 + + + + hundredGigE1/27 + 10.0.0.52/31 + + + + hundredGigE1/28 + 10.0.0.54/31 + + + + hundredGigE1/29 + 10.0.0.56/31 + + + + hundredGigE1/30 + 10.0.0.58/31 + + + + hundredGigE1/31 + 10.0.0.60/31 + + + + hundredGigE1/32 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + hundredGigE1/1 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/2 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/3 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/4 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/5 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/6 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/7 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/8 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/9 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/10 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/11 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/12 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/13 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/14 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/15 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/16 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/17 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/18 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/19 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/20 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/21 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/22 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/23 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/24 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/25 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/26 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/27 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/28 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/29 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/30 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/31 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/32 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Force10-Z9100 + + + + switch1 + Force10-Z9100 +
diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 9e07ccf4b91c..693bb7606745 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.3.1-1-20170208221802.12_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.3.1-1-20170208221802.12_amd64.deb?sv=2015-04-05&sr=b&sig=RpHs7rvOiM%2FzBHeaA2BwP4CYRmiJFhPGBn88Hx9V5Rg%3D&se=2030-10-25T02%3A43%3A53Z&sp=r" +BRCM_SAI = libsaibcm_2.1.3.1-2_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.3.1-2_amd64.deb?sv=2015-04-05&sr=b&sig=zR%2BANpuGPa6oQoYTE20eeFEWXH7QugPV8f%2BPl8N5Y5Y%3D&se=2030-11-03T11%3A18%3A37Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.3.1-1-20170208221802.12_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.3.1-2_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.3.1-1-20170208221802.12_amd64.deb?sv=2015-04-05&sr=b&sig=DNOUenzhSfCHR4QdxkNwf5zdoecCblClau4rjoa0oJE%3D&se=2030-10-25T02%3A47%3A33Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.3.1-2_amd64.deb?sv=2015-04-05&sr=b&sig=H25Jlxwkacnm1agUykzHxcr4G2quJNRQVPVwrG623vQ%3D&se=2030-11-03T11%3A20%3A56Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index a4f2dbfeb79d..8fe1cfa30de2 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.1.5-6-20170208212127.20_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-6-20170208212127.20_amd64.deb?sv=2015-04-05&sr=b&sig=VrkDUWofqRz7G70C8%2BGIVtimvNPgnSkCkZccEVPmiIM%3D&se=2030-10-25T02%3A46%3A20Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.1.5-7_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-7_amd64.deb?sv=2015-04-05&sr=b&sig=DY5BPSDturlcHXfqYcS3Gl89Ypd%2BWMYmMLZ2rlNoC5w%3D&se=2030-11-03T11%3A21%3A53Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-6-20170208212127.20_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-6-20170208212127.20_amd64.deb?sv=2015-04-05&sr=b&sig=FUNtA7GYpHPoP9QH72VdwLk0yxCUAmEqNmZm%2FEMOUf8%3D&se=2030-10-25T02%3A45%3A34Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-7_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-7_amd64.deb?sv=2015-04-05&sr=b&sig=glZblgedvf6uOW5k1YpU7NiBWnIZgX5oWvcVsDsYuXc%3D&se=2030-11-03T11%3A22%3A44Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) diff --git a/src/sonic-config-engine/platform/Force10-Z9100/port_config.ini b/src/sonic-config-engine/platform/Force10-Z9100/port_config.ini index e06a68fadce6..e000f29bef38 100644 --- a/src/sonic-config-engine/platform/Force10-Z9100/port_config.ini +++ b/src/sonic-config-engine/platform/Force10-Z9100/port_config.ini @@ -1,33 +1,33 @@ -# name lanes -Ethernet0 49,50,51,52 -Ethernet4 53,54,55,56 -Ethernet8 57,58,59,60 -Ethernet12 61,62,63,64 -Ethernet16 65,66,67,68 -Ethernet20 69,70,71,72 -Ethernet24 73,74,75,76 -Ethernet28 77,78,79,80 -Ethernet32 37,38,39,40 -Ethernet36 33,34,35,36 -Ethernet40 45,46,47,48 -Ethernet44 41,42,43,44 -Ethernet48 81,82,83,84 -Ethernet52 85,86,87,88 -Ethernet56 89,90,91,92 -Ethernet60 93,94,95,96 -Ethernet64 97,98,99,100 -Ethernet68 101,102,103,104 -Ethernet72 105,106,107,108 -Ethernet76 109,110,111,112 -Ethernet80 21,22,23,24 -Ethernet84 17,18,19,20 -Ethernet88 29,30,31,32 -Ethernet92 25,26,27,28 -Ethernet96 117,118,119,120 -Ethernet100 113,114,115,116 -Ethernet104 125,126,127.128 -Ethernet108 121,122,123,124 -Ethernet112 5,6,7,8 -Ethernet116 1,2,3,4 -Ethernet120 13,14,15,16 -Ethernet124 9,10,11,12 +# name lanes alias +Ethernet0 49,50,51,52 hundredGigE1/1 +Ethernet4 53,54,55,56 hundredGigE1/2 +Ethernet8 57,58,59,60 hundredGigE1/3 +Ethernet12 61,62,63,64 hundredGigE1/4 +Ethernet16 65,66,67,68 hundredGigE1/5 +Ethernet20 69,70,71,72 hundredGigE1/6 +Ethernet24 73,74,75,76 hundredGigE1/7 +Ethernet28 77,78,79,80 hundredGigE1/8 +Ethernet32 37,38,39,40 hundredGigE1/9 +Ethernet36 33,34,35,36 hundredGigE1/10 +Ethernet40 45,46,47,48 hundredGigE1/11 +Ethernet44 41,42,43,44 hundredGigE1/12 +Ethernet48 81,82,83,84 hundredGigE1/13 +Ethernet52 85,86,87,88 hundredGigE1/14 +Ethernet56 89,90,91,92 hundredGigE1/15 +Ethernet60 93,94,95,96 hundredGigE1/16 +Ethernet64 97,98,99,100 hundredGigE1/17 +Ethernet68 101,102,103,104 hundredGigE1/18 +Ethernet72 105,106,107,108 hundredGigE1/19 +Ethernet76 109,110,111,112 hundredGigE1/20 +Ethernet80 21,22,23,24 hundredGigE1/21 +Ethernet84 17,18,19,20 hundredGigE1/22 +Ethernet88 29,30,31,32 hundredGigE1/23 +Ethernet92 25,26,27,28 hundredGigE1/24 +Ethernet96 117,118,119,120 hundredGigE1/25 +Ethernet100 113,114,115,116 hundredGigE1/26 +Ethernet104 125,126,127,128 hundredGigE1/27 +Ethernet108 121,122,123,124 hundredGigE1/28 +Ethernet112 5,6,7,8 hundredGigE1/29 +Ethernet116 1,2,3,4 hundredGigE1/30 +Ethernet120 13,14,15,16 hundredGigE1/31 +Ethernet124 9,10,11,12 hundredGigE1/32 diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 84f6221f340e..144bbbac5b1a 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 84f6221f340ec6618b3a72da41fff4047af7eec9 +Subproject commit 144bbbac5b1a9c3167ae6ecd94ff7bdffd3b869e diff --git a/src/sonic-swss b/src/sonic-swss index 3c3908654ba1..9f0351815aef 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 3c3908654ba10ad2307f2b0ac07bff55c577a47c +Subproject commit 9f0351815aef8798a1367ef6e60e006156d7d190 From 1b240e8f37182ba8aeb3b220522226f3a78c5d76 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 24 Feb 2017 16:27:39 -0800 Subject: [PATCH 0309/1011] [boardcom]: update saibcm to 2.1.3.1-3 (#336) --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 693bb7606745..f396e030cfbf 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.3.1-2_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.3.1-2_amd64.deb?sv=2015-04-05&sr=b&sig=zR%2BANpuGPa6oQoYTE20eeFEWXH7QugPV8f%2BPl8N5Y5Y%3D&se=2030-11-03T11%3A18%3A37Z&sp=r" +BRCM_SAI = libsaibcm_2.1.3.1-3_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.3.1-3_amd64.deb?sv=2015-04-05&sr=b&sig=j5U8yxIqk4B1Wk8OZp9HbMQ7J9u5GPQNmzTDLilJDjU%3D&se=2030-11-03T20%3A45%3A59Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.3.1-2_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.3.1-3_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.3.1-2_amd64.deb?sv=2015-04-05&sr=b&sig=H25Jlxwkacnm1agUykzHxcr4G2quJNRQVPVwrG623vQ%3D&se=2030-11-03T11%3A20%3A56Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.3.1-3_amd64.deb?sv=2015-04-05&sr=b&sig=7FPU5S234yjDIPJUUasC%2BRDqPdrJjdOmSodEApzQjTo%3D&se=2030-11-03T20%3A49%3A38Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From 08734229b61aa094e1e408dad610c441997cbe94 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Sat, 25 Feb 2017 11:13:23 -0800 Subject: [PATCH 0310/1011] [cfggen] Allow sku with no alias mapping and minigraph with no png (#335) * [cfggen] Allow sku with no alias mapping and minigraph with no png * Add alias mapping for minigraph_neighbor keys --- src/sonic-config-engine/minigraph.py | 35 ++++++++++++++-------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 317d9c963a33..79496eee4e89 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -65,9 +65,14 @@ def parse_png(png, hname): startport = link.find(str(QName(ns, "StartPort"))).text if enddevice == hname: + if port_alias_map.has_key(endport): + endport = port_alias_map[endport] neighbors[endport] = {'name': startdevice, 'port': startport} else: + if port_alias_map.has_key(startport): + endport = port_alias_map[startport] neighbors[startport] = {'name': enddevice, 'port': endport} + if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): lo_addr = None @@ -174,7 +179,10 @@ def parse_dpg(dpg, hname): pcintfname = pcintf.find(str(QName(ns, "Name"))).text pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text pcmbr_list = pcintfmbr.split(';', 1) - pc_intfs[pcintfname]=pcmbr_list + for i,member in enumerate(pcmbr_list): + if port_alias_map.has_key(member): + pcmbr_list[i] = port_alias_map[member] + pc_intfs[pcintfname] = pcmbr_list lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces"))) lo_intfs = [] @@ -210,10 +218,14 @@ def parse_dpg(dpg, hname): vlanid = vintf.find(str(QName(ns, "VlanID"))).text vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text vmbr_list = vintfmbr.split(';') - vlan_attributes = {'name': vintfname, 'members': vmbr_list, 'vlanid': vlanid} + for i,member in enumerate(vmbr_list): + if port_alias_map.has_key(member): + vmbr_list[i] = port_alias_map[member] + vlan_attributes = {'name': vintfname, 'members': " ".join(vmbr_list), 'vlanid': vlanid} for addrtuple in vlan_map.get(vintfname, []): vlan_attributes.update(addrtuple) vlan_intfs.append(copy.deepcopy(vlan_attributes)) + return intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs return None, None, None, None, None @@ -352,19 +364,6 @@ def parse_xml(filename, platform=None): elif child.tag == str(QName(ns, "UngDec")): (u_neighbors, u_devices, _, _, _, _) = parse_png(child, hostname) - # Replace port with alias in Vlan interfaces members - for vlan in vlan_intfs: - for i,member in enumerate(vlan['members']): - vlan['members'][i] = port_alias_map[member] - - # Convert vlan members into a space-delimited string - vlan['members'] = " ".join(vlan['members']) - - # Replace port with alias in port channel interfaces members - for pc in pc_intfs.keys(): - for i,member in enumerate(pc_intfs[pc]): - pc_intfs[pc][i] = port_alias_map[member] - Tree = lambda: defaultdict(Tree) results = Tree() @@ -385,15 +384,15 @@ def parse_xml(filename, platform=None): results['minigraph_underlay_neighbors'] = u_neighbors results['minigraph_underlay_devices'] = u_devices results['minigraph_as_xml'] = mini_graph_path - results['minigraph_console'] = get_console_info(devices, console_dev, console_port) - results['minigraph_mgmt'] = get_mgmt_info(devices, mgmt_dev, mgmt_port) + if devices != None: + results['minigraph_console'] = get_console_info(devices, console_dev, console_port) + results['minigraph_mgmt'] = get_mgmt_info(devices, mgmt_dev, mgmt_port) results['minigraph_hostname'] = hostname results['inventory_hostname'] = hostname results['alias_map'] = alias_map_list return results - port_alias_map = {} From 8dc9dccaefcdfa7bd17838cade9a93ae6144cf20 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 27 Feb 2017 02:00:44 +0200 Subject: [PATCH 0311/1011] [slave.mk]: Make installer executable. (#337) Signed-off-by: marian-pritsak --- slave.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/slave.mk b/slave.mk index 2484e323c194..9a31aadf11f5 100644 --- a/slave.mk +++ b/slave.mk @@ -334,6 +334,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform $(if $($*_DOCKERS), rm sonic_debian_extension.sh, ) + + chmod a+x $@ $(FOOTER) ############################################################################### From ffd65841e60a24b1daae21cb9d608507431e7f81 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 26 Feb 2017 21:55:24 -0800 Subject: [PATCH 0312/1011] [kernel]: update linux kernel to support z9100 (#339) --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index cf93afcc12cb..258652dfb123 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit cf93afcc12cb77a94fafd7f828d7549fdc346027 +Subproject commit 258652dfb1234ac224930ce5bf13954165ce55e5 From 2a551d3c60396122c3e8d70b26466e3972fc73ef Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 27 Feb 2017 00:13:36 -0800 Subject: [PATCH 0313/1011] Consolidate device-specific files; install as a Debian package (#316) ( All device-specific files now reside under /device directory in a // directory structure in repo. * Device-specific files are now packaged into a Debian package (sonic-device-data) and are now installed to /usr/share/sonic/device/// directory on switch. --- .gitignore | 1 + README.md | 80 +++---- .../AS7512/port_config.ini | 33 +++ .../Arista-7050-QX32/port_config.ini | 33 +++ .../Arista-7050-QX32/sai.profile | 1 + .../x86_64-arista_7050_qx32/plugins/eeprom.py | 220 ++++++++++++++++++ .../plugins/sfputil.py | 27 +++ .../x86_64-arista_7050_qx32/sensors.conf | 79 +++++++ .../Arista-7060-CX32S/port_config.ini | 33 +++ .../x86_64-arista_7060_cx32s/sensors.conf | 47 ++++ .../Force10-S6000/port_config.ini | 33 +++ .../Force10-S6000/sai.profile | 1 + .../plugins/eeprom.py | 124 ++++++++++ .../plugins/sfputil.py | 27 +++ .../x86_64-dell_s6000_s1220-r0/sensors.conf | 57 +++++ .../Force10-S6100/port_config.ini | 65 ++++++ .../Force10-S6100/sai.profile | 1 + .../plugins/sfputil.py | 27 +++ .../INGRASYS-S9100-C32/port_config.ini | 33 +++ .../x86_64-ingrasys_s9100-r0/sensors.conf | 35 +++ .../ACS-MSN2700/port_config.ini | 33 +++ .../ACS-MSN2700/sai.profile | 1 + .../x86_64-mlnx_msn2700-r0/plugins/eeprom.py | 33 +++ .../x86_64-mlnx_msn2700-r0/plugins/sfputil.py | 28 +++ .../x86_64-mlnx_msn2700-r0/sensors.conf | 21 ++ files/build_templates/docker_image_ctl.j2 | 9 +- .../build_templates/sonic_debian_extension.j2 | 53 +++-- rules/sonic-device-data.mk | 10 + rules/sonic-utilities.mk | 4 +- slave.mk | 2 +- src/sonic-config-engine/minigraph.py | 4 +- src/sonic-device-data/LICENSE | 15 ++ src/sonic-device-data/MAINTAINERS | 7 + src/sonic-device-data/Makefile | 22 ++ src/sonic-device-data/README.md | 4 + src/sonic-device-data/src/debian/changelog | 5 + src/sonic-device-data/src/debian/compat | 1 + src/sonic-device-data/src/debian/control | 11 + src/sonic-device-data/src/debian/copyright | 0 src/sonic-device-data/src/debian/install | 1 + src/sonic-device-data/src/debian/rules | 7 + src/sonic-utilities | 2 +- 42 files changed, 1157 insertions(+), 73 deletions(-) create mode 100644 device/accton/x86_64-accton_as7512_32x-r0/AS7512/port_config.ini create mode 100644 device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini create mode 100644 device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/sai.profile create mode 100644 device/arista/x86_64-arista_7050_qx32/plugins/eeprom.py create mode 100644 device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py create mode 100644 device/arista/x86_64-arista_7050_qx32/sensors.conf create mode 100644 device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini create mode 100644 device/arista/x86_64-arista_7060_cx32s/sensors.conf create mode 100644 device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/port_config.ini create mode 100644 device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/sai.profile create mode 100644 device/dell/x86_64-dell_s6000_s1220-r0/plugins/eeprom.py create mode 100644 device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py create mode 100644 device/dell/x86_64-dell_s6000_s1220-r0/sensors.conf create mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/port_config.ini create mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/sai.profile create mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py create mode 100644 device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini create mode 100644 device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf create mode 100644 device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/port_config.ini create mode 100644 device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/sai.profile create mode 100644 device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py create mode 100644 device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py create mode 100644 device/mellanox/x86_64-mlnx_msn2700-r0/sensors.conf create mode 100644 rules/sonic-device-data.mk create mode 100644 src/sonic-device-data/LICENSE create mode 100644 src/sonic-device-data/MAINTAINERS create mode 100644 src/sonic-device-data/Makefile create mode 100644 src/sonic-device-data/README.md create mode 100644 src/sonic-device-data/src/debian/changelog create mode 100644 src/sonic-device-data/src/debian/compat create mode 100644 src/sonic-device-data/src/debian/control create mode 100644 src/sonic-device-data/src/debian/copyright create mode 100644 src/sonic-device-data/src/debian/install create mode 100755 src/sonic-device-data/src/debian/rules diff --git a/.gitignore b/.gitignore index 96a073d67fc0..b2c3e81854b0 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ src/snmpd/* !src/snmpd/Makefile src/thrift/* !src/thrift/Makefile +src/sonic-device-data/src/device/ # Autogenerated Dockerfiles dockers/docker-database/Dockerfile diff --git a/README.md b/README.md index 5e3cffec91dc..ce41a8f97196 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,51 @@ -Broadcom[![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) -Cavium[![Cavium](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) -Mellanox[![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) -P4[![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all) +Broadcom: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) +Cavium: [![Cavium](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) +Mellanox: [![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) +P4: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all) -# Build SONiC Switch Images - buildimage +# sonic-buildimage + +## Build SONiC Switch Images # Description Build an [Open Network Install Environment (ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also build docker images running inside the NOS. -# Prerequisite -# SAI Version +# Prerequisites + +## SAI Version SONiC V2 is using [SAI 0.9.4](https://github.com/opencomputeproject/SAI/tree/v0.9.4). -# Clone or fetch the code repository with all git submodules -To clone the code repository recursively, assuming git version 1.9 or newer +## Clone or fetch the code repository with all git submodules +To clone the code repository recursively, assuming git version 1.9 or newer: git clone --recursive https://github.com/Azure/sonic-buildimage.git -If it is already cloned, however there is no files under ./dockers/docker-base/ or ./src/sonic-linux-kernel/, manually fetch all the git submodules. - +NOTE: If the repo has already been cloned, however there are no files under the submodule directories (e.g., src/lldpd, src/ptf, src/sonic-linux-kernel, etc.), you can manually fetch all the git submodules as follows: git submodule update --init --recursive -You also need to change all git paths to relative path as we build all submodules inside the docker. +You also need to change all git paths to relative path as we build all submodules inside the docker: git submodule foreach --recursive '[ -f .git ] && echo "gitdir: $(realpath --relative-to=. $(cut -d" " -f2 .git))" > .git' -# Usage +## Usage -To build NOS installer image and docker images, run command line +To build NOS installer image and docker images, run the following commands: make configure PLATFORM=[ASIC_VENDOR] SKU=[HW_SKU] make - **NOTE**: We recommend to reserve 50G free space to build one platform. + **NOTE**: We recommend reserving 50G free space to build one platform. -Supported PLATFORM AND SKU are: +Supported PLATFORM and SKU are: - PLATFORM=broadcom SKU=Force10-S6000 - PLATFORM=mellanox SKU=ACS-MSN2700 - PLATFORM=cavium SKU=AS7512 - PLATFORM=p4 -You can find rules/config file useful. It contains configuration options for build process, like adding more verbosity or showing dependencies, username and password for base image etc. +You may find the rules/config file useful. It contains configuration options for the build process, like adding more verbosity or showing dependencies, username and password for base image etc. Every docker image is built and saved to target/ directory. -So, for instance, to build only docker-database, execute +So, for instance, to build only docker-database, execute: make target/docker-database.gz @@ -51,37 +53,37 @@ Same goes for debian packages, which are under target/debs/: make target/debs/swss_1.0.0_amd64.deb -Every target has a clean target, so in order to clean swss, execute +Every target has a clean target, so in order to clean swss, execute: make target/debs/swss_1.0.0_amd64.deb-clean -It is recommended to use clean targets to clean all packages, that are built together, like dev packages for instance. In order to be more familiar with build process and make some changes to it, it is recommended to read this short [Documentation](README.buildsystem.md). +It is recommended to use clean targets to clean all packages that are built together, like dev packages for instance. In order to be more familiar with build process and make some changes to it, it is recommended to read this short [Documentation](README.buildsystem.md). -# Note: -If you are running make for the first time, a sonic-slave-${USER} docker image will be built automatically. -It is a one time action, so be patient. +## Notes: +- If you are running make for the first time, a sonic-slave-${USER} docker image will be built automatically. +This may take a while, but it is a one-time action, so please be patient. -The root is disabled, but the created user could sudo. +- The root user account is disabled. However, the created user can sudo. -The target directory is ./target, containing the NOS installer image and docker images. -- sonic-generic.bin: SONiC switch installer image (ONIE compatiable) -- sonic-aboot.bin: SONiC switch installer image (Aboot compatiable) -- docker-base.gz: base docker image where other docker images are built from, only used in build process (gzip tar archive) -- docker-database.gz: docker image for in-memory key-value store, used as inter-process communication (gzip tar archive) -- docker-fpm.gz: docker image for quagga with fpm module enabled (gzip tar archive) -- docker-orchagent-brcm.gz: docker image for SWitch State Service (SWSS) on Broadcom platform (gzip tar archive) -- docker-orchagent-cavm.gz: docker image for SWitch State Service (SWSS) on Cavium platform (gzip tar archive) -- docker-orchagent-mlnx.gz: docker image for SWitch State Service (SWSS) on Mellanox platform (gzip tar archive) -- docker-syncd-brcm.gz: docker image for the daemon to sync database and Broadcom switch ASIC (gzip tar archive) -- docker-syncd-cavm.gz: docker image for the daemon to sync database and Cavium switch ASIC (gzip tar archive) -- docker-syncd-mlnx.gz: docker image for the daemon to sync database and Mellanox switch ASIC (gzip tar archive) -- docker-sonic-p4.gz: docker image for all-in-one for p4 software switch (gzip tar archive) +- The target directory is ./target, containing the NOS installer image and docker images. + - sonic-generic.bin: SONiC switch installer image (ONIE compatiable) + - sonic-aboot.bin: SONiC switch installer image (Aboot compatiable) + - docker-base.gz: base docker image where other docker images are built from, only used in build process (gzip tar archive) + - docker-database.gz: docker image for in-memory key-value store, used as inter-process communication (gzip tar archive) + - docker-fpm.gz: docker image for quagga with fpm module enabled (gzip tar archive) + - docker-orchagent-brcm.gz: docker image for SWitch State Service (SWSS) on Broadcom platform (gzip tar archive) + - docker-orchagent-cavm.gz: docker image for SWitch State Service (SWSS) on Cavium platform (gzip tar archive) + - docker-orchagent-mlnx.gz: docker image for SWitch State Service (SWSS) on Mellanox platform (gzip tar archive) + - docker-syncd-brcm.gz: docker image for the daemon to sync database and Broadcom switch ASIC (gzip tar archive) + - docker-syncd-cavm.gz: docker image for the daemon to sync database and Cavium switch ASIC (gzip tar archive) + - docker-syncd-mlnx.gz: docker image for the daemon to sync database and Mellanox switch ASIC (gzip tar archive) + - docker-sonic-p4.gz: docker image for all-in-one for p4 software switch (gzip tar archive) -# Contribution guide +## Contribution Guide All contributors must sign a contribution license agreement before contributions can be accepted. Contact sonic-cla-agreements@microsoft.com. -### GitHub Workflow +## GitHub Workflow We're following basic GitHub Flow. If you have no idea what we're talking about, check out [GitHub's official guide](https://guides.github.com/introduction/flow/). Note that merge is only performed by the repository maintainer. diff --git a/device/accton/x86_64-accton_as7512_32x-r0/AS7512/port_config.ini b/device/accton/x86_64-accton_as7512_32x-r0/AS7512/port_config.ini new file mode 100644 index 000000000000..c10cd2786941 --- /dev/null +++ b/device/accton/x86_64-accton_as7512_32x-r0/AS7512/port_config.ini @@ -0,0 +1,33 @@ +# name lanes +Ethernet0 16,17,18,19 +Ethernet4 20,21,22,23 +Ethernet8 24,25,26,27 +Ethernet12 28,29,30,31 +Ethernet16 32,33,34,35 +Ethernet20 36,37,38,39 +Ethernet24 40,41,42,43 +Ethernet28 44,45,46,47 +Ethernet32 0,1,2,3 +Ethernet36 4,5,6,7 +Ethernet40 8,9,10,11 +Ethernet44 12,13,14,15 +Ethernet48 48,49,50,51 +Ethernet52 52,53,54,55 +Ethernet56 56,57,58,59 +Ethernet60 60,61,62,63 +Ethernet64 127,126,125,124 +Ethernet68 123,122,121,120 +Ethernet72 115,114,113,112 +Ethernet76 119,118,117,116 +Ethernet80 79,78,77,76 +Ethernet84 75,74,73,72 +Ethernet88 64,65,66,67 +Ethernet92 71,70,68,69 +Ethernet96 111,110,109,108 +Ethernet100 107,106,105,104 +Ethernet104 103,102,101,100 +Ethernet108 99,98,97,96 +Ethernet112 95,94,93,92 +Ethernet116 91,90,89,88 +Ethernet120 87,86,85,84 +Ethernet124 83,82,81,80 diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini new file mode 100644 index 000000000000..b9ab8854a2ec --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 125,126,127,128 Ethernet1/1 +Ethernet4 121,122,123,124 Ethernet2/1 +Ethernet8 13,14,15,16 Ethernet3/1 +Ethernet12 9,10,11,12 Ethernet4/1 +Ethernet16 17,18,19,20 Ethernet5/1 +Ethernet20 21,22,23,24 Ethernet6/1 +Ethernet24 25,26,27,28 Ethernet7/1 +Ethernet28 29,30,31,32 Ethernet8/1 +Ethernet32 37,38,39,40 Ethernet9/1 +Ethernet36 33,34,35,36 Ethernet10/1 +Ethernet40 45,46,47,48 Ethernet11/1 +Ethernet44 41,42,43,44 Ethernet12/1 +Ethernet48 53,54,55,56 Ethernet13/1 +Ethernet52 49,50,51,52 Ethernet14/1 +Ethernet56 69,70,71,72 Ethernet15/1 +Ethernet60 65,66,67,68 Ethernet16/1 +Ethernet64 77,78,79,80 Ethernet17/1 +Ethernet68 73,74,75,76 Ethernet18/1 +Ethernet72 93,94,95,96 Ethernet19/1 +Ethernet76 89,90,91,92 Ethernet20/1 +Ethernet80 101,102,103,104 Ethernet21/1 +Ethernet84 97,98,99,100 Ethernet22/1 +Ethernet88 109,110,111,112 Ethernet23/1 +Ethernet92 105,106,107,108 Ethernet24/1 +Ethernet96 61,62,63,64 Ethernet25 +Ethernet100 57,58,59,60 Ethernet26 +Ethernet104 81,82,83,84 Ethernet27 +Ethernet108 85,86,87,88 Ethernet28 +Ethernet112 117,118,119,120 Ethernet29 +Ethernet116 113,114,115,116 Ethernet30 +Ethernet120 5,6,7,8 Ethernet31 +Ethernet124 1,2,3,4 Ethernet32 diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/sai.profile b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/sai.profile new file mode 100644 index 000000000000..76ffdfc028ed --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/td2-a7050-qx32-32x40G.config.bcm diff --git a/device/arista/x86_64-arista_7050_qx32/plugins/eeprom.py b/device/arista/x86_64-arista_7050_qx32/plugins/eeprom.py new file mode 100644 index 000000000000..f8a3515d924f --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/plugins/eeprom.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python + +############################################################################# +# Arista 7050-QX32 +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + import subprocess + import re + import struct + import zlib + import StringIO + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +def showMac( m ): + return ":".join([m[0:2], m[2:4], m[4:6], m[6:8], m[8:10], m[10:12]]) + +typeMap = { + "END" : ( "00", None, None, None, False ), + "SKU" : ( "03", None, None, None, False ), + "MAC" : ( "05", None, showMac, None, False ), + "SerialNumber" : ( "0E", None, None, None, False ), + } + +idToNameMap = {} +for k, v in typeMap.iteritems(): + idToNameMap[ v[0] ] = k + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + _TLV_HDR_ENABLED = 0 + + pFdl = None + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/drivers/eeprom/1-0052/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + + def _decode_eeprom(self, e): + # For format 0002 and more recent fdls use the new Prefdl class + data = e[0:4] + if data in ("0002", "0003"): + fp = StringIO.StringIO(e[4:]) + self.pFdl = PreFdl( fp, data, data ) + + def decode_eeprom(self, e): + self._decode_eeprom(e) + return self.pFdl.show() + + def is_checksum_valid(self, e): + self._decode_eeprom(e) + return (True, self.pFdl.get_crc()) + + def serial_number_str(self, e): + self._decode_eeprom(e) + return self.pFdl.get_field('SerialNumber') + + def mgmtaddrstr(self,e): + self._decode_eeprom(e) + return self.pFdl.get_field('MAC') + +def crc32( data ): + return struct.unpack("I",struct.pack("i",zlib.crc32( data )))[0] + +def validSerial( x ): + x = x.replace( " ", "" ) + x = x.replace( "-", "" ) + # All serial numbers are upper case + x = x.upper() + if re.compile( "[A-Z]{3}\d{4}[A-Z0-9]{4}$" ).match( x ): + return x + return None + +class PreFdlField( ): + def __init__( self, name, valid, show, optionName, data=None, append=False ): + self.name = name + if valid: + self.valid = valid + else: + self.valid = lambda x: x + self.show = show + self.optionName = optionName + self.data = [] + self.append = append + if data: + self.dataIs( data ) + + def dataIs( self, data ): + vd = self.valid( data ) + if not vd: + raise InvalidPrefdlData( "Invalid %s: %s" % ( self.name, data ) ) + if self.append: + self.data.append( vd ) + else: + self.data = [ vd ] + +class TlvField( PreFdlField ): + def __init__( self, name ): + args = typeMap.get( name ) + valid = None + show = None + optionName = None + append = False + if args: + self.id, valid, show, optionName, append = args + PreFdlField.__init__( self, name, valid, show, optionName, append=append ) + + +class PreFdl(): + def __init__( self, fp=None, preFdlStr=None, version="0002" ): + # populate the required fields + self.requiredFields = [] + self.mac = None + self.serial = None + + if version == "0002": + preFdlStr, offset = self.initPreFdl2( fp, preFdlStr ) + elif version == "0003": + preFdlStr, offset = self.initPreFdl3( fp, preFdlStr ) + else: + raise NotImplementedError( + "Only Prefdl data format version 0002 or 0003 are supported" ) + + # populate the tlv fileds + self.tlvFields = {} + for k in typeMap.keys(): + self.tlvFields[ k ] = TlvField( k ) + + # create the map option to field + self.optionMap = {} + for f in self.requiredFields + self.tlvFields.values(): + # Do not add the option from TLV if already added by required fields + if f.optionName and f.optionName not in self.optionMap: + self.optionMap[ f.optionName ] = f + + # save the current tlv fields + if fp: + while True: + tlv = fp.read( 6 ) + ( id, lengthStr ) = ( tlv[0:2], tlv[2:6] ) + length = int( lengthStr, base=16 ) + bytes = fp.read( length ) + what = None if id not in idToNameMap.keys() else idToNameMap[ id ] + if what and what != "END": + self.tlvFields[ what ].dataIs( bytes ) + preFdlStr += tlv + bytes + offset += 6 + length + if what == "END": + # End of the tlv list + break + self.crc = fp.read( 8 ) + # Check the CRC + computed = crc32( preFdlStr ) + if int( self.crc, 16 ) != computed: + raise Exception( "Invalid CRC -- saw %s expected %8X" % + ( self.crc, computed ) ) + + # Initialize and parse fixed section for prefdl version 2. Return the offset + # to where the TLV section starts. + def initPreFdl2( self, fp, preFdlStr ): + # if we start with an existing file + if fp: + # if no preFdlStr is specified, read the fixed section, 30 bytes. + # Otherwise, only the 4 byte data version section was written and + # read the remaining 26 bytes from the fixed section. + if not preFdlStr: + preFdlStr = fp.read( 30 ).strip() + elif preFdlStr == "0002": + preFdlStr += fp.read( 26 ).strip() + else: + raise ValueError( "preFdlStr arg has invalid data format" ) + if len( preFdlStr ) < 12: + fatal( "prefdl is too short exiting" ) + data = None if not preFdlStr else preFdlStr[ 16:16 + 11 ] + self.requiredFields.append( + PreFdlField( "SerialNumber", validSerial, None, None, data ) ) + return preFdlStr, 30 + + # Initialize and parse fixed section for prefdl version 3. Return the offset + # to where the TLV section starts. + def initPreFdl3( self, fp, preFdlStr ): + # if we start with an existing file + currPtr = 0 + if fp and not preFdlStr: + preFdlStr = fp.read( 4 ).strip() + if len( preFdlStr ) < 4: + fatal( "prefdl is too short exiting" ) + return preFdlStr, 4 + + def show( self ): + for f in self.requiredFields + self.tlvFields.values(): + for d in f.data: + dStr = d if f.show is None else f.show( d ) + print "%s: %s" % ( f.name, dStr ) + + def get_field( self, name ): + for f in self.requiredFields + self.tlvFields.values(): + for d in f.data: + if f.name == name: + dStr = d if f.show is None else f.show( d ) + return dStr + + def get_crc( self ): + return self.crc + diff --git a/device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py b/device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py new file mode 100644 index 000000000000..5d2d28b8f328 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + eeprom_offset = 10 + + port_to_eeprom_mapping = {} + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + for x in range(0, self.port_end + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) + sfputilbase.__init__(self, port_num) diff --git a/device/arista/x86_64-arista_7050_qx32/sensors.conf b/device/arista/x86_64-arista_7050_qx32/sensors.conf new file mode 100644 index 000000000000..7745054a05ca --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/sensors.conf @@ -0,0 +1,79 @@ +# libsensors configuration file +# ---------------------------------------------- +# + +bus "i2c-2" "SCD SMBus master 0 bus 0" +bus "i2c-3" "SCD SMBus master 0 bus 1" +bus "i2c-5" "SCD SMBus master 0 bus 3" +bus "i2c-6" "SCD SMBus master 0 bus 4" +bus "i2c-7" "SCD SMBus master 0 bus 5" + +chip "k10temp-pci-00c3" + label temp1 "Cpu temp sensor" + +chip "lm73-i2c-3-48" + label temp1 "Rear Temp Sensor" + set temp1_max 65 + #set temp1_max_alarm 75 # read-only + +chip "lm86-i2c-2-4c" + label temp1 "Board Temp Sensor" + set temp1_max 65 + set temp1_crit 75 + + label temp2 "Front-panel Temp Sensor" + set temp2_max 65 + set temp2_crit 75 + +chip "pmbus-i2c-3-4e" + label temp1 "Power Controller Sensor 1" + set temp1_max 60 + set temp1_crit 70 + + label temp2 "Power Controller Sensor 2" + set temp2_max 60 + set temp2_crit 70 + + ignore curr1 + +chip "pmbus-i2c-5-58" + label temp1 "Power Supply 1 Sensor 1" + set temp1_max 60 + set temp1_crit 70 + + label temp2 "Power Supply 1 Sensor 2" + set temp2_max 60 + set temp2_crit 70 + + ignore temp3 + + set in1_max 250 + set in1_crit 255 + set power1_max 525 + set power2_max 460 + set power2_crit 462 + set curr1_max 5.28 + set curr1_crit 5.30 + set curr2_max 36 + set curr2_crit 37 + +chip "pmbus-i2c-6-58" + label temp1 "Power Supply 2 Sensor 1" + set temp1_max 60 + set temp1_crit 70 + + label temp2 "Power Supply 2 Sensor 2" + set temp2_max 60 + set temp2_crit 70 + + ignore temp3 + + set in1_max 250 + set in1_crit 255 + set power1_max 525 + set power2_max 460 + set power2_crit 462 + set curr1_max 5.28 + set curr1_crit 5.30 + set curr2_max 36 + set curr2_crit 37 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini new file mode 100644 index 000000000000..414fb94efbc1 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 33,34,35,36 Ethernet1/1 +Ethernet4 37,38,39,40 Ethernet2/1 +Ethernet8 41,42,43,44 Ethernet3/1 +Ethernet12 45,46,47,48 Ethernet4/1 +Ethernet16 49,50,51,52 Ethernet5/1 +Ethernet20 53,54,55,56 Ethernet6/1 +Ethernet24 57,58,59,60 Ethernet7/1 +Ethernet28 61,62,63,64 Ethernet8/1 +Ethernet32 65,66,67,68 Ethernet9/1 +Ethernet36 69,70,71,72 Ethernet10/1 +Ethernet40 73,74,75,76 Ethernet11/1 +Ethernet44 77,78,79,80 Ethernet12/1 +Ethernet48 81,82,83,84 Ethernet13/1 +Ethernet52 85,86,87,88 Ethernet14/1 +Ethernet56 89,90,91,92 Ethernet15/1 +Ethernet60 93,94,95,96 Ethernet16/1 +Ethernet64 97,98,99,100 Ethernet17/1 +Ethernet68 101,102,103,104 Ethernet18/1 +Ethernet72 105,106,107,108 Ethernet19/1 +Ethernet76 109,110,111,112 Ethernet20/1 +Ethernet80 113,114,115,116 Ethernet21/1 +Ethernet84 117,118,119,120 Ethernet22/1 +Ethernet88 121,122,123,124 Ethernet23/1 +Ethernet92 125,126,127,128 Ethernet24/1 +Ethernet96 1,2,3,4 Ethernet25/1 +Ethernet100 5,6,7,8 Ethernet26/1 +Ethernet104 9,10,11,12 Ethernet27/1 +Ethernet108 13,14,15,16 Ethernet28/1 +Ethernet112 17,18,19,20 Ethernet29/1 +Ethernet116 21,22,23,24 Ethernet30/1 +Ethernet120 25,26,27,28 Ethernet31/1 +Ethernet124 29,30,31,32 Ethernet32/1 diff --git a/device/arista/x86_64-arista_7060_cx32s/sensors.conf b/device/arista/x86_64-arista_7060_cx32s/sensors.conf new file mode 100644 index 000000000000..3b4dd2385322 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/sensors.conf @@ -0,0 +1,47 @@ +# libsensors configuration file for DCS-7060CX-32S +# ------------------------------------------------ +# + +bus "i2c-2" "SCD SMBus master 0 bus 0" +bus "i2c-3" "SCD SMBus master 0 bus 1" +bus "i2c-5" "SCD SMBus master 0 bus 3" +bus "i2c-6" "SCD SMBus master 0 bus 4" +bus "i2c-7" "SCD SMBus master 0 bus 5" + +chip "k10temp-pci-00c3" + label temp1 "Cpu temp sensor" + +# missing support for +# chip "max6697-i2c-2-1a" +# board sensor 65 75 +# (1) switch chip left sensor 95 105 +# (5) switch chip right sensor 95 105 +# (6) front panel temp sensor 65 75 + +chip "max6658-i2c-3-4c" + label temp1 "Cpu board temp sensor" + set temp1_max 75 + set temp1_crit 80 + + label temp2 "Back panel temp sensor" + set temp2_max 75 + set temp2_crit 80 + +chip "pmbus-i2c-3-4e" + label temp1 "Power controller 1 sensor 1" + label temp2 "Power controller 1 sensor 2" + +chip "pmbus-i2c-7-4e" + label temp1 "Power controller 2 sensor 1" + label temp2 "Power controller 2 sensor 2" + +chip "pmbus-i2c-6-58" + label temp1 "Power supply 1 hotspot sensor" + label temp2 "Power supply 1 inlet temp sensor" + label temp3 "Power supply 1 sensor" + +chip "pmbus-i2c-5-58" + label temp1 "Power supply 2 hotspot sensor" + label temp2 "Power supply 2 inlet temp sensor" + label temp3 "Power supply 2 sensor" + diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/port_config.ini b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/port_config.ini new file mode 100644 index 000000000000..06898f1d7964 --- /dev/null +++ b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 29,30,31,32 fortyGigE0/0 +Ethernet4 25,26,27,28 fortyGigE0/4 +Ethernet8 37,38,39,40 fortyGigE0/8 +Ethernet12 33,34,35,36 fortyGigE0/12 +Ethernet16 41,42,43,44 fortyGigE0/16 +Ethernet20 45,46,47,48 fortyGigE0/20 +Ethernet24 5,6,7,8 fortyGigE0/24 +Ethernet28 1,2,3,4 fortyGigE0/28 +Ethernet32 9,10,11,12 fortyGigE0/32 +Ethernet36 13,14,15,16 fortyGigE0/36 +Ethernet40 21,22,23,24 fortyGigE0/40 +Ethernet44 17,18,19,20 fortyGigE0/44 +Ethernet48 49,50,51,52 fortyGigE0/48 +Ethernet52 53,54,55,56 fortyGigE0/52 +Ethernet56 61,62,63,64 fortyGigE0/56 +Ethernet60 57,58,59,60 fortyGigE0/60 +Ethernet64 65,66,67,68 fortyGigE0/64 +Ethernet68 69,70,71,72 fortyGigE0/68 +Ethernet72 77,78,79,80 fortyGigE0/72 +Ethernet76 73,74,75,76 fortyGigE0/76 +Ethernet80 105,106,107,108 fortyGigE0/80 +Ethernet84 109,110,111,112 fortyGigE0/84 +Ethernet88 117,118,119,120 fortyGigE0/88 +Ethernet92 113,114,115,116 fortyGigE0/92 +Ethernet96 121,122,123,124 fortyGigE0/96 +Ethernet100 125,126,127,128 fortyGigE0/100 +Ethernet104 85,86,87,88 fortyGigE0/104 +Ethernet108 81,82,83,84 fortyGigE0/108 +Ethernet112 89,90,91,92 fortyGigE0/112 +Ethernet116 93,94,95,96 fortyGigE0/116 +Ethernet120 97,98,99,100 fortyGigE0/120 +Ethernet124 101,102,103,104 fortyGigE0/124 diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/sai.profile b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/sai.profile new file mode 100644 index 000000000000..b64d997fb451 --- /dev/null +++ b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/td2-s6000-32x40G.config.bcm diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/eeprom.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/eeprom.py new file mode 100644 index 000000000000..f08c5ba52cec --- /dev/null +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/eeprom.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python + +############################################################################# +# Dell S6000 +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + import subprocess + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 128 + _TLV_HDR_ENABLED = 0 + + _TLV_BLOCK_NUMBER = 3 + _TLV_BLOCK_HDR_STRING = "\x3a\x29" + + _TLV_CODE_MFG = 0x20 + _TLV_CODE_SW = 0x1f + _TLV_CODE_MAC = 0x21 + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-10/10-0053/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + + def decode_eeprom(self, e): + tlv_block_index = 0 + tlv_index = self.eeprom_start + tlv_end = self._TLV_INFO_MAX_LEN + + print "TLV Name Len Value" + print "-------------------- --- -----" + while tlv_block_index < self._TLV_BLOCK_NUMBER: + if not self.is_valid_block(e[tlv_index:]): + print "Invalid TLV field starting at EEPROM offset %d" % (tlv_index,) + return + print self.decoder(None, e[tlv_index:tlv_index + ord(e[tlv_index+2])]) + if not self.is_valid_block_checksum(e[tlv_index:tlv_index + ord(e[tlv_index+2])]): + print "(*** checksum invalid)" + tlv_index += ord(e[tlv_index+2]) + tlv_block_index += 1 + + def is_valid_block(self, e): + return (len(e) >= 8 and ord(e[2]) <= len(e) and \ + e[0:2] == self._TLV_BLOCK_HDR_STRING) + + def is_valid_block_checksum(self, e): + crc = self.compute_dell_crc(e[:-2]) + tlv_crc = ord(e[-1]) << 8 | ord(e[-2]) + return crc == tlv_crc + + def decoder(self, s, t): + ret = "" + if ord(t[4]) == self._TLV_CODE_MFG: + name = "PPID" + value = t[6:8] + "-" + t[8:14] + "-" + t[14:19] + "-" + \ + t[19:22] + "-" + t[22:26] + ret += "%-20s %3d %s\n" % (name, 20, value) + name = "DPN Rev" + ret += "%-20s %3d %s\n" % (name, 3, t[26:29]) + name = "Service Tag" + ret += "%-20s %3d %s\n" % (name, 7, t[29:36]) + name = "Part Number" + ret += "%-20s %3d %s\n" % (name, 10, t[36:46]) + name = "Part Number Rev" + ret += "%-20s %3d %s\n" % (name, 3, t[46:49]) + name = "Mfg Test Results" + ret += "%-20s %3d %s" % (name, 2, t[49:51]) + if ord(t[4]) == self._TLV_CODE_SW: + name = "Card ID" + ret += "%-20s %3d 0x%s\n" % (name, 2, t[6:8].encode('hex')) + name = "Module ID" + ret += "%-20s %3d %s" % (name, 2, ord(t[8:9])) + if ord(t[4]) == self._TLV_CODE_MAC: + name = "Base MAC Address" + value = ":".join([binascii.b2a_hex(T) for T in t[6:12]]).upper() + ret += "%-20s %3d %s" % (name, 12, value) + return ret + + def is_checksum_valid(self, e): + # Checksum is already calculated before + return (True, 0) + + def get_tlv_index(self, e, code): + tlv_index = 0 + while tlv_index < len(e): + if not self.is_valid_block(e[tlv_index:]): + return (False, 0) + if ord(e[tlv_index+4]) == code: + if not self.is_valid_block_checksum(e[tlv_index:tlv_index + ord(e[tlv_index+2])]): + print "(*** checksum invalid)" + return (True, tlv_index) + tlv_index += ord(e[tlv_index+2]) + return (Flase, 0) + + def base_mac_addr(self, e): + (is_valid, t) = self.get_tlv_index(e, self._TLV_CODE_MAC) + if not is_valid: + return "Bad base MAC address" + return ":".join([binascii.b2a_hex(T) for T in e[t:][6:12]]).upper() + + def serial_number_str(self, e): + ''' Return Service Tag ''' + (is_valid, t) = self.get_tlv_index(e, self._TLV_CODE_MFG) + if not is_valid: + return "Bad service tag" + t = e[t:] + return t[29:36] diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py new file mode 100644 index 000000000000..8b1ec277d79f --- /dev/null +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + eeprom_offset = 20 + + port_to_eeprom_mapping = {} + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + for x in range(0, self.port_end + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) + sfputilbase.__init__(self, port_num) diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/sensors.conf b/device/dell/x86_64-dell_s6000_s1220-r0/sensors.conf new file mode 100644 index 000000000000..2208bb6340d1 --- /dev/null +++ b/device/dell/x86_64-dell_s6000_s1220-r0/sensors.conf @@ -0,0 +1,57 @@ +# libsensors configuration file +# -------------------------------------------------- +# + +# tmp75-i2c-11-4c has sensors close to Networking ASIC. +# tmp75-i2c-11-4d has sensors close to NIC. +# tmp75-i2c-11-4e is an ambient temperature sensor. + +chip "tmp75-*" + set temp1_max 50 + set temp1_max_hyst 25 + +# emc1403-i2c-10-4d has following temperature sensors: +# temp1: CPU0 external Temp Sensor +# temp2: CPU1 external Temp Sensor +# temp3: CPU Internal DTS (Internal die, max of all die readings) + +chip "emc1403-*" + set temp1_crit 85 + set temp1_max 50 + set temp2_crit 85 + set temp2_max 50 + set temp3_crit 85 + set temp3_max 50 + +chip "max6620-i2c-*-2a" + ignore fan3 + ignore fan4 + +chip "w83627dhg-*" + label in0 "VCore 1" + label in1 "VCore 2" + set in0_min 0 + set in0_max 1.74 + set in1_min 0 + set in1_max 1.74 + ignore fan1 + ignore fan2 + ignore fan3 + ignore fan4 + ignore fan5 + ignore in4 + ignore in5 + ignore in6 + ignore temp1 + ignore temp2 + ignore temp3 + ignore cpu0_vid + ignore intrusion0 + +chip "jc42-*" + set temp1_max 50 + set temp1_crit 85 + +chip "dni_dps460-*" + set temp1_max 50 + set temp2_max 50 diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/port_config.ini b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/port_config.ini new file mode 100644 index 000000000000..dcdd6548c198 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/port_config.ini @@ -0,0 +1,65 @@ +# name lanes alias +Ethernet0 101,102 fortyGigE1/1/1 +Ethernet1 103,104 fortyGigE1/1/2 +Ethernet2 97,98 fortyGigE1/1/3 +Ethernet3 99,100 fortyGigE1/1/4 +Ethernet4 69,70 fortyGigE1/1/5 +Ethernet5 71,72 fortyGigE1/1/6 +Ethernet6 65,66 fortyGigE1/1/7 +Ethernet7 67,68 fortyGigE1/1/8 +Ethernet8 53,54 fortyGigE1/1/9 +Ethernet9 55,56 fortyGigE1/1/10 +Ethernet10 49,50 fortyGigE1/1/11 +Ethernet11 51,52 fortyGigE1/1/12 +Ethernet12 21,22 fortyGigE1/1/13 +Ethernet13 23,24 fortyGigE1/1/14 +Ethernet14 17,18 fortyGigE1/1/15 +Ethernet15 19,20 fortyGigE1/1/16 +Ethernet16 25,26 fortyGigE1/2/1 +Ethernet17 27,28 fortyGigE1/2/2 +Ethernet18 29,30 fortyGigE1/2/3 +Ethernet19 31,32 fortyGigE1/2/4 +Ethernet20 57,58 fortyGigE1/2/5 +Ethernet21 59,60 fortyGigE1/2/6 +Ethernet22 61,62 fortyGigE1/2/7 +Ethernet23 63,64 fortyGigE1/2/8 +Ethernet24 73,74 fortyGigE1/2/9 +Ethernet25 75,76 fortyGigE1/2/10 +Ethernet26 77,78 fortyGigE1/2/11 +Ethernet27 79,80 fortyGigE1/2/12 +Ethernet28 105,106 fortyGigE1/2/13 +Ethernet29 107,108 fortyGigE1/2/14 +Ethernet30 109,110 fortyGigE1/2/15 +Ethernet31 111,112 fortyGigE1/2/16 +Ethernet32 13,14 fortyGigE1/3/1 +Ethernet33 15,16 fortyGigE1/3/2 +Ethernet34 9,10 fortyGigE1/3/3 +Ethernet35 11,12 fortyGigE1/3/4 +Ethernet36 125,126 fortyGigE1/3/5 +Ethernet37 127,128 fortyGigE1/3/6 +Ethernet38 121,122 fortyGigE1/3/7 +Ethernet39 123,124 fortyGigE1/3/8 +Ethernet40 93,94 fortyGigE1/3/9 +Ethernet41 95,96 fortyGigE1/3/10 +Ethernet42 89,90 fortyGigE1/3/11 +Ethernet43 91,92 fortyGigE1/3/12 +Ethernet44 45,46 fortyGigE1/3/13 +Ethernet45 47,48 fortyGigE1/3/14 +Ethernet46 41,42 fortyGigE1/3/15 +Ethernet47 43,44 fortyGigE1/3/16 +Ethernet48 113,114 fortyGigE1/4/1 +Ethernet49 115,116 fortyGigE1/4/2 +Ethernet50 117,118 fortyGigE1/4/3 +Ethernet51 119,120 fortyGigE1/4/4 +Ethernet52 1,2 fortyGigE1/4/5 +Ethernet53 3,4 fortyGigE1/4/6 +Ethernet54 5,6 fortyGigE1/4/7 +Ethernet55 7,8 fortyGigE1/4/8 +Ethernet56 33,34 fortyGigE1/4/9 +Ethernet57 35,36 fortyGigE1/4/10 +Ethernet58 37,38 fortyGigE1/4/11 +Ethernet59 39,40 fortyGigE1/4/12 +Ethernet60 81,82 fortyGigE1/4/13 +Ethernet61 83,84 fortyGigE1/4/14 +Ethernet62 85,86 fortyGigE1/4/15 +Ethernet63 87,88 fortyGigE1/4/16 diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/sai.profile b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/sai.profile new file mode 100644 index 000000000000..ee286905f907 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-s6100-64x40G.config.bcm diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py new file mode 100644 index 000000000000..534e587ae722 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 63 + ports_in_block = 64 + + eeprom_offset = 18 + + port_to_eeprom_mapping = {} + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + for x in range(0, self.port_end + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) + sfputilbase.__init__(self, port_num) diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini new file mode 100644 index 000000000000..d2b36ebf5e2a --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 5,6,7,8 Ethernet0 +Ethernet4 1,2,3,4 Ethernet4 +Ethernet8 13,14,15,16 Ethernet8 +Ethernet12 9,10,11,12 Ethernet12 +Ethernet16 21,22,23,24 Ethernet16 +Ethernet20 17,18,19,20 Ethernet20 +Ethernet24 29,30,31,32 Ethernet24 +Ethernet28 25,26,27,28 Ethernet28 +Ethernet32 37,38,39,40 Ethernet32 +Ethernet36 33,34,35,36 Ethernet36 +Ethernet40 45,46,47,48 Ethernet40 +Ethernet44 41,42,43,44 Ethernet44 +Ethernet48 53,54,55,56 Ethernet48 +Ethernet52 49,50,51,52 Ethernet52 +Ethernet56 61,62,63,64 Ethernet56 +Ethernet60 57,58,59,60 Ethernet60 +Ethernet64 69,70,71,72 Ethernet64 +Ethernet68 65,66,67,68 Ethernet68 +Ethernet72 77,78,79,80 Ethernet72 +Ethernet76 73,74,75,76 Ethernet76 +Ethernet80 85,86,87,88 Ethernet80 +Ethernet84 81,82,83,84 Ethernet84 +Ethernet88 93,94,95,96 Ethernet88 +Ethernet92 89,90,91,92 Ethernet92 +Ethernet96 101,102,103,104 Ethernet96 +Ethernet100 97,98,99,100 Ethernet100 +Ethernet104 109,110,111,112 Ethernet104 +Ethernet108 105,106,107,108 Ethernet108 +Ethernet112 117,118,119,120 Ethernet112 +Ethernet116 113,114,115,116 Ethernet116 +Ethernet120 125,126,127,128 Ethernet120 +Ethernet124 121,122,123,124 Ethernet124 diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf new file mode 100644 index 000000000000..44eedb4b11b0 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf @@ -0,0 +1,35 @@ +# libsensors configuration file +chip "i350bb-*" + ignore loc1 + +chip "jc42-*" + label temp1 "DIMM Temp" + set temp1_max 50 + set temp1_crit 85 + +chip "w83795adg-*" + label in0 "1.0V" + label in1 "1.0V_ROV" + label in2 "1.25V" + label in3 "1.8V" + ignore in4 + ignore in5 + ignore in6 + ignore in7 + label in12 "+3.3V" + ignore in14 + ignore in15 + ignore in16 + label fan1 "FANTRAY 1-A" + label fan2 "FANTRAY 1-B" + label fan3 "FANTRAY 2-A" + label fan4 "FANTRAY 2-B" + label fan5 "FANTRAY 3-A" + label fan6 "FANTRAY 3-B" + label fan7 "FANTRAY 4-A" + label fan8 "FANTRAY 4-B" + label temp1 "Front MAC Temp" + label temp2 "Rear MAC Temp" + ignore temp3 + ignore temp4 + ignore intrusion0 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/port_config.ini b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/port_config.ini new file mode 100644 index 000000000000..816bb0e94a70 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/port_config.ini @@ -0,0 +1,33 @@ +# name lanes +Ethernet0 0,1,2,3 +Ethernet4 4,5,6,7 +Ethernet8 8,9,10,11 +Ethernet12 12,13,14,15 +Ethernet16 16,17,18,19 +Ethernet20 20,21,22,23 +Ethernet24 24,25,26,27 +Ethernet28 28,29,30,31 +Ethernet32 32,33,34,35 +Ethernet36 36,37,38,39 +Ethernet40 40,41,42,43 +Ethernet44 44,45,46,47 +Ethernet48 48,49,50,51 +Ethernet52 52,53,54,55 +Ethernet56 56,57,58,59 +Ethernet60 60,61,62,63 +Ethernet64 64,65,66,67 +Ethernet68 68,69,70,71 +Ethernet72 72,73,74,75 +Ethernet76 76,77,78,79 +Ethernet80 80,81,82,83 +Ethernet84 84,85,86,87 +Ethernet88 88,89,90,91 +Ethernet92 92,93,94,95 +Ethernet96 96,97,98,99 +Ethernet100 100,101,102,103 +Ethernet104 104,105,106,107 +Ethernet108 108,109,110,111 +Ethernet112 112,113,114,115 +Ethernet116 116,117,118,119 +Ethernet120 120,121,122,123 +Ethernet124 124,125,126,127 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/sai.profile b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/sai.profile new file mode 100644 index 000000000000..9a9a38aeb068 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sai_2700.xml diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py new file mode 100644 index 000000000000..a9e22e3e698c --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + import eeprom_base + import eeprom_tlvinfo + import subprocess +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + _TLV_INFO_MAX_LEN = 256 + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/bsp/eeprom/sys_eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py new file mode 100644 index 000000000000..04e9a4eff85e --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py @@ -0,0 +1,28 @@ +#! /usr/bin/python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + eeprom_offset = 1 + + port_to_eeprom_mapping = {} + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/bsp/qsfp/qsfp{0}' + for x in range(0, self.port_end + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) + sfputilbase.__init__(self, port_num) + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2700-r0/sensors.conf new file mode 100644 index 000000000000..a3e30391863e --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/sensors.conf @@ -0,0 +1,21 @@ +bus "i2c-7" "i2c-1-mux (chan_id 5)" +chip "lm75-i2c-7-4a" + label temp1 "Ambient Port Temp" + +bus "i2c-5" "i2c-1-mux (chan_id 3)" +chip "ucd9200-i2c-5-27" + label in1 "UCD1 vin" + label in2 "ASIC 3.3 vout" + label in3 "ASIC 1.2 vout" + label temp1 "UCD1 Temp" + label temp2 "UCD1 Temp2" + +chip "ucd9200-i2c-5-41" + label in1 "UCD2 vin" + label in2 "ASIC Vcore vout" + label temp1 "UCD2 Temp1" + label temp2 "UCD2 Temp2" + +bus "i2c-17" "i2c-1-mux (chan_id 7)" +chip "lm75-i2c-17-49" + label temp1 "Ambient Board Temp" diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 6f604c63aefb..5a753471911d 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -1,11 +1,18 @@ #!/bin/bash +# Obtain our platform and HWSKU as we will mount directories with these names in each docker +PLATFORM=`/usr/bin/sonic-cfggen -v platform` +HWSKU=`/usr/bin/sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` + start() { docker inspect --type container {{docker_container_name}} &>/dev/null if [ "$?" -eq "0" ]; then docker start -a {{docker_container_name}} else - docker run {{docker_image_run_opt}} --name={{docker_container_name}} {{docker_image_name}} + docker run {{docker_image_run_opt}} \ + -v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \ + -v /usr/share/sonic/device/$PLATFORM/$HWSKU:/usr/share/sonic/hwsku:ro \ + --name={{docker_container_name}} {{docker_image_name}} fi } diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index f69d9ff87372..c02263d3e37e 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -34,45 +34,44 @@ sudo LANG=C chroot $FILESYSTEM_ROOT mount sysfs /sys -t sysfs sudo chroot $FILESYSTEM_ROOT service docker start sudo chroot $FILESYSTEM_ROOT docker version -# Install config engine dependencies -sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install \ - python-lxml \ - python-jinja2 \ - python-netaddr \ - python-ipaddr \ - python-yaml - -sudo dpkg --root=$FILESYSTEM_ROOT -i {{config_engine}} - -# Python tabulate required for sonic-utilities -python_tabulate_url=http://packages.microsoft.com/repos/sonic-dev/pool/main/p/python-tabulate/python-tabulate_0.7.7-1_all.deb -python_template_deb_temp=`mktemp` -trap_push "rm -f $python_template_deb_temp" -wget $python_tabulate_url -qO $python_template_deb_temp && { \ - sudo dpkg --root=$FILESYSTEM_ROOT -i $python_template_deb_temp || \ - sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f; \ -} - -# Sonic utilities -sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/sonic-utilities_*.deb || \ - sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f - -# Create all needed directories -sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/ -sudo mkdir -p $FILESYSTEM_ROOT/usr/share/sonic/templates/ - # Apply apt configuration files sudo cp $IMAGE_CONFIGS/apt/sources.list $FILESYSTEM_ROOT/etc/apt/ sudo cp -R $IMAGE_CONFIGS/apt/sources.list.d/ $FILESYSTEM_ROOT/etc/apt/ cat $IMAGE_CONFIGS/apt/sonic-dev.gpg.key | sudo LANG=C chroot $FILESYSTEM_ROOT apt-key add - +# Update apt's snapshot of its repos +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get update + # Apply environtment configuration files sudo cp $IMAGE_CONFIGS/environment/environment $FILESYSTEM_ROOT/etc/ sudo cp $IMAGE_CONFIGS/environment/motd $FILESYSTEM_ROOT/etc/ +# Create all needed directories +sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/ +sudo mkdir -p $FILESYSTEM_ROOT/usr/share/sonic/templates/ + # Copy default minigraph sudo cp $IMAGE_CONFIGS/minigraph/minigraph_{{sonic_hwsku}}.xml $FILESYSTEM_ROOT/etc/sonic/minigraph.xml +# Install dependencies for SONiC config engine +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install \ + python-lxml \ + python-jinja2 \ + python-netaddr \ + python-ipaddr \ + python-yaml + +# Install SONiC config engine +sudo dpkg --root=$FILESYSTEM_ROOT -i {{config_engine}} + +# Install SONiC Utilities (and its dependencies via 'apt-get -y install -f') +sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/python-sonic-utilities_*.deb || \ + sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f + +# Install SONiC Device Data (and its dependencies via 'apt-get -y install -f') +sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/sonic-device-data_*.deb || \ + sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f + # Copy NTP configuration files and templates sudo cp $IMAGE_CONFIGS/ntp/ntp-config.service $FILESYSTEM_ROOT/etc/systemd/system/ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable ntp-config.service diff --git a/rules/sonic-device-data.mk b/rules/sonic-device-data.mk new file mode 100644 index 000000000000..abf7d0501f93 --- /dev/null +++ b/rules/sonic-device-data.mk @@ -0,0 +1,10 @@ +# sonic-device-data Debian package + +SONIC_DEVICE_DATA_VERSION = 1.0 +SONIC_DEVICE_DATA_VERSION_FULL = $(SONIC_DEVICE_DATA_VERSION)-1 + +export SONIC_DEVICE_DATA_VERSION SONIC_DEVICE_DATA_VERSION_FULL + +SONIC_DEVICE_DATA = sonic-device-data_$(SONIC_DEVICE_DATA_VERSION_FULL)_all.deb +$(SONIC_DEVICE_DATA)_SRC_PATH = $(SRC_PATH)/sonic-device-data +SONIC_MAKE_DEBS += $(SONIC_DEVICE_DATA) diff --git a/rules/sonic-utilities.mk b/rules/sonic-utilities.mk index 7f40cdc93c6c..7377ed50cbca 100644 --- a/rules/sonic-utilities.mk +++ b/rules/sonic-utilities.mk @@ -1,5 +1,5 @@ # sonic utilities package -SONIC_UTILS = sonic-utilities_0.1_amd64.deb +SONIC_UTILS = python-sonic-utilities_1.0-1_all.deb $(SONIC_UTILS)_SRC_PATH = $(SRC_PATH)/sonic-utilities -SONIC_DPKG_DEBS += $(SONIC_UTILS) +SONIC_PYTHON_STDEB_DEBS += $(SONIC_UTILS) diff --git a/slave.mk b/slave.mk index 9a31aadf11f5..a77c2f9818f5 100644 --- a/slave.mk +++ b/slave.mk @@ -286,7 +286,7 @@ $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TA ############################################################################### # targets for building installers with base image -$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_UTILS)) $(addprefix $(DEBS_PATH)/,$(SONIC_CONFIG_ENGINE)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) +$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_CONFIG_ENGINE) $(SONIC_DEVICE_DATA) $(SONIC_UTILS)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $(HEADER) ## Pass initramfs and linux kernel explicitly. They are used for all platforms export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 79496eee4e89..aece9dee8a50 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -299,10 +299,10 @@ def get_mgmt_info(devices, dev, port): def get_alias_map_list(hwsku, platform=None): port_config_candidates = [] - port_config_candidates.append('/usr/share/sonic/sku/port_config.ini') + port_config_candidates.append('/usr/share/sonic/hwsku/port_config.ini') if platform != None: port_config_candidates.append(os.path.join('/usr/share/sonic/device', platform, hwsku, 'port_config.ini')) - port_config_candidates.append(os.path.join('/usr/share/sonic/device', hwsku, 'port_config.ini')) + port_config_candidates.append(os.path.join('/usr/share/sonic/platform', hwsku, 'port_config.ini')) port_config_candidates.append(os.path.join('/usr/share/sonic', hwsku, 'port_config.ini')) port_config = None for candidate in port_config_candidates: diff --git a/src/sonic-device-data/LICENSE b/src/sonic-device-data/LICENSE new file mode 100644 index 000000000000..2ff086dedcdd --- /dev/null +++ b/src/sonic-device-data/LICENSE @@ -0,0 +1,15 @@ +Copyright (C) 2017 Microsoft + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/sonic-device-data/MAINTAINERS b/src/sonic-device-data/MAINTAINERS new file mode 100644 index 000000000000..fde1eede3214 --- /dev/null +++ b/src/sonic-device-data/MAINTAINERS @@ -0,0 +1,7 @@ +# This file describes the maintainers for sonic-device-data +# See the SONiC project governance document for more information + +Name = "Joe LeVeque" +Email = "jolevequ@microsoft.com" +Github = jleveque +Mailinglist = sonicproject@googlegroups.com diff --git a/src/sonic-device-data/Makefile b/src/sonic-device-data/Makefile new file mode 100644 index 000000000000..dc45dc6bff9f --- /dev/null +++ b/src/sonic-device-data/Makefile @@ -0,0 +1,22 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = sonic-device-data_$(SONIC_DEVICE_DATA_VERSION_FULL)_all.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + pushd ./src + + # Remove any stale data + rm -rf ./device + + # Create a new dir and copy all ONIE-platform-string-named dirs into it + mkdir ./device + cp -r ../../../device/*/* ./device/ + + # Build the package + dpkg-buildpackage -rfakeroot -b -us -uc + + popd + + mv $* $(DEST)/ diff --git a/src/sonic-device-data/README.md b/src/sonic-device-data/README.md new file mode 100644 index 000000000000..e8ccad58b819 --- /dev/null +++ b/src/sonic-device-data/README.md @@ -0,0 +1,4 @@ +# sonic-device-data +Device-specific data for the SONiC project + +See the [SONiC Website](http://azure.github.io/SONiC/) for more information about the SONiC project. diff --git a/src/sonic-device-data/src/debian/changelog b/src/sonic-device-data/src/debian/changelog new file mode 100644 index 000000000000..9cf0041aa890 --- /dev/null +++ b/src/sonic-device-data/src/debian/changelog @@ -0,0 +1,5 @@ +sonic-device-data (1.0-1) UNRELEASED; urgency=low + + * Initial release. (Closes: #XXXXXX) + + -- Joe LeVeque Tue, 20 Feb 2017 14:00:00 -0700 diff --git a/src/sonic-device-data/src/debian/compat b/src/sonic-device-data/src/debian/compat new file mode 100644 index 000000000000..ec635144f600 --- /dev/null +++ b/src/sonic-device-data/src/debian/compat @@ -0,0 +1 @@ +9 diff --git a/src/sonic-device-data/src/debian/control b/src/sonic-device-data/src/debian/control new file mode 100644 index 000000000000..a9969efc4b84 --- /dev/null +++ b/src/sonic-device-data/src/debian/control @@ -0,0 +1,11 @@ +Source: sonic-device-data +Maintainer: Joe LeVeque +Section: misc +Priority: optional +Standards-Version: 0.1 +Build-Depends: debhelper (>=9) + +Package: sonic-device-data +Architecture: all +Depends: ${misc:Depends} +Description: Device-specific data files for SONiC diff --git a/src/sonic-device-data/src/debian/copyright b/src/sonic-device-data/src/debian/copyright new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/src/sonic-device-data/src/debian/install b/src/sonic-device-data/src/debian/install new file mode 100644 index 000000000000..707d39adfccb --- /dev/null +++ b/src/sonic-device-data/src/debian/install @@ -0,0 +1 @@ +device/ usr/share/sonic/ diff --git a/src/sonic-device-data/src/debian/rules b/src/sonic-device-data/src/debian/rules new file mode 100755 index 000000000000..e91562ccbb5a --- /dev/null +++ b/src/sonic-device-data/src/debian/rules @@ -0,0 +1,7 @@ +#!/usr/bin/make -f + +build: + +%: + dh $@ + diff --git a/src/sonic-utilities b/src/sonic-utilities index be32ae1646ce..07a8b3ab377f 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit be32ae1646ce3f98e6fbe15f70aa0629fba0735c +Subproject commit 07a8b3ab377f4ceb2ad84c82dcdbb0e592a70b4c From b9b7d7a29590c9db1c3dd04cc5e55a6edc99fd0e Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 27 Feb 2017 13:08:41 -0800 Subject: [PATCH 0314/1011] [installer]: support platform driver lazy installation (#340) allow one image to support multiple switch devices, install corresponding platform driver during the first boot time. --- build_debian.sh | 11 +++-- .../build_templates/sonic_debian_extension.j2 | 40 +++++++++++++++++-- files/image_config/platform/rc.local | 25 ++++++++++++ platform/broadcom/one-image.mk | 5 ++- platform/broadcom/platform-modules-dell.mk | 1 + .../platform-modules-ingrasys-s9100.mk | 1 + platform/broadcom/platform-modules-s6000.mk | 1 + slave.mk | 3 +- 8 files changed, 77 insertions(+), 10 deletions(-) create mode 100755 files/image_config/platform/rc.local diff --git a/build_debian.sh b/build_debian.sh index 2d6cc35533f6..16f31f980ada 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -37,6 +37,7 @@ DOCKER_VERSION=1.11.1-0~jessie_amd64 ## Working directory to prepare the file system FILESYSTEM_ROOT=./fsroot +PLATFORM_DIR=platform ## Hostname for the linux image HOSTNAME=sonic DEFAULT_USERINFO="Default admin user,,," @@ -61,6 +62,8 @@ if [[ -d $FILESYSTEM_ROOT ]]; then sudo rm -rf $FILESYSTEM_ROOT || die "Failed to clean chroot directory" fi mkdir -p $FILESYSTEM_ROOT +mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR +touch $FILESYSTEM_ROOT/$PLATFORM_DIR/firsttime ## Build a basic Debian system by debootstrap echo '[INFO] Debootstrap...' @@ -247,7 +250,7 @@ sudo cp files/dhcp/snmpcommunity $FILESYSTEM_ROOT/etc/dhcp/dhclient-exit-hooks.d sudo cp files/dhcp/dhclient.conf $FILESYSTEM_ROOT/etc/dhcp/ if [ -f sonic_debian_extension.sh ]; then - ./sonic_debian_extension.sh $FILESYSTEM_ROOT + ./sonic_debian_extension.sh $FILESYSTEM_ROOT $PLATFORM_DIR fi ## Clean up apt @@ -268,11 +271,11 @@ sudo mkdir $FILESYSTEM_ROOT/host sudo rm -f $ONIE_INSTALLER_PAYLOAD $FILESYSTEM_SQUASHFS ## Output the file system total size for diag purpose sudo du -hs $FILESYSTEM_ROOT -sudo mksquashfs $FILESYSTEM_ROOT $FILESYSTEM_SQUASHFS -e boot -e var/lib/docker +sudo mksquashfs $FILESYSTEM_ROOT $FILESYSTEM_SQUASHFS -e boot -e var/lib/docker -e $PLATFORM_DIR ## Compress docker files pushd $FILESYSTEM_ROOT && sudo tar czf $OLDPWD/$FILESYSTEM_DOCKERFS -C var/lib/docker .; popd -## Compress together with /boot and /var/lib/docker as an installer payload zip file -pushd $FILESYSTEM_ROOT && sudo zip $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/; popd +## Compress together with /boot, /var/lib/docker and $PLATFORM_DIR as an installer payload zip file +pushd $FILESYSTEM_ROOT && sudo zip $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/ $PLATFORM_DIR/; popd sudo zip -g $ONIE_INSTALLER_PAYLOAD $FILESYSTEM_SQUASHFS $FILESYSTEM_DOCKERFS diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index c02263d3e37e..08aaae769fa8 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -4,7 +4,7 @@ ## to debian file system. ## ## USAGE: -## ./sonic_debian_extension.sh FILESYSTEM_ROOT +## ./sonic_debian_extension.sh FILESYSTEM_ROOT PLATFORM_DIR ## PARAMETERS: ## FILESYSTEM_ROOT ## Path to debian file system root directory @@ -15,6 +15,12 @@ FILESYSTEM_ROOT=$1 exit 1 } +PLATFORM_DIR=$2 +[ -n "$PLATFORM_DIR" ] || { + echo "Error: no or empty PLATFORM_DIR argument" + exit 1 +} + ## Enable debug output for script set -x -e @@ -22,7 +28,6 @@ set -x -e BUILD_TEMPLATES=files/build_templates IMAGE_CONFIGS=files/image_config -{% if installer_debs.strip() -%} clean_sys() { sudo umount $FILESYSTEM_ROOT/sys/fs/cgroup/* \ $FILESYSTEM_ROOT/sys/fs/cgroup \ @@ -130,6 +135,7 @@ exit 101 EOF sudo chmod a+x $FILESYSTEM_ROOT/usr/sbin/policy-rc.d +{% if installer_debs.strip() -%} {% for deb in installer_debs.strip().split(' ') -%} if [ $sonic_asic_platform == "mellanox" ]; then sudo dpkg --extract {{deb}} $FILESYSTEM_ROOT @@ -137,12 +143,38 @@ else sudo dpkg --root=$FILESYSTEM_ROOT -i {{deb}} || sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f fi {% endfor %} - -sudo rm -f $FILESYSTEM_ROOT/usr/sbin/policy-rc.d +{% endif %} ## Run depmod command for target kernel modules sudo LANG=C chroot $FILESYSTEM_ROOT depmod -a {{kversion}} + +## download all dependency packages for platform debian packages +{% if lazy_installer_debs.strip() -%} +{% for file in lazy_installer_debs.strip().split(' ') -%} + +{% set dev = file.split('@')[0] -%} +{% set deb = file.split('@')[1] -%} +{% set debfilename = deb.split('/')|last -%} +{% set debname = debfilename.split('_')|first -%} + +sudo dpkg --root=$FILESYSTEM_ROOT -i {{deb}} || sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f --download-only + +sudo mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}} +sudo cp {{ deb }} $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/ +for f in `find $FILESYSTEM_ROOT/var/cache/apt/archives -name "*.deb"`; do + sudo mv $f $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/ +done + +sudo dpkg --root=$FILESYSTEM_ROOT -P {{ debname }} + +{% endfor %} {% endif %} + +sudo rm -f $FILESYSTEM_ROOT/usr/sbin/policy-rc.d + +## copy platform rc.local +sudo cp $IMAGE_CONFIGS/platform/rc.local $FILESYSTEM_ROOT/etc/ + {% if installer_images.strip() -%} {% for image in installer_images.strip().split(' ') -%} sudo LANG=C chroot $FILESYSTEM_ROOT docker load < {{image}} diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local new file mode 100755 index 000000000000..dc5507fe234b --- /dev/null +++ b/files/image_config/platform/rc.local @@ -0,0 +1,25 @@ +#!/bin/sh -e +# +# rc.local +# +# This script is executed at the end of each multiuser runlevel. +# Make sure that the script will "exit 0" on success or any other +# value on error. +# +# In order to enable or disable this script just change the execution +# bits. +# +# By default this script does nothing. + +. /host/machine.conf + +echo "install platform dependent packages at the first boot time" + +if [ -f /host/platform/firsttime ]; then + if [ -d /host/platform/$onie_platform ]; then + dpkg -i /host/platform/$onie_platform/*.deb + fi + rm /host/platform/firsttime +fi + +exit 0 diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 59939fb72e7c..4558d6669d09 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -3,6 +3,9 @@ SONIC_ONE_IMAGE = sonic-broadcom.bin $(SONIC_ONE_IMAGE)_MACHINE = broadcom $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_ONE_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) $(DELL_S6000_PLATFORM_MODULE) +$(SONIC_ONE_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) +$(SONIC_ONE_IMAGE)_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ + $(DELL_Z9100_PLATFORM_MODULE) \ + $(INGRASYS_S9100_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/broadcom/platform-modules-dell.mk b/platform/broadcom/platform-modules-dell.mk index 36ca217f56ca..ce4c29651c4f 100644 --- a/platform/broadcom/platform-modules-dell.mk +++ b/platform/broadcom/platform-modules-dell.mk @@ -7,4 +7,5 @@ export DELL_Z9100_PLATFORM_MODULE_VERSION DELL_Z9100_PLATFORM_MODULE = platform-modules-z9100_$(DELL_Z9100_PLATFORM_MODULE_VERSION)_amd64.deb $(DELL_Z9100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-dell $(DELL_Z9100_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(DELL_Z9100_PLATFORM_MODULE)_PLATFORM = x86_64-dell_z9100_c2538-r0 SONIC_DPKG_DEBS += $(DELL_Z9100_PLATFORM_MODULE) diff --git a/platform/broadcom/platform-modules-ingrasys-s9100.mk b/platform/broadcom/platform-modules-ingrasys-s9100.mk index 1802290008b0..7c7df7b1cf61 100755 --- a/platform/broadcom/platform-modules-ingrasys-s9100.mk +++ b/platform/broadcom/platform-modules-ingrasys-s9100.mk @@ -7,4 +7,5 @@ export INGRASYS_S9100_PLATFORM_MODULE_VERSION INGRASYS_S9100_PLATFORM_MODULE = sonic-platform-ingrasys-s9100_$(INGRASYS_S9100_PLATFORM_MODULE_VERSION)_amd64.deb $(INGRASYS_S9100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ingrasys-s9100 $(INGRASYS_S9100_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(INGRASYS_S9100_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s9100-r0 SONIC_DPKG_DEBS += $(INGRASYS_S9100_PLATFORM_MODULE) diff --git a/platform/broadcom/platform-modules-s6000.mk b/platform/broadcom/platform-modules-s6000.mk index a32ab67c7aa8..d2c105ffdc8d 100644 --- a/platform/broadcom/platform-modules-s6000.mk +++ b/platform/broadcom/platform-modules-s6000.mk @@ -7,4 +7,5 @@ export DELL_S6000_PLATFORM_MODULE_VERSION DELL_S6000_PLATFORM_MODULE = platform-modules-s6000_$(DELL_S6000_PLATFORM_MODULE_VERSION)_amd64.deb $(DELL_S6000_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-s6000 $(DELL_S6000_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(DELL_S6000_PLATFORM_MODULE)_PLATFORM = x86_64-dell_s6000_s1220-r0 SONIC_DPKG_DEBS += $(DELL_S6000_PLATFORM_MODULE) diff --git a/slave.mk b/slave.mk index a77c2f9818f5..529ece46f8cb 100644 --- a/slave.mk +++ b/slave.mk @@ -286,13 +286,14 @@ $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TA ############################################################################### # targets for building installers with base image -$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_CONFIG_ENGINE) $(SONIC_DEVICE_DATA) $(SONIC_UTILS)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) +$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_CONFIG_ENGINE) $(SONIC_DEVICE_DATA) $(SONIC_UTILS)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $(HEADER) ## Pass initramfs and linux kernel explicitly. They are used for all platforms export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" export linux_kernel="$(DEBS_PATH)/$(LINUX_KERNEL)" export kversion="$(KVERSION)" export installer_debs="$(addprefix $(DEBS_PATH)/,$($*_DEPENDS))" + export lazy_installer_debs="$(foreach deb, $($*_INSTALLS),$(addprefix $($(deb)_PLATFORM)@, $(DEBS_PATH)/$(deb)))" export installer_images="$(addprefix $(TARGET_PATH)/,$($*_DOCKERS))" export config_engine="$(addprefix $(DEBS_PATH)/,$(SONIC_CONFIG_ENGINE))" export image_type="$($*_IMAGE_TYPE)" From 7e1adeeb222f723dc40bc7119d5e57bcbdc3c0fc Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 27 Feb 2017 14:42:25 -0800 Subject: [PATCH 0315/1011] [platform]: add eeprom/sfputil support for z9100 (#342) --- .../Force10-Z9100/port_config.ini | 33 ++++++++++ .../Force10-Z9100/sai.profile | 1 + .../plugins/eeprom.py | 23 +++++++ .../plugins/sfputil.py | 60 +++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100/port_config.ini create mode 100644 device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100/sai.profile create mode 100644 device/dell/x86_64-dell_z9100_c2538-r0/plugins/eeprom.py create mode 100644 device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100/port_config.ini b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100/port_config.ini new file mode 100644 index 000000000000..e000f29bef38 --- /dev/null +++ b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 49,50,51,52 hundredGigE1/1 +Ethernet4 53,54,55,56 hundredGigE1/2 +Ethernet8 57,58,59,60 hundredGigE1/3 +Ethernet12 61,62,63,64 hundredGigE1/4 +Ethernet16 65,66,67,68 hundredGigE1/5 +Ethernet20 69,70,71,72 hundredGigE1/6 +Ethernet24 73,74,75,76 hundredGigE1/7 +Ethernet28 77,78,79,80 hundredGigE1/8 +Ethernet32 37,38,39,40 hundredGigE1/9 +Ethernet36 33,34,35,36 hundredGigE1/10 +Ethernet40 45,46,47,48 hundredGigE1/11 +Ethernet44 41,42,43,44 hundredGigE1/12 +Ethernet48 81,82,83,84 hundredGigE1/13 +Ethernet52 85,86,87,88 hundredGigE1/14 +Ethernet56 89,90,91,92 hundredGigE1/15 +Ethernet60 93,94,95,96 hundredGigE1/16 +Ethernet64 97,98,99,100 hundredGigE1/17 +Ethernet68 101,102,103,104 hundredGigE1/18 +Ethernet72 105,106,107,108 hundredGigE1/19 +Ethernet76 109,110,111,112 hundredGigE1/20 +Ethernet80 21,22,23,24 hundredGigE1/21 +Ethernet84 17,18,19,20 hundredGigE1/22 +Ethernet88 29,30,31,32 hundredGigE1/23 +Ethernet92 25,26,27,28 hundredGigE1/24 +Ethernet96 117,118,119,120 hundredGigE1/25 +Ethernet100 113,114,115,116 hundredGigE1/26 +Ethernet104 125,126,127,128 hundredGigE1/27 +Ethernet108 121,122,123,124 hundredGigE1/28 +Ethernet112 5,6,7,8 hundredGigE1/29 +Ethernet116 1,2,3,4 hundredGigE1/30 +Ethernet120 13,14,15,16 hundredGigE1/31 +Ethernet124 9,10,11,12 hundredGigE1/32 diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100/sai.profile b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100/sai.profile new file mode 100644 index 000000000000..2c9a6e54c1ac --- /dev/null +++ b/device/dell/x86_64-dell_z9100_c2538-r0/Force10-Z9100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-z9100-32x100G.config.bcm diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/plugins/eeprom.py b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/eeprom.py new file mode 100644 index 000000000000..0e6b1bcfafcb --- /dev/null +++ b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/eeprom.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +############################################################################# +# Dell Z9100 +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-2/2-0050/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py new file mode 100644 index 000000000000..07e094db7bb8 --- /dev/null +++ b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 0: 18, + 1: 19, + 2: 20, + 3: 21, + 4: 22, + 5: 23, + 6: 24, + 7: 25, + 8: 26, + 9: 27, + 10: 28, + 11: 29, + 12: 31, + 13: 30, + 14: 33, + 15: 32, + 16: 34, + 17: 35, + 18: 36, + 19: 37, + 20: 38, + 21: 39, + 22: 40, + 23: 41, + 24: 42, + 25: 43, + 26: 44, + 27: 45, + 28: 46, + 29: 47, + 30: 48, + 31: 49 + } + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + for x in range(0, self.port_end + 1): + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + sfputilbase.__init__(self, port_num) From 66efbe4ee6e10e577e298486a7b5d6f35a23d6f9 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 27 Feb 2017 16:21:46 -0800 Subject: [PATCH 0316/1011] [README.md]: Fix formatting --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ce41a8f97196..b6b114ea3181 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ To clone the code repository recursively, assuming git version 1.9 or newer: git clone --recursive https://github.com/Azure/sonic-buildimage.git NOTE: If the repo has already been cloned, however there are no files under the submodule directories (e.g., src/lldpd, src/ptf, src/sonic-linux-kernel, etc.), you can manually fetch all the git submodules as follows: + git submodule update --init --recursive You also need to change all git paths to relative path as we build all submodules inside the docker: From d9b1000e6c74ada3da8f0d0f3a764108662396f0 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 28 Feb 2017 10:52:56 -0800 Subject: [PATCH 0317/1011] [cfggen] Add support in -v for jinja2 expression (#345) * Add support in -v for jinja2 expression * Format json output --- dockers/docker-teamd/config.sh | 2 +- src/sonic-config-engine/sonic-cfggen | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/dockers/docker-teamd/config.sh b/dockers/docker-teamd/config.sh index 8259e2faf312..b3ad1401ad5f 100755 --- a/dockers/docker-teamd/config.sh +++ b/dockers/docker-teamd/config.sh @@ -2,7 +2,7 @@ mkdir -p /etc/teamd -for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml --var-keys minigraph_portchannel_interfaces`; do +for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_portchannel_interfaces.keys()"`; do sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'"}' -t /usr/share/sonic/templates/teamd.j2 >/etc/teamd/$pc.conf done diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 169967075473..90a905c5b3e1 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -8,6 +8,7 @@ import jinja2 import netaddr import json from minigraph import parse_xml +from minigraph import minigraph_encoder def is_ipv4(value): @@ -55,9 +56,9 @@ def main(): group = parser.add_mutually_exclusive_group() group.add_argument("-t", "--template", help="render the data with the template file") group.add_argument("-s", "--alias-mapping", help="print alias mapping json if available", action='store_true') - group.add_argument("-v", "--var", help="print the value of a variable") + group.add_argument("-v", "--var", help="print the value of a variable, support jinja2 expression") group.add_argument("--var-json", help="print the value of a variable, in json format") - group.add_argument("--var-keys", help="print all keys of a map variable") + group.add_argument("--var-keys", help="print all keys of a map variable - to be deprecated, use -v and keys()") group.add_argument("--print-data", help="print all data", action='store_true') args = parser.parse_args() @@ -94,10 +95,11 @@ def main(): print template.render(data) if args.var != None: - print data[args.var] + template = jinja2.Template('{{' + args.var + '}}') + print template.render(data) if args.var_json != None: - print json.dumps(data[args.var_json]) + print json.dumps(data[args.var_json], indent=4, cls=minigraph_encoder) if args.var_keys != None: for key in data[args.var_keys].keys(): @@ -111,7 +113,7 @@ def main(): print json.dumps(mapping) if args.print_data: - print data + print json.dumps(data, indent=4, cls=minigraph_encoder) if __name__ == "__main__": main() From 1a3bfc223643d10424c13f53f52b662f0d4fbc54 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 28 Feb 2017 12:55:48 -0800 Subject: [PATCH 0318/1011] [kernel]: update sonic linux kernel to download source from azure storage (#347) --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 258652dfb123..73e99e9126c2 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 258652dfb1234ac224930ce5bf13954165ce55e5 +Subproject commit 73e99e9126c2233a36609275a9e9bd0bb0f3d0f5 From ad1b5811117f37a660a8f7028bec5e13cdb61416 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 28 Feb 2017 13:36:59 -0800 Subject: [PATCH 0319/1011] [docker]: Add -c option in teamd docker Dockerfile (#348) CMD is not longer a file name but a command that needs to be executed, thus /bin/bash is not enough for the entrypoint and -c is needed. Signed-off-by: Shuotian Cheng --- dockers/docker-teamd/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index e1e41c33ba17..32e302971ed2 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -22,5 +22,5 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -ENTRYPOINT ["/bin/bash"] +ENTRYPOINT ["/bin/bash", "-c"] CMD ["/usr/bin/config.sh && /usr/bin/start.sh"] From e097440f58489b2f630105041354677e5e569310 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 28 Feb 2017 16:02:43 -0800 Subject: [PATCH 0320/1011] [platform]: add dell s6100 into one image (#346) --- platform/broadcom/one-image.mk | 1 + platform/broadcom/platform-modules-dell.mk | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 4558d6669d09..e7e20a9eb7f3 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -6,6 +6,7 @@ $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie $(SONIC_ONE_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) $(SONIC_ONE_IMAGE)_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(DELL_Z9100_PLATFORM_MODULE) \ + $(DELL_S6100_PLATFORM_MODULE) \ $(INGRASYS_S9100_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/broadcom/platform-modules-dell.mk b/platform/broadcom/platform-modules-dell.mk index ce4c29651c4f..f01d162a34a4 100644 --- a/platform/broadcom/platform-modules-dell.mk +++ b/platform/broadcom/platform-modules-dell.mk @@ -1,11 +1,19 @@ -# Dell Z9100 Platform modules +# Dell Z9100 and S6100 Platform modules DELL_Z9100_PLATFORM_MODULE_VERSION = 1.1 +DELL_S6100_PLATFORM_MODULE_VERSION = 1.1 export DELL_Z9100_PLATFORM_MODULE_VERSION +export DELL_S6100_PLATFORM_MODULE_VERSION DELL_Z9100_PLATFORM_MODULE = platform-modules-z9100_$(DELL_Z9100_PLATFORM_MODULE_VERSION)_amd64.deb $(DELL_Z9100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-dell $(DELL_Z9100_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) $(DELL_Z9100_PLATFORM_MODULE)_PLATFORM = x86_64-dell_z9100_c2538-r0 -SONIC_DPKG_DEBS += $(DELL_Z9100_PLATFORM_MODULE) + +DELL_S6100_PLATFORM_MODULE = platform-modules-s6100_$(DELL_S6100_PLATFORM_MODULE_VERSION)_amd64.deb +$(DELL_S6100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-dell +$(DELL_S6100_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(DELL_S6100_PLATFORM_MODULE)_PLATFORM = x86_64-dell_s6100_c2538-r0 + +SONIC_DPKG_DEBS += $(DELL_Z9100_PLATFORM_MODULE) $(DELL_S6100_PLATFORM_MODULE) From 73fb59c52c6bdc206fd8bb62766ea4c575dc0af3 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 1 Mar 2017 08:32:58 -0800 Subject: [PATCH 0321/1011] =?UTF-8?q?[build]:=20allow=20single=20src=20fil?= =?UTF-8?q?e=20to=20build=20multiple=20independent=20debian=20p=E2=80=A6?= =?UTF-8?q?=20(#349)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit add_derived_package setup dependency between the main deb and derived deb. The derived deb depends on the main deb and need to install the main deb. add_extra_package does not setup dependency between the main deb and peer deb, does not require to install the main deb. * rename add_peer_packages to add_extra_packages --- platform/broadcom/platform-modules-dell.mk | 6 ++--- rules/functions | 10 +++++++- slave.mk | 29 ++++++++++++++++------ 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/platform/broadcom/platform-modules-dell.mk b/platform/broadcom/platform-modules-dell.mk index f01d162a34a4..f0b5d261e05b 100644 --- a/platform/broadcom/platform-modules-dell.mk +++ b/platform/broadcom/platform-modules-dell.mk @@ -10,10 +10,8 @@ DELL_Z9100_PLATFORM_MODULE = platform-modules-z9100_$(DELL_Z9100_PLATFORM_MODULE $(DELL_Z9100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-dell $(DELL_Z9100_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) $(DELL_Z9100_PLATFORM_MODULE)_PLATFORM = x86_64-dell_z9100_c2538-r0 +SONIC_DPKG_DEBS += $(DELL_Z9100_PLATFORM_MODULE) DELL_S6100_PLATFORM_MODULE = platform-modules-s6100_$(DELL_S6100_PLATFORM_MODULE_VERSION)_amd64.deb -$(DELL_S6100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-dell -$(DELL_S6100_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) $(DELL_S6100_PLATFORM_MODULE)_PLATFORM = x86_64-dell_s6100_c2538-r0 - -SONIC_DPKG_DEBS += $(DELL_Z9100_PLATFORM_MODULE) $(DELL_S6100_PLATFORM_MODULE) +$(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_S6100_PLATFORM_MODULE))) diff --git a/rules/functions b/rules/functions index b0d7f9e68499..4379d85c9ed8 100644 --- a/rules/functions +++ b/rules/functions @@ -89,13 +89,21 @@ endef define add_derived_package $(2)_DEPENDS += $(1) $(2)_RDEPENDS += $($(1)_RDEPENDS) -$(2)_DERIVED_FROM = $(1) +$(2)_MAIN_DEB = $(1) $(1)_DERIVED_DEBS += $(2) $(2)_URL = $($(1)_URL) $(2)_SRC_PATH = $($(1)_SRC_PATH) SONIC_DERIVED_DEBS += $(2) endef +# call: +# add_extra_package some_deb.deb, some_extra_deb +define add_extra_package +$(2)_MAIN_DEB = $(1) +$(1)_EXTRA_DEBS += $(2) +SONIC_EXTRA_DEBS += $(2) +endef + ############################################################################### ## Utility functions ############################################################################### diff --git a/slave.mk b/slave.mk index 529ece46f8cb..fbec243d7149 100644 --- a/slave.mk +++ b/slave.mk @@ -140,7 +140,7 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_ONLINE_FILES)) : $(DEBS_PATH)/% : .platform $(addprefix $(DEBS_PATH)/, $(SONIC_MAKE_DEBS)) : $(DEBS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) $(HEADER) # remove target to force rebuild - rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS)) + rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) # build project and take package make DEST=$(shell pwd)/$(DEBS_PATH) -C $($*_SRC_PATH) $(shell pwd)/$(DEBS_PATH)/$* $(LOG) $(FOOTER) @@ -159,7 +159,7 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) : $(DEBS_PATH)/% : .platform $$(a [ ! -f ./autogen.sh ] || ./autogen.sh $(LOG) dpkg-buildpackage -rfakeroot -b -us -uc $(LOG) popd $(LOG) - mv $(addprefix $($*_SRC_PATH)/../, $* $($*_DERIVED_DEBS)) $(DEBS_PATH) $(LOG) + mv $(addprefix $($*_SRC_PATH)/../, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) $(DEBS_PATH) $(LOG) $(FOOTER) # Build project with python setup.py --command-packages=stdeb.command @@ -190,6 +190,19 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_DERIVED_DEBS)) : $(DEBS_PATH)/% : .platform $ [ -f $@ ] && touch $@ $(FOOTER) +# Rules for extra debian packages +# All noise takes place in main deb recipe, so we are just telling that +# we need to build the main deb and move our deb to other targets +# Add new dev package: +# $(eval $(call add_extra_package,$(ORIGINAL_DEB),extra_deb_file.deb)) +$(addprefix $(DEBS_PATH)/, $(SONIC_EXTRA_DEBS)) : $(DEBS_PATH)/% : .platform $$(addprefix $(DEBS_PATH)/,$$($$*_MAIN_DEB)) + $(HEADER) + # All noise takes place in main deb recipe, so we are just telling that + # we depend on it + # Put newer timestamp + [ -f $@ ] && touch $@ + $(FOOTER) + # Targets for installing debian packages prior to build one that depends on them SONIC_INSTALL_TARGETS = $(addsuffix -install,$(addprefix $(DEBS_PATH)/, \ $(SONIC_ONLINE_DEBS) \ @@ -197,7 +210,8 @@ SONIC_INSTALL_TARGETS = $(addsuffix -install,$(addprefix $(DEBS_PATH)/, \ $(SONIC_MAKE_DEBS) \ $(SONIC_DPKG_DEBS) \ $(SONIC_PYTHON_STDEB_DEBS) \ - $(SONIC_DERIVED_DEBS))) + $(SONIC_DERIVED_DEBS) \ + $(SONIC_EXTRA_DEBS))) $(SONIC_INSTALL_TARGETS) : $(DEBS_PATH)/%-install : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) $(DEBS_PATH)/$$* $(HEADER) [ -f $(DEBS_PATH)/$* ] || { echo $(DEBS_PATH)/$* does not exist $(LOG) && exit 1; } @@ -351,11 +365,12 @@ SONIC_CLEAN_DEBS = $(addsuffix -clean,$(addprefix $(DEBS_PATH)/, \ $(SONIC_MAKE_DEBS) \ $(SONIC_DPKG_DEBS) \ $(SONIC_PYTHON_STDEB_DEBS) \ - $(SONIC_DERIVED_DEBS))) -$(SONIC_CLEAN_DEBS) : $(DEBS_PATH)/%-clean : .platform $$(addsuffix -clean,$$(addprefix $(DEBS_PATH)/,$$($$*_DERIVED_FROM))) - @# remove derived targets if main one is removed, because we treat them + $(SONIC_DERIVED_DEBS) \ + $(SONIC_EXTRA_DEBS))) +$(SONIC_CLEAN_DEBS) : $(DEBS_PATH)/%-clean : .platform $$(addsuffix -clean,$$(addprefix $(DEBS_PATH)/,$$($$*_MAIN_DEB))) + @# remove derived or extra targets if main one is removed, because we treat them @# as part of one package - @rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS)) + @rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) SONIC_CLEAN_TARGETS += $(addsuffix -clean,$(addprefix $(TARGET_PATH)/, \ $(SONIC_DOCKER_IMAGES) \ From a8776033bfc255518eebf2f81e4cead7380a3432 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 1 Mar 2017 20:57:35 +0200 Subject: [PATCH 0322/1011] Merge swss and syncd into single service (#334) Current implementation of swss and syncd causes a lot of problems in terms of dependencies and synchronization. Instead of handling them in separate services, we now start and stop them both as a single entity. Signed-off-by: marian-pritsak --- .../build_templates/sonic_debian_extension.j2 | 6 ++-- files/build_templates/swss.service.j2 | 28 ++++++++++++++++-- files/build_templates/syncd.service.j2 | 29 ------------------- slave.mk | 8 +++-- 4 files changed, 34 insertions(+), 37 deletions(-) delete mode 100644 files/build_templates/syncd.service.j2 diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 08aaae769fa8..8a2a8f988b70 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -184,8 +184,10 @@ sudo chroot $FILESYSTEM_ROOT service docker stop sudo cp {{script}} $FILESYSTEM_ROOT/usr/bin/ {% endfor %} {% for service in installer_services.split(' ') -%} -sudo cp {{service}} $FILESYSTEM_ROOT/etc/systemd/system/ -sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable {{service}} +if [ -f {{service}} ]; then + sudo cp {{service}} $FILESYSTEM_ROOT/etc/systemd/system/ + sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable {{service}} +fi {% endfor %} sudo LANG=C chroot $FILESYSTEM_ROOT fuser -km /sys || true sudo LANG=C chroot $FILESYSTEM_ROOT umount -lf /sys diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index f60ef6712dd8..3af444a553d4 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -1,18 +1,40 @@ [Unit] -Description=switch state service container +Description=switch state service Requires=database.service After=database.service [Service] -User={{ sonicadmin_user }} # Wait for redis server start before database clean ExecStartPre=/bin/bash -c "while true; do if [ \"$(/usr/bin/docker exec database redis-cli ping)\" == \"PONG\" ]; then break; fi; sleep 1; done" ExecStartPre=/usr/bin/docker exec database redis-cli -n 0 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 1 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 2 FLUSHDB -ExecStart=/usr/bin/{{docker_container_name}}.sh start + +{% if sonic_hwsku == 'ACS-MSN2700' %} +ExecStartPre=/etc/init.d/sxdkernel start +ExecStartPre=/usr/bin/mst start +ExecStartPre=/etc/mlnx/msn2700 start +{% elif sonic_hwsku == 'AS7512' %} +ExecStartPre=-/etc/init.d/xpnet.sh stop +ExecStartPre=/etc/init.d/xpnet.sh start +{% endif %} + +# systemd allows only one parent process within service, +# so we spawn both dockers from single bash parent +ExecStart=/bin/bash -c "/usr/bin/{{docker_container_name}}.sh start & /usr/bin/syncd.sh start & wait -n 0" + ExecStop=/usr/bin/{{docker_container_name}}.sh stop ExecStopPost=/usr/bin/syncd.sh stop +{% if sonic_hwsku == 'ACS-MSN2700' %} +ExecStopPost=/etc/mlnx/msn2700 stop +ExecStopPost=/etc/init.d/sxdkernel stop +ExecStopPost=/usr/bin/mst stop +{% elif sonic_hwsku == 'AS7512' %} +ExecStopPost=/etc/init.d/xpnet.sh stop +ExecStopPost=/etc/init.d/xpnet.sh start +{% endif %} + + [Install] WantedBy=multi-user.target diff --git a/files/build_templates/syncd.service.j2 b/files/build_templates/syncd.service.j2 deleted file mode 100644 index e0fdb7e270a5..000000000000 --- a/files/build_templates/syncd.service.j2 +++ /dev/null @@ -1,29 +0,0 @@ -[Unit] -Description=syncd container -Requires=database.service -After=database.service - -[Service] -User=root -{% if sonic_hwsku == 'ACS-MSN2700' %} -ExecStartPre=/etc/init.d/sxdkernel start -ExecStartPre=/usr/bin/mst start -ExecStartPre=/etc/mlnx/msn2700 start -{% elif sonic_hwsku == 'AS7512' %} -ExecStartPre=-/etc/init.d/xpnet.sh stop -ExecStartPre=/etc/init.d/xpnet.sh start -{% endif %} -ExecStart=/usr/bin/{{docker_container_name}}.sh start -ExecStop=/usr/bin/{{docker_container_name}}.sh stop -{% if sonic_hwsku == 'ACS-MSN2700' %} -ExecStopPost=/etc/mlnx/msn2700 stop -ExecStopPost=/etc/init.d/sxdkernel stop -ExecStopPost=/usr/bin/mst stop -{% elif sonic_hwsku == 'AS7512' %} -ExecStopPost=/etc/init.d/xpnet.sh stop -ExecStopPost=/etc/init.d/xpnet.sh start -{% endif %} -Restart=always - -[Install] -WantedBy=multi-user.target diff --git a/slave.mk b/slave.mk index fbec243d7149..0a5548a29dcc 100644 --- a/slave.mk +++ b/slave.mk @@ -322,7 +322,9 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export docker_container_name="$($(docker)_CONTAINER_NAME)" export docker_image_run_opt="$($(docker)_RUN_OPT)" j2 files/build_templates/docker_image_ctl.j2 > $($(docker)_CONTAINER_NAME).sh - j2 files/build_templates/$($(docker)_CONTAINER_NAME).service.j2 > $($(docker)_CONTAINER_NAME).service + if [ -f files/build_templates/$($(docker)_CONTAINER_NAME).service.j2 ]; then + j2 files/build_templates/$($(docker)_CONTAINER_NAME).service.j2 > $($(docker)_CONTAINER_NAME).service + fi chmod +x $($(docker)_CONTAINER_NAME).sh ) @@ -342,8 +344,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform TARGET_MACHINE=$($*_MACHINE) IMAGE_TYPE=$($*_IMAGE_TYPE) DEBUG_BUILD=$(DEBUG_BUILD) ./build_image.sh $(LOG) $(foreach docker, $($*_DOCKERS), \ - rm $($(docker)_CONTAINER_NAME).sh - rm $($(docker)_CONTAINER_NAME).service + rm -f $($(docker)_CONTAINER_NAME).sh + rm -f $($(docker)_CONTAINER_NAME).service ) $(if $($*_DOCKERS), From 38b9eb18299377a3cc2082d483cf407224be05ae Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 1 Mar 2017 21:00:59 +0200 Subject: [PATCH 0323/1011] [Makefile]: Automatically rebuild sonic-slave (#338) sonic-slave is not built upon every make call, because it takes a lot of time. So in order to track changes hash of Dockerfile is included to sonic-slave image. Signed-off-by: marian-pritsak --- Makefile | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index d17b002e66b1..5ae33d2cf6b0 100644 --- a/Makefile +++ b/Makefile @@ -9,24 +9,30 @@ PWD := $(shell pwd) MAKEFLAGS += -B +SLAVE_TAG = $(shell shasum sonic-slave/Dockerfile | awk '{print substr($$1,0,11);}') +SLAVE_IMAGE = sonic-slave-$(USER) + DOCKER_RUN := docker run --rm=true --privileged \ -v $(PWD):/sonic \ -i$(SONIC_SLAVE_TTY) -DOCKER_BUILD = docker build --no-cache \ +DOCKER_BUILD = docker build \ --build-arg user=$(USER) \ --build-arg uid=$(shell id -u) \ --build-arg guid=$(shell id -g) \ - -t sonic-slave-$(USER) \ - sonic-slave + -t $(SLAVE_IMAGE) \ + sonic-slave && \ + docker tag $(SLAVE_IMAGE):latest $(SLAVE_IMAGE):$(SLAVE_TAG) .PHONY: sonic-slave-build sonic-slave-bash .DEFAULT_GOAL := all %:: - @docker inspect --type image sonic-slave-$(USER) &> /dev/null || $(DOCKER_BUILD) - @$(DOCKER_RUN) sonic-slave-$(USER) make \ + @docker inspect --type image $(SLAVE_IMAGE):$(SLAVE_TAG) &> /dev/null || \ + { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ + $(DOCKER_BUILD) ; } + @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) make \ -C sonic \ -f slave.mk \ PLATFORM=$(PLATFORM) \ @@ -39,4 +45,7 @@ sonic-slave-build : @$(DOCKER_BUILD) sonic-slave-bash : - @$(DOCKER_RUN) -t sonic-slave-$(USER) bash + @docker inspect --type image $(SLAVE_IMAGE):$(SLAVE_TAG) &> /dev/null || \ + { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ + $(DOCKER_BUILD) ; } + @$(DOCKER_RUN) -t $(SLAVE_IMAGE):$(SLAVE_TAG) bash From 7d10892dce1fae2dea052d96469e1ac248615ab3 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 2 Mar 2017 00:25:44 +0200 Subject: [PATCH 0324/1011] [Makefile]: Add --no-cache to docker build (#352) Option was removed by mistake in 38b9eb18299377a3cc2082d483cf407224be05ae Signed-off-by: marian-pritsak --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5ae33d2cf6b0..5c6b21a73941 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ DOCKER_RUN := docker run --rm=true --privileged \ -v $(PWD):/sonic \ -i$(SONIC_SLAVE_TTY) -DOCKER_BUILD = docker build \ +DOCKER_BUILD = docker build --no-cache \ --build-arg user=$(USER) \ --build-arg uid=$(shell id -u) \ --build-arg guid=$(shell id -g) \ From 903499000f90b11dcde396f37fc82ae8346dc80f Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 1 Mar 2017 14:32:52 -0800 Subject: [PATCH 0325/1011] [docker-teamd] fix a config bug introduced in #345 (#353) --- dockers/docker-teamd/config.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-teamd/config.sh b/dockers/docker-teamd/config.sh index b3ad1401ad5f..d1b34f426428 100755 --- a/dockers/docker-teamd/config.sh +++ b/dockers/docker-teamd/config.sh @@ -2,7 +2,7 @@ mkdir -p /etc/teamd -for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_portchannel_interfaces.keys()"`; do +for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml -v "' '.join(minigraph_portchannel_interfaces.keys())"`; do sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'"}' -t /usr/share/sonic/templates/teamd.j2 >/etc/teamd/$pc.conf done From 0ed9b3ce285b336a9305620b70db602dab759094 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 1 Mar 2017 17:05:13 -0800 Subject: [PATCH 0326/1011] [platform]: remove sku from build parameter (#350) different sku will be contained in a single one sonic image. no longer need to specify sku at the build time --- .gitignore | 2 + Makefile | 1 - README.md | 10 +- .../x86_64-accton_as7512_32x-r0/minigraph.xml | 0 .../x86_64-arista_7050_qx32/minigraph.xml | 1049 +++++++++++++++++ .../x86_64-dell_s6000_s1220-r0/minigraph.xml | 0 .../x86_64-dell_z9100_c2538-r0/minigraph.xml | 0 .../x86_64-ingrasys_s9100-r0/minigraph.xml | 0 .../x86_64-mlnx_msn2700-r0/minigraph.xml | 0 .../build_templates/sonic_debian_extension.j2 | 4 - files/build_templates/sonic_version.yml.j2 | 1 - files/build_templates/swss.service.j2 | 9 +- files/image_config/platform/rc.local | 18 +- slave.mk | 4 - 14 files changed, 1077 insertions(+), 21 deletions(-) rename files/image_config/minigraph/minigraph_AS7512.xml => device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml (100%) create mode 100644 device/arista/x86_64-arista_7050_qx32/minigraph.xml rename files/image_config/minigraph/minigraph_Force10-S6000.xml => device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml (100%) rename files/image_config/minigraph/minigraph_Force10-Z9100.xml => device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml (100%) rename files/image_config/minigraph/minigraph_ingrasys-s9100.xml => device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml (100%) rename files/image_config/minigraph/minigraph_ACS-MSN2700.xml => device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml (100%) diff --git a/.gitignore b/.gitignore index b2c3e81854b0..ffcc741d83ef 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ fsroot/ fs.* target/ +*.deb +*.changes # Subdirectories in src src/hiredis/* diff --git a/Makefile b/Makefile index 5c6b21a73941..3b9a8645ce92 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,6 @@ DOCKER_BUILD = docker build --no-cache \ -C sonic \ -f slave.mk \ PLATFORM=$(PLATFORM) \ - SKU=$(SKU) \ DEBUG_BUILD=$(DEBUG_BUILD) \ ENABLE_DHCP_GRAPH_SERVICE=$(ENABLE_DHCP_GRAPH_SERVICE) \ $@ diff --git a/README.md b/README.md index b6b114ea3181..7f4e3770164c 100644 --- a/README.md +++ b/README.md @@ -32,15 +32,15 @@ You also need to change all git paths to relative path as we build all submodule To build NOS installer image and docker images, run the following commands: - make configure PLATFORM=[ASIC_VENDOR] SKU=[HW_SKU] + make configure PLATFORM=[ASIC_VENDOR] make **NOTE**: We recommend reserving 50G free space to build one platform. -Supported PLATFORM and SKU are: -- PLATFORM=broadcom SKU=Force10-S6000 -- PLATFORM=mellanox SKU=ACS-MSN2700 -- PLATFORM=cavium SKU=AS7512 +Supported PLATFORM are: +- PLATFORM=broadcom +- PLATFORM=mellanox +- PLATFORM=cavium - PLATFORM=p4 You may find the rules/config file useful. It contains configuration options for the build process, like adding more verbosity or showing dependencies, username and password for base image etc. diff --git a/files/image_config/minigraph/minigraph_AS7512.xml b/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml similarity index 100% rename from files/image_config/minigraph/minigraph_AS7512.xml rename to device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml diff --git a/device/arista/x86_64-arista_7050_qx32/minigraph.xml b/device/arista/x86_64-arista_7050_qx32/minigraph.xml new file mode 100644 index 000000000000..26bf46132a25 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/minigraph.xml @@ -0,0 +1,1049 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + Ethernet1/1 + 10.0.0.0/31 + + + + Ethernet2/1 + 10.0.0.2/31 + + + + Ethernet3/1 + 10.0.0.4/31 + + + + Ethernet4/1 + 10.0.0.6/31 + + + + Ethernet5/1 + 10.0.0.8/31 + + + + Ethernet6/1 + 10.0.0.10/31 + + + + Ethernet7/1 + 10.0.0.12/31 + + + + Ethernet8/1 + 10.0.0.14/31 + + + + Ethernet9/1 + 10.0.0.16/31 + + + + Ethernet10/1 + 10.0.0.18/31 + + + + Ethernet11/1 + 10.0.0.20/31 + + + + Ethernet12/1 + 10.0.0.22/31 + + + + Ethernet13/1 + 10.0.0.24/31 + + + + Ethernet14/1 + 10.0.0.26/31 + + + + Ethernet15/1 + 10.0.0.28/31 + + + + Ethernet16/1 + 10.0.0.30/31 + + + + Ethernet17/1 + 10.0.0.32/31 + + + + Ethernet18/1 + 10.0.0.34/31 + + + + Ethernet19/1 + 10.0.0.36/31 + + + + Ethernet20/1 + 10.0.0.38/31 + + + + Ethernet21/1 + 10.0.0.40/31 + + + + Ethernet22/1 + 10.0.0.42/31 + + + + Ethernet23/1 + 10.0.0.44/31 + + + + Ethernet24/1 + 10.0.0.46/31 + + + + Ethernet25 + 10.0.0.48/31 + + + + Ethernet26 + 10.0.0.50/31 + + + + Ethernet27 + 10.0.0.52/31 + + + + Ethernet28 + 10.0.0.54/31 + + + + Ethernet29 + 10.0.0.56/31 + + + + Ethernet30 + 10.0.0.58/31 + + + + Ethernet31 + 10.0.0.60/31 + + + + Ethernet32 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + Ethernet1/1 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet2/1 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet3/1 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet4/1 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet5/1 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet6/1 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet7/1 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet8/1 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet9/1 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet10/1 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet11/1 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet12/1 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet13/1 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet14/1 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet15/1 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet16/1 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet17/1 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet18/1 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet19/1 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet20/1 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet21/1 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet22/1 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet23/1 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet24/1 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet25 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet26 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet27 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet28 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet29 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet30 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet31 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet32 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Arista-7050-QX32 + + + + switch1 + Arista-7050-QX32 +
diff --git a/files/image_config/minigraph/minigraph_Force10-S6000.xml b/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml similarity index 100% rename from files/image_config/minigraph/minigraph_Force10-S6000.xml rename to device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml diff --git a/files/image_config/minigraph/minigraph_Force10-Z9100.xml b/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml similarity index 100% rename from files/image_config/minigraph/minigraph_Force10-Z9100.xml rename to device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml diff --git a/files/image_config/minigraph/minigraph_ingrasys-s9100.xml b/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml similarity index 100% rename from files/image_config/minigraph/minigraph_ingrasys-s9100.xml rename to device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml diff --git a/files/image_config/minigraph/minigraph_ACS-MSN2700.xml b/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml similarity index 100% rename from files/image_config/minigraph/minigraph_ACS-MSN2700.xml rename to device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 8a2a8f988b70..eaab6af01614 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -55,9 +55,6 @@ sudo cp $IMAGE_CONFIGS/environment/motd $FILESYSTEM_ROOT/etc/ sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/ sudo mkdir -p $FILESYSTEM_ROOT/usr/share/sonic/templates/ -# Copy default minigraph -sudo cp $IMAGE_CONFIGS/minigraph/minigraph_{{sonic_hwsku}}.xml $FILESYSTEM_ROOT/etc/sonic/minigraph.xml - # Install dependencies for SONiC config engine sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install \ python-lxml \ @@ -118,7 +115,6 @@ sudo cp $IMAGE_CONFIGS/snmp/snmp.yml $FILESYSTEM_ROOT/etc/sonic/ # Generate build version file export git_revision=$(git rev-parse --short HEAD) -export sonic_hwsku={{sonic_hwsku}} export debian_version=`cat $FILESYSTEM_ROOT/etc/debian_version` export kernel_version={{kversion}} j2 $BUILD_TEMPLATES/sonic_version.yml.j2 > sonic_version.yml diff --git a/files/build_templates/sonic_version.yml.j2 b/files/build_templates/sonic_version.yml.j2 index d0dd45aea56d..54eb904a1614 100644 --- a/files/build_templates/sonic_version.yml.j2 +++ b/files/build_templates/sonic_version.yml.j2 @@ -1,4 +1,3 @@ build_version: {{git_revision}} -build_hwsku: {{sonic_hwsku}} debian_version: {{debian_version}} kernel_version: {{kernel_version}} diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index 3af444a553d4..3ec8161fa00a 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -4,17 +4,18 @@ Requires=database.service After=database.service [Service] +User=root # Wait for redis server start before database clean ExecStartPre=/bin/bash -c "while true; do if [ \"$(/usr/bin/docker exec database redis-cli ping)\" == \"PONG\" ]; then break; fi; sleep 1; done" ExecStartPre=/usr/bin/docker exec database redis-cli -n 0 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 1 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 2 FLUSHDB -{% if sonic_hwsku == 'ACS-MSN2700' %} +{% if sonic_asic_platform == 'mellanox' %} ExecStartPre=/etc/init.d/sxdkernel start ExecStartPre=/usr/bin/mst start ExecStartPre=/etc/mlnx/msn2700 start -{% elif sonic_hwsku == 'AS7512' %} +{% elif sonic_asic_platform == 'cavium' %} ExecStartPre=-/etc/init.d/xpnet.sh stop ExecStartPre=/etc/init.d/xpnet.sh start {% endif %} @@ -26,11 +27,11 @@ ExecStart=/bin/bash -c "/usr/bin/{{docker_container_name}}.sh start & /usr/bin/s ExecStop=/usr/bin/{{docker_container_name}}.sh stop ExecStopPost=/usr/bin/syncd.sh stop -{% if sonic_hwsku == 'ACS-MSN2700' %} +{% if sonic_asic_platform == 'mellanox' %} ExecStopPost=/etc/mlnx/msn2700 stop ExecStopPost=/etc/init.d/sxdkernel stop ExecStopPost=/usr/bin/mst stop -{% elif sonic_hwsku == 'AS7512' %} +{% elif sonic_asic_platform == 'cavium' %} ExecStopPost=/etc/init.d/xpnet.sh stop ExecStopPost=/etc/init.d/xpnet.sh start {% endif %} diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index dc5507fe234b..1b2fadf3c343 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -16,9 +16,23 @@ echo "install platform dependent packages at the first boot time" if [ -f /host/platform/firsttime ]; then - if [ -d /host/platform/$onie_platform ]; then - dpkg -i /host/platform/$onie_platform/*.deb + + if [ -n $aboot_platform ]; then + platform=$aboot_platform + elif [ -n $onie_platform ]; then + platform=$onie_platform + else + echo "Unknown sonic platform" + rm /host/platform/firsttime + exit 0 fi + + cp /usr/share/sonic/device/$platform/minigraph.xml /etc/sonic/ + + if [ -d /host/platform/$platform ]; then + dpkg -i /host/platform/$platform/*.deb + fi + rm /host/platform/firsttime fi diff --git a/slave.mk b/slave.mk index 0a5548a29dcc..55fc848cf9a9 100644 --- a/slave.mk +++ b/slave.mk @@ -25,7 +25,6 @@ PYTHON_WHEELS_PATH = $(TARGET_PATH)/python-wheels PROJECT_ROOT = $(shell pwd) CONFIGURED_PLATFORM := $(shell [ -f .platform ] && cat .platform || echo generic) -CONFIGURED_SKU := $(shell [ -f .sku ] && cat .sku || echo undefined) PLATFORM_PATH = platform/$(CONFIGURED_PLATFORM) ############################################################################### @@ -49,7 +48,6 @@ configure : @mkdir -p target/debs @mkdir -p target/python-wheels @echo $(PLATFORM) > .platform - @echo $(SKU) > .sku distclean : .platform .sku clean @rm -f .platform .sku @@ -65,7 +63,6 @@ include $(RULES_PATH)/*.mk ifneq ($(CONFIGURED_PLATFORM), undefined) include $(PLATFORM_PATH)/rules.mk endif -export CONFIGURED_SKU MAKEFLAGS += -j $(SONIC_CONFIG_BUILD_JOBS) @@ -312,7 +309,6 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export config_engine="$(addprefix $(DEBS_PATH)/,$(SONIC_CONFIG_ENGINE))" export image_type="$($*_IMAGE_TYPE)" export sonicadmin_user="$(USERNAME)" - export sonic_hwsku="$(CONFIGURED_SKU)" export sonic_asic_platform="$(CONFIGURED_PLATFORM)" export enable_dhcp_graph_service="$(ENABLE_DHCP_GRAPH_SERVICE)" From 524692462c2a8d54060cd77b6870cb9a64706668 Mon Sep 17 00:00:00 2001 From: Lihua Yuan Date: Wed, 1 Mar 2017 18:03:31 -0800 Subject: [PATCH 0327/1011] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7f4e3770164c..b4230b3d6582 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,10 @@ To build NOS installer image and docker images, run the following commands: Supported PLATFORM are: - PLATFORM=broadcom +- PLATFORM=marvell (*pending*) - PLATFORM=mellanox - PLATFORM=cavium +- PLATFORM=centec (*pending*) - PLATFORM=p4 You may find the rules/config file useful. It contains configuration options for the build process, like adding more verbosity or showing dependencies, username and password for base image etc. From fd6080a3628a7c16599f17293e64be67acdfe22e Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 1 Mar 2017 18:22:47 -0800 Subject: [PATCH 0328/1011] [Broadcom]: Update debian package versions (#354) Signed-off-by: Shuotian Cheng --- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index f396e030cfbf..d2d701b8ed10 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.3.1-3_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.3.1-3_amd64.deb?sv=2015-04-05&sr=b&sig=j5U8yxIqk4B1Wk8OZp9HbMQ7J9u5GPQNmzTDLilJDjU%3D&se=2030-11-03T20%3A45%3A59Z&sp=r" +BRCM_SAI = libsaibcm_2.1.3.1-4+0-20170301222525.13-1.gbp8d6580_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.3.1-4+0-20170301222525.13-1.gbp8d6580_amd64.deb?sv=2015-04-05&sr=b&sig=YhWQFb2Bz5ZgqyA8VciIT20I%2BBDhps77ksakG0jU92A%3D&se=2030-11-08T22%3A34%3A36Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.3.1-3_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.3.1-4+0-20170301222525.13-1.gbp8d6580_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.3.1-3_amd64.deb?sv=2015-04-05&sr=b&sig=7FPU5S234yjDIPJUUasC%2BRDqPdrJjdOmSodEApzQjTo%3D&se=2030-11-03T20%3A49%3A38Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.3.1-4+0-20170301222525.13-1.gbp8d6580_amd64.deb?sv=2015-04-05&sr=b&sig=QUmwuM3AZ4qe5sVFTmB6tEWApJKWU7PP5kfaDVM2dKU%3D&se=2030-11-08T22%3A35%3A34Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 8fe1cfa30de2..c15d327f96a1 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.1.5-7_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-7_amd64.deb?sv=2015-04-05&sr=b&sig=DY5BPSDturlcHXfqYcS3Gl89Ypd%2BWMYmMLZ2rlNoC5w%3D&se=2030-11-03T11%3A21%3A53Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.1.5-7-20170301212550.23_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-7-20170301212550.23_amd64.deb?sv=2015-04-05&sr=b&sig=d18xevgySzJGCbD6I9M4SX1%2B291vIOMbMXPsbkDjuFA%3D&se=2030-11-08T22%3A36%3A21Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-7_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-7_amd64.deb?sv=2015-04-05&sr=b&sig=glZblgedvf6uOW5k1YpU7NiBWnIZgX5oWvcVsDsYuXc%3D&se=2030-11-03T11%3A22%3A44Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-7-20170301212550.23_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-7-20170301212550.23_amd64.deb?sv=2015-04-05&sr=b&sig=5iudeTcf3WNlNSYgJPfaj41CVh7n71GuV7v1hmuy0OI%3D&se=2030-11-08T22%3A36%3A58Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 2a2af6a44ee76387aa2afac725488ef4a6a5c236 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 1 Mar 2017 18:23:28 -0800 Subject: [PATCH 0329/1011] [orchagent]: Update start.sh to combine td2 qos/buffers config (#344) Signed-off-by: Shuotian Cheng --- dockers/docker-orchagent/start.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 51073fde00f4..af7f2f321a0a 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -37,16 +37,14 @@ SWSSCONFIG_ARGS="00-copp.config.json " if [ "$HWSKU" == "Force10-S6000" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - SWSSCONFIG_ARGS+="td2.32ports.qos.1.json td2.32ports.qos.2.json td2.32ports.qos.3.json td2.32ports.qos.4.json td2.32ports.qos.5.json td2.32ports.qos.6.json " - SWSSCONFIG_ARGS+="td2.32ports.buffers.1.json td2.32ports.buffers.2.json td2.32ports.buffers.3.json " + SWSSCONFIG_ARGS+="td2.32ports.qos.json td2.32ports.buffers.json " elif [ "$HWSKU" == "Force10-S6100" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "Force10-Z9100" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "Arista-7050-QX32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - SWSSCONFIG_ARGS+="td2.32ports.qos.1.json td2.32ports.qos.2.json td2.32ports.qos.3.json td2.32ports.qos.4.json td2.32ports.qos.5.json td2.32ports.qos.6.json " - SWSSCONFIG_ARGS+="td2.32ports.buffers.1.json td2.32ports.buffers.2.json td2.32ports.buffers.3.json " + SWSSCONFIG_ARGS+="td2.32ports.qos.json td2.32ports.buffers.json " elif [ "$HWSKU" == "Arista-7060-CX32S" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "AS7512" ]; then From e6c2380b6f22f9ab7948a864a70214cecdcc45d0 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Thu, 2 Mar 2017 14:08:25 +0200 Subject: [PATCH 0330/1011] Remove SKU from distclean target. --- slave.mk | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/slave.mk b/slave.mk index 55fc848cf9a9..456b73ec4680 100644 --- a/slave.mk +++ b/slave.mk @@ -38,19 +38,13 @@ ifneq ($(CONFIGURED_PLATFORM),generic) @exit 1 endif -.sku : -ifneq ($(CONFIGURED_PLATFORM),generic) - @echo Build system is not configured, please run make configure - @exit 1 -endif - configure : @mkdir -p target/debs @mkdir -p target/python-wheels @echo $(PLATFORM) > .platform -distclean : .platform .sku clean - @rm -f .platform .sku +distclean : .platform clean + @rm -f .platform ############################################################################### ## Include other rules @@ -398,4 +392,4 @@ all : .platform $$(addprefix $(TARGET_PATH)/,$$(SONIC_ALL)) .PHONY : $(SONIC_CLEAN_DEBS) $(SONIC_CLEAN_TARGETS) $(SONIC_CLEAN_WHEELS) clean distclean configure -.INTERMEDIATE : $(SONIC_INSTALL_TARGETS) $(SONIC_INSTALL_WHEELS) $(DOCKER_LOAD_TARGETS) docker-start .platform .sku +.INTERMEDIATE : $(SONIC_INSTALL_TARGETS) $(SONIC_INSTALL_WHEELS) $(DOCKER_LOAD_TARGETS) docker-start .platform From adc296bf6f0fbb723d38c28a41a86dd27ae34a1b Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 2 Mar 2017 20:10:40 +0200 Subject: [PATCH 0331/1011] [rc.local]: Put variables into quotes in conditionals (#361) Signed-off-by: marian-pritsak --- files/image_config/platform/rc.local | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index 1b2fadf3c343..eccba516e694 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -17,9 +17,9 @@ echo "install platform dependent packages at the first boot time" if [ -f /host/platform/firsttime ]; then - if [ -n $aboot_platform ]; then + if [ -n "$aboot_platform" ]; then platform=$aboot_platform - elif [ -n $onie_platform ]; then + elif [ -n "$onie_platform" ]; then platform=$onie_platform else echo "Unknown sonic platform" From bac738f91f785f2db84d5e754214b2e328008f81 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 2 Mar 2017 11:33:46 -0800 Subject: [PATCH 0332/1011] Add bgp container with gobgp (#358) * Add go-1.7 into docker-slave * Create container docker-fpm-gobgp with gobgpd inside --- dockers/docker-fpm-gobgp/Dockerfile.j2 | 31 ++++++++++++ dockers/docker-fpm-gobgp/config.sh | 17 +++++++ dockers/docker-fpm-gobgp/daemons | 31 ++++++++++++ dockers/docker-fpm-gobgp/gobgpd.conf.j2 | 28 +++++++++++ dockers/docker-fpm-gobgp/isolate.j2 | 24 +++++++++ dockers/docker-fpm-gobgp/start.sh | 5 ++ dockers/docker-fpm-gobgp/supervisord.conf | 6 +++ dockers/docker-fpm-gobgp/unisolate.j2 | 24 +++++++++ dockers/docker-fpm-gobgp/zebra.conf.j2 | 61 +++++++++++++++++++++++ rules/docker-fpm-gobgp.mk | 14 ++++++ rules/gobgp.mk | 5 ++ sonic-slave/Dockerfile | 4 ++ src/gobgp/Makefile | 23 +++++++++ src/gobgp/debian/changelog | 5 ++ src/gobgp/debian/compat | 1 + src/gobgp/debian/control | 12 +++++ src/gobgp/debian/gobgp.dirs | 1 + src/gobgp/debian/gobgp.init.d | 50 +++++++++++++++++++ src/gobgp/debian/gobgp.service | 16 ++++++ src/gobgp/debian/rules | 3 ++ src/gobgp/gobgpd.conf.sample | 21 ++++++++ 21 files changed, 382 insertions(+) create mode 100644 dockers/docker-fpm-gobgp/Dockerfile.j2 create mode 100755 dockers/docker-fpm-gobgp/config.sh create mode 100644 dockers/docker-fpm-gobgp/daemons create mode 100644 dockers/docker-fpm-gobgp/gobgpd.conf.j2 create mode 100755 dockers/docker-fpm-gobgp/isolate.j2 create mode 100755 dockers/docker-fpm-gobgp/start.sh create mode 100644 dockers/docker-fpm-gobgp/supervisord.conf create mode 100755 dockers/docker-fpm-gobgp/unisolate.j2 create mode 100644 dockers/docker-fpm-gobgp/zebra.conf.j2 create mode 100644 rules/docker-fpm-gobgp.mk create mode 100644 rules/gobgp.mk create mode 100644 src/gobgp/Makefile create mode 100644 src/gobgp/debian/changelog create mode 100644 src/gobgp/debian/compat create mode 100644 src/gobgp/debian/control create mode 100644 src/gobgp/debian/gobgp.dirs create mode 100644 src/gobgp/debian/gobgp.init.d create mode 100644 src/gobgp/debian/gobgp.service create mode 100755 src/gobgp/debian/rules create mode 100644 src/gobgp/gobgpd.conf.sample diff --git a/dockers/docker-fpm-gobgp/Dockerfile.j2 b/dockers/docker-fpm-gobgp/Dockerfile.j2 new file mode 100644 index 000000000000..3d89999d9758 --- /dev/null +++ b/dockers/docker-fpm-gobgp/Dockerfile.j2 @@ -0,0 +1,31 @@ +FROM docker-fpm + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && apt-get install -y supervisor + +COPY \ +{% for deb in docker_fpm_gobgp_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -i \ +{% for deb in docker_fpm_gobgp_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +COPY ["*.j2", "/usr/share/sonic/templates/"] +COPY ["start.sh", "config.sh", "/usr/bin/"] +COPY ["daemons", "/etc/quagga/"] +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +ENTRYPOINT /usr/bin/config.sh \ + && /usr/bin/start.sh \ + && /usr/bin/supervisord \ + && /bin/bash diff --git a/dockers/docker-fpm-gobgp/config.sh b/dockers/docker-fpm-gobgp/config.sh new file mode 100755 index 000000000000..07aa8c33eea1 --- /dev/null +++ b/dockers/docker-fpm-gobgp/config.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +mkdir -p /etc/quagga +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/gobgpd.conf.j2 >/etc/gobgp/gobgpd.conf +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 +chown root:root /usr/sbin/bgp-isolate +chmod 0755 /usr/sbin/bgp-isolate + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/unisolate.j2 >/usr/sbin/bgp-unisolate +chown root:root /usr/sbin/bgp-unisolate +chmod 0755 /usr/sbin/bgp-unisolate + +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status + diff --git a/dockers/docker-fpm-gobgp/daemons b/dockers/docker-fpm-gobgp/daemons new file mode 100644 index 000000000000..6832c3db78d0 --- /dev/null +++ b/dockers/docker-fpm-gobgp/daemons @@ -0,0 +1,31 @@ +# This file tells the quagga package which daemons to start. +# +# Entries are in the format: =(yes|no|priority) +# 0, "no" = disabled +# 1, "yes" = highest priority +# 2 .. 10 = lower priorities +# Read /usr/share/doc/quagga/README.Debian for details. +# +# Sample configurations for these daemons can be found in +# /usr/share/doc/quagga/examples/. +# +# ATTENTION: +# +# When activation a daemon at the first time, a config file, even if it is +# empty, has to be present *and* be owned by the user and group "quagga", else +# the daemon will not be started by /etc/init.d/quagga. The permissions should +# be u=rw,g=r,o=. +# When using "vtysh" such a config file is also needed. It should be owned by +# group "quaggavty" and set to ug=rw,o= though. Check /etc/pam.d/quagga, too. +# +# The watchquagga daemon is always started. Per default in monitoring-only but +# that can be changed via /etc/quagga/debian.conf. +# +zebra=yes +bgpd=no +ospfd=no +ospf6d=no +ripd=no +ripngd=no +isisd=no +babeld=no diff --git a/dockers/docker-fpm-gobgp/gobgpd.conf.j2 b/dockers/docker-fpm-gobgp/gobgpd.conf.j2 new file mode 100644 index 000000000000..adbc063cfc6c --- /dev/null +++ b/dockers/docker-fpm-gobgp/gobgpd.conf.j2 @@ -0,0 +1,28 @@ +[global.config] + as = {{ minigraph_bgp_asn }} + router-id = "{{ minigraph_lo_interfaces[0]['addr'] }}" +{% for bgp_session in minigraph_bgp %} +{% if bgp_session['asn'] != 0 %} +[[neighbors]] + [neighbors.config] + peer-as = {{ bgp_session['asn'] }} + neighbor-address = "{{ bgp_session['addr'] }}" + [neighbors.graceful-restart.config] + enabled = true + [[neighbors.afi-safis]] + [neighbors.afi-safis.config] +{% if bgp_session['addr'] | ipv6 %} + afi-safi-name = "ipv6-unicast" +{% else %} + afi-safi-name = "ipv4-unicast" +{% endif %} + [neighbors.afi-safis.mp-graceful-restart.config] + enabled = true +{% endif %} +{% endfor %} +[zebra] + [zebra.config] + enabled = true + url = "unix:/var/run/quagga/zserv.api" + redistribute-route-type-list = ["connect"] + diff --git a/dockers/docker-fpm-gobgp/isolate.j2 b/dockers/docker-fpm-gobgp/isolate.j2 new file mode 100755 index 000000000000..e587623e984f --- /dev/null +++ b/dockers/docker-fpm-gobgp/isolate.j2 @@ -0,0 +1,24 @@ +#!/bin/bash + +echo Not implemented yet +exit + +## vtysh only accepts script in stdin, so cannot be directly used in shebang +## Cut the tail of this script and feed vtysh stdin +sed -n -e '9,$p' < "$0" | vtysh "$@" +## Exit with vtysh return code +exit $? + +## vtysh script start from next line, which line number MUST eqaul in 'sed' command above + +configure terminal + router bgp {{ minigraph_bgp_asn }} +{% for bgp_session in minigraph_bgp %} + neighbor {{ bgp_session['addr'] }} route-map ISOLATE out +{% endfor %} + exit +exit + +{% for bgp_session in minigraph_bgp %} +clear ip bgp {{ bgp_session['addr'] }} soft out +{% endfor %} diff --git a/dockers/docker-fpm-gobgp/start.sh b/dockers/docker-fpm-gobgp/start.sh new file mode 100755 index 000000000000..90a1d515fa3a --- /dev/null +++ b/dockers/docker-fpm-gobgp/start.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +service rsyslog start +service quagga start +fpmsyncd & diff --git a/dockers/docker-fpm-gobgp/supervisord.conf b/dockers/docker-fpm-gobgp/supervisord.conf new file mode 100644 index 000000000000..793fc5434f80 --- /dev/null +++ b/dockers/docker-fpm-gobgp/supervisord.conf @@ -0,0 +1,6 @@ +[supervisord] +nodaemon=true + +[program:gobgpd] +command=/usr/sbin/gobgpd -p -f /etc/gobgp/gobgpd.conf -r +priority=1 diff --git a/dockers/docker-fpm-gobgp/unisolate.j2 b/dockers/docker-fpm-gobgp/unisolate.j2 new file mode 100755 index 000000000000..d1310114d908 --- /dev/null +++ b/dockers/docker-fpm-gobgp/unisolate.j2 @@ -0,0 +1,24 @@ +#!/bin/bash + +echo Not implemented yet +exit + +## vtysh only accepts script in stdin, so cannot be directly used in shebang +## Cut the tail of this script and feed vtysh stdin +sed -n -e '9,$p' < "$0" | vtysh "$@" +## Exit with vtysh return code +exit $? + +## vtysh script start from next line, which line number MUST eqaul in 'sed' command above + +configure terminal + router bgp {{ minigraph_bgp_asn }} +{% for bgp_session in minigraph_bgp %} + no neighbor {{ bgp_session['addr'] }} route-map ISOLATE out +{% endfor %} + exit +exit + +{% for bgp_session in minigraph_bgp %} +clear ip bgp {{ bgp_session['addr'] }} soft out +{% endfor %} diff --git a/dockers/docker-fpm-gobgp/zebra.conf.j2 b/dockers/docker-fpm-gobgp/zebra.conf.j2 new file mode 100644 index 000000000000..ad05dcbe4e90 --- /dev/null +++ b/dockers/docker-fpm-gobgp/zebra.conf.j2 @@ -0,0 +1,61 @@ +! +{% block banner %} +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/zebra.conf.j2 using minigraph_facts.py +! file: zebra.conf +! +{% endblock banner %} +! +{% block sys_init %} +hostname {{ inventory_hostname }} +password zebra +enable password zebra +{% endblock sys_init %} +! +{% block interfaces %} +! Enable link-detect (default disabled) +{% for interface in minigraph_interfaces %} +interface {{ interface['alias'] }} +link-detect +! +{% endfor %} +{% endblock interfaces %} +! +{% block default_route %} +! set static default route to mgmt gateway as a backup to learned default +ip route 0.0.0.0/0 {{ minigraph_mgmt_interface['gwaddr'] }} 200 +{% endblock default_route %} +! +{% block source_loopback %} +! Set ip source to loopback for bgp learned routes +route-map RM_SET_SRC permit 10 + set src {{ minigraph_lo_interfaces[0]['addr'] }} +! +{% set lo_ipv6_addrs = [] %} +{% if minigraph_lo_interfaces is defined %} +{% for interface in minigraph_lo_interfaces %} +{% if interface['addr'] is defined and interface['addr']|ipv6 %} +{% if lo_ipv6_addrs.append(interface['addr']) %} +{% endif %} +{% endif %} +{% endfor %} +{% endif %} +{% if lo_ipv6_addrs|length > 0 %} +route-map RM_SET_SRC6 permit 10 + set src {{ lo_ipv6_addrs[0] }} +! +{% endif %} +ip protocol bgp route-map RM_SET_SRC +! +{% if lo_ipv6_addrs|length > 0 %} +ipv6 protocol bgp route-map RM_SET_SRC6 +! +{% endif %} +{% endblock source_loopback %} +! +{% block logging %} +log syslog informational +log facility local4 +{% endblock logging %} +! + diff --git a/rules/docker-fpm-gobgp.mk b/rules/docker-fpm-gobgp.mk new file mode 100644 index 000000000000..eb9406ec0ba4 --- /dev/null +++ b/rules/docker-fpm-gobgp.mk @@ -0,0 +1,14 @@ +# docker image for fpm-gobgp + +DOCKER_FPM_GOBGP = docker-fpm-gobgp.gz +$(DOCKER_FPM_GOBGP)_PATH = $(DOCKERS_PATH)/docker-fpm-gobgp +$(DOCKER_FPM_GOBGP)_DEPENDS += $(GOBGP) +$(DOCKER_FPM_GOBGP)_LOAD_DOCKERS += $(DOCKER_FPM) +SONIC_DOCKER_IMAGES += $(DOCKER_FPM_GOBGP) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_FPM_GOBGP) + +$(DOCKER_FPM_GOBGP)_CONTAINER_NAME = bgp +$(DOCKER_FPM_GOBGP)_RUN_OPT += --net=host --privileged -t +$(DOCKER_FPM_GOBGP)_RUN_OPT += --volumes-from database +$(DOCKER_FPM_GOBGP)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + diff --git a/rules/gobgp.mk b/rules/gobgp.mk new file mode 100644 index 000000000000..5ce566f7b630 --- /dev/null +++ b/rules/gobgp.mk @@ -0,0 +1,5 @@ +# gobgp package + +GOBGP = gobgp_1.16-01_amd64.deb +$(GOBGP)_SRC_PATH = $(SRC_PATH)/gobgp +SONIC_DPKG_DEBS += $(GOBGP) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 03f38a06c2ca..b436c5199d84 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -6,6 +6,7 @@ RUN echo "deb http://debian-archive.trafficmanager.net/debian/ jessie main contr RUN echo "deb-src http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free" >> /etc/apt/sources.list RUN echo "deb http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list RUN echo "deb-src http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list +RUN echo 'deb http://debian-archive.trafficmanager.net/debian jessie-backports main' >> /etc/apt/sources.list ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -70,6 +71,9 @@ RUN apt-get update && apt-get install -y dkms # For python3.5 build RUN apt-get update && apt-get install -y sharutils libncursesw5-dev libbz2-dev liblzma-dev libgdbm-dev tk-dev blt-dev libmpdec-dev libbluetooth-dev locales libsqlite3-dev libgpm2 time net-tools xvfb python-sphinx python3-sphinx +# For gobgp build +RUN apt-get -yt jessie-backports install golang-go + RUN mkdir /var/run/sshd EXPOSE 22 diff --git a/src/gobgp/Makefile b/src/gobgp/Makefile new file mode 100644 index 000000000000..ec0bdc74f034 --- /dev/null +++ b/src/gobgp/Makefile @@ -0,0 +1,23 @@ +export GOPATH=/tmp/go + +INSTALL := /usr/bin/install + +all: gobgp gobgpd + +gobgpd: + go get -v github.com/osrg/gobgp/gobgpd + +gobgp: + go get -v github.com/osrg/gobgp/gobgp + +install: + $(INSTALL) -D ${GOPATH}/bin/gobgp $(DESTDIR)/usr/bin/gobgp + $(INSTALL) -D ${GOPATH}/bin/gobgpd $(DESTDIR)/usr/sbin/gobgpd + $(INSTALL) -D gobgpd.conf.sample $(DESTDIR)/etc/gobgp/gobgpd.conf.sample + +deinstall: + rm $(DESTDIR)/usr/bin/gobgp + rm $(DESTDIR)/usr/sbin/gobgpd + +clean: + rm -fr ${GOPATH} diff --git a/src/gobgp/debian/changelog b/src/gobgp/debian/changelog new file mode 100644 index 000000000000..ba412cc45ede --- /dev/null +++ b/src/gobgp/debian/changelog @@ -0,0 +1,5 @@ +gobgp (1.16-01) UNRELEASED; urgency=low + + * Initial release. + + -- Pavel Shirshov Sat, 25 Feb 2017 00:25:19 +0000 diff --git a/src/gobgp/debian/compat b/src/gobgp/debian/compat new file mode 100644 index 000000000000..ec635144f600 --- /dev/null +++ b/src/gobgp/debian/compat @@ -0,0 +1 @@ +9 diff --git a/src/gobgp/debian/control b/src/gobgp/debian/control new file mode 100644 index 000000000000..7d534852a383 --- /dev/null +++ b/src/gobgp/debian/control @@ -0,0 +1,12 @@ +Source: gobgp +Maintainer: Pavel Shirshov +Build-Depends: debhelper (>= 8.0.0), + dh-systemd +Standards-Version: 3.9.3 +Section: net + +Package: gobgp +Priority: extra +Architecture: amd64 +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: gobgp BGP daemon diff --git a/src/gobgp/debian/gobgp.dirs b/src/gobgp/debian/gobgp.dirs new file mode 100644 index 000000000000..3e9f1c594d41 --- /dev/null +++ b/src/gobgp/debian/gobgp.dirs @@ -0,0 +1 @@ +etc/gobgp diff --git a/src/gobgp/debian/gobgp.init.d b/src/gobgp/debian/gobgp.init.d new file mode 100644 index 000000000000..189fdad05690 --- /dev/null +++ b/src/gobgp/debian/gobgp.init.d @@ -0,0 +1,50 @@ +#!/bin/bash +# +### BEGIN INIT INFO +# Provides: gobgp +# Required-Start: $local_fs $network $remote_fs $syslog +# Required-Stop: $local_fs $network $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: start and stop the gobgpd +# Description: gobgpd is an implementation of bgp daemon in Go +### END INIT INFO +# + +PATH=/bin:/usr/bin:/sbin:/usr/sbin +D_PATH=/usr/sbin +C_PATH=/etc/gobgp + +. /lib/lsb/init-functions + +######################################################### +# Main program # +######################################################### + +case "$1" in + start) + if [ -f /etc/gobgp/gobgpd.conf ] + then + /usr/sbin/gobgpd -f /etc/gobgp/gobgpd.conf -r + echo $! > /var/run/gobgpd.pid + else + echo /etc/gobgp/gobgpd.conf not found + fi + ;; + + stop) + kill -9 $(echo /var/run/gobgpd.pid) + ;; + + restart|force-reload) + $0 stop $2 + sleep 1 + $0 start $2 + ;; + *) + echo "Usage: /etc/init.d/gobgp {start|stop|restart|force-reload}" + exit 1 + ;; +esac + +exit 0 diff --git a/src/gobgp/debian/gobgp.service b/src/gobgp/debian/gobgp.service new file mode 100644 index 000000000000..68a0b595aa1d --- /dev/null +++ b/src/gobgp/debian/gobgp.service @@ -0,0 +1,16 @@ +[Unit] +Description=gobgp service +After=network.target +ConditionPathExists=/etc/gobgp/gobgpd.yml + +[Service] +EnvironmentFile=-/etc/default/gobgp +ExecStart=/usr/sbin/gobgpd $DAEMON_ARGS +#ExecReload=/bin/kill -HUP $MAINPID +KillMode=process +Restart=on-failure + +[Install] +WantedBy=multi-user.target +Alias=gobgpd.service + diff --git a/src/gobgp/debian/rules b/src/gobgp/debian/rules new file mode 100755 index 000000000000..b6bee2ee4e76 --- /dev/null +++ b/src/gobgp/debian/rules @@ -0,0 +1,3 @@ +#!/usr/bin/make -f +%: + dh $@ --with systemd diff --git a/src/gobgp/gobgpd.conf.sample b/src/gobgp/gobgpd.conf.sample new file mode 100644 index 000000000000..c308df15be2c --- /dev/null +++ b/src/gobgp/gobgpd.conf.sample @@ -0,0 +1,21 @@ +[global.config] + as = 65501 + router-id = "192.168.0.1" +[[neighbors]] + [neighbors.config] + peer-as = 65502 + neighbor-address = "192.168.0.2" + [neighbors.graceful-restart.config] + enabled = true + restart-time = 120 + [[neighbors.afi-safis]] + [neighbors.afi-safis.config] + afi-safi-name = "ipv4-unicast" + [neighbors.afi-safis.mp-graceful-restart.config] + enabled = true + +[zebra] + [zebra.config] + enabled = true + url = "unix:/var/run/quagga/zserv.api" + redistribute-route-type-list = ["connect"] From 4eb549d36fdfe59fb41015fa9432da672d574c80 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 2 Mar 2017 12:17:04 -0800 Subject: [PATCH 0333/1011] [sonic_cli]: Fix bash completion for 'show' command (#355) --- .../build_templates/sonic_debian_extension.j2 | 4 ++ files/image_config/bash/bash.bashrc | 57 +++++++++++++++++++ src/sonic-utilities | 2 +- 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 files/image_config/bash/bash.bashrc diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index eaab6af01614..276fa2ef30f6 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -70,6 +70,10 @@ sudo dpkg --root=$FILESYSTEM_ROOT -i {{config_engine}} sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/python-sonic-utilities_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f +# SONiC utilities installs bash-completion as a dependency. However, it is disabled by default +# in bash.bashrc, so we copy a version of the file with it enabled here. +sudo cp -f $IMAGE_CONFIGS/bash/bash.bashrc $FILESYSTEM_ROOT/etc/ + # Install SONiC Device Data (and its dependencies via 'apt-get -y install -f') sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/sonic-device-data_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f diff --git a/files/image_config/bash/bash.bashrc b/files/image_config/bash/bash.bashrc new file mode 100644 index 000000000000..b531c88a0601 --- /dev/null +++ b/files/image_config/bash/bash.bashrc @@ -0,0 +1,57 @@ +# System-wide .bashrc file for interactive bash(1) shells. + +# To enable the settings / commands in this file for login shells as well, +# this file has to be sourced in /etc/profile. + +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, overwrite the one in /etc/profile) +PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' + +# Commented out, don't overwrite xterm -T "title" -n "icontitle" by default. +# If this is an xterm set the title to user@host:dir +#case "$TERM" in +#xterm*|rxvt*) +# PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"' +# ;; +#*) +# ;; +#esac + +# enable bash completion in interactive shells +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi + +# if the command-not-found package is installed, use it +if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then + function command_not_found_handle { + # check because c-n-f could've been removed in the meantime + if [ -x /usr/lib/command-not-found ]; then + /usr/lib/command-not-found -- "$1" + return $? + elif [ -x /usr/share/command-not-found/command-not-found ]; then + /usr/share/command-not-found/command-not-found -- "$1" + return $? + else + printf "%s: command not found\n" "$1" >&2 + return 127 + fi + } +fi + + diff --git a/src/sonic-utilities b/src/sonic-utilities index 07a8b3ab377f..cca83512018c 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 07a8b3ab377f4ceb2ad84c82dcdbb0e592a70b4c +Subproject commit cca83512018cd48a193a7f8f3d0676c8053bcc2d From 667ef1d766510e6d2173dfe99e420cbe7da95857 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 2 Mar 2017 13:34:37 -0800 Subject: [PATCH 0334/1011] [libteam]: Add 0002-libteam-Temporarily-remove-redundant-debug-mes.patch (#357) Signed-off-by: Shuotian Cheng --- ...mporarily-remove-redundant-debug-mes.patch | 25 +++++++++++++++++++ src/libteam/Makefile | 1 + 2 files changed, 26 insertions(+) create mode 100644 src/libteam/0002-libteam-Temporarily-remove-redundant-debug-mes.patch diff --git a/src/libteam/0002-libteam-Temporarily-remove-redundant-debug-mes.patch b/src/libteam/0002-libteam-Temporarily-remove-redundant-debug-mes.patch new file mode 100644 index 000000000000..a640f40e6e07 --- /dev/null +++ b/src/libteam/0002-libteam-Temporarily-remove-redundant-debug-mes.patch @@ -0,0 +1,25 @@ +From a5c8f3f41c575ebb7018e67cb3d1f724f0685850 Mon Sep 17 00:00:00 2001 +From: Shuotian Cheng +Date: Mon, 27 Feb 2017 14:21:09 -0800 +Subject: [PATCH] libteam: Temporarily remove redundant debug messages + +--- + teamd/teamd_runner_lacp.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/teamd/teamd_runner_lacp.c b/teamd/teamd_runner_lacp.c +index 9c77fae..5e37a4c 100644 +--- a/teamd/teamd_runner_lacp.c ++++ b/teamd/teamd_runner_lacp.c +@@ -922,8 +922,6 @@ static void lacp_port_actor_update(struct lacp_port *lacp_port) + state |= INFO_STATE_DEFAULTED; + if (teamd_port_count(lacp_port->ctx) > 0) + state |= INFO_STATE_AGGREGATION; +- teamd_log_dbg("%s: lacp info state: 0x%02X.", lacp_port->tdport->ifname, +- state); + lacp_port->actor.state = state; + } + +-- +2.1.4 + diff --git a/src/libteam/Makefile b/src/libteam/Makefile index e6864596c98d..c2b8a09cff6f 100644 --- a/src/libteam/Makefile +++ b/src/libteam/Makefile @@ -16,6 +16,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Apply patch git apply ../0001-libteam-Add-team_get_port_enabled-function.patch + git apply ../0002-libteam-Temporarily-remove-redundant-debug-mes.patch popd # Obtain debian packaging From f06dc5d3f9d20e7daf0d7c660e83b1ba7b780557 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 2 Mar 2017 15:59:16 -0800 Subject: [PATCH 0335/1011] [teamd]: Update the start.sh script to clean up the docker state (#351) This change should be temporary because the current teamd cannot re-create net devices acrosss restart. Basically, it will fail when there're files in /var/run/teamd/ folder or the previously created net devices are still there. Thus, the current workaround is to remove the obsolete files to restart the docker-teamd. This workaround cannot resolve the swss restart issue. Before restarting swss, docker teamd needs to be stopped manually. After swss starts, docker teamd needs to be restarted manually. This change will only make sure that rebooting the switch will make the switch at the correct state. Signed-off-by: Shuotian Cheng --- dockers/docker-teamd/start.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dockers/docker-teamd/start.sh b/dockers/docker-teamd/start.sh index 268217272f6e..e68b3ed00b8f 100755 --- a/dockers/docker-teamd/start.sh +++ b/dockers/docker-teamd/start.sh @@ -2,9 +2,17 @@ TEAMD_CONF_PATH=/etc/teamd +# Before teamd could automatically add newly created host interfaces into the +# LAG, this workaround will be needed. It will remove the obsolete files and +# net devices that are failed to be removed in the previous run. function start_app { + # Remove *.pid and *.sock files if there are any + rm -f /var/run/teamd/* if [ -d $TEAMD_CONF_PATH ]; then for f in $TEAMD_CONF_PATH/*; do + # Remove netdevs if there are any + intf=`echo $f | awk -F'[/.]' '{print $4}'` + ip link del $intf teamd -f $f -d done fi From d3891a2a42e33f0de5320c4499997932b11c6d0d Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 2 Mar 2017 16:04:18 -0800 Subject: [PATCH 0336/1011] Keep pip in the debian image (#356) --- build_debian.sh | 4 ++-- files/build_templates/sonic_debian_extension.j2 | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 16f31f980ada..85126bf34e89 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -166,6 +166,7 @@ sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install \ ## Note: gdisk is needed for sgdisk in install.sh ## Note: parted is needed for partprobe in install.sh ## Note: ca-certificates is needed for easy_install +## Note: don't install python-apt by pip, older than Debian repo one sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install \ file \ ifupdown \ @@ -232,8 +233,7 @@ set /files/etc/sysctl.conf/net.ipv6.conf.all.accept_dad 0 ## docker-py is needed by Ansible docker module sudo LANG=C chroot $FILESYSTEM_ROOT easy_install pip sudo LANG=C chroot $FILESYSTEM_ROOT pip install 'docker-py==1.6.0' -## Remove pip which is unnecessary in the base image -sudo LANG=C chroot $FILESYSTEM_ROOT pip uninstall -y pip +## Note: keep pip installed for maintainance purpose ## Config DHCP for eth0 sudo tee -a $FILESYSTEM_ROOT/etc/network/interfaces > /dev/null < Date: Thu, 2 Mar 2017 18:07:43 -0800 Subject: [PATCH 0337/1011] [teamd]: Add redis-tools as the dependency of docker-teamd and fix bugs (#363) - Fix the if condition bug to wait till PORT_TABLE:ConfigDone before start Signed-off-by: Shuotian Cheng --- dockers/docker-teamd/Dockerfile.j2 | 4 ++++ dockers/docker-teamd/start.sh | 2 +- rules/docker-teamd.mk | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index 32e302971ed2..b3f35dd3c2e5 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -2,6 +2,10 @@ FROM docker-config-engine RUN apt-get update && apt-get install -f -y libdbus-1-3 libdaemon0 libjansson4 +## Install redis-tools dependencies +## TODO: implicitly install dependencies +RUN apt-get -y install libjemalloc1 + COPY \ {% for deb in docker_teamd_debs.split(' ') -%} debs/{{ deb }}{{' '}} diff --git a/dockers/docker-teamd/start.sh b/dockers/docker-teamd/start.sh index e68b3ed00b8f..6ea5eb01b328 100755 --- a/dockers/docker-teamd/start.sh +++ b/dockers/docker-teamd/start.sh @@ -36,7 +36,7 @@ service rsyslog start while true; do # Check if front-panel ports are configured result=`echo -en "SELECT 0\nHGETALL PORT_TABLE:ConfigDone" | redis-cli | sed -n 3p` - if [ "$result" != "0" ]; then + if [ "$result" == "0" ]; then start_app read fi diff --git a/rules/docker-teamd.mk b/rules/docker-teamd.mk index f023c3598fa1..14038fcd0381 100644 --- a/rules/docker-teamd.mk +++ b/rules/docker-teamd.mk @@ -2,7 +2,7 @@ DOCKER_TEAMD = docker-teamd.gz $(DOCKER_TEAMD)_PATH = $(DOCKERS_PATH)/docker-teamd -$(DOCKER_TEAMD)_DEPENDS += $(SWSS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) +$(DOCKER_TEAMD)_DEPENDS += $(SWSS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(REDIS_TOOLS) $(DOCKER_TEAMD)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_TEAMD) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_TEAMD) From 80e3dc0df7711429b3d28512730e4711ca19db51 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 2 Mar 2017 23:53:20 -0800 Subject: [PATCH 0338/1011] [device]: add missing sai profile and minigraph for the supported devices (#362) change orchagent start.sh to use mounted hwsku directory --- .../AS7512-C32/port_config.ini | 33 + .../AS7512-C32/sai.profile | 2 + .../AS7512-S128/port_config.ini | 129 ++ .../AS7512-S128/sai.profile | 2 + .../AS7512/sai.profile | 2 + .../x86_64-accton_as7512_32x-r0/minigraph.xml | 140 +-- .../Arista-7060-CX32S/sai.profile | 1 + .../x86_64-arista_7060_cx32s/minigraph.xml | 1049 +++++++++++++++++ .../x86_64-dell_s6100_c2538-r0/minigraph.xml | 744 ++++++++++++ .../INGRASYS-S9100-C32/sai.profile | 1 + .../INGRASYS-S9100-C32/syncd.conf | 1 + dockers/docker-orchagent/start.sh | 6 +- files/build_templates/sonic_version.yml.j2 | 2 + 13 files changed, 2038 insertions(+), 74 deletions(-) create mode 100644 device/accton/x86_64-accton_as7512_32x-r0/AS7512-C32/port_config.ini create mode 100644 device/accton/x86_64-accton_as7512_32x-r0/AS7512-C32/sai.profile create mode 100644 device/accton/x86_64-accton_as7512_32x-r0/AS7512-S128/port_config.ini create mode 100644 device/accton/x86_64-accton_as7512_32x-r0/AS7512-S128/sai.profile create mode 100644 device/accton/x86_64-accton_as7512_32x-r0/AS7512/sai.profile create mode 100644 device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/sai.profile create mode 100644 device/arista/x86_64-arista_7060_cx32s/minigraph.xml create mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml create mode 100644 device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile create mode 100644 device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/syncd.conf diff --git a/device/accton/x86_64-accton_as7512_32x-r0/AS7512-C32/port_config.ini b/device/accton/x86_64-accton_as7512_32x-r0/AS7512-C32/port_config.ini new file mode 100644 index 000000000000..c10cd2786941 --- /dev/null +++ b/device/accton/x86_64-accton_as7512_32x-r0/AS7512-C32/port_config.ini @@ -0,0 +1,33 @@ +# name lanes +Ethernet0 16,17,18,19 +Ethernet4 20,21,22,23 +Ethernet8 24,25,26,27 +Ethernet12 28,29,30,31 +Ethernet16 32,33,34,35 +Ethernet20 36,37,38,39 +Ethernet24 40,41,42,43 +Ethernet28 44,45,46,47 +Ethernet32 0,1,2,3 +Ethernet36 4,5,6,7 +Ethernet40 8,9,10,11 +Ethernet44 12,13,14,15 +Ethernet48 48,49,50,51 +Ethernet52 52,53,54,55 +Ethernet56 56,57,58,59 +Ethernet60 60,61,62,63 +Ethernet64 127,126,125,124 +Ethernet68 123,122,121,120 +Ethernet72 115,114,113,112 +Ethernet76 119,118,117,116 +Ethernet80 79,78,77,76 +Ethernet84 75,74,73,72 +Ethernet88 64,65,66,67 +Ethernet92 71,70,68,69 +Ethernet96 111,110,109,108 +Ethernet100 107,106,105,104 +Ethernet104 103,102,101,100 +Ethernet108 99,98,97,96 +Ethernet112 95,94,93,92 +Ethernet116 91,90,89,88 +Ethernet120 87,86,85,84 +Ethernet124 83,82,81,80 diff --git a/device/accton/x86_64-accton_as7512_32x-r0/AS7512-C32/sai.profile b/device/accton/x86_64-accton_as7512_32x-r0/AS7512-C32/sai.profile new file mode 100644 index 000000000000..457c339c58ab --- /dev/null +++ b/device/accton/x86_64-accton_as7512_32x-r0/AS7512-C32/sai.profile @@ -0,0 +1,2 @@ +mode=3 +hwId=as7512 diff --git a/device/accton/x86_64-accton_as7512_32x-r0/AS7512-S128/port_config.ini b/device/accton/x86_64-accton_as7512_32x-r0/AS7512-S128/port_config.ini new file mode 100644 index 000000000000..c3b669950405 --- /dev/null +++ b/device/accton/x86_64-accton_as7512_32x-r0/AS7512-S128/port_config.ini @@ -0,0 +1,129 @@ +# name lanes +Ethernet1 0 +Ethernet2 1 +Ethernet3 2 +Ethernet4 3 +Ethernet5 4 +Ethernet6 5 +Ethernet7 6 +Ethernet8 7 +Ethernet9 8 +Ethernet10 9 +Ethernet11 10 +Ethernet12 11 +Ethernet13 12 +Ethernet14 13 +Ethernet15 14 +Ethernet16 15 +Ethernet17 16 +Ethernet18 17 +Ethernet19 18 +Ethernet20 19 +Ethernet21 20 +Ethernet22 21 +Ethernet23 22 +Ethernet24 23 +Ethernet25 24 +Ethernet26 25 +Ethernet27 26 +Ethernet28 27 +Ethernet29 28 +Ethernet30 29 +Ethernet31 30 +Ethernet32 31 +Ethernet33 32 +Ethernet34 33 +Ethernet35 34 +Ethernet36 35 +Ethernet37 36 +Ethernet38 37 +Ethernet39 38 +Ethernet40 39 +Ethernet41 40 +Ethernet42 41 +Ethernet43 42 +Ethernet44 43 +Ethernet45 44 +Ethernet46 45 +Ethernet47 46 +Ethernet48 47 +Ethernet49 48 +Ethernet50 49 +Ethernet51 50 +Ethernet52 51 +Ethernet53 52 +Ethernet54 53 +Ethernet55 54 +Ethernet56 55 +Ethernet57 56 +Ethernet58 57 +Ethernet59 58 +Ethernet60 59 +Ethernet61 60 +Ethernet62 61 +Ethernet63 62 +Ethernet64 63 +Ethernet65 64 +Ethernet66 65 +Ethernet67 66 +Ethernet68 67 +Ethernet69 68 +Ethernet70 69 +Ethernet71 70 +Ethernet72 71 +Ethernet73 72 +Ethernet74 73 +Ethernet75 74 +Ethernet76 75 +Ethernet77 76 +Ethernet78 77 +Ethernet79 78 +Ethernet80 79 +Ethernet81 80 +Ethernet82 81 +Ethernet83 82 +Ethernet84 83 +Ethernet85 84 +Ethernet86 85 +Ethernet87 86 +Ethernet88 87 +Ethernet89 88 +Ethernet90 89 +Ethernet91 90 +Ethernet92 91 +Ethernet93 92 +Ethernet94 93 +Ethernet95 94 +Ethernet96 95 +Ethernet97 96 +Ethernet98 97 +Ethernet99 98 +Ethernet100 99 +Ethernet101 100 +Ethernet102 101 +Ethernet103 102 +Ethernet104 103 +Ethernet105 104 +Ethernet106 105 +Ethernet107 106 +Ethernet108 107 +Ethernet109 108 +Ethernet110 109 +Ethernet111 110 +Ethernet112 111 +Ethernet113 112 +Ethernet114 113 +Ethernet115 114 +Ethernet116 115 +Ethernet117 116 +Ethernet118 117 +Ethernet119 118 +Ethernet120 119 +Ethernet121 120 +Ethernet122 121 +Ethernet123 122 +Ethernet124 123 +Ethernet125 124 +Ethernet126 125 +Ethernet127 126 +Ethernet128 127 diff --git a/device/accton/x86_64-accton_as7512_32x-r0/AS7512-S128/sai.profile b/device/accton/x86_64-accton_as7512_32x-r0/AS7512-S128/sai.profile new file mode 100644 index 000000000000..471c4395758f --- /dev/null +++ b/device/accton/x86_64-accton_as7512_32x-r0/AS7512-S128/sai.profile @@ -0,0 +1,2 @@ +mode=0 +hwId=as7512 diff --git a/device/accton/x86_64-accton_as7512_32x-r0/AS7512/sai.profile b/device/accton/x86_64-accton_as7512_32x-r0/AS7512/sai.profile new file mode 100644 index 000000000000..017996f7d7cc --- /dev/null +++ b/device/accton/x86_64-accton_as7512_32x-r0/AS7512/sai.profile @@ -0,0 +1,2 @@ +mode=1 +hwId=as7512 diff --git a/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml b/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml index 0fbd853220b2..42bb951add3a 100644 --- a/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml +++ b/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml @@ -5,14 +5,14 @@ ARISTA01T0 10.0.0.33 - switch2 + switch1 10.0.0.32 1 180 60 - switch2 + switch1 10.0.0.0 ARISTA01T2 10.0.0.1 @@ -23,14 +23,14 @@ ARISTA02T0 10.0.0.35 - switch2 + switch1 10.0.0.34 1 180 60 - switch2 + switch1 10.0.0.2 ARISTA02T2 10.0.0.3 @@ -41,14 +41,14 @@ ARISTA03T0 10.0.0.37 - switch2 + switch1 10.0.0.36 1 180 60 - switch2 + switch1 10.0.0.4 ARISTA03T2 10.0.0.5 @@ -59,14 +59,14 @@ ARISTA04T0 10.0.0.39 - switch2 + switch1 10.0.0.38 1 180 60 - switch2 + switch1 10.0.0.6 ARISTA04T2 10.0.0.7 @@ -77,14 +77,14 @@ ARISTA05T0 10.0.0.41 - switch2 + switch1 10.0.0.40 1 180 60 - switch2 + switch1 10.0.0.8 ARISTA05T2 10.0.0.9 @@ -95,14 +95,14 @@ ARISTA06T0 10.0.0.43 - switch2 + switch1 10.0.0.42 1 180 60 - switch2 + switch1 10.0.0.10 ARISTA06T2 10.0.0.11 @@ -113,14 +113,14 @@ ARISTA07T0 10.0.0.45 - switch2 + switch1 10.0.0.44 1 180 60 - switch2 + switch1 10.0.0.12 ARISTA07T2 10.0.0.13 @@ -131,14 +131,14 @@ ARISTA08T0 10.0.0.47 - switch2 + switch1 10.0.0.46 1 180 60 - switch2 + switch1 10.0.0.14 ARISTA08T2 10.0.0.15 @@ -149,14 +149,14 @@ ARISTA09T0 10.0.0.49 - switch2 + switch1 10.0.0.48 1 180 60 - switch2 + switch1 10.0.0.16 ARISTA09T2 10.0.0.17 @@ -167,14 +167,14 @@ ARISTA10T0 10.0.0.51 - switch2 + switch1 10.0.0.50 1 180 60 - switch2 + switch1 10.0.0.18 ARISTA10T2 10.0.0.19 @@ -185,14 +185,14 @@ ARISTA11T0 10.0.0.53 - switch2 + switch1 10.0.0.52 1 180 60 - switch2 + switch1 10.0.0.20 ARISTA11T2 10.0.0.21 @@ -203,14 +203,14 @@ ARISTA12T0 10.0.0.55 - switch2 + switch1 10.0.0.54 1 180 60 - switch2 + switch1 10.0.0.22 ARISTA12T2 10.0.0.23 @@ -221,14 +221,14 @@ ARISTA13T0 10.0.0.57 - switch2 + switch1 10.0.0.56 1 180 60 - switch2 + switch1 10.0.0.24 ARISTA13T2 10.0.0.25 @@ -239,14 +239,14 @@ ARISTA14T0 10.0.0.59 - switch2 + switch1 10.0.0.58 1 180 60 - switch2 + switch1 10.0.0.26 ARISTA14T2 10.0.0.27 @@ -257,14 +257,14 @@ ARISTA15T0 10.0.0.61 - switch2 + switch1 10.0.0.60 1 180 60 - switch2 + switch1 10.0.0.28 ARISTA15T2 10.0.0.29 @@ -275,14 +275,14 @@ ARISTA16T0 10.0.0.63 - switch2 + switch1 10.0.0.62 1 180 60 - switch2 + switch1 10.0.0.30 ARISTA16T2 10.0.0.31 @@ -294,7 +294,7 @@ 65100 - switch2 + switch1
10.0.0.33
@@ -639,7 +639,7 @@ - switch2 + switch1 @@ -814,224 +814,224 @@ DeviceInterfaceLink - switch2 + switch1 Ethernet0 ARISTA01T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet4 ARISTA02T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet8 ARISTA03T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet12 ARISTA04T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet16 ARISTA05T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet20 ARISTA06T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet24 ARISTA07T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet28 ARISTA08T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet32 ARISTA09T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet36 ARISTA10T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet40 ARISTA11T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet44 ARISTA12T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet48 ARISTA13T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet52 ARISTA14T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet56 ARISTA15T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet60 ARISTA16T2 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet64 ARISTA01T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet68 ARISTA02T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet72 ARISTA03T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet76 ARISTA04T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet80 ARISTA05T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet84 ARISTA06T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet88 ARISTA07T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet92 ARISTA08T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet96 ARISTA09T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet100 ARISTA10T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet104 ARISTA11T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet108 ARISTA12T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet112 ARISTA13T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet116 ARISTA14T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet120 ARISTA15T0 Ethernet1 DeviceInterfaceLink - switch2 + switch1 Ethernet124 ARISTA16T0 Ethernet1 @@ -1039,11 +1039,11 @@ - switch2 - ACS-MSN2700 + switch1 + AS7512 - switch2 - ACS-MSN2700 + switch1 + AS7512 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/sai.profile b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/sai.profile new file mode 100644 index 000000000000..29a42f07a734 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-a7060-cx32s-32x100G.config.bcm diff --git a/device/arista/x86_64-arista_7060_cx32s/minigraph.xml b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml new file mode 100644 index 000000000000..3fcd713cbc79 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml @@ -0,0 +1,1049 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + Ethernet1/1 + 10.0.0.0/31 + + + + Ethernet2/1 + 10.0.0.2/31 + + + + Ethernet3/1 + 10.0.0.4/31 + + + + Ethernet4/1 + 10.0.0.6/31 + + + + Ethernet5/1 + 10.0.0.8/31 + + + + Ethernet6/1 + 10.0.0.10/31 + + + + Ethernet7/1 + 10.0.0.12/31 + + + + Ethernet8/1 + 10.0.0.14/31 + + + + Ethernet9/1 + 10.0.0.16/31 + + + + Ethernet10/1 + 10.0.0.18/31 + + + + Ethernet11/1 + 10.0.0.20/31 + + + + Ethernet12/1 + 10.0.0.22/31 + + + + Ethernet13/1 + 10.0.0.24/31 + + + + Ethernet14/1 + 10.0.0.26/31 + + + + Ethernet15/1 + 10.0.0.28/31 + + + + Ethernet16/1 + 10.0.0.30/31 + + + + Ethernet17/1 + 10.0.0.32/31 + + + + Ethernet18/1 + 10.0.0.34/31 + + + + Ethernet19/1 + 10.0.0.36/31 + + + + Ethernet20/1 + 10.0.0.38/31 + + + + Ethernet21/1 + 10.0.0.40/31 + + + + Ethernet22/1 + 10.0.0.42/31 + + + + Ethernet23/1 + 10.0.0.44/31 + + + + Ethernet24/1 + 10.0.0.46/31 + + + + Ethernet25/1 + 10.0.0.48/31 + + + + Ethernet26/1 + 10.0.0.50/31 + + + + Ethernet27/1 + 10.0.0.52/31 + + + + Ethernet28/1 + 10.0.0.54/31 + + + + Ethernet29/1 + 10.0.0.56/31 + + + + Ethernet30/1 + 10.0.0.58/31 + + + + Ethernet31/1 + 10.0.0.60/31 + + + + Ethernet32/1 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + Ethernet1/1 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet2/1 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet3/1 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet4/1 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet5/1 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet6/1 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet7/1 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet8/1 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet9/1 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet10/1 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet11/1 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet12/1 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet13/1 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet14/1 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet15/1 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet16/1 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet17/1 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet18/1 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet19/1 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet20/1 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet21/1 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet22/1 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet23/1 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet24/1 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet25/1 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet26/1 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet27/1 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet28/1 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet29/1 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet30/1 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet31/1 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet32/1 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Arista-7060-CX32S + + + + switch1 + Arista-7060-CX32S +
diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml b/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml new file mode 100644 index 000000000000..e07ec53e18e9 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml @@ -0,0 +1,744 @@ + + + + + + ARISTA01T1 + 10.0.0.1 + switch1 + 10.0.0.0 + 1 + 180 + 60 + + + ARISTA02T1 + 10.0.0.5 + switch1 + 10.0.0.4 + 1 + 180 + 60 + + + ARISTA03T1 + 10.0.0.9 + switch1 + 10.0.0.8 + 1 + 180 + 60 + + + ARISTA04T1 + 10.0.0.13 + switch1 + 10.0.0.12 + 1 + 180 + 60 + + + ARISTA01T1 + FC00::2 + switch1 + FC00::1 + 1 + 180 + 60 + + + ARISTA02T1 + FC00::A + switch1 + FC00::9 + 1 + 180 + 60 + + + ARISTA03T1 + FC00::12 + switch1 + FC00::11 + 1 + 180 + 60 + + + ARISTA04T1 + FC00::1A + switch1 + FC00::19 + 1 + 180 + 60 + + + + + 64601 + switch1 + + + BGPPeer +
10.0.0.1
+ + + +
+ + BGPPeer +
10.0.0.5
+ + + +
+ + BGPPeer +
10.0.0.9
+ + + +
+ + BGPPeer +
10.0.0.13
+ + + +
+ + BGPPeer +
FC00::2
+ + + +
+ + BGPPeer +
FC00::A
+ + + +
+ + BGPPeer +
FC00::12
+ + + +
+ + BGPPeer +
FC00::1A
+ + + +
+
+ +
+ + 64802 + ARISTA01T1 + + + + 64802 + ARISTA02T1 + + + + 64802 + ARISTA03T1 + + + + 64802 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + + + + switch1 + + + PortChannelInterface + PortChannel1 + fortyGigE1/1/1;fortyGigE1/1/2 + + + + PortChannelInterface + PortChannel5 + fortyGigE1/1/5;fortyGigE1/1/6 + + + + PortChannelInterface + PortChannel16 + fortyGigE1/2/1;fortyGigE1/2/2 + + + + PortChannelInterface + PortChannel20 + fortyGigE1/2/5;fortyGigE1/2/6 + + + + + + VlanInterface + Vlan2 + fortyGigE1/1/7;fortyGigE1/1/8;fortyGigE1/1/9;fortyGigE1/1/10;fortyGigE1/1/11;fortyGigE1/1/12;fortyGigE1/1/13;fortyGigE1/1/14;fortyGigE1/1/15;fortyGigE1/1/16;fortyGigE1/3/1;fortyGigE1/3/5;fortyGigE1/3/6;fortyGigE1/3/7;fortyGigE1/3/8;fortyGigE1/3/9;fortyGigE1/3/10;fortyGigE1/3/11;fortyGigE1/2/7;fortyGigE1/2/8;fortyGigE1/2/9;fortyGigE1/2/10;fortyGigE1/2/11;fortyGigE1/2/12;fortyGigE1/2/13;fortyGigE1/2/14;fortyGigE1/2/15;fortyGigE1/2/16;fortyGigE1/4/1;fortyGigE1/4/5;fortyGigE1/4/6;fortyGigE1/4/7;fortyGigE1/4/8;fortyGigE1/4/9;fortyGigE1/4/10;fortyGigE1/4/11 + False + 0.0.0.0/0 + + 2 + 2 + 172.0.0.0/26 + + + + + IPInterface + + PortChannel1 + 10.0.0.0/31 + + + IPInterface + + PortChannel5 + 10.0.0.4/31 + + + IPInterface + + PortChannel16 + 10.0.0.8/31 + + + IPInterface + + PortChannel20 + 10.0.0.12/31 + + + IPInterface + + PortChannel1 + FC00::1/126 + + + IPInterface + + PortChannel5 + FC00::9/126 + + + IPInterface + + PortChannel16 + FC00::11/126 + + + IPInterface + + PortChannel20 + FC00::19/126 + + + IPInterface + + Vlan2 + 172.0.0.1/26 + + + + + + + + + + + + DeviceInterfaceLink + true + 40000 + ARISTA01T1 + Ethernet1 + true + switch1 + fortyGigE1/1/1 + + + DeviceInterfaceLink + true + 40000 + ARISTA01T1 + Ethernet2 + true + switch1 + fortyGigE1/1/2 + + + DeviceInterfaceLink + true + 40000 + ARISTA02T1 + Ethernet1 + true + switch1 + fortyGigE1/1/5 + + + DeviceInterfaceLink + true + 40000 + ARISTA02T1 + Ethernet2 + true + switch1 + fortyGigE1/1/6 + + + DeviceInterfaceLink + true + 40000 + ARISTA03T1 + Ethernet1 + true + switch1 + fortyGigE1/2/1 + + + DeviceInterfaceLink + true + 40000 + ARISTA03T1 + Ethernet2 + true + switch1 + fortyGigE1/2/2 + + + DeviceInterfaceLink + true + 40000 + ARISTA04T1 + Ethernet1 + true + switch1 + fortyGigE1/2/5 + + + DeviceInterfaceLink + true + 40000 + ARISTA04T1 + Ethernet2 + true + switch1 + fortyGigE1/2/6 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/1/7 + true + server-01 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/1/8 + true + server-02 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/1/9 + true + server-03 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/1/10 + true + server-04 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/1/11 + true + server-05 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/1/12 + true + server-06 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/1/13 + true + server-07 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/1/14 + true + server-08 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/1/15 + true + server-09 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/1/16 + true + server-10 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/3/1 + true + server-11 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/3/5 + true + server-12 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/3/6 + true + server-13 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/3/7 + true + server-14 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/3/8 + true + server-15 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/3/9 + true + server-16 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/3/10 + true + server-17 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/3/11 + true + server-18 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/2/7 + true + server-19 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/2/8 + true + server-20 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/2/9 + true + server-21 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/2/10 + true + server-22 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/2/11 + true + server-23 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/2/12 + true + server-24 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/2/13 + true + server-25 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/2/14 + true + server-26 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/2/15 + true + server-27 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/2/16 + true + server-28 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/4/1 + true + server-29 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/4/5 + true + server-30 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/4/6 + true + server-31 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/4/7 + true + server-32 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/4/8 + true + server-33 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/4/9 + true + server-34 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/4/10 + true + server-35 + 0 + + + DeviceInterfaceLink + true + 40000 + switch1 + fortyGigE1/4/11 + true + server-36 + 0 + + + + + switch1 + Force10-S6100 + + + + switch1 + Force10-S6100 +
diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile new file mode 100644 index 000000000000..1b6009956e90 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-ingrasys-s9100-32x100G.config.bcm diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/syncd.conf b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/syncd.conf new file mode 100644 index 000000000000..1b197345d308 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/syncd.conf @@ -0,0 +1 @@ +OPENNSL_CONFIG_POST_INIT_FILE=/etc/bcm/th-ingrasys-s9100-32x100G.soc diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index af7f2f321a0a..6e05782b3d75 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -23,15 +23,13 @@ function clean_up { trap clean_up SIGTERM SIGKILL -. /host/machine.conf - HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` ORCHAGENT_ARGS="" -PORTSYNCD_ARGS="-p /usr/share/sonic/$HWSKU/port_config.ini" +PORTSYNCD_ARGS="-p /usr/share/sonic/hwsku/port_config.ini" SWSSCONFIG_ARGS="00-copp.config.json " @@ -49,7 +47,7 @@ elif [ "$HWSKU" == "Arista-7060-CX32S" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "AS7512" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "ingrasys-s9100" ]; then +elif [ "$HWSKU" == "INGRASYS-S9100-C32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "ACS-MSN2700" ]; then SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json " diff --git a/files/build_templates/sonic_version.yml.j2 b/files/build_templates/sonic_version.yml.j2 index 54eb904a1614..6eb8a6d6c5e4 100644 --- a/files/build_templates/sonic_version.yml.j2 +++ b/files/build_templates/sonic_version.yml.j2 @@ -1,3 +1,5 @@ build_version: {{git_revision}} debian_version: {{debian_version}} kernel_version: {{kernel_version}} +asic_type: {{sonic_asic_platform}} + From 0f845998bb1d7cecd6a12da0ffdc8014a59b62f7 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 3 Mar 2017 01:33:44 -0800 Subject: [PATCH 0339/1011] [sonic-slave]: fix thrift test break introduced in #358 (#364) --- sonic-slave/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index b436c5199d84..f1d68c680cb8 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -72,7 +72,7 @@ RUN apt-get update && apt-get install -y dkms RUN apt-get update && apt-get install -y sharutils libncursesw5-dev libbz2-dev liblzma-dev libgdbm-dev tk-dev blt-dev libmpdec-dev libbluetooth-dev locales libsqlite3-dev libgpm2 time net-tools xvfb python-sphinx python3-sphinx # For gobgp build -RUN apt-get -yt jessie-backports install golang-go +RUN apt-get -yt jessie-backports install golang-go golang-github-golang-mock-dev RUN mkdir /var/run/sshd EXPOSE 22 From ba0f19ad549d71fbe61ef631364f389ecfc44c8d Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Fri, 3 Mar 2017 12:26:44 +0200 Subject: [PATCH 0340/1011] [build_debuian]: Fix issue #267 (docker connect failure). (#365) --- files/build_templates/sonic_debian_extension.j2 | 1 - 1 file changed, 1 deletion(-) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 6b323a3220c2..c84518576f17 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -37,7 +37,6 @@ trap_push clean_sys sudo LANG=C chroot $FILESYSTEM_ROOT mount sysfs /sys -t sysfs sudo chroot $FILESYSTEM_ROOT service docker start -sudo chroot $FILESYSTEM_ROOT docker version # Apply apt configuration files sudo cp $IMAGE_CONFIGS/apt/sources.list $FILESYSTEM_ROOT/etc/apt/ From aed03d6dd5650e64432a38ef54765efc9075511d Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 3 Mar 2017 08:43:22 -0800 Subject: [PATCH 0341/1011] [gobgp]: do not install docker-fpm-gobgp into one image (#366) * [gobgp]: do not install docker-fpm-gobgp into one image but build docker-fpm-gobgp on different platforms --- platform/broadcom/rules.mk | 3 ++- platform/cavium/rules.mk | 3 ++- platform/mellanox/rules.mk | 3 ++- rules/docker-fpm-gobgp.mk | 1 - 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index d9dc0eccc1da..37e18ba80285 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -17,7 +17,8 @@ $(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/dsserve?sv SONIC_ONLINE_FILES += $(BCMCMD) $(DSSERVE) -SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT_IMAGE) +SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT_IMAGE) \ + $(DOCKER_FPM_GOBGP) # Inject brcm sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index 6fb9d8c267ef..05312066719f 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -4,7 +4,8 @@ include $(PLATFORM_PATH)/docker-orchagent-cavm.mk include $(PLATFORM_PATH)/cavm_platform_modules.mk include $(PLATFORM_PATH)/one-image.mk -SONIC_ALL += $(SONIC_ONE_IMAGE) +SONIC_ALL += $(SONIC_ONE_IMAGE) \ + $(DOCKER_FPM_GOBGP) # Inject cavium sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(CAVM_SAI) $(CAVM_LIBSAI) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index 2c10cf3337c8..8bcb8d0278b4 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -7,7 +7,8 @@ include $(PLATFORM_PATH)/docker-syncd-mlnx.mk include $(PLATFORM_PATH)/docker-orchagent-mlnx.mk include $(PLATFORM_PATH)/one-image.mk -SONIC_ALL += $(SONIC_ONE_IMAGE) +SONIC_ALL += $(SONIC_ONE_IMAGE) \ + $(DOCKER_FPM_GOBGP) # Inject mlnx sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) diff --git a/rules/docker-fpm-gobgp.mk b/rules/docker-fpm-gobgp.mk index eb9406ec0ba4..78bf1b840a2b 100644 --- a/rules/docker-fpm-gobgp.mk +++ b/rules/docker-fpm-gobgp.mk @@ -5,7 +5,6 @@ $(DOCKER_FPM_GOBGP)_PATH = $(DOCKERS_PATH)/docker-fpm-gobgp $(DOCKER_FPM_GOBGP)_DEPENDS += $(GOBGP) $(DOCKER_FPM_GOBGP)_LOAD_DOCKERS += $(DOCKER_FPM) SONIC_DOCKER_IMAGES += $(DOCKER_FPM_GOBGP) -SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_FPM_GOBGP) $(DOCKER_FPM_GOBGP)_CONTAINER_NAME = bgp $(DOCKER_FPM_GOBGP)_RUN_OPT += --net=host --privileged -t From 0993ac2188035263833f353c8ef05f3757a52be8 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 3 Mar 2017 08:44:11 -0800 Subject: [PATCH 0342/1011] [swss]: add swssloglevel to change level log on-the-fly (#367) add swssloglevel to change level log on-the-fly and simplify syncd start logic on multiple platforms --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 144bbbac5b1a..22ea540f50dc 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 144bbbac5b1a9c3167ae6ecd94ff7bdffd3b869e +Subproject commit 22ea540f50dc05b6320b0f00f769bc5be0b2a9d3 diff --git a/src/sonic-swss b/src/sonic-swss index 9f0351815aef..dc33b7549e57 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 9f0351815aef8798a1367ef6e60e006156d7d190 +Subproject commit dc33b7549e57719d7855b1f7929b38b9b519072b diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 31a6b40089ef..b1c829a0b2f4 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 31a6b40089efd42c895604b7d1d9fcc5b5c37040 +Subproject commit b1c829a0b2f4dd0dfef8ec1e6b6cd67bcf334d7c From 1ba2111111be92fbc2ddc6061235228c9fc0e021 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Sat, 4 Mar 2017 02:23:49 +0200 Subject: [PATCH 0343/1011] [teamd]: Add volumes from database in docker-teamd.mk (#369) teamsyncd requires volumes from database to connect to DB. Signed-off-by: marian-pritsak --- rules/docker-teamd.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/rules/docker-teamd.mk b/rules/docker-teamd.mk index 14038fcd0381..cc97e24fe4ab 100644 --- a/rules/docker-teamd.mk +++ b/rules/docker-teamd.mk @@ -10,3 +10,4 @@ SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_TEAMD) $(DOCKER_TEAMD)_CONTAINER_NAME = teamd $(DOCKER_TEAMD)_RUN_OPT += --net=host --privileged -t $(DOCKER_TEAMD)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_TEAMD)_RUN_OPT += --volumes-from database From 366775a64ec860395cb6919f1328451bcf79d5ab Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 3 Mar 2017 23:07:23 -0800 Subject: [PATCH 0344/1011] [Broadcom]: Update debian package versions (#373) Signed-off-by: Shuotian Cheng --- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index d2d701b8ed10..ace7617f7ff4 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.3.1-4+0-20170301222525.13-1.gbp8d6580_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.3.1-4+0-20170301222525.13-1.gbp8d6580_amd64.deb?sv=2015-04-05&sr=b&sig=YhWQFb2Bz5ZgqyA8VciIT20I%2BBDhps77ksakG0jU92A%3D&se=2030-11-08T22%3A34%3A36Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-20170303234832.14_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-20170303234832.14_amd64.deb?sv=2015-04-05&sr=b&sig=gZKsefmpU6Xc6X0emxjlGKwf1aPsyxloulhXL0qGgFc%3D&se=2030-11-10T23%3A58%3A37Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.3.1-4+0-20170301222525.13-1.gbp8d6580_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-20170303234832.14_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.3.1-4+0-20170301222525.13-1.gbp8d6580_amd64.deb?sv=2015-04-05&sr=b&sig=QUmwuM3AZ4qe5sVFTmB6tEWApJKWU7PP5kfaDVM2dKU%3D&se=2030-11-08T22%3A35%3A34Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-20170303234832.14_amd64.deb?sv=2015-04-05&sr=b&sig=kEhXcoL0iOUpnuGJLduktluImi0eQVHAjGunGbipa28%3D&se=2030-11-10T23%3A59%3A08Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index c15d327f96a1..57583bb178f7 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.1.5-7-20170301212550.23_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.1.5-7-20170301212550.23_amd64.deb?sv=2015-04-05&sr=b&sig=d18xevgySzJGCbD6I9M4SX1%2B291vIOMbMXPsbkDjuFA%3D&se=2030-11-08T22%3A36%3A21Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.2.2-20170303224751.24_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-20170303224751.24_amd64.deb?sv=2015-04-05&sr=b&sig=rFu55R4M6M9vJ%2FlJgv6wvp2fbZnKpiHNnhzCddEidgo%3D&se=2030-11-10T23%3A59%3A41Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.1.5-7-20170301212550.23_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.1.5-7-20170301212550.23_amd64.deb?sv=2015-04-05&sr=b&sig=5iudeTcf3WNlNSYgJPfaj41CVh7n71GuV7v1hmuy0OI%3D&se=2030-11-08T22%3A36%3A58Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-20170303224751.24_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-20170303224751.24_amd64.deb?sv=2015-04-05&sr=b&sig=DMN91a5PwxG7ow15K1YyHudRF%2F2l0ipAXJ7c1dOW6QY%3D&se=2030-11-11T00%3A00%3A09Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 701d5ddb8abfe7be2edc5d8bd09ffd5636362f3c Mon Sep 17 00:00:00 2001 From: Nadiya Date: Sat, 4 Mar 2017 11:56:41 +0200 Subject: [PATCH 0345/1011] Add cavm saiserver (#137) --- dockers/docker-saiserver-cavm/Dockerfile | 30 +++++++++++++++++++++ dockers/docker-saiserver-cavm/portmap.ini | 33 +++++++++++++++++++++++ dockers/docker-saiserver-cavm/profile.ini | 4 +++ dockers/docker-saiserver-cavm/start.sh | 11 ++++++++ 4 files changed, 78 insertions(+) create mode 100644 dockers/docker-saiserver-cavm/Dockerfile create mode 100644 dockers/docker-saiserver-cavm/portmap.ini create mode 100644 dockers/docker-saiserver-cavm/profile.ini create mode 100755 dockers/docker-saiserver-cavm/start.sh diff --git a/dockers/docker-saiserver-cavm/Dockerfile b/dockers/docker-saiserver-cavm/Dockerfile new file mode 100644 index 000000000000..2ee6b8ff38cd --- /dev/null +++ b/dockers/docker-saiserver-cavm/Dockerfile @@ -0,0 +1,30 @@ + +FROM docker-base + +RUN apt-get update \ + && apt-get install -y libsensors4-dev \ + python \ + python-dev + +COPY deps /root/deps + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ + dpkg_apt /root/deps/xp-tools.deb \ + && dpkg_apt /root/deps/libsai.deb \ + && dpkg_apt /root/deps/sai.deb \ + && dpkg_apt /root/deps/libthrift-0.9.3_*.deb \ + && dpkg_apt /root/deps/libnl-3-200_*.deb \ + && dpkg_apt /root/deps/libnl-genl-3-200_*.deb \ + && dpkg_apt /root/deps/libnl-route-3-200_*.deb + + +COPY ["deps/saiserver", "start.sh", "/usr/bin/"] + +COPY ["portmap.ini", "profile.ini", "/etc/sai/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf deps + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-saiserver-cavm/portmap.ini b/dockers/docker-saiserver-cavm/portmap.ini new file mode 100644 index 000000000000..c35776dcfcc5 --- /dev/null +++ b/dockers/docker-saiserver-cavm/portmap.ini @@ -0,0 +1,33 @@ +# alias lanes +Ethernet0 16,17,18,19 +Ethernet4 20,21,22,23 +Ethernet8 24,25,26,27 +Ethernet12 28,29,30,31 +Ethernet16 32,33,34,35 +Ethernet20 36,37,38,39 +Ethernet24 40,41,42,43 +Ethernet28 44,45,46,47 +Ethernet32 0,1,2,3 +Ethernet36 4,5,6,7 +Ethernet40 8,9,10,11 +Ethernet44 12,13,14,15 +Ethernet48 48,49,50,51 +Ethernet52 52,53,54,55 +Ethernet56 56,57,58,59 +Ethernet60 60,61,62,63 +Ethernet64 127,126,125,124 +Ethernet68 123,122,121,120 +Ethernet72 115,114,113,112 +Ethernet76 119,118,117,116 +Ethernet80 79,78,77,76 +Ethernet84 75,74,73,72 +Ethernet88 64,65,66,67 +Ethernet92 71,70,68,69 +Ethernet96 111,110,109,108 +Ethernet100 107,106,105,104 +Ethernet104 103,102,101,100 +Ethernet108 99,98,97,96 +Ethernet112 95,94,93,92 +Ethernet116 91,90,89,88 +Ethernet120 87,86,85,84 +Ethernet124 83,82,81,80 diff --git a/dockers/docker-saiserver-cavm/profile.ini b/dockers/docker-saiserver-cavm/profile.ini new file mode 100644 index 000000000000..2b85ae77ebef --- /dev/null +++ b/dockers/docker-saiserver-cavm/profile.ini @@ -0,0 +1,4 @@ +#SKU_128X10 +mode=0 + +hwId=as7512 diff --git a/dockers/docker-saiserver-cavm/start.sh b/dockers/docker-saiserver-cavm/start.sh new file mode 100755 index 000000000000..8d683c0a016a --- /dev/null +++ b/dockers/docker-saiserver-cavm/start.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +function clean_up { + service rsyslog stop +} + +trap clean_up SIGTERM SIGKILL + +service rsyslog start + +/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini From b9c624520ed8c32709ed1e9362d616a10024a592 Mon Sep 17 00:00:00 2001 From: Min Yao Date: Sat, 4 Mar 2017 18:17:38 +0800 Subject: [PATCH 0346/1011] Support centec platform (#376) --- .../E582-48x6q/port_config.ini | 33 + .../E582-48x6q/sai.profile | 1 + .../x86_64-centec_e582_48x6q-r0/minigraph.xml | 1049 +++++++++++++++++ .../ES6428A-X48Q2H4/port_config.ini | 33 + .../ES6428A-X48Q2H4/sai.profile | 1 + .../x86_64-ew_es6220_x48q2h4-r0/minigraph.xml | 1049 +++++++++++++++++ dockers/docker-orchagent-centec | 1 + .../platforms/x86_64-centec_e582_48x6q-r0 | 1 + .../platforms/x86_64-ew_es6220_x48q2h4-r0 | 1 + platform/centec/docker-orchagent-centec.mk | 16 + platform/centec/docker-syncd-centec.mk | 15 + .../centec/docker-syncd-centec/Dockerfile.j2 | 29 + platform/centec/docker-syncd-centec/start.sh | 14 + platform/centec/one-image.mk | 8 + platform/centec/platform.conf | 0 platform/centec/rules.mk | 13 + platform/centec/sai.mk | 5 + platform/centec/sdk.mk | 4 + 18 files changed, 2273 insertions(+) create mode 100644 device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/port_config.ini create mode 100644 device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/sai.profile create mode 100644 device/centec/x86_64-centec_e582_48x6q-r0/minigraph.xml create mode 100644 device/centec/x86_64-ew_es6220_x48q2h4-r0/ES6428A-X48Q2H4/port_config.ini create mode 100644 device/centec/x86_64-ew_es6220_x48q2h4-r0/ES6428A-X48Q2H4/sai.profile create mode 100644 device/centec/x86_64-ew_es6220_x48q2h4-r0/minigraph.xml create mode 120000 dockers/docker-orchagent-centec create mode 100644 installer/x86_64/platforms/x86_64-centec_e582_48x6q-r0 create mode 100644 installer/x86_64/platforms/x86_64-ew_es6220_x48q2h4-r0 create mode 100644 platform/centec/docker-orchagent-centec.mk create mode 100644 platform/centec/docker-syncd-centec.mk create mode 100755 platform/centec/docker-syncd-centec/Dockerfile.j2 create mode 100755 platform/centec/docker-syncd-centec/start.sh create mode 100644 platform/centec/one-image.mk create mode 100644 platform/centec/platform.conf create mode 100644 platform/centec/rules.mk create mode 100644 platform/centec/sai.mk create mode 100644 platform/centec/sdk.mk diff --git a/device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/port_config.ini b/device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/port_config.ini new file mode 100644 index 000000000000..b9a831f22e8d --- /dev/null +++ b/device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/port_config.ini @@ -0,0 +1,33 @@ +# name lanes +Ethernet0 1 +Ethernet4 2 +Ethernet8 3 +Ethernet12 4 +Ethernet16 5 +Ethernet20 6 +Ethernet24 7 +Ethernet28 8 +Ethernet32 9 +Ethernet36 10 +Ethernet40 11 +Ethernet44 12 +Ethernet48 13 +Ethernet52 14 +Ethernet56 15 +Ethernet60 16 +Ethernet64 17 +Ethernet68 18 +Ethernet72 19 +Ethernet76 20 +Ethernet80 21 +Ethernet84 22 +Ethernet88 23 +Ethernet92 24 +Ethernet96 25 +Ethernet100 26 +Ethernet104 27 +Ethernet108 28 +Ethernet112 29 +Ethernet116 30 +Ethernet120 31 +Ethernet124 32 diff --git a/device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/sai.profile b/device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/sai.profile new file mode 100644 index 000000000000..2eb3ce5f612b --- /dev/null +++ b/device/centec/x86_64-centec_e582_48x6q-r0/E582-48x6q/sai.profile @@ -0,0 +1 @@ +BOARD_CONFIG_FILE_PATH=/etc/centec/E582-48x6q.json diff --git a/device/centec/x86_64-centec_e582_48x6q-r0/minigraph.xml b/device/centec/x86_64-centec_e582_48x6q-r0/minigraph.xml new file mode 100644 index 000000000000..fd35742353c9 --- /dev/null +++ b/device/centec/x86_64-centec_e582_48x6q-r0/minigraph.xml @@ -0,0 +1,1049 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet60 + 10.0.0.30/31 + + + + Ethernet64 + 10.0.0.32/31 + + + + Ethernet68 + 10.0.0.34/31 + + + + Ethernet72 + 10.0.0.36/31 + + + + Ethernet76 + 10.0.0.38/31 + + + + Ethernet80 + 10.0.0.40/31 + + + + Ethernet84 + 10.0.0.42/31 + + + + Ethernet88 + 10.0.0.44/31 + + + + Ethernet92 + 10.0.0.46/31 + + + + Ethernet96 + 10.0.0.48/31 + + + + Ethernet100 + 10.0.0.50/31 + + + + Ethernet104 + 10.0.0.52/31 + + + + Ethernet108 + 10.0.0.54/31 + + + + Ethernet112 + 10.0.0.56/31 + + + + Ethernet116 + 10.0.0.58/31 + + + + Ethernet120 + 10.0.0.60/31 + + + + Ethernet124 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet60 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet64 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet68 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet72 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet76 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet80 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet84 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet88 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet92 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet96 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet100 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet104 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet108 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet112 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet116 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet120 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet124 + ARISTA16T0 + Ethernet1 + + + + + switch1 + E582-48x6q + + + + switch1 + E582-48x6q +
diff --git a/device/centec/x86_64-ew_es6220_x48q2h4-r0/ES6428A-X48Q2H4/port_config.ini b/device/centec/x86_64-ew_es6220_x48q2h4-r0/ES6428A-X48Q2H4/port_config.ini new file mode 100644 index 000000000000..b9a831f22e8d --- /dev/null +++ b/device/centec/x86_64-ew_es6220_x48q2h4-r0/ES6428A-X48Q2H4/port_config.ini @@ -0,0 +1,33 @@ +# name lanes +Ethernet0 1 +Ethernet4 2 +Ethernet8 3 +Ethernet12 4 +Ethernet16 5 +Ethernet20 6 +Ethernet24 7 +Ethernet28 8 +Ethernet32 9 +Ethernet36 10 +Ethernet40 11 +Ethernet44 12 +Ethernet48 13 +Ethernet52 14 +Ethernet56 15 +Ethernet60 16 +Ethernet64 17 +Ethernet68 18 +Ethernet72 19 +Ethernet76 20 +Ethernet80 21 +Ethernet84 22 +Ethernet88 23 +Ethernet92 24 +Ethernet96 25 +Ethernet100 26 +Ethernet104 27 +Ethernet108 28 +Ethernet112 29 +Ethernet116 30 +Ethernet120 31 +Ethernet124 32 diff --git a/device/centec/x86_64-ew_es6220_x48q2h4-r0/ES6428A-X48Q2H4/sai.profile b/device/centec/x86_64-ew_es6220_x48q2h4-r0/ES6428A-X48Q2H4/sai.profile new file mode 100644 index 000000000000..6a5af192a2b7 --- /dev/null +++ b/device/centec/x86_64-ew_es6220_x48q2h4-r0/ES6428A-X48Q2H4/sai.profile @@ -0,0 +1 @@ +BOARD_CONFIG_FILE_PATH=/etc/centec/ES6428A-X48Q2H4.json diff --git a/device/centec/x86_64-ew_es6220_x48q2h4-r0/minigraph.xml b/device/centec/x86_64-ew_es6220_x48q2h4-r0/minigraph.xml new file mode 100644 index 000000000000..03be9a51b7c1 --- /dev/null +++ b/device/centec/x86_64-ew_es6220_x48q2h4-r0/minigraph.xml @@ -0,0 +1,1049 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet60 + 10.0.0.30/31 + + + + Ethernet64 + 10.0.0.32/31 + + + + Ethernet68 + 10.0.0.34/31 + + + + Ethernet72 + 10.0.0.36/31 + + + + Ethernet76 + 10.0.0.38/31 + + + + Ethernet80 + 10.0.0.40/31 + + + + Ethernet84 + 10.0.0.42/31 + + + + Ethernet88 + 10.0.0.44/31 + + + + Ethernet92 + 10.0.0.46/31 + + + + Ethernet96 + 10.0.0.48/31 + + + + Ethernet100 + 10.0.0.50/31 + + + + Ethernet104 + 10.0.0.52/31 + + + + Ethernet108 + 10.0.0.54/31 + + + + Ethernet112 + 10.0.0.56/31 + + + + Ethernet116 + 10.0.0.58/31 + + + + Ethernet120 + 10.0.0.60/31 + + + + Ethernet124 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet60 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet64 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet68 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet72 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet76 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet80 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet84 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet88 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet92 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet96 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet100 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet104 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet108 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet112 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet116 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet120 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet124 + ARISTA16T0 + Ethernet1 + + + + + switch1 + ES6428A-X48Q2H4 + + + + switch1 + ES6428A-X48Q2H4 +
diff --git a/dockers/docker-orchagent-centec b/dockers/docker-orchagent-centec new file mode 120000 index 000000000000..8d52609c56e5 --- /dev/null +++ b/dockers/docker-orchagent-centec @@ -0,0 +1 @@ +docker-orchagent \ No newline at end of file diff --git a/installer/x86_64/platforms/x86_64-centec_e582_48x6q-r0 b/installer/x86_64/platforms/x86_64-centec_e582_48x6q-r0 new file mode 100644 index 000000000000..5e62742c11bf --- /dev/null +++ b/installer/x86_64/platforms/x86_64-centec_e582_48x6q-r0 @@ -0,0 +1 @@ +CONSOLE_SPEED=115200 diff --git a/installer/x86_64/platforms/x86_64-ew_es6220_x48q2h4-r0 b/installer/x86_64/platforms/x86_64-ew_es6220_x48q2h4-r0 new file mode 100644 index 000000000000..5e62742c11bf --- /dev/null +++ b/installer/x86_64/platforms/x86_64-ew_es6220_x48q2h4-r0 @@ -0,0 +1 @@ +CONSOLE_SPEED=115200 diff --git a/platform/centec/docker-orchagent-centec.mk b/platform/centec/docker-orchagent-centec.mk new file mode 100644 index 000000000000..86b214cdcb85 --- /dev/null +++ b/platform/centec/docker-orchagent-centec.mk @@ -0,0 +1,16 @@ +# docker image for orchagent + +DOCKER_ORCHAGENT_CENTEC = docker-orchagent-centec.gz +$(DOCKER_ORCHAGENT_CENTEC)_PATH = $(DOCKERS_PATH)/docker-orchagent +$(DOCKER_ORCHAGENT_CENTEC)_DEPENDS += $(SWSS) $(REDIS_TOOLS) +$(DOCKER_ORCHAGENT_CENTEC)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) +SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_CENTEC) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_CENTEC) + +$(DOCKER_ORCHAGENT_CENTEC)_CONTAINER_NAME = swss +$(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += --net=host --privileged -t +$(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += --volumes-from database +$(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro +$(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro +$(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /host/machine.conf:/host/machine.conf +$(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/centec/docker-syncd-centec.mk b/platform/centec/docker-syncd-centec.mk new file mode 100644 index 000000000000..2c2cec179852 --- /dev/null +++ b/platform/centec/docker-syncd-centec.mk @@ -0,0 +1,15 @@ +# docker image for centec syncd + +DOCKER_SYNCD_CENTEC = docker-syncd-centec.gz +$(DOCKER_SYNCD_CENTEC)_PATH = $(PLATFORM_PATH)/docker-syncd-centec +$(DOCKER_SYNCD_CENTEC)_DEPENDS += $(SYNCD) +$(DOCKER_SYNCD_CENTEC)_LOAD_DOCKERS += $(DOCKER_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CENTEC) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_CENTEC) + +$(DOCKER_SYNCD_CENTEC)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_CENTEC)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_CENTEC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_CENTEC)_RUN_OPT += -v /var/run/docker-syncd:/var/run/sswsyncd +$(DOCKER_SYNCD_CENTEC)_RUN_OPT += --volumes-from database +$(DOCKER_SYNCD_CENTEC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/centec/docker-syncd-centec/Dockerfile.j2 b/platform/centec/docker-syncd-centec/Dockerfile.j2 new file mode 100755 index 000000000000..617143215a4d --- /dev/null +++ b/platform/centec/docker-syncd-centec/Dockerfile.j2 @@ -0,0 +1,29 @@ +FROM docker-base + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update + +COPY \ +{% for deb in docker_syncd_centec_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -i \ +{% for deb in docker_syncd_centec_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +## TODO: add kmod into Depends +RUN apt-get install -f kmod + +COPY ["start.sh", "/usr/bin/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/platform/centec/docker-syncd-centec/start.sh b/platform/centec/docker-syncd-centec/start.sh new file mode 100755 index 000000000000..3e5b941a7658 --- /dev/null +++ b/platform/centec/docker-syncd-centec/start.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +function clean_up { + service syncd stop + service rsyslog stop + exit +} + +trap clean_up SIGTERM SIGKILL + +service rsyslog start +service syncd start + +read diff --git a/platform/centec/one-image.mk b/platform/centec/one-image.mk new file mode 100644 index 000000000000..49c27aea4261 --- /dev/null +++ b/platform/centec/one-image.mk @@ -0,0 +1,8 @@ +# sonic centec one image installer + +SONIC_ONE_IMAGE = sonic-centec.bin +$(SONIC_ONE_IMAGE)_MACHINE = centec +$(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie +$(SONIC_ONE_IMAGE)_DEPENDS += $(CENTEC_SDK_KERNEL) +$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/centec/platform.conf b/platform/centec/platform.conf new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/centec/rules.mk b/platform/centec/rules.mk new file mode 100644 index 000000000000..d8c3568f0cc0 --- /dev/null +++ b/platform/centec/rules.mk @@ -0,0 +1,13 @@ +include $(PLATFORM_PATH)/sdk.mk +include $(PLATFORM_PATH)/sai.mk +include $(PLATFORM_PATH)/docker-orchagent-centec.mk +include $(PLATFORM_PATH)/docker-syncd-centec.mk +include $(PLATFORM_PATH)/one-image.mk + +SONIC_ALL += $(SONIC_ONE_IMAGE) + +# Inject centec sai into sairedis +$(LIBSAIREDIS)_DEPENDS += $(CENTEC_SAI) + +# Runtime dependency on centec sai is set only for syncd +$(SYNCD)_RDEPENDS += $(CENTEC_SAI) diff --git a/platform/centec/sai.mk b/platform/centec/sai.mk new file mode 100644 index 000000000000..de8615ac132c --- /dev/null +++ b/platform/centec/sai.mk @@ -0,0 +1,5 @@ +# Centec SAI +CENTEC_SAI = libsai_1.0.0_amd64.deb +$(CENTEC_SAI)_URL = https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/SONiC_0.9.4/libsai_1.0.0_amd64.deb + +SONIC_ONLINE_DEBS += $(CENTEC_SAI) diff --git a/platform/centec/sdk.mk b/platform/centec/sdk.mk new file mode 100644 index 000000000000..1b52dcffe64d --- /dev/null +++ b/platform/centec/sdk.mk @@ -0,0 +1,4 @@ +CENTEC_SDK_KERNEL = centec-gg-sdk3.5-modules-3.16.36-1-amd64.deb +$(CENTEC_SDK_KERNEL)_URL = "https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/centec-gg-sdk3.5-modules-3.16.36-1-amd64.deb" + +SONIC_ONLINE_DEBS += $(CENTEC_SDK_KERNEL) From 32e4655b3c096132da064cb401ba6a47e9b3d21f Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 4 Mar 2017 10:11:20 -0800 Subject: [PATCH 0347/1011] Update build instruction for broadcom platform --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b4230b3d6582..eb59a9b25211 100644 --- a/README.md +++ b/README.md @@ -30,21 +30,30 @@ You also need to change all git paths to relative path as we build all submodule ## Usage -To build NOS installer image and docker images, run the following commands: +To build SONiC installer image and docker images, run the following commands: make configure PLATFORM=[ASIC_VENDOR] make **NOTE**: We recommend reserving 50G free space to build one platform. -Supported PLATFORM are: +The SONIiC installer contains all docker images needed. SONiC use one image for all switches devices of a same ASIC vendor. The supported ASIC vendors are: + - PLATFORM=broadcom - PLATFORM=marvell (*pending*) - PLATFORM=mellanox - PLATFORM=cavium -- PLATFORM=centec (*pending*) +- PLATFORM=centec - PLATFORM=p4 +For Broadcom ASIC, we build ONIE and EOS image. EOS image is used for Arista devices, ONIE image is used for all other Broadcom ASIC based devices. + + make configure PLATFORM=broadcom + # build ONIE image + make target/sonic-broadcom.bin + # build EOS image + make target/sonic-aboot-broadcom.swi + You may find the rules/config file useful. It contains configuration options for the build process, like adding more verbosity or showing dependencies, username and password for base image etc. Every docker image is built and saved to target/ directory. From 7069cefc905700c41bb9e2076f93874f1d51c1b0 Mon Sep 17 00:00:00 2001 From: Lihua Yuan Date: Sat, 4 Mar 2017 13:48:36 -0800 Subject: [PATCH 0348/1011] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index eb59a9b25211..47f9b25e6e58 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,9 @@ P4: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buil ## Build SONiC Switch Images -# Description -Build an [Open Network Install Environment (ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also build docker images running inside the NOS. +# Description + +Following is the instruction on how to build an [(ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also how to build docker images running inside the NOS. Note that SONiC image are build per ASIC platform. Switches using the same ASIC platform share a common image. For a list of supported switches and ASIC, please refer to this [document](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all). # Prerequisites From 6cb5925d819753f99a75d88292aedda5d5255537 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 4 Mar 2017 18:02:15 -0800 Subject: [PATCH 0349/1011] [sairedis]: update syncd init to support centec asic (#379) --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 22ea540f50dc..426589a7f6be 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 22ea540f50dc05b6320b0f00f769bc5be0b2a9d3 +Subproject commit 426589a7f6be8f021207734fd277882eb051fc5f From 45e5c147294f1ee3366e2fb002236068fa421bcb Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 5 Mar 2017 09:46:46 -0800 Subject: [PATCH 0350/1011] add badge for centec --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 47f9b25e6e58..9b9ed723e1f7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ Broadcom: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) Cavium: [![Cavium](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) +Centec: [![Centec](https://sonic-jenkins.westus.cloudapp.azure.com/job/centec/job/buildimage-centec-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/centec/job/buildimage-centec-all/) Mellanox: [![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) P4: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all) From 5dafa907b203a906fb452e2420036edc9a5222e9 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 6 Mar 2017 12:22:42 -0800 Subject: [PATCH 0351/1011] [dockers]: Add base image files to syncd-brcm, database and teamd (#380) --- dockers/docker-database/base_image_files/redis-cli | 4 ++++ dockers/docker-teamd/base_image_files/teamdctl | 4 ++++ platform/broadcom/docker-syncd-brcm.mk | 3 +++ platform/broadcom/docker-syncd-brcm/base_image_files/bcmcmd | 4 ++++ rules/docker-database.mk | 2 ++ rules/docker-teamd.mk | 3 +++ 6 files changed, 20 insertions(+) create mode 100755 dockers/docker-database/base_image_files/redis-cli create mode 100755 dockers/docker-teamd/base_image_files/teamdctl create mode 100755 platform/broadcom/docker-syncd-brcm/base_image_files/bcmcmd diff --git a/dockers/docker-database/base_image_files/redis-cli b/dockers/docker-database/base_image_files/redis-cli new file mode 100755 index 000000000000..646992f65abd --- /dev/null +++ b/dockers/docker-database/base_image_files/redis-cli @@ -0,0 +1,4 @@ +#!/bin/bash + +docker exec -it database redis-cli "$@" + diff --git a/dockers/docker-teamd/base_image_files/teamdctl b/dockers/docker-teamd/base_image_files/teamdctl new file mode 100755 index 000000000000..c7f59d321454 --- /dev/null +++ b/dockers/docker-teamd/base_image_files/teamdctl @@ -0,0 +1,4 @@ +#!/bin/bash + +docker exec -i teamd teamdctl "$@" + diff --git a/platform/broadcom/docker-syncd-brcm.mk b/platform/broadcom/docker-syncd-brcm.mk index b1353cc2f866..1e5e7a34adb8 100644 --- a/platform/broadcom/docker-syncd-brcm.mk +++ b/platform/broadcom/docker-syncd-brcm.mk @@ -14,3 +14,6 @@ $(DOCKER_SYNCD_BRCM)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf $(DOCKER_SYNCD_BRCM)_RUN_OPT += -v /var/run/docker-syncd:/var/run/sswsyncd $(DOCKER_SYNCD_BRCM)_RUN_OPT += --volumes-from database $(DOCKER_SYNCD_BRCM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +$(DOCKER_SYNCD_BRCM)_BASE_IMAGE_FILES += bcmcmd:/usr/bin/bcmcmd + diff --git a/platform/broadcom/docker-syncd-brcm/base_image_files/bcmcmd b/platform/broadcom/docker-syncd-brcm/base_image_files/bcmcmd new file mode 100755 index 000000000000..ee87a93cdf6e --- /dev/null +++ b/platform/broadcom/docker-syncd-brcm/base_image_files/bcmcmd @@ -0,0 +1,4 @@ +#!/bin/bash + +docker exec -i syncd bcmcmd "$@" + diff --git a/rules/docker-database.mk b/rules/docker-database.mk index 168164a02636..9a8004038150 100644 --- a/rules/docker-database.mk +++ b/rules/docker-database.mk @@ -11,3 +11,5 @@ $(DOCKER_DATABASE)_CONTAINER_NAME = database $(DOCKER_DATABASE)_RUN_OPT += --net=host --privileged -t $(DOCKER_DATABASE)_RUN_OPT += -v /var/run/redis +$(DOCKER_DATABASE)_BASE_IMAGE_FILES += redis-cli:/usr/bin/redis-cli + diff --git a/rules/docker-teamd.mk b/rules/docker-teamd.mk index cc97e24fe4ab..932e2aee0fa7 100644 --- a/rules/docker-teamd.mk +++ b/rules/docker-teamd.mk @@ -11,3 +11,6 @@ $(DOCKER_TEAMD)_CONTAINER_NAME = teamd $(DOCKER_TEAMD)_RUN_OPT += --net=host --privileged -t $(DOCKER_TEAMD)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_TEAMD)_RUN_OPT += --volumes-from database + +$(DOCKER_TEAMD)_BASE_IMAGE_FILES += teamdctl:/usr/bin/teamdctl + From bd6bf1ff9a425b729294db89ffe7a6b04bda3973 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 6 Mar 2017 12:41:26 -0800 Subject: [PATCH 0352/1011] [config] [oneimage & dhcp relay docker] Move ntp, rsyslog, and dhcp server information into minigraph (#374) Move DHCP, rsyslog, and NTP server information into minigraph * Fix dhcp relay template according to CR --- .../x86_64-accton_as7512_32x-r0/minigraph.xml | 25 ++++++++++++++ .../x86_64-arista_7050_qx32/minigraph.xml | 25 ++++++++++++++ .../x86_64-arista_7060_cx32s/minigraph.xml | 25 ++++++++++++++ .../x86_64-dell_s6000_s1220-r0/minigraph.xml | 25 ++++++++++++++ .../x86_64-dell_s6100_c2538-r0/minigraph.xml | 25 ++++++++++++++ .../x86_64-dell_z9100_c2538-r0/minigraph.xml | 25 ++++++++++++++ .../x86_64-ingrasys_s9100-r0/minigraph.xml | 33 ++++++++++++++++++- .../x86_64-mlnx_msn2700-r0/minigraph.xml | 25 ++++++++++++++ dockers/docker-dhcp-relay/config.sh | 2 +- dockers/docker-dhcp-relay/isc-dhcp-relay.j2 | 2 +- .../build_templates/sonic_debian_extension.j2 | 2 -- files/image_config/ntp/ntp-config.sh | 2 +- files/image_config/ntp/ntp.yml | 6 ---- files/image_config/rsyslog/rsyslog-config.sh | 2 +- files/image_config/rsyslog/rsyslog.yml | 1 - src/sonic-config-engine/minigraph.py | 27 +++++++++++++++ 16 files changed, 238 insertions(+), 14 deletions(-) delete mode 100644 files/image_config/ntp/ntp.yml delete mode 100644 files/image_config/rsyslog/rsyslog.yml diff --git a/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml b/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml index 42bb951add3a..f2326c44aae3 100644 --- a/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml +++ b/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml @@ -1044,6 +1044,31 @@ + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + switch1 AS7512 diff --git a/device/arista/x86_64-arista_7050_qx32/minigraph.xml b/device/arista/x86_64-arista_7050_qx32/minigraph.xml index 26bf46132a25..f2ef7b0b8bc2 100644 --- a/device/arista/x86_64-arista_7050_qx32/minigraph.xml +++ b/device/arista/x86_64-arista_7050_qx32/minigraph.xml @@ -1044,6 +1044,31 @@ + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + switch1 Arista-7050-QX32 diff --git a/device/arista/x86_64-arista_7060_cx32s/minigraph.xml b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml index 3fcd713cbc79..5d7dcea980ff 100644 --- a/device/arista/x86_64-arista_7060_cx32s/minigraph.xml +++ b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml @@ -1044,6 +1044,31 @@ + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + switch1 Arista-7060-CX32S diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml b/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml index 436f6880da4f..0fd1f49ab868 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml +++ b/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml @@ -1044,6 +1044,31 @@ + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + switch1 Force10-S6000 diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml b/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml index e07ec53e18e9..3ae8e77f8024 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml +++ b/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml @@ -739,6 +739,31 @@ + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + switch1 Force10-S6100 diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml b/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml index 44cffcdd4378..ab1ce20a69a8 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml +++ b/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml @@ -1044,6 +1044,31 @@ + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + switch1 Force10-Z9100 diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml index c67990fc7305..154c1847eb20 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml @@ -109,7 +109,38 @@ Ethernet4 - + + + OCPSCH01040GGLF + ingrasys-s9100 + + + + + + + OCPSCH01040GGLF + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + OCPSCH01040GGLF ingrasys-s9100 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml b/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml index 0fa570c7a0a8..4942e64be5e9 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml @@ -1044,6 +1044,31 @@ ` + + + + switch2 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + switch2 ACS-MSN2700 diff --git a/dockers/docker-dhcp-relay/config.sh b/dockers/docker-dhcp-relay/config.sh index f0a861cfb997..99df251572d5 100755 --- a/dockers/docker-dhcp-relay/config.sh +++ b/dockers/docker-dhcp-relay/config.sh @@ -1,4 +1,4 @@ #!/bin/bash -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/dhcp_relay.yml -t /usr/share/sonic/templates/isc-dhcp-relay.j2 > /etc/default/isc-dhcp-relay +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/isc-dhcp-relay.j2 > /etc/default/isc-dhcp-relay diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 index 07df5e1f9a76..812e2bb8e1e4 100644 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 @@ -1,4 +1,4 @@ -SERVERS="{{ dhcp_servers }}" +SERVERS="{{ dhcp_servers | join(' ') }}" INTERFACES="{{ minigraph_vlan_interfaces[0]['name'] }}" diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index c84518576f17..5d079ea35c7d 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -83,14 +83,12 @@ sudo cp $IMAGE_CONFIGS/ntp/ntp-config.service $FILESYSTEM_ROOT/etc/systemd/syste sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable ntp-config.service sudo cp $IMAGE_CONFIGS/ntp/ntp-config.sh $FILESYSTEM_ROOT/usr/bin/ sudo cp $IMAGE_CONFIGS/ntp/ntp.conf.j2 $FILESYSTEM_ROOT/usr/share/sonic/templates/ -sudo cp $IMAGE_CONFIGS/ntp/ntp.yml $FILESYSTEM_ROOT/etc/sonic/ # Copy rsyslog configuration files and templates sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog-config.service $FILESYSTEM_ROOT/etc/systemd/system/ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable rsyslog-config.service sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog-config.sh $FILESYSTEM_ROOT/usr/bin/ sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.conf.j2 $FILESYSTEM_ROOT/usr/share/sonic/templates/ -sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.yml $FILESYSTEM_ROOT/etc/sonic/ sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.d/* $FILESYSTEM_ROOT/etc/rsyslog.d/ # Copy interfaces configuration files and templates diff --git a/files/image_config/ntp/ntp-config.sh b/files/image_config/ntp/ntp-config.sh index 55a048a71328..2465058ba021 100755 --- a/files/image_config/ntp/ntp-config.sh +++ b/files/image_config/ntp/ntp-config.sh @@ -1,3 +1,3 @@ #!/bin/bash -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/ntp.yml -t /usr/share/sonic/templates/ntp.conf.j2 >/etc/ntp.conf +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/ntp.conf.j2 >/etc/ntp.conf diff --git a/files/image_config/ntp/ntp.yml b/files/image_config/ntp/ntp.yml deleted file mode 100644 index efb3a5272fcc..000000000000 --- a/files/image_config/ntp/ntp.yml +++ /dev/null @@ -1,6 +0,0 @@ -ntp_servers: - - 0.debian.pool.ntp.org - - 1.debian.pool.ntp.org - - 2.debian.pool.ntp.org - - 3.debian.pool.ntp.org - diff --git a/files/image_config/rsyslog/rsyslog-config.sh b/files/image_config/rsyslog/rsyslog-config.sh index 8c14b9adce9f..044888029686 100755 --- a/files/image_config/rsyslog/rsyslog-config.sh +++ b/files/image_config/rsyslog/rsyslog-config.sh @@ -1,3 +1,3 @@ #!/bin/bash -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/rsyslog.yml -t /usr/share/sonic/templates/rsyslog.conf.j2 >/etc/rsyslog.conf +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/rsyslog.conf.j2 >/etc/rsyslog.conf diff --git a/files/image_config/rsyslog/rsyslog.yml b/files/image_config/rsyslog/rsyslog.yml deleted file mode 100644 index 006271123b9d..000000000000 --- a/files/image_config/rsyslog/rsyslog.yml +++ /dev/null @@ -1 +0,0 @@ -syslog_servers: [] diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index aece9dee8a50..afd4538f1346 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -266,6 +266,25 @@ def parse_cpg(cpg, hname): return bgp_sessions, myasn +def parse_meta(meta, hname): + syslog_servers = [] + dhcp_servers = [] + ntp_servers = [] + 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: + properties = device.find(str(QName(ns1, "Properties"))) + for device_property in properties.findall(str(QName(ns1, "DeviceProperty"))): + name = device_property.find(str(QName(ns1, "Name"))).text + value = device_property.find(str(QName(ns1, "Value"))).text + value_group = value.split(';') if value and value != "" else [] + if name == "DhcpResources": + dhcp_servers = value_group + elif name == "NtpResources": + ntp_servers = value_group + elif name == "SyslogResources": + syslog_servers = value_group + return syslog_servers, dhcp_servers, ntp_servers def get_console_info(devices, dev, port): for k, v in devices.items(): @@ -340,6 +359,9 @@ def parse_xml(filename, platform=None): neighbors = None devices = None hostname = None + syslog_servers = [] + dhcp_servers = [] + ntp_servers = [] hwsku_qn = QName(ns, "HwSku") hostname_qn = QName(ns, "Hostname") @@ -363,6 +385,8 @@ def parse_xml(filename, platform=None): (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) = parse_meta(child, hostname) Tree = lambda: defaultdict(Tree) @@ -389,6 +413,9 @@ def parse_xml(filename, platform=None): results['minigraph_mgmt'] = get_mgmt_info(devices, mgmt_dev, mgmt_port) results['minigraph_hostname'] = hostname results['inventory_hostname'] = hostname + results['syslog_servers'] = syslog_servers + results['dhcp_servers'] = dhcp_servers + results['ntp_servers'] = ntp_servers results['alias_map'] = alias_map_list return results From 1491bf9eaed494478185dbc6f965676fe2a2d5c7 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 7 Mar 2017 02:28:50 -0800 Subject: [PATCH 0353/1011] [src]: Update sonic-snmpagent submodule (#382) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index a3391a9c709a..c38cc59c14e3 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit a3391a9c709a1160dd7d261ac1da2013127c3d45 +Subproject commit c38cc59c14e383c2100ce996935ebc3d8c0c2c05 From 7548c36d7792f6b090cdcc135cb89c1075d4c74d Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 7 Mar 2017 12:32:39 -0800 Subject: [PATCH 0354/1011] [build]: set build jobs to 1 by default (#383) --- rules/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/config b/rules/config index be8b7a9d77fb..d016288e4776 100644 --- a/rules/config +++ b/rules/config @@ -18,7 +18,7 @@ # SONIC_CONFIG_BUILD_JOBS - set number of jobs for parallel build. # Corresponding -j argument will be passed to make command inside docker # container. -SONIC_CONFIG_BUILD_JOBS = $(shell nproc) +SONIC_CONFIG_BUILD_JOBS = 1 # SONIC_CONFIG_LOG_TO_FILES - print output from execution of rule for each # target into separate log file under target/log/. From fcffbb3ce69df0623f0b4ec92c4da552bf696f47 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 7 Mar 2017 22:34:24 +0200 Subject: [PATCH 0355/1011] [slave.mk]: Add installer to clean targets. (#384) Signed-off-by: marian-pritsak --- slave.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/slave.mk b/slave.mk index 456b73ec4680..ef4cf58924dc 100644 --- a/slave.mk +++ b/slave.mk @@ -366,7 +366,8 @@ $(SONIC_CLEAN_DEBS) : $(DEBS_PATH)/%-clean : .platform $$(addsuffix -clean,$$(ad SONIC_CLEAN_TARGETS += $(addsuffix -clean,$(addprefix $(TARGET_PATH)/, \ $(SONIC_DOCKER_IMAGES) \ - $(SONIC_SIMPLE_DOCKER_IMAGES))) + $(SONIC_SIMPLE_DOCKER_IMAGES) \ + $(SONIC_INSTALLERS))) $(SONIC_CLEAN_TARGETS) : $(TARGET_PATH)/%-clean : .platform @rm -f $(TARGET_PATH)/$* From 4c656824783b26c4202689f085576b915d353302 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 8 Mar 2017 09:00:58 +0200 Subject: [PATCH 0356/1011] [orchagent]: Add swssloglevel shortcut in base image (#386) Signed-off-by: marian-pritsak --- dockers/docker-orchagent/base_image_files/swssloglevel | 2 ++ platform/broadcom/docker-orchagent-brcm.mk | 2 ++ platform/cavium/docker-orchagent-cavm.mk | 2 ++ platform/centec/docker-orchagent-centec.mk | 2 ++ platform/mellanox/docker-orchagent-mlnx.mk | 2 ++ 5 files changed, 10 insertions(+) create mode 100755 dockers/docker-orchagent/base_image_files/swssloglevel diff --git a/dockers/docker-orchagent/base_image_files/swssloglevel b/dockers/docker-orchagent/base_image_files/swssloglevel new file mode 100755 index 000000000000..9282470c2645 --- /dev/null +++ b/dockers/docker-orchagent/base_image_files/swssloglevel @@ -0,0 +1,2 @@ +#!/bin/bash +docker exec -i swss swssloglevel "$@" diff --git a/platform/broadcom/docker-orchagent-brcm.mk b/platform/broadcom/docker-orchagent-brcm.mk index 2278d89cb832..e49b67c2c2cc 100644 --- a/platform/broadcom/docker-orchagent-brcm.mk +++ b/platform/broadcom/docker-orchagent-brcm.mk @@ -14,3 +14,5 @@ $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/network/interfaces:/etc/network/inte $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +$(DOCKER_ORCHAGENT_BRCM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel diff --git a/platform/cavium/docker-orchagent-cavm.mk b/platform/cavium/docker-orchagent-cavm.mk index d9460d1c88db..8130ca8dc1cb 100644 --- a/platform/cavium/docker-orchagent-cavm.mk +++ b/platform/cavium/docker-orchagent-cavm.mk @@ -14,3 +14,5 @@ $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/network/interfaces:/etc/network/inte $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +$(DOCKER_ORCHAGENT_CAVM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel diff --git a/platform/centec/docker-orchagent-centec.mk b/platform/centec/docker-orchagent-centec.mk index 86b214cdcb85..0613fb510de3 100644 --- a/platform/centec/docker-orchagent-centec.mk +++ b/platform/centec/docker-orchagent-centec.mk @@ -14,3 +14,5 @@ $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/network/interfaces:/etc/network/in $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +$(DOCKER_ORCHAGENT_CENTEC)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel diff --git a/platform/mellanox/docker-orchagent-mlnx.mk b/platform/mellanox/docker-orchagent-mlnx.mk index c193a7754185..505804fb8c17 100644 --- a/platform/mellanox/docker-orchagent-mlnx.mk +++ b/platform/mellanox/docker-orchagent-mlnx.mk @@ -14,3 +14,5 @@ $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/network/interfaces:/etc/network/inte $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +$(DOCKER_ORCHAGENT_MLNX)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel From 0fbbb2be415ece58ada449dcbaa735b08bcb3cf0 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 8 Mar 2017 09:11:42 +0200 Subject: [PATCH 0357/1011] [slave.mk]: add procmail to sonic-slave. (#385) Needed for lockfile utility. Signed-off-by: marian-pritsak --- sonic-slave/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index f1d68c680cb8..dd9838e83800 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -92,6 +92,9 @@ RUN apt-get update && apt-get install -y docutils-common libjs-sphinxdoc libjs-u # For templating RUN pip install j2cli +# For lockfile +RUN apt-get update && apt-get install -y procmail + # Install depot-tools (for git-retry) RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /usr/share/depot_tools ENV PATH /usr/share/depot_tools:$PATH From b9bee5dc92f71aa60c025b5f061f384702184d7f Mon Sep 17 00:00:00 2001 From: kaiyu22 Date: Mon, 13 Mar 2017 23:31:51 +0800 Subject: [PATCH 0358/1011] [platform]: Sync hwsku name with INGRASYS-S9100-C32 (#391) Signed-off-by: Sam Yang yang.kaiyu@gmail.com --- device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml | 4 ++-- .../{ingrasys-s9100 => INGRASYS-S9100-C32}/port_config.ini | 0 .../{ingrasys-s9100 => INGRASYS-S9100-C32}/sensors.conf | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename src/sonic-config-engine/platform/{ingrasys-s9100 => INGRASYS-S9100-C32}/port_config.ini (100%) rename src/sonic-config-engine/platform/{ingrasys-s9100 => INGRASYS-S9100-C32}/sensors.conf (100%) diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml index 154c1847eb20..d56428187aa8 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml @@ -112,7 +112,7 @@ OCPSCH01040GGLF - ingrasys-s9100 + INGRASYS-S9100-C32 @@ -142,5 +142,5 @@ OCPSCH01040GGLF - ingrasys-s9100 + INGRASYS-S9100-C32 diff --git a/src/sonic-config-engine/platform/ingrasys-s9100/port_config.ini b/src/sonic-config-engine/platform/INGRASYS-S9100-C32/port_config.ini similarity index 100% rename from src/sonic-config-engine/platform/ingrasys-s9100/port_config.ini rename to src/sonic-config-engine/platform/INGRASYS-S9100-C32/port_config.ini diff --git a/src/sonic-config-engine/platform/ingrasys-s9100/sensors.conf b/src/sonic-config-engine/platform/INGRASYS-S9100-C32/sensors.conf similarity index 100% rename from src/sonic-config-engine/platform/ingrasys-s9100/sensors.conf rename to src/sonic-config-engine/platform/INGRASYS-S9100-C32/sensors.conf From 567b7901e4de8dcc640631ad61915ecb85d4a196 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 13 Mar 2017 17:37:45 -0700 Subject: [PATCH 0359/1011] Fix OneImage snmp mount (#392) --- rules/docker-lldp-sv2.mk | 1 + rules/docker-snmp-sv2.mk | 1 + 2 files changed, 2 insertions(+) diff --git a/rules/docker-lldp-sv2.mk b/rules/docker-lldp-sv2.mk index d9500d1d077a..d19ca6b35029 100644 --- a/rules/docker-lldp-sv2.mk +++ b/rules/docker-lldp-sv2.mk @@ -11,5 +11,6 @@ SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_LLDP_SV2) $(DOCKER_LLDP_SV2)_CONTAINER_NAME = lldp $(DOCKER_LLDP_SV2)_RUN_OPT += --net=host --privileged -t $(DOCKER_LLDP_SV2)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_LLDP_SV2)_RUN_OPT += --volumes-from database $(DOCKER_LLDP_SV2)_BASE_IMAGE_FILES += lldpctl:/usr/bin/lldpctl diff --git a/rules/docker-snmp-sv2.mk b/rules/docker-snmp-sv2.mk index 95fdcc25775c..60ca007d3f17 100644 --- a/rules/docker-snmp-sv2.mk +++ b/rules/docker-snmp-sv2.mk @@ -12,3 +12,4 @@ SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SNMP_SV2) $(DOCKER_SNMP_SV2)_CONTAINER_NAME = snmp $(DOCKER_SNMP_SV2)_RUN_OPT += --net=host --privileged -t $(DOCKER_SNMP_SV2)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_SNMP_SV2)_RUN_OPT += --volumes-from database From 57196aa92743a8304d602a2764f265e57ad71879 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 14 Mar 2017 18:47:23 -0700 Subject: [PATCH 0360/1011] Update submodules (#394) --- src/sonic-py-swsssdk | 2 +- src/sonic-snmpagent | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index e5cbe0c8b65b..497bdfe64c3d 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit e5cbe0c8b65bcdb1cf35cf05261521dcea0a2e3a +Subproject commit 497bdfe64c3ddc2ce711ec8a2b0839d9d26f5666 diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index c38cc59c14e3..0c14bcc2bb9c 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit c38cc59c14e383c2100ce996935ebc3d8c0c2c05 +Subproject commit 0c14bcc2bb9cb35573ddcae2a23b6640db45fa01 From d3aa07e1de360108bf8c508fa3c47064e0ff82ea Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Tue, 14 Mar 2017 21:03:04 -0700 Subject: [PATCH 0361/1011] Update sonic-utilities submodule (#395) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index cca83512018c..dea6e8000f16 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit cca83512018cd48a193a7f8f3d0676c8053bcc2d +Subproject commit dea6e8000f160b30e962d59adbaaba41744fe7c2 From 831b10ea26952478f8f8168d03adb9e5ab92cc83 Mon Sep 17 00:00:00 2001 From: Min Yao Date: Tue, 14 Mar 2017 21:03:30 -0700 Subject: [PATCH 0362/1011] [Centec] update centec gg sdk3.5 kernel module debian package (#393) --- platform/centec/sdk.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/centec/sdk.mk b/platform/centec/sdk.mk index 1b52dcffe64d..ac1939122f47 100644 --- a/platform/centec/sdk.mk +++ b/platform/centec/sdk.mk @@ -1,4 +1,4 @@ -CENTEC_SDK_KERNEL = centec-gg-sdk3.5-modules-3.16.36-1-amd64.deb -$(CENTEC_SDK_KERNEL)_URL = "https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/centec-gg-sdk3.5-modules-3.16.36-1-amd64.deb" +CENTEC_SDK_KERNEL = centec-gg-sdk3.5-modules-3.16.0-4-amd64.deb +$(CENTEC_SDK_KERNEL)_URL = "https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/centec-gg-sdk3.5-modules-3.16.0-4-amd64.deb" SONIC_ONLINE_DEBS += $(CENTEC_SDK_KERNEL) From 62ddedecdce7fc763084cf54c325b4871f41b36c Mon Sep 17 00:00:00 2001 From: kaiyu22 Date: Thu, 16 Mar 2017 01:55:16 +0800 Subject: [PATCH 0363/1011] [platform]: Updated syncd.conf for INGRASYS-S9100-C32 (#396) Signed-off-by: Sam Yang yang.kaiyu@gmail.com --- .../x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/syncd.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/syncd.conf b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/syncd.conf index 1b197345d308..bd5ba3938842 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/syncd.conf +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/syncd.conf @@ -1 +1 @@ -OPENNSL_CONFIG_POST_INIT_FILE=/etc/bcm/th-ingrasys-s9100-32x100G.soc +export OPENNSL_CONFIG_POST_INIT_FILE=/etc/bcm/th-ingrasys-s9100-32x100G.soc From d7c70665de5fff3afa3f47b6a5f78b82097c3870 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 15 Mar 2017 18:38:55 -0700 Subject: [PATCH 0364/1011] [baseimage]: Add kexec-tools package into the baseimage (#397) * Include kexec-tools package which could be used for fast reboot * Use sudo for sed --- build_debian.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index 85126bf34e89..46cb4bce5259 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -193,7 +193,11 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in pciutils \ iptables-persistent \ logrotate \ - curl + curl \ + kexec-tools + +## Disable kexec supported reboot which was installed by default +sudo sed -i 's/LOAD_KEXEC=true/LOAD_KEXEC=false/' $FILESYSTEM_ROOT/etc/default/kexec ## Remove sshd host keys, and will regenerate on first sshd start sudo rm -f $FILESYSTEM_ROOT/etc/ssh/ssh_host_*_key* From d34cfd04a8d261a7cca5db67ca009ee61195d10c Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 15 Mar 2017 20:14:28 -0700 Subject: [PATCH 0365/1011] [motd]: Lower-case 'i' in title (#398) --- files/image_config/environment/motd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/image_config/environment/motd b/files/image_config/environment/motd index 47e32505aa51..aa96d66ba7c5 100644 --- a/files/image_config/environment/motd +++ b/files/image_config/environment/motd @@ -5,7 +5,7 @@ You are on ___) | |_| | |\ | | |___ |____/ \___/|_| \_|_|\____| --- Software for Open Networking In the Cloud -- +-- Software for Open Networking in the Cloud -- Unauthorized access and/or use are prohibited. All access and/or use are subject to monitoring. From 096690e6262ccbe2b623dcd3b9aa98be0ac2dcc2 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 16 Mar 2017 09:28:14 -0700 Subject: [PATCH 0366/1011] [snmpagent]: update sonic-snmpagent submodule (#402) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 0c14bcc2bb9c..c1b22019810c 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 0c14bcc2bb9cb35573ddcae2a23b6640db45fa01 +Subproject commit c1b22019810c0c6bf3516f5def320e1c84ca7e12 From d6bfa505b31d67ec2c6e869fb5330440c0493df4 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 16 Mar 2017 10:40:33 -0700 Subject: [PATCH 0367/1011] Wait for VLAN interface to come up before starting DHCP relay (#399) --- dockers/docker-dhcp-relay/Dockerfile | 7 ++++--- dockers/docker-dhcp-relay/start.sh | 12 ++++++++++++ files/build_templates/dhcp_relay.service.j2 | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100755 dockers/docker-dhcp-relay/start.sh diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile index fbdabe333e6e..5c9ee3fb643b 100644 --- a/dockers/docker-dhcp-relay/Dockerfile +++ b/dockers/docker-dhcp-relay/Dockerfile @@ -15,8 +15,9 @@ RUN rm -rf /debs COPY ["isc-dhcp-relay.j2", "/usr/share/sonic/templates/"] COPY ["config.sh", "/usr/bin/"] +COPY ["start.sh", "/usr/bin/"] -ENTRYPOINT /usr/bin/config.sh \ - && service rsyslog start \ - && service isc-dhcp-relay start \ +ENTRYPOINT /usr/bin/config.sh \ + && service rsyslog start \ + && /usr/bin/start.sh \ && /bin/bash diff --git a/dockers/docker-dhcp-relay/start.sh b/dockers/docker-dhcp-relay/start.sh new file mode 100755 index 000000000000..05a7693268dc --- /dev/null +++ b/dockers/docker-dhcp-relay/start.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +VLAN_IFACE_NAME=`sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_vlan_interfaces[0]['name']"` + +# Wait for the VLAN to come up (i.e., 'ip link show' returns 0) +until ip link show $VLAN_IFACE_NAME > /dev/null 2>&1; do + sleep 1 +done + +# Start the DHCP relay +service isc-dhcp-relay start + diff --git a/files/build_templates/dhcp_relay.service.j2 b/files/build_templates/dhcp_relay.service.j2 index ee0c444ccce5..95d66c605f85 100644 --- a/files/build_templates/dhcp_relay.service.j2 +++ b/files/build_templates/dhcp_relay.service.j2 @@ -1,7 +1,7 @@ [Unit] Description=DHCP relay container Requires=docker.service -After=docker.service +After=interfaces-config.service [Service] User={{ sonicadmin_user }} From 05e6b3611df5dd8c18466866dc4eca8f4f77ff6e Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 16 Mar 2017 11:22:40 -0700 Subject: [PATCH 0368/1011] [interfaces]: Combine vlan_interfaces and lag_interfaces file and add allow-hotplug (#381) * [files]: Add allow-hotplug stanza to interfaces files - start interface when the kernel detects a hotplug event from the interface ref: https://www.debian.org/doc/manuals/debian-reference/ch05.en.html * [interfaces]: Combine vlan_interfaces and lag_interfaces file and add allow-hotplug 1. Remove vlan_interfaces and lag_interfaces file and members in teamd.j2 2. Add all interfaces to /etc/network/interfaces file 3. Add allow-hotplug stanza 4. Add up to automatically add interfaces to VLAN and LAG 5. Add unique_name filter to minigraph.py to remove duplicate interface names 6. Add brctl to base image 7. Update sonic-swss submodule Signed-off-by: Shuotian Cheng --- .../docker-orchagent/base_image_files/brctl | 4 ++ .../interfaces/interfaces-config.sh | 2 - files/image_config/interfaces/interfaces.j2 | 66 +++++++++++++++---- .../image_config/interfaces/lag_interfaces.j2 | 20 ------ .../interfaces/vlan_interfaces.j2 | 18 ----- platform/broadcom/docker-orchagent-brcm.mk | 1 + platform/cavium/docker-orchagent-cavm.mk | 1 + platform/centec/docker-orchagent-centec.mk | 1 + platform/mellanox/docker-orchagent-mlnx.mk | 1 + src/sonic-config-engine/minigraph.py | 34 ++++++---- src/sonic-config-engine/sonic-cfggen | 10 +++ src/sonic-swss | 2 +- 12 files changed, 95 insertions(+), 65 deletions(-) create mode 100755 dockers/docker-orchagent/base_image_files/brctl delete mode 100644 files/image_config/interfaces/lag_interfaces.j2 delete mode 100644 files/image_config/interfaces/vlan_interfaces.j2 diff --git a/dockers/docker-orchagent/base_image_files/brctl b/dockers/docker-orchagent/base_image_files/brctl new file mode 100755 index 000000000000..b02d74479f17 --- /dev/null +++ b/dockers/docker-orchagent/base_image_files/brctl @@ -0,0 +1,4 @@ +#!/bin/bash + +docker exec -i swss brctl "$@" + diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index f8b54790c931..f36f45b55576 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -1,8 +1,6 @@ #!/bin/bash sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/interfaces.j2 >/etc/network/interfaces -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/vlan_interfaces.j2 >/etc/network/interfaces.d/vlan_interfaces -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/lag_interfaces.j2 >/etc/network/interfaces.d/lag_interfaces ifdown eth0 && ifup eth0 ifdown lo && ifup lo diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 6d1476963ed9..acf7b247fcf0 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -1,10 +1,10 @@ # {% block banner %} -# =========== Managed by config engine DO NOT EDIT! ======================== -# generated by templates/interfaces.j2 using sonic-cfggen -# file: interfaces -{% endblock %} +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces # +{% endblock banner %} {% block loopback %} # The loopback network interface auto lo @@ -17,7 +17,6 @@ iface lo {{ 'inet' if minigraph_lo_interface['addr'] | ipv4 else 'inet6' }} stat # {% endfor %} {% endblock loopback %} -# {% block mgmt_interface %} # The management network interface auto eth0 @@ -25,26 +24,71 @@ auto eth0 iface eth0 inet static address {{ minigraph_mgmt_interface['addr'] }} netmask {{ minigraph_mgmt_interface['mask'] }} - ################ management network policy routing rules - #### management port up rules" + ########## management network policy routing rules + # management port up rules up ip route add default via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 table default up ip rule add from {{ minigraph_mgmt_interface['addr'] }}/32 table default - #### management port down rules" + # management port down rules down ip route delete default via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 table default down ip rule delete from {{ minigraph_mgmt_interface['addr'] }}/32 table default {# TODO: COPP policy type rules #} {% else %} iface eth0 inet dhcp {% endif %} -{% endblock mgmt_interface %} # -{% block front_panel_interface %} +{% endblock mgmt_interface %} +{% block front_panel_interfaces %} # The switch front panel interfaces {% for interface in minigraph_interfaces %} auto {{ interface['alias'] }} +allow-hotplug {{ interface['alias'] }} iface {{ interface['alias'] }} {{ 'inet' if interface['addr'] | ipv4 else 'inet6' }} static address {{ interface['addr'] }} netmask {{ interface['mask'] }} # {% endfor %} -{% endblock front_panel_interface %} +{% for vlan_interface in minigraph_vlan_interfaces|unique_name %} +{% for interface in vlan_interface['members'] %} +auto {{ interface }} +allow-hotplug {{ interface }} +iface {{ interface }} inet manual + pre-up ifconfig {{ interface }} up + post-up brctl addif {{ vlan_interface['name'] }} {{ interface }} + post-down ifconfig {{ interface }} down +# +{% endfor %} +{% endfor %} +# Add || true to suppress the error when docker-teamd starts after docker-swss +{% for pc_interface in minigraph_portchannel_interfaces|unique_name %} +{% for interface in pc_interface['members'] %} +{% if pc_interface['name'] not in pc_set %} +auto {{ interface }} +allow-hotplug {{ interface }} +iface {{ interface }} inet manual + pre-up teamdctl {{ pc_interface['name'] }} port add {{ interface }} || true + post-down ifconfig {{ interface }} down +# +{% endif %} +{% endfor %} +{% endfor %} +{% endblock front_panel_interfaces %} +{% block vlan_interfaces %} +{% for vlan_interface in minigraph_vlan_interfaces %} +auto {{ vlan_interface['name'] }} +allow-hotplug {{ vlan_interface['name'] }} +iface {{ vlan_interface['name'] }} {{ 'inet' if vlan_interface['addr'] | ipv4 else 'inet6' }} static + address {{ vlan_interface['addr'] }} + netmask {{ vlan_interface['mask'] }} +# +{% endfor %} +{% endblock vlan_interfaces %} +{% block pc_interfaces %} +{% for pc_interface in minigraph_portchannel_interfaces %} +auto {{ pc_interface['name'] }} +allow-hotplug {{ pc_interface['name'] }} +iface {{ pc_interface['name'] }} {{ 'inet' if pc_interface['addr'] | ipv4 else 'inet6' }} static + address {{ pc_interface['addr'] }} + netmask {{ pc_interface['mask'] }} +# +{% endfor %} +{% endblock pc_interfaces %} diff --git a/files/image_config/interfaces/lag_interfaces.j2 b/files/image_config/interfaces/lag_interfaces.j2 deleted file mode 100644 index 0b5e24b61893..000000000000 --- a/files/image_config/interfaces/lag_interfaces.j2 +++ /dev/null @@ -1,20 +0,0 @@ -# -{% block banner %} -# =========== Managed by config engine DO NOT EDIT! ======================== -# generated by templates/lag_interfaces.j2 using sonic-cfggen -# file: lag_interfaces -{% endblock %} -# -{% block lag_interface %} -# The switch LAG interfaces -{% for interface in minigraph_interfaces %} -{% if 'PortChannel' in interface['alias'] %} -auto {{ interface['name'] }} -iface {{ interface['name'] }} {{ 'inet' if interface['addr'] | ipv4 else 'inet6' }} static - address {{ interface['addr'] }} - netmask {{ interface['mask'] }} -{% endif %} -{% endfor %} -{% endblock lag_interface %} -# - diff --git a/files/image_config/interfaces/vlan_interfaces.j2 b/files/image_config/interfaces/vlan_interfaces.j2 deleted file mode 100644 index 6d85d7910ed8..000000000000 --- a/files/image_config/interfaces/vlan_interfaces.j2 +++ /dev/null @@ -1,18 +0,0 @@ -# -{% block banner %} -# =========== Managed by config engine DO NOT EDIT! ======================== -# generated by templates/interfaces.j2 using sonic-cfggen -# file: vlan_interfaces -{% endblock %} -# -{% block vlan_interface %} -# The switch VLAN interfaces -{% for interface in minigraph_vlan_interfaces %} -auto {{ interface['name'] }} -iface {{ interface['name'] }} {{ 'inet' if interface['addr'] | ipv4 else 'inet6' }} static - bridge_ports {{ interface['members'] }} - address {{ interface['addr'] }} - netmask {{ interface['mask'] }} -{% endfor %} -{% endblock vlan_interface %} -# diff --git a/platform/broadcom/docker-orchagent-brcm.mk b/platform/broadcom/docker-orchagent-brcm.mk index e49b67c2c2cc..37fdb9c66ac5 100644 --- a/platform/broadcom/docker-orchagent-brcm.mk +++ b/platform/broadcom/docker-orchagent-brcm.mk @@ -16,3 +16,4 @@ $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_BRCM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel +$(DOCKER_ORCHAGENT_BRCM)_BASE_IMAGE_FILES += brctl:/usr/bin/brctl diff --git a/platform/cavium/docker-orchagent-cavm.mk b/platform/cavium/docker-orchagent-cavm.mk index 8130ca8dc1cb..65ddd9eac252 100644 --- a/platform/cavium/docker-orchagent-cavm.mk +++ b/platform/cavium/docker-orchagent-cavm.mk @@ -16,3 +16,4 @@ $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_CAVM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel +$(DOCKER_ORCHAGENT_CAVM)_BASE_IMAGE_FILES += brctl:/usr/bin/brctl diff --git a/platform/centec/docker-orchagent-centec.mk b/platform/centec/docker-orchagent-centec.mk index 0613fb510de3..a3738f6aa2ca 100644 --- a/platform/centec/docker-orchagent-centec.mk +++ b/platform/centec/docker-orchagent-centec.mk @@ -16,3 +16,4 @@ $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_CENTEC)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel +$(DOCKER_ORCHAGENT_CENTEC)_BASE_IMAGE_FILES += brctl:/usr/bin/brctl diff --git a/platform/mellanox/docker-orchagent-mlnx.mk b/platform/mellanox/docker-orchagent-mlnx.mk index 505804fb8c17..d081e8af5f3b 100644 --- a/platform/mellanox/docker-orchagent-mlnx.mk +++ b/platform/mellanox/docker-orchagent-mlnx.mk @@ -16,3 +16,4 @@ $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_MLNX)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel +$(DOCKER_ORCHAGENT_MLNX)_BASE_IMAGE_FILES += brctl:/usr/bin/brctl diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index afd4538f1346..7cba925928ca 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -44,7 +44,7 @@ def default(self, obj): if isinstance(obj, (ipaddress.IPv4Network, ipaddress.IPv6Network, ipaddress.IPv4Address, ipaddress.IPv6Address)): return str(obj) return json.JSONEncoder.default(self, obj) - + def parse_png(png, hname): neighbors = {} devices = {} @@ -125,6 +125,7 @@ def parse_dpg(dpg, hname): ipintfs = child.find(str(QName(ns, "IPInterfaces"))) intfs = [] vlan_map = {} + pc_map = {} for ipintf in ipintfs.findall(str(QName(ns, "IPInterface"))): intfname = ipintf.find(str(QName(ns, "AttachTo"))).text ipprefix = ipintf.find(str(QName(ns, "Prefix"))).text @@ -134,27 +135,31 @@ def parse_dpg(dpg, hname): addr_bits = ipn.max_prefixlen subnet = ipaddress.IPNetwork(str(ipn.network) + '/' + str(prefix_len)) ipmask = ipn.netmask - + intf = {'addr': ipaddr, 'subnet': subnet} if isinstance(ipn, ipaddress.IPv4Network): intf['mask'] = ipmask else: intf['mask'] = str(prefix_len) - + if intfname[0:4] == "Vlan": if intfname in vlan_map: vlan_map[intfname].append(intf) - else: vlan_map[intfname] = [intf] + elif intfname[0:11] == "PortChannel": + if intfname in pc_map: + pc_map[intfname].append(intf) + else: + pc_map[intfname] = [intf] else: intf.update({'name': intfname, 'prefixlen': int(prefix_len)}) - + if port_alias_map.has_key(intfname): intf['alias'] = port_alias_map[intfname] else: intf['alias'] = intfname - + # TODO: remove peer_addr after dependency removed ipaddr_val = int(ipn.ip) peer_addr_val = None @@ -168,13 +173,13 @@ def parse_dpg(dpg, hname): peer_addr_val = ipaddr_val + 1 else: peer_addr_val = ipaddr_val - 1 - + if peer_addr_val is not None: intf['peer_addr'] = ipaddress.IPAddress(peer_addr_val) intfs.append(intf) pcintfs = child.find(str(QName(ns, "PortChannelInterfaces"))) - pc_intfs = {} + pc_intfs = [] for pcintf in pcintfs.findall(str(QName(ns, "PortChannel"))): pcintfname = pcintf.find(str(QName(ns, "Name"))).text pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text @@ -182,7 +187,10 @@ def parse_dpg(dpg, hname): for i,member in enumerate(pcmbr_list): if port_alias_map.has_key(member): pcmbr_list[i] = port_alias_map[member] - pc_intfs[pcintfname] = pcmbr_list + pc_attributes = {'name': pcintfname, 'members': pcmbr_list} + for addrtuple in pc_map.get(pcintfname, []): + pc_attributes.update(addrtuple) + pc_intfs.append(copy.deepcopy(pc_attributes)) lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces"))) lo_intfs = [] @@ -221,12 +229,12 @@ def parse_dpg(dpg, hname): for i,member in enumerate(vmbr_list): if port_alias_map.has_key(member): vmbr_list[i] = port_alias_map[member] - vlan_attributes = {'name': vintfname, 'members': " ".join(vmbr_list), 'vlanid': vlanid} + vlan_attributes = {'name': vintfname, 'members': vmbr_list, 'vlanid': vlanid} for addrtuple in vlan_map.get(vintfname, []): vlan_attributes.update(addrtuple) vlan_intfs.append(copy.deepcopy(vlan_attributes)) - + return intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs return None, None, None, None, None @@ -284,7 +292,7 @@ def parse_meta(meta, hname): ntp_servers = value_group elif name == "SyslogResources": syslog_servers = value_group - return syslog_servers, dhcp_servers, ntp_servers + return syslog_servers, dhcp_servers, ntp_servers def get_console_info(devices, dev, port): for k, v in devices.items(): @@ -330,7 +338,7 @@ def get_alias_map_list(hwsku, platform=None): break if port_config == None: return None - + alias_map_list = [] with open(port_config) as data: for line in data: diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 90a905c5b3e1..93f27a30442d 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -35,6 +35,15 @@ def is_ipv6(value): return False return addr.version == 6 +def unique_name(l): + name_list = [] + new_list = [] + for item in l: + if item['name'] not in name_list: + name_list.append(item['name']) + new_list.append(item) + return new_list + def get_machine_info(): if not os.path.isfile('/host/machine.conf'): return None @@ -91,6 +100,7 @@ def main(): env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'), trim_blocks=True) env.filters['ipv4'] = is_ipv4 env.filters['ipv6'] = is_ipv6 + env.filters['unique_name'] = unique_name template = env.get_template(template_file) print template.render(data) diff --git a/src/sonic-swss b/src/sonic-swss index dc33b7549e57..6f06b59971e5 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit dc33b7549e57719d7855b1f7929b38b9b519072b +Subproject commit 6f06b59971e5ee75b721d3630878ba03f28f9831 From 74b6c4074b3ba61fb1fbd4f4b036693c95eeeee1 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 16 Mar 2017 14:24:43 -0700 Subject: [PATCH 0369/1011] Support submodule patching if provided (#403) * Support submodule patching if provided * Replace stg with quilt, working without git branch --- slave.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/slave.mk b/slave.mk index ef4cf58924dc..fd05c26620be 100644 --- a/slave.mk +++ b/slave.mk @@ -229,7 +229,9 @@ $(SONIC_INSTALL_TARGETS) : $(DEBS_PATH)/%-install : .platform $$(addsuffix -inst $(addprefix $(PYTHON_WHEELS_PATH)/, $(SONIC_PYTHON_WHEELS)) : $(PYTHON_WHEELS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*_DEPENDS))) $(HEADER) pushd $($*_SRC_PATH) $(LOG) + if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch/series quilt push -a; fi python$($*_PYTHON_VERSION) setup.py bdist_wheel $(LOG) + if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then quilt pop -a; fi popd $(LOG) mv $($*_SRC_PATH)/dist/$* $(PYTHON_WHEELS_PATH) $(LOG) $(FOOTER) From 1e07284e7ae05f0f2bd81e6db1c820a7a534fb4d Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 16 Mar 2017 22:43:39 -0700 Subject: [PATCH 0370/1011] [p4]: Add openssh-client and openssh-server to Dockerfile (#405) Signed-off-by: Shuotian Cheng --- platform/p4/docker-sonic-p4/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/p4/docker-sonic-p4/Dockerfile.j2 b/platform/p4/docker-sonic-p4/Dockerfile.j2 index 97e3a56817e4..a0944cb84a70 100644 --- a/platform/p4/docker-sonic-p4/Dockerfile.j2 +++ b/platform/p4/docker-sonic-p4/Dockerfile.j2 @@ -5,7 +5,7 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils python-ply libqt5core5a libqt5network5 libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0 libgmp10 libjudydebian1 libnanomsg0 libdaemon0 libjansson4 libjemalloc1 +RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils python-ply libqt5core5a libqt5network5 libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0 libgmp10 libjudydebian1 libnanomsg0 libdaemon0 libjansson4 libjemalloc1 openssh-client openssh-server COPY \ {% for deb in docker_sonic_p4_debs.split(' ') -%} From 36e02f76eeca7743bee4aeb779c5564b4e80d110 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 16 Mar 2017 22:57:30 -0700 Subject: [PATCH 0371/1011] Fix: support submodule patching if provided (#407) --- slave.mk | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/slave.mk b/slave.mk index fd05c26620be..bdb1ca441e08 100644 --- a/slave.mk +++ b/slave.mk @@ -132,8 +132,12 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_MAKE_DEBS)) : $(DEBS_PATH)/% : .platform $$(a $(HEADER) # remove target to force rebuild rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) + # apply series of patches if exist + if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi # build project and take package make DEST=$(shell pwd)/$(DEBS_PATH) -C $($*_SRC_PATH) $(shell pwd)/$(DEBS_PATH)/$* $(LOG) + # clean up + if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt pop -a -f; popd; fi $(FOOTER) # Build project with dpkg-buildpackage @@ -229,9 +233,11 @@ $(SONIC_INSTALL_TARGETS) : $(DEBS_PATH)/%-install : .platform $$(addsuffix -inst $(addprefix $(PYTHON_WHEELS_PATH)/, $(SONIC_PYTHON_WHEELS)) : $(PYTHON_WHEELS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*_DEPENDS))) $(HEADER) pushd $($*_SRC_PATH) $(LOG) - if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch/series quilt push -a; fi + # apply series of patches if exist + if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; fi python$($*_PYTHON_VERSION) setup.py bdist_wheel $(LOG) - if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then quilt pop -a; fi + # clean up + if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then quilt pop -a -f; fi popd $(LOG) mv $($*_SRC_PATH)/dist/$* $(PYTHON_WHEELS_PATH) $(LOG) $(FOOTER) From 799f0727a56d5caa5b96db03ad859c6a7d1e0e71 Mon Sep 17 00:00:00 2001 From: wadelnn Date: Fri, 17 Mar 2017 17:04:25 +0800 Subject: [PATCH 0372/1011] Update Ingrasys S9100 submodule (#406) * Update Ingrasys S9100 submodule * Modified debian files permission --- platform/broadcom/sonic-platform-modules-ingrasys-s9100 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-ingrasys-s9100 b/platform/broadcom/sonic-platform-modules-ingrasys-s9100 index 287f78d69417..83d62823d26a 160000 --- a/platform/broadcom/sonic-platform-modules-ingrasys-s9100 +++ b/platform/broadcom/sonic-platform-modules-ingrasys-s9100 @@ -1 +1 @@ -Subproject commit 287f78d694174fb60e61420ca8e9de24ea300fd8 +Subproject commit 83d62823d26a6b572bbe11272d00775f8123c199 From e0fd12aa2307e78ed75c09bed7735c1e8bdb2cd9 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 17 Mar 2017 11:07:12 -0700 Subject: [PATCH 0373/1011] [cfggen] Add basic functional test (#375) [cfggen] Add basic functional test --- sonic-slave/Dockerfile | 3 + src/sonic-config-engine/MANIFEST.in | 1 + src/sonic-config-engine/setup.py | 7 + src/sonic-config-engine/tests/__init__.py | 0 .../tests/sample_graph.xml | 129 ++++++++++++++++++ src/sonic-config-engine/tests/test.j2 | 3 + src/sonic-config-engine/tests/test.yml | 3 + src/sonic-config-engine/tests/test_cfggen.py | 61 +++++++++ 8 files changed, 207 insertions(+) create mode 100644 src/sonic-config-engine/tests/__init__.py create mode 100644 src/sonic-config-engine/tests/sample_graph.xml create mode 100644 src/sonic-config-engine/tests/test.j2 create mode 100644 src/sonic-config-engine/tests/test.yml create mode 100644 src/sonic-config-engine/tests/test_cfggen.py diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index dd9838e83800..b8b31940a98d 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -89,6 +89,9 @@ RUN apt-get update && apt-get install -y libmysqlclient-dev libmysqld-dev libper # For mpdecimal RUN apt-get update && apt-get install -y docutils-common libjs-sphinxdoc libjs-underscore python-docutils python-jinja2 python-markupsafe python-pygments python-roman python-sphinx sphinx-common python3-sphinx +# For sonic config engine testing +RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml + # For templating RUN pip install j2cli diff --git a/src/sonic-config-engine/MANIFEST.in b/src/sonic-config-engine/MANIFEST.in index a98b68c2a5bb..c228a249adfb 100644 --- a/src/sonic-config-engine/MANIFEST.in +++ b/src/sonic-config-engine/MANIFEST.in @@ -1 +1,2 @@ recursive-include platform *.json *.ini *.conf +recursive-include tests *.j2 *.yml *.xml diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py index 37c61b84ae5f..1a0cae5882fb 100644 --- a/src/sonic-config-engine/setup.py +++ b/src/sonic-config-engine/setup.py @@ -2,6 +2,7 @@ from setuptools import setup import os.path +import unittest def get_platform_file_list(): data_files = [] @@ -15,6 +16,11 @@ def get_platform_file_list(): data_files.append( (os.path.join('/usr/share/sonic', platform), files) ) return data_files +def get_test_suite(): + test_loader = unittest.TestLoader() + test_suite = test_loader.discover('tests', pattern='*.py') + return test_suite + setup(name='sonic-config-engine', version='1.0', description='Utilities for generating SONiC configuration files', @@ -25,4 +31,5 @@ def get_platform_file_list(): scripts=['sonic-cfggen'], data_files=get_platform_file_list(), install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'pyyaml'], + test_suite='setup.get_test_suite', ) diff --git a/src/sonic-config-engine/tests/__init__.py b/src/sonic-config-engine/tests/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/src/sonic-config-engine/tests/sample_graph.xml b/src/sonic-config-engine/tests/sample_graph.xml new file mode 100644 index 000000000000..47efabf7d81c --- /dev/null +++ b/src/sonic-config-engine/tests/sample_graph.xml @@ -0,0 +1,129 @@ + + + + + + OCPSCH0104001MS + 10.10.1.14 + OCPSCH01040DDLF + 10.10.1.13 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.14 + OCPSCH01040DDLF + 10.10.2.13 + 1 + 10 + 3 + + + + + 64536 + OCPSCH01040DDLF + + +
10.10.1.14
+ + +
+ +
10.10.2.14
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.6/32 + + 100.0.0.6/32 + + + + + ManagementIP1 + Management0 + + 192.168.200.15/24 + + 192.168.200.15/24 + + + + + + OCPSCH01040DDLF + + + + + + Ethernet0 + 10.10.1.13/30 + + + + Ethernet1 + 10.10.2.13/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH01040DDLF + Ethernet0 + OCPSCH0104012MS + Ethernet12 + + + 40000 + DeviceInterfaceLink + OCPCH01040DDLF + Ethernet1 + OCPSCH0104002MS + Ethernet12 + + + + + OCPSCH01040DDLF + Force10-Z9100 + + + + OCPSCH01040DDLF + Force10-Z9100 +
diff --git a/src/sonic-config-engine/tests/test.j2 b/src/sonic-config-engine/tests/test.j2 new file mode 100644 index 000000000000..787a1f0a2c41 --- /dev/null +++ b/src/sonic-config-engine/tests/test.j2 @@ -0,0 +1,3 @@ +{% for item in yml_item -%} +{{ item }} +{% endfor %} diff --git a/src/sonic-config-engine/tests/test.yml b/src/sonic-config-engine/tests/test.yml new file mode 100644 index 000000000000..dc08eb66bed1 --- /dev/null +++ b/src/sonic-config-engine/tests/test.yml @@ -0,0 +1,3 @@ +yml_item: + - value1 + - value2 diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py new file mode 100644 index 000000000000..894f069c1ef8 --- /dev/null +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -0,0 +1,61 @@ +from unittest import TestCase +import subprocess +import os + +class TestCfgGen(TestCase): + + def setUp(self): + self.test_dir = os.path.dirname(os.path.realpath(__file__)) + self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfggen') + self.sample_graph = os.path.join(self.test_dir, 'sample_graph.xml') + + def run_script(self, argument): + print '\n Running sonic-cfggen ' + argument + output = subprocess.check_output(self.script_file + ' ' + argument, shell=True) + linecount = output.strip().count('\n') + if linecount <= 0: + print ' Output: ' + output.strip() + else: + print ' Output: ({0} lines, {1} bytes)'.format(linecount + 1, len(output)) + return output + + def test_dummy_run(self): + argument = '' + output = self.run_script(argument) + self.assertEqual(output, '') + + def test_minigraph_sku(self): + argument = '-v minigraph_hwsku -m "' + self.sample_graph + '"' + output = self.run_script(argument) + self.assertEqual(output.strip(), 'Force10-Z9100') + + def test_print_data(self): + argument = '-m "' + self.sample_graph + '" --print-data' + output = self.run_script(argument) + self.assertTrue(len(output.strip()) > 0) + + def test_jinja_expression(self): + argument = '-m "' + self.sample_graph + '" -v "minigraph_devices[minigraph_hostname][\'type\']"' + output = self.run_script(argument) + self.assertEqual(output.strip(), 'LeafRouter') + + def test_print_alias_mapping(self): + argument = '-s' + output = self.run_script(argument) + self.assertTrue(len(output.strip()) > 0) + + def test_additional_json_data(self): + argument = '-a \'{"key1":"value1"}\' -v key1' + output = self.run_script(argument) + self.assertEqual(output.strip(), 'value1') + + def test_read_yaml(self): + argument = '-v yml_item -y ' + os.path.join(self.test_dir, 'test.yml') + output = self.run_script(argument) + self.assertEqual(output.strip(), '[\'value1\', \'value2\']') + + def test_render_template(self): + argument = '-y ' + os.path.join(self.test_dir, 'test.yml') + ' -t' + os.path.join(self.test_dir, 'test.j2') + output = self.run_script(argument) + self.assertEqual(output.strip(), 'value1\nvalue2') + From b165ab9e5427e2dd396b5b30fe125dc30627acff Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 17 Mar 2017 11:59:07 -0700 Subject: [PATCH 0374/1011] [build]: allow install same platform module deb on multiple platforms (#410) --- slave.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slave.mk b/slave.mk index bdb1ca441e08..34d13202ecef 100644 --- a/slave.mk +++ b/slave.mk @@ -306,7 +306,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export linux_kernel="$(DEBS_PATH)/$(LINUX_KERNEL)" export kversion="$(KVERSION)" export installer_debs="$(addprefix $(DEBS_PATH)/,$($*_DEPENDS))" - export lazy_installer_debs="$(foreach deb, $($*_INSTALLS),$(addprefix $($(deb)_PLATFORM)@, $(DEBS_PATH)/$(deb)))" + export lazy_installer_debs="$(foreach deb, $($*_INSTALLS),$(foreach device, $($(deb)_PLATFORM),$(addprefix $(device)@, $(DEBS_PATH)/$(deb))))" export installer_images="$(addprefix $(TARGET_PATH)/,$($*_DOCKERS))" export config_engine="$(addprefix $(DEBS_PATH)/,$(SONIC_CONFIG_ENGINE))" export image_type="$($*_IMAGE_TYPE)" From 3643281594b03ba0c13228991ac78bc16300f41b Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 17 Mar 2017 14:51:42 -0700 Subject: [PATCH 0375/1011] [cfggen] Add tool to translate openconfig acl into sonic format (#388) * Build sonic-config-engine as whl instead of deb package * Add tool to translate openconfig acl into sonic format --- dockers/docker-config-engine/Dockerfile.j2 | 29 +- .../build_templates/sonic_debian_extension.j2 | 18 +- rules/docker-config-engine.mk | 2 +- rules/sonic-config.mk | 5 +- slave.mk | 5 +- src/sonic-config-engine/openconfig_acl.py | 7544 +++++++++++++++++ src/sonic-config-engine/setup.py | 6 +- src/sonic-config-engine/translate_acl | 139 + 8 files changed, 7730 insertions(+), 18 deletions(-) create mode 100644 src/sonic-config-engine/openconfig_acl.py create mode 100755 src/sonic-config-engine/translate_acl diff --git a/dockers/docker-config-engine/Dockerfile.j2 b/dockers/docker-config-engine/Dockerfile.j2 index 067983724014..68555d44779b 100644 --- a/dockers/docker-config-engine/Dockerfile.j2 +++ b/dockers/docker-config-engine/Dockerfile.j2 @@ -6,19 +6,42 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update # Dependencies for sonic-cfggen -RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml +RUN apt-get install -y python-lxml python-yaml python-bitarray python-pip python-dev +RUN pip install --upgrade pip + +RUN pip install netaddr ipaddr jinja2 pyangbind + +{% if docker_config_engine_debs.strip() %} COPY \ {% for deb in docker_config_engine_debs.split(' ') -%} debs/{{ deb }}{{' '}} {%- endfor -%} debs/ +{%- endif -%} +{% if docker_config_engine_debs.strip() %} RUN dpkg -i \ {% for deb in docker_config_engine_debs.split(' ') -%} debs/{{ deb }}{{' '}} {%- endfor %} +{%- endif -%} + +{% if docker_config_engine_whls.strip() %} +COPY \ +{% for whl in docker_config_engine_whls.split(' ') -%} +python-wheels/{{ whl }}{{' '}} +{%- endfor -%} +python-wheels/ +{%- endif -%} + +{% if docker_config_engine_whls.strip() %} +RUN pip install \ +{% for whl in docker_config_engine_whls.split(' ') -%} +python-wheels/{{ whl }}{{' '}} +{%- endfor %} +{%- endif -%} ## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs +RUN apt-get remove -y python-pip python-dev; apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs /python-wheels diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 5d079ea35c7d..cba88c4eabac 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -54,17 +54,17 @@ sudo cp $IMAGE_CONFIGS/environment/motd $FILESYSTEM_ROOT/etc/ sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic/ sudo mkdir -p $FILESYSTEM_ROOT/usr/share/sonic/templates/ -# Install dependencies for SONiC config engine -# TODO: pip-install instead of apt-get after config engine wrapped into a wheel, even better use pip implicitly installing dependencies +# Install dependencies for SONiC config engine sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install \ + python-dev \ python-lxml \ - python-jinja2 \ - python-netaddr \ - python-ipaddr \ - python-yaml + python-yaml \ + python-bitarray # Install SONiC config engine -sudo dpkg --root=$FILESYSTEM_ROOT -i {{config_engine}} +CONFIG_ENGINE_WHL_NAME=`basename {{config_engine}}` +sudo cp {{config_engine}} $FILESYSTEM_ROOT/$CONFIG_ENGINE_WHL_NAME +sudo chroot $FILESYSTEM_ROOT pip install $CONFIG_ENGINE_WHL_NAME # Install SONiC Utilities (and its dependencies via 'apt-get -y install -f') sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/python-sonic-utilities_*.deb || \ @@ -191,6 +191,10 @@ sudo LANG=C chroot $FILESYSTEM_ROOT fuser -km /sys || true sudo LANG=C chroot $FILESYSTEM_ROOT umount -lf /sys {% endif %} +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get remove -y python-dev +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get clean -y +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get autoremove -y + {% for file in installer_extra_files.split(' ') -%} {% if file.strip() -%} {% set src = file.split(':')[0] -%} diff --git a/rules/docker-config-engine.mk b/rules/docker-config-engine.mk index 8f168cc441ac..ca0a6a739778 100644 --- a/rules/docker-config-engine.mk +++ b/rules/docker-config-engine.mk @@ -2,6 +2,6 @@ DOCKER_CONFIG_ENGINE = docker-config-engine.gz $(DOCKER_CONFIG_ENGINE)_PATH = $(DOCKERS_PATH)/docker-config-engine -$(DOCKER_CONFIG_ENGINE)_DEPENDS += $(SONIC_CONFIG_ENGINE) +$(DOCKER_CONFIG_ENGINE)_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE) $(DOCKER_CONFIG_ENGINE)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_CONFIG_ENGINE) diff --git a/rules/sonic-config.mk b/rules/sonic-config.mk index e0f6504bf994..3dc295c44a69 100644 --- a/rules/sonic-config.mk +++ b/rules/sonic-config.mk @@ -1,5 +1,6 @@ # sonic-config-engine package -SONIC_CONFIG_ENGINE = python-sonic-config-engine_1.0-1_all.deb +SONIC_CONFIG_ENGINE = sonic_config_engine-1.0-py2-none-any.whl $(SONIC_CONFIG_ENGINE)_SRC_PATH = $(SRC_PATH)/sonic-config-engine -SONIC_PYTHON_STDEB_DEBS += $(SONIC_CONFIG_ENGINE) +$(SONIC_CONFIG_ENGINE)_PYTHON_VERSION = 2 +SONIC_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE) diff --git a/slave.mk b/slave.mk index 34d13202ecef..2b7e45a07e92 100644 --- a/slave.mk +++ b/slave.mk @@ -280,6 +280,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .pl sudo mount --bind $(PYTHON_WHEELS_PATH) $($*.gz_PATH)/python-wheels $(LOG) # Export variables for j2. Use path for unique variable names, e.g. docker_orchagent_debs $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_debs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DEPENDS),RDEPENDS))\n" | awk '!a[$$0]++')) + $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_whls=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_PYTHON_WHEELS)))\n" | awk '!a[$$0]++')) $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_dbgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DBG_PACKAGES)))\n" | awk '!a[$$0]++')) j2 $($*.gz_PATH)/Dockerfile.j2 > $($*.gz_PATH)/Dockerfile docker build --squash --no-cache -t $* $($*.gz_PATH) $(LOG) @@ -299,7 +300,7 @@ $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TA ############################################################################### # targets for building installers with base image -$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_CONFIG_ENGINE) $(SONIC_DEVICE_DATA) $(SONIC_UTILS)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) +$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_DEVICE_DATA) $(SONIC_UTILS)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) $(HEADER) ## Pass initramfs and linux kernel explicitly. They are used for all platforms export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" @@ -308,7 +309,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform 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))" - export config_engine="$(addprefix $(DEBS_PATH)/,$(SONIC_CONFIG_ENGINE))" + export config_engine="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE))" export image_type="$($*_IMAGE_TYPE)" export sonicadmin_user="$(USERNAME)" export sonic_asic_platform="$(CONFIGURED_PLATFORM)" diff --git a/src/sonic-config-engine/openconfig_acl.py b/src/sonic-config-engine/openconfig_acl.py new file mode 100644 index 000000000000..92ff414ed23e --- /dev/null +++ b/src/sonic-config-engine/openconfig_acl.py @@ -0,0 +1,7544 @@ +# This file is auto generated by pyangbind: https://github.com/robshakir/pyangbind +# from https://github.com/openconfig/public/blob/master/release/models/acl/openconfig-acl.yang +# +# Detail step to regenerate this file: +# 1. Sync openconfig ACL yang models from https://github.com/openconfig/public/tree/master/release/models/acl +# 2. Sync inet yang models which contain type dependencies for openconfig ACL yang models from https://github.com/YangModels/yang/tree/master/standard/ietf/RFC , and put them in the same folder with models from step 1. +# 3. Install PyangBind: +# pip install pyangbind +# 4. Get PyangBind install path: +# export PYBINDPLUGIN=`/usr/bin/env python -c \ +# 'import pyangbind; import os; print "%s/plugin" % os.path.dirname(pyangbind.__file__)'` +# 5. Generate this file with pyang: +# pyang --plugindir $PYBINDPLUGIN -f pybind -o openconfig_acl.py openconfig-acl.yang + +from operator import attrgetter +from pyangbind.lib.yangtypes import RestrictedPrecisionDecimalType, RestrictedClassType, TypedListType +from pyangbind.lib.yangtypes import YANGBool, YANGListType, YANGDynClass, ReferenceType +from pyangbind.lib.base import PybindBase +from decimal import Decimal +from bitarray import bitarray +import __builtin__ +class yc_state_openconfig_acl__acl_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Global operational state data for ACLs + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__counter_capability',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__counter_capability = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-acl:AGGREGATE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:INTERFACE_AGGREGATE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'AGGREGATE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'INTERFACE_AGGREGATE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'INTERFACE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:INTERFACE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="counter-capability", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'state'] + + def _get_counter_capability(self): + """ + Getter method for counter_capability, mapped from YANG variable /acl/state/counter_capability (identityref) + + YANG Description: System reported indication of how ACL counters are reported +by the target + """ + return self.__counter_capability + + def _set_counter_capability(self, v, load=False): + """ + Setter method for counter_capability, mapped from YANG variable /acl/state/counter_capability (identityref) + If this variable is read-only (config: false) in the + source YANG file, then _set_counter_capability is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_counter_capability() directly. + + YANG Description: System reported indication of how ACL counters are reported +by the target + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-acl:AGGREGATE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:INTERFACE_AGGREGATE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'AGGREGATE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'INTERFACE_AGGREGATE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'INTERFACE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:INTERFACE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="counter-capability", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """counter_capability must be of a type compatible with identityref""", + 'defined-type': "openconfig-acl:identityref", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-acl:AGGREGATE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:INTERFACE_AGGREGATE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'AGGREGATE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'INTERFACE_AGGREGATE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'INTERFACE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:INTERFACE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="counter-capability", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)""", + }) + + self.__counter_capability = t + if hasattr(self, '_set'): + self._set() + + def _unset_counter_capability(self): + self.__counter_capability = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-acl:AGGREGATE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:INTERFACE_AGGREGATE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'AGGREGATE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'INTERFACE_AGGREGATE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'INTERFACE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:INTERFACE_ONLY': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="counter-capability", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + + counter_capability = __builtin__.property(_get_counter_capability) + + + _pyangbind_elements = {'counter_capability': counter_capability, } + + +class yc_config_openconfig_acl__acl_acl_sets_acl_set_config(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/config. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Access list config + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__name','__description',) + + _yang_name = 'config' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__name = YANGDynClass(base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True) + self.__description = YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'config'] + + def _get_name(self): + """ + Getter method for name, mapped from YANG variable /acl/acl_sets/acl_set/config/name (string) + + YANG Description: The name of the access-list set + """ + return self.__name + + def _set_name(self, v, load=False): + """ + Setter method for name, mapped from YANG variable /acl/acl_sets/acl_set/config/name (string) + If this variable is read-only (config: false) in the + source YANG file, then _set_name is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_name() directly. + + YANG Description: The name of the access-list set + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """name must be of a type compatible with string""", + 'defined-type': "string", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)""", + }) + + self.__name = t + if hasattr(self, '_set'): + self._set() + + def _unset_name(self): + self.__name = YANGDynClass(base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True) + + + def _get_description(self): + """ + Getter method for description, mapped from YANG variable /acl/acl_sets/acl_set/config/description (string) + + YANG Description: Description, or comment, for the ACL set + """ + return self.__description + + def _set_description(self, v, load=False): + """ + Setter method for description, mapped from YANG variable /acl/acl_sets/acl_set/config/description (string) + If this variable is read-only (config: false) in the + source YANG file, then _set_description is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_description() directly. + + YANG Description: Description, or comment, for the ACL set + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """description must be of a type compatible with string""", + 'defined-type': "string", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)""", + }) + + self.__description = t + if hasattr(self, '_set'): + self._set() + + def _unset_description(self): + self.__description = YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True) + + name = __builtin__.property(_get_name, _set_name) + description = __builtin__.property(_get_description, _set_description) + + + _pyangbind_elements = {'name': name, 'description': description, } + + +class yc_state_openconfig_acl__acl_acl_sets_acl_set_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Access list state information + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__name','__description',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__name = YANGDynClass(base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False) + self.__description = YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'state'] + + def _get_name(self): + """ + Getter method for name, mapped from YANG variable /acl/acl_sets/acl_set/state/name (string) + + YANG Description: The name of the access-list set + """ + return self.__name + + def _set_name(self, v, load=False): + """ + Setter method for name, mapped from YANG variable /acl/acl_sets/acl_set/state/name (string) + If this variable is read-only (config: false) in the + source YANG file, then _set_name is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_name() directly. + + YANG Description: The name of the access-list set + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """name must be of a type compatible with string""", + 'defined-type': "string", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)""", + }) + + self.__name = t + if hasattr(self, '_set'): + self._set() + + def _unset_name(self): + self.__name = YANGDynClass(base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False) + + + def _get_description(self): + """ + Getter method for description, mapped from YANG variable /acl/acl_sets/acl_set/state/description (string) + + YANG Description: Description, or comment, for the ACL set + """ + return self.__description + + def _set_description(self, v, load=False): + """ + Setter method for description, mapped from YANG variable /acl/acl_sets/acl_set/state/description (string) + If this variable is read-only (config: false) in the + source YANG file, then _set_description is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_description() directly. + + YANG Description: Description, or comment, for the ACL set + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """description must be of a type compatible with string""", + 'defined-type': "string", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)""", + }) + + self.__description = t + if hasattr(self, '_set'): + self._set() + + def _unset_description(self): + self.__description = YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False) + + name = __builtin__.property(_get_name) + description = __builtin__.property(_get_description) + + + _pyangbind_elements = {'name': name, 'description': description, } + + +class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_config(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/config. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Access list entries config + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__sequence_id','__description',) + + _yang_name = 'config' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__sequence_id = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=True) + self.__description = YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'config'] + + def _get_sequence_id(self): + """ + Getter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config/sequence_id (uint32) + + YANG Description: The sequence id determines the order in which ACL entries +are applied. The sequence id must be unique for each entry +in an ACL set. Target devices should apply the ACL entry +rules in the order determined by sequence id, rather than +the relying only on order in the list. + """ + return self.__sequence_id + + def _set_sequence_id(self, v, load=False): + """ + Setter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config/sequence_id (uint32) + If this variable is read-only (config: false) in the + source YANG file, then _set_sequence_id is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_sequence_id() directly. + + YANG Description: The sequence id determines the order in which ACL entries +are applied. The sequence id must be unique for each entry +in an ACL set. Target devices should apply the ACL entry +rules in the order determined by sequence id, rather than +the relying only on order in the list. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """sequence_id must be of a type compatible with uint32""", + 'defined-type': "uint32", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=True)""", + }) + + self.__sequence_id = t + if hasattr(self, '_set'): + self._set() + + def _unset_sequence_id(self): + self.__sequence_id = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=True) + + + def _get_description(self): + """ + Getter method for description, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config/description (string) + + YANG Description: A user-defined description, or comment, for this Access List +Entry. + """ + return self.__description + + def _set_description(self, v, load=False): + """ + Setter method for description, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config/description (string) + If this variable is read-only (config: false) in the + source YANG file, then _set_description is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_description() directly. + + YANG Description: A user-defined description, or comment, for this Access List +Entry. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """description must be of a type compatible with string""", + 'defined-type': "string", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)""", + }) + + self.__description = t + if hasattr(self, '_set'): + self._set() + + def _unset_description(self): + self.__description = YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True) + + sequence_id = __builtin__.property(_get_sequence_id, _set_sequence_id) + description = __builtin__.property(_get_description, _set_description) + + + _pyangbind_elements = {'sequence_id': sequence_id, 'description': description, } + + +class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: State information for ACL entries + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__sequence_id','__description','__matched_packets','__matched_octets',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + self.__sequence_id = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=False) + self.__description = YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False) + self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'state'] + + def _get_sequence_id(self): + """ + Getter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/sequence_id (uint32) + + YANG Description: The sequence id determines the order in which ACL entries +are applied. The sequence id must be unique for each entry +in an ACL set. Target devices should apply the ACL entry +rules in the order determined by sequence id, rather than +the relying only on order in the list. + """ + return self.__sequence_id + + def _set_sequence_id(self, v, load=False): + """ + Setter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/sequence_id (uint32) + If this variable is read-only (config: false) in the + source YANG file, then _set_sequence_id is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_sequence_id() directly. + + YANG Description: The sequence id determines the order in which ACL entries +are applied. The sequence id must be unique for each entry +in an ACL set. Target devices should apply the ACL entry +rules in the order determined by sequence id, rather than +the relying only on order in the list. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """sequence_id must be of a type compatible with uint32""", + 'defined-type': "uint32", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=False)""", + }) + + self.__sequence_id = t + if hasattr(self, '_set'): + self._set() + + def _unset_sequence_id(self): + self.__sequence_id = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=False) + + + def _get_description(self): + """ + Getter method for description, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/description (string) + + YANG Description: A user-defined description, or comment, for this Access List +Entry. + """ + return self.__description + + def _set_description(self, v, load=False): + """ + Setter method for description, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/description (string) + If this variable is read-only (config: false) in the + source YANG file, then _set_description is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_description() directly. + + YANG Description: A user-defined description, or comment, for this Access List +Entry. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """description must be of a type compatible with string""", + 'defined-type': "string", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)""", + }) + + self.__description = t + if hasattr(self, '_set'): + self._set() + + def _unset_description(self): + self.__description = YANGDynClass(base=unicode, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False) + + + def _get_matched_packets(self): + """ + Getter method for matched_packets, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/matched_packets (yang:counter64) + + YANG Description: Count of the number of packets matching the current ACL +entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + return self.__matched_packets + + def _set_matched_packets(self, v, load=False): + """ + Setter method for matched_packets, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/matched_packets (yang:counter64) + If this variable is read-only (config: false) in the + source YANG file, then _set_matched_packets is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_matched_packets() directly. + + YANG Description: Count of the number of packets matching the current ACL +entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """matched_packets must be of a type compatible with yang:counter64""", + 'defined-type': "yang:counter64", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False)""", + }) + + self.__matched_packets = t + if hasattr(self, '_set'): + self._set() + + def _unset_matched_packets(self): + self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + + + def _get_matched_octets(self): + """ + Getter method for matched_octets, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/matched_octets (yang:counter64) + + YANG Description: Count of the number of octets (bytes) matching the current +ACL entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + return self.__matched_octets + + def _set_matched_octets(self, v, load=False): + """ + Setter method for matched_octets, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/matched_octets (yang:counter64) + If this variable is read-only (config: false) in the + source YANG file, then _set_matched_octets is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_matched_octets() directly. + + YANG Description: Count of the number of octets (bytes) matching the current +ACL entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """matched_octets must be of a type compatible with yang:counter64""", + 'defined-type': "yang:counter64", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False)""", + }) + + self.__matched_octets = t + if hasattr(self, '_set'): + self._set() + + def _unset_matched_octets(self): + self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + + sequence_id = __builtin__.property(_get_sequence_id) + description = __builtin__.property(_get_description) + matched_packets = __builtin__.property(_get_matched_packets) + matched_octets = __builtin__.property(_get_matched_octets) + + + _pyangbind_elements = {'sequence_id': sequence_id, 'description': description, 'matched_packets': matched_packets, 'matched_octets': matched_octets, } + + +class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_config(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/l2/config. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Configuration data + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__source_mac','__source_mac_mask','__destination_mac','__destination_mac_mask','__ethertype',) + + _yang_name = 'config' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__source_mac = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + self.__destination_mac = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + self.__destination_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + self.__ethertype = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'1..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=True) + self.__source_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'l2', u'config'] + + def _get_source_mac(self): + """ + Getter method for source_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/source_mac (yang:mac-address) + + YANG Description: Source IEEE 802 MAC address. + """ + return self.__source_mac + + def _set_source_mac(self, v, load=False): + """ + Setter method for source_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/source_mac (yang:mac-address) + If this variable is read-only (config: false) in the + source YANG file, then _set_source_mac is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_source_mac() directly. + + YANG Description: Source IEEE 802 MAC address. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """source_mac must be of a type compatible with yang:mac-address""", + 'defined-type': "yang:mac-address", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True)""", + }) + + self.__source_mac = t + if hasattr(self, '_set'): + self._set() + + def _unset_source_mac(self): + self.__source_mac = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + + + def _get_source_mac_mask(self): + """ + Getter method for source_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/source_mac_mask (yang:mac-address) + + YANG Description: Source IEEE 802 MAC address mask. + """ + return self.__source_mac_mask + + def _set_source_mac_mask(self, v, load=False): + """ + Setter method for source_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/source_mac_mask (yang:mac-address) + If this variable is read-only (config: false) in the + source YANG file, then _set_source_mac_mask is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_source_mac_mask() directly. + + YANG Description: Source IEEE 802 MAC address mask. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """source_mac_mask must be of a type compatible with yang:mac-address""", + 'defined-type': "yang:mac-address", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True)""", + }) + + self.__source_mac_mask = t + if hasattr(self, '_set'): + self._set() + + def _unset_source_mac_mask(self): + self.__source_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + + + def _get_destination_mac(self): + """ + Getter method for destination_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/destination_mac (yang:mac-address) + + YANG Description: Destination IEEE 802 MAC address. + """ + return self.__destination_mac + + def _set_destination_mac(self, v, load=False): + """ + Setter method for destination_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/destination_mac (yang:mac-address) + If this variable is read-only (config: false) in the + source YANG file, then _set_destination_mac is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_destination_mac() directly. + + YANG Description: Destination IEEE 802 MAC address. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """destination_mac must be of a type compatible with yang:mac-address""", + 'defined-type': "yang:mac-address", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True)""", + }) + + self.__destination_mac = t + if hasattr(self, '_set'): + self._set() + + def _unset_destination_mac(self): + self.__destination_mac = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + + + def _get_destination_mac_mask(self): + """ + Getter method for destination_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/destination_mac_mask (yang:mac-address) + + YANG Description: Destination IEEE 802 MAC address mask. + """ + return self.__destination_mac_mask + + def _set_destination_mac_mask(self, v, load=False): + """ + Setter method for destination_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/destination_mac_mask (yang:mac-address) + If this variable is read-only (config: false) in the + source YANG file, then _set_destination_mac_mask is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_destination_mac_mask() directly. + + YANG Description: Destination IEEE 802 MAC address mask. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """destination_mac_mask must be of a type compatible with yang:mac-address""", + 'defined-type': "yang:mac-address", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True)""", + }) + + self.__destination_mac_mask = t + if hasattr(self, '_set'): + self._set() + + def _unset_destination_mac_mask(self): + self.__destination_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=True) + + + def _get_ethertype(self): + """ + Getter method for ethertype, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/ethertype (oc-pkt-match-types:ethertype-type) + + YANG Description: Ethertype field to match in Ethernet packets + """ + return self.__ethertype + + def _set_ethertype(self, v, load=False): + """ + Setter method for ethertype, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/ethertype (oc-pkt-match-types:ethertype-type) + If this variable is read-only (config: false) in the + source YANG file, then _set_ethertype is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_ethertype() directly. + + YANG Description: Ethertype field to match in Ethernet packets + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'1..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """ethertype must be of a type compatible with oc-pkt-match-types:ethertype-type""", + 'defined-type': "oc-pkt-match-types:ethertype-type", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'1..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=True)""", + }) + + self.__ethertype = t + if hasattr(self, '_set'): + self._set() + + def _unset_ethertype(self): + self.__ethertype = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'1..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=True) + + source_mac = __builtin__.property(_get_source_mac, _set_source_mac) + source_mac_mask = __builtin__.property(_get_source_mac_mask, _set_source_mac_mask) + destination_mac = __builtin__.property(_get_destination_mac, _set_destination_mac) + destination_mac_mask = __builtin__.property(_get_destination_mac_mask, _set_destination_mac_mask) + ethertype = __builtin__.property(_get_ethertype, _set_ethertype) + + + _pyangbind_elements = {'source_mac': source_mac, 'source_mac_mask': source_mac_mask, 'destination_mac': destination_mac, 'destination_mac_mask': destination_mac_mask, 'ethertype': ethertype, } + + +class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/l2/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: State Information. + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__source_mac','__source_mac_mask','__destination_mac','__destination_mac_mask','__ethertype',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__source_mac = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + self.__destination_mac = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + self.__destination_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + self.__ethertype = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'1..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=False) + self.__source_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'l2', u'state'] + + def _get_source_mac(self): + """ + Getter method for source_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/source_mac (yang:mac-address) + + YANG Description: Source IEEE 802 MAC address. + """ + return self.__source_mac + + def _set_source_mac(self, v, load=False): + """ + Setter method for source_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/source_mac (yang:mac-address) + If this variable is read-only (config: false) in the + source YANG file, then _set_source_mac is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_source_mac() directly. + + YANG Description: Source IEEE 802 MAC address. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """source_mac must be of a type compatible with yang:mac-address""", + 'defined-type': "yang:mac-address", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False)""", + }) + + self.__source_mac = t + if hasattr(self, '_set'): + self._set() + + def _unset_source_mac(self): + self.__source_mac = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + + + def _get_source_mac_mask(self): + """ + Getter method for source_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/source_mac_mask (yang:mac-address) + + YANG Description: Source IEEE 802 MAC address mask. + """ + return self.__source_mac_mask + + def _set_source_mac_mask(self, v, load=False): + """ + Setter method for source_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/source_mac_mask (yang:mac-address) + If this variable is read-only (config: false) in the + source YANG file, then _set_source_mac_mask is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_source_mac_mask() directly. + + YANG Description: Source IEEE 802 MAC address mask. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """source_mac_mask must be of a type compatible with yang:mac-address""", + 'defined-type': "yang:mac-address", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False)""", + }) + + self.__source_mac_mask = t + if hasattr(self, '_set'): + self._set() + + def _unset_source_mac_mask(self): + self.__source_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + + + def _get_destination_mac(self): + """ + Getter method for destination_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/destination_mac (yang:mac-address) + + YANG Description: Destination IEEE 802 MAC address. + """ + return self.__destination_mac + + def _set_destination_mac(self, v, load=False): + """ + Setter method for destination_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/destination_mac (yang:mac-address) + If this variable is read-only (config: false) in the + source YANG file, then _set_destination_mac is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_destination_mac() directly. + + YANG Description: Destination IEEE 802 MAC address. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """destination_mac must be of a type compatible with yang:mac-address""", + 'defined-type': "yang:mac-address", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False)""", + }) + + self.__destination_mac = t + if hasattr(self, '_set'): + self._set() + + def _unset_destination_mac(self): + self.__destination_mac = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + + + def _get_destination_mac_mask(self): + """ + Getter method for destination_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/destination_mac_mask (yang:mac-address) + + YANG Description: Destination IEEE 802 MAC address mask. + """ + return self.__destination_mac_mask + + def _set_destination_mac_mask(self, v, load=False): + """ + Setter method for destination_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/destination_mac_mask (yang:mac-address) + If this variable is read-only (config: false) in the + source YANG file, then _set_destination_mac_mask is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_destination_mac_mask() directly. + + YANG Description: Destination IEEE 802 MAC address mask. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """destination_mac_mask must be of a type compatible with yang:mac-address""", + 'defined-type': "yang:mac-address", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False)""", + }) + + self.__destination_mac_mask = t + if hasattr(self, '_set'): + self._set() + + def _unset_destination_mac_mask(self): + self.__destination_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:mac-address', is_config=False) + + + def _get_ethertype(self): + """ + Getter method for ethertype, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/ethertype (oc-pkt-match-types:ethertype-type) + + YANG Description: Ethertype field to match in Ethernet packets + """ + return self.__ethertype + + def _set_ethertype(self, v, load=False): + """ + Setter method for ethertype, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/ethertype (oc-pkt-match-types:ethertype-type) + If this variable is read-only (config: false) in the + source YANG file, then _set_ethertype is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_ethertype() directly. + + YANG Description: Ethertype field to match in Ethernet packets + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'1..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """ethertype must be of a type compatible with oc-pkt-match-types:ethertype-type""", + 'defined-type': "oc-pkt-match-types:ethertype-type", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'1..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=False)""", + }) + + self.__ethertype = t + if hasattr(self, '_set'): + self._set() + + def _unset_ethertype(self): + self.__ethertype = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'1..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_ARP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_VLAN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_ROCE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV6': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_MPLS': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:ETHERTYPE_IPV4': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'ETHERTYPE_LLDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=False) + + source_mac = __builtin__.property(_get_source_mac) + source_mac_mask = __builtin__.property(_get_source_mac_mask) + destination_mac = __builtin__.property(_get_destination_mac) + destination_mac_mask = __builtin__.property(_get_destination_mac_mask) + ethertype = __builtin__.property(_get_ethertype) + + + _pyangbind_elements = {'source_mac': source_mac, 'source_mac_mask': source_mac_mask, 'destination_mac': destination_mac, 'destination_mac_mask': destination_mac_mask, 'ethertype': ethertype, } + + +class yc_l2_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/l2. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Ethernet header fields + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__config','__state',) + + _yang_name = 'l2' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'l2'] + + def _get_config(self): + """ + Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config (container) + + YANG Description: Configuration data + """ + return self.__config + + def _set_config(self, v, load=False): + """ + Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_config is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_config() directly. + + YANG Description: Configuration data + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """config must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__config = t + if hasattr(self, '_set'): + self._set() + + def _unset_config(self): + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state (container) + + YANG Description: State Information. + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: State Information. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + config = __builtin__.property(_get_config, _set_config) + state = __builtin__.property(_get_state, _set_state) + + + _pyangbind_elements = {'config': config, 'state': state, } + + +class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip_config(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/ip/config. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Configuration data + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__ip_version','__source_ip_address','__source_ip_flow_label','__destination_ip_address','__destination_ip_flow_label','__dscp','__protocol','__hop_limit',) + + _yang_name = 'config' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True) + self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..254']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True) + self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:dscp', is_config=True) + self.__source_ip_address = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="source-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=True) + self.__destination_ip_address = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="destination-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=True) + self.__ip_version = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'unknown': {'value': 0}, u'ipv4': {'value': 1}, u'ipv6': {'value': 2}},), is_leaf=True, yang_name="ip-version", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-version', is_config=True) + self.__destination_ip_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="destination-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=True) + self.__source_ip_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="source-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'ip', u'config'] + + def _get_ip_version(self): + """ + Getter method for ip_version, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/ip_version (inet:ip-version) + + YANG Description: IP version of the header. + """ + return self.__ip_version + + def _set_ip_version(self, v, load=False): + """ + Setter method for ip_version, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/ip_version (inet:ip-version) + If this variable is read-only (config: false) in the + source YANG file, then _set_ip_version is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_ip_version() directly. + + YANG Description: IP version of the header. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'unknown': {'value': 0}, u'ipv4': {'value': 1}, u'ipv6': {'value': 2}},), is_leaf=True, yang_name="ip-version", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-version', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """ip_version must be of a type compatible with inet:ip-version""", + 'defined-type': "inet:ip-version", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'unknown': {'value': 0}, u'ipv4': {'value': 1}, u'ipv6': {'value': 2}},), is_leaf=True, yang_name="ip-version", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-version', is_config=True)""", + }) + + self.__ip_version = t + if hasattr(self, '_set'): + self._set() + + def _unset_ip_version(self): + self.__ip_version = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'unknown': {'value': 0}, u'ipv4': {'value': 1}, u'ipv6': {'value': 2}},), is_leaf=True, yang_name="ip-version", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-version', is_config=True) + + + def _get_source_ip_address(self): + """ + Getter method for source_ip_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/source_ip_address (inet:ip-prefix) + + YANG Description: Destination IP address prefix. + """ + return self.__source_ip_address + + def _set_source_ip_address(self, v, load=False): + """ + Setter method for source_ip_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/source_ip_address (inet:ip-prefix) + If this variable is read-only (config: false) in the + source YANG file, then _set_source_ip_address is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_source_ip_address() directly. + + YANG Description: Destination IP address prefix. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="source-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """source_ip_address must be of a type compatible with inet:ip-prefix""", + 'defined-type': "inet:ip-prefix", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="source-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=True)""", + }) + + self.__source_ip_address = t + if hasattr(self, '_set'): + self._set() + + def _unset_source_ip_address(self): + self.__source_ip_address = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="source-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=True) + + + def _get_source_ip_flow_label(self): + """ + Getter method for source_ip_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/source_ip_flow_label (inet:ipv6-flow-label) + + YANG Description: Source IPv6 Flow label. + """ + return self.__source_ip_flow_label + + def _set_source_ip_flow_label(self, v, load=False): + """ + Setter method for source_ip_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/source_ip_flow_label (inet:ipv6-flow-label) + If this variable is read-only (config: false) in the + source YANG file, then _set_source_ip_flow_label is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_source_ip_flow_label() directly. + + YANG Description: Source IPv6 Flow label. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="source-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """source_ip_flow_label must be of a type compatible with inet:ipv6-flow-label""", + 'defined-type': "inet:ipv6-flow-label", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="source-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=True)""", + }) + + self.__source_ip_flow_label = t + if hasattr(self, '_set'): + self._set() + + def _unset_source_ip_flow_label(self): + self.__source_ip_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="source-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=True) + + + def _get_destination_ip_address(self): + """ + Getter method for destination_ip_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/destination_ip_address (inet:ip-prefix) + + YANG Description: Destination IP address prefix. + """ + return self.__destination_ip_address + + def _set_destination_ip_address(self, v, load=False): + """ + Setter method for destination_ip_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/destination_ip_address (inet:ip-prefix) + If this variable is read-only (config: false) in the + source YANG file, then _set_destination_ip_address is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_destination_ip_address() directly. + + YANG Description: Destination IP address prefix. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="destination-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """destination_ip_address must be of a type compatible with inet:ip-prefix""", + 'defined-type': "inet:ip-prefix", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="destination-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=True)""", + }) + + self.__destination_ip_address = t + if hasattr(self, '_set'): + self._set() + + def _unset_destination_ip_address(self): + self.__destination_ip_address = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="destination-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=True) + + + def _get_destination_ip_flow_label(self): + """ + Getter method for destination_ip_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/destination_ip_flow_label (inet:ipv6-flow-label) + + YANG Description: Destination IPv6 Flow label. + """ + return self.__destination_ip_flow_label + + def _set_destination_ip_flow_label(self, v, load=False): + """ + Setter method for destination_ip_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/destination_ip_flow_label (inet:ipv6-flow-label) + If this variable is read-only (config: false) in the + source YANG file, then _set_destination_ip_flow_label is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_destination_ip_flow_label() directly. + + YANG Description: Destination IPv6 Flow label. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="destination-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """destination_ip_flow_label must be of a type compatible with inet:ipv6-flow-label""", + 'defined-type': "inet:ipv6-flow-label", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="destination-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=True)""", + }) + + self.__destination_ip_flow_label = t + if hasattr(self, '_set'): + self._set() + + def _unset_destination_ip_flow_label(self): + self.__destination_ip_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="destination-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=True) + + + def _get_dscp(self): + """ + Getter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/dscp (inet:dscp) + + YANG Description: Value of diffserv codepoint. + """ + return self.__dscp + + def _set_dscp(self, v, load=False): + """ + Setter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/dscp (inet:dscp) + If this variable is read-only (config: false) in the + source YANG file, then _set_dscp is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_dscp() directly. + + YANG Description: Value of diffserv codepoint. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:dscp', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """dscp must be of a type compatible with inet:dscp""", + 'defined-type': "inet:dscp", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:dscp', is_config=True)""", + }) + + self.__dscp = t + if hasattr(self, '_set'): + self._set() + + def _unset_dscp(self): + self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:dscp', is_config=True) + + + def _get_protocol(self): + """ + Getter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/protocol (oc-pkt-match-types:ip-protocol-type) + + YANG Description: Internet Protocol number. + """ + return self.__protocol + + def _set_protocol(self, v, load=False): + """ + Setter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/protocol (oc-pkt-match-types:ip-protocol-type) + If this variable is read-only (config: false) in the + source YANG file, then _set_protocol is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_protocol() directly. + + YANG Description: Internet Protocol number. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..254']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """protocol must be of a type compatible with oc-pkt-match-types:ip-protocol-type""", + 'defined-type': "oc-pkt-match-types:ip-protocol-type", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..254']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True)""", + }) + + self.__protocol = t + if hasattr(self, '_set'): + self._set() + + def _unset_protocol(self): + self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..254']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True) + + + def _get_hop_limit(self): + """ + Getter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/hop_limit (uint8) + + YANG Description: The IP packet's hop limit -- known as TTL (in hops) in +IPv4 packets, and hop limit in IPv6 + """ + return self.__hop_limit + + def _set_hop_limit(self, v, load=False): + """ + Setter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config/hop_limit (uint8) + If this variable is read-only (config: false) in the + source YANG file, then _set_hop_limit is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_hop_limit() directly. + + YANG Description: The IP packet's hop limit -- known as TTL (in hops) in +IPv4 packets, and hop limit in IPv6 + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """hop_limit must be of a type compatible with uint8""", + 'defined-type': "uint8", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)""", + }) + + self.__hop_limit = t + if hasattr(self, '_set'): + self._set() + + def _unset_hop_limit(self): + self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True) + + ip_version = __builtin__.property(_get_ip_version, _set_ip_version) + source_ip_address = __builtin__.property(_get_source_ip_address, _set_source_ip_address) + source_ip_flow_label = __builtin__.property(_get_source_ip_flow_label, _set_source_ip_flow_label) + destination_ip_address = __builtin__.property(_get_destination_ip_address, _set_destination_ip_address) + destination_ip_flow_label = __builtin__.property(_get_destination_ip_flow_label, _set_destination_ip_flow_label) + dscp = __builtin__.property(_get_dscp, _set_dscp) + protocol = __builtin__.property(_get_protocol, _set_protocol) + hop_limit = __builtin__.property(_get_hop_limit, _set_hop_limit) + + + _pyangbind_elements = {'ip_version': ip_version, 'source_ip_address': source_ip_address, 'source_ip_flow_label': source_ip_flow_label, 'destination_ip_address': destination_ip_address, 'destination_ip_flow_label': destination_ip_flow_label, 'dscp': dscp, 'protocol': protocol, 'hop_limit': hop_limit, } + + +class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/ip/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: State information + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__ip_version','__source_ip_address','__source_ip_flow_label','__destination_ip_address','__destination_ip_flow_label','__dscp','__protocol','__hop_limit',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False) + self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..254']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False) + self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:dscp', is_config=False) + self.__source_ip_address = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="source-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=False) + self.__destination_ip_address = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="destination-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=False) + self.__ip_version = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'unknown': {'value': 0}, u'ipv4': {'value': 1}, u'ipv6': {'value': 2}},), is_leaf=True, yang_name="ip-version", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-version', is_config=False) + self.__destination_ip_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="destination-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=False) + self.__source_ip_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="source-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'ip', u'state'] + + def _get_ip_version(self): + """ + Getter method for ip_version, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/ip_version (inet:ip-version) + + YANG Description: IP version of the header. + """ + return self.__ip_version + + def _set_ip_version(self, v, load=False): + """ + Setter method for ip_version, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/ip_version (inet:ip-version) + If this variable is read-only (config: false) in the + source YANG file, then _set_ip_version is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_ip_version() directly. + + YANG Description: IP version of the header. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'unknown': {'value': 0}, u'ipv4': {'value': 1}, u'ipv6': {'value': 2}},), is_leaf=True, yang_name="ip-version", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-version', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """ip_version must be of a type compatible with inet:ip-version""", + 'defined-type': "inet:ip-version", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'unknown': {'value': 0}, u'ipv4': {'value': 1}, u'ipv6': {'value': 2}},), is_leaf=True, yang_name="ip-version", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-version', is_config=False)""", + }) + + self.__ip_version = t + if hasattr(self, '_set'): + self._set() + + def _unset_ip_version(self): + self.__ip_version = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'unknown': {'value': 0}, u'ipv4': {'value': 1}, u'ipv6': {'value': 2}},), is_leaf=True, yang_name="ip-version", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-version', is_config=False) + + + def _get_source_ip_address(self): + """ + Getter method for source_ip_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/source_ip_address (inet:ip-prefix) + + YANG Description: Destination IP address prefix. + """ + return self.__source_ip_address + + def _set_source_ip_address(self, v, load=False): + """ + Setter method for source_ip_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/source_ip_address (inet:ip-prefix) + If this variable is read-only (config: false) in the + source YANG file, then _set_source_ip_address is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_source_ip_address() directly. + + YANG Description: Destination IP address prefix. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="source-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """source_ip_address must be of a type compatible with inet:ip-prefix""", + 'defined-type': "inet:ip-prefix", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="source-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=False)""", + }) + + self.__source_ip_address = t + if hasattr(self, '_set'): + self._set() + + def _unset_source_ip_address(self): + self.__source_ip_address = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="source-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=False) + + + def _get_source_ip_flow_label(self): + """ + Getter method for source_ip_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/source_ip_flow_label (inet:ipv6-flow-label) + + YANG Description: Source IPv6 Flow label. + """ + return self.__source_ip_flow_label + + def _set_source_ip_flow_label(self, v, load=False): + """ + Setter method for source_ip_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/source_ip_flow_label (inet:ipv6-flow-label) + If this variable is read-only (config: false) in the + source YANG file, then _set_source_ip_flow_label is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_source_ip_flow_label() directly. + + YANG Description: Source IPv6 Flow label. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="source-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """source_ip_flow_label must be of a type compatible with inet:ipv6-flow-label""", + 'defined-type': "inet:ipv6-flow-label", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="source-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=False)""", + }) + + self.__source_ip_flow_label = t + if hasattr(self, '_set'): + self._set() + + def _unset_source_ip_flow_label(self): + self.__source_ip_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="source-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=False) + + + def _get_destination_ip_address(self): + """ + Getter method for destination_ip_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/destination_ip_address (inet:ip-prefix) + + YANG Description: Destination IP address prefix. + """ + return self.__destination_ip_address + + def _set_destination_ip_address(self, v, load=False): + """ + Setter method for destination_ip_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/destination_ip_address (inet:ip-prefix) + If this variable is read-only (config: false) in the + source YANG file, then _set_destination_ip_address is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_destination_ip_address() directly. + + YANG Description: Destination IP address prefix. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="destination-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """destination_ip_address must be of a type compatible with inet:ip-prefix""", + 'defined-type': "inet:ip-prefix", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="destination-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=False)""", + }) + + self.__destination_ip_address = t + if hasattr(self, '_set'): + self._set() + + def _unset_destination_ip_address(self): + self.__destination_ip_address = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))'}),RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'}),], is_leaf=True, yang_name="destination-ip-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ip-prefix', is_config=False) + + + def _get_destination_ip_flow_label(self): + """ + Getter method for destination_ip_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/destination_ip_flow_label (inet:ipv6-flow-label) + + YANG Description: Destination IPv6 Flow label. + """ + return self.__destination_ip_flow_label + + def _set_destination_ip_flow_label(self, v, load=False): + """ + Setter method for destination_ip_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/destination_ip_flow_label (inet:ipv6-flow-label) + If this variable is read-only (config: false) in the + source YANG file, then _set_destination_ip_flow_label is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_destination_ip_flow_label() directly. + + YANG Description: Destination IPv6 Flow label. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="destination-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """destination_ip_flow_label must be of a type compatible with inet:ipv6-flow-label""", + 'defined-type': "inet:ipv6-flow-label", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="destination-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=False)""", + }) + + self.__destination_ip_flow_label = t + if hasattr(self, '_set'): + self._set() + + def _unset_destination_ip_flow_label(self): + self.__destination_ip_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': [u'0..1048575']}), is_leaf=True, yang_name="destination-ip-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:ipv6-flow-label', is_config=False) + + + def _get_dscp(self): + """ + Getter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/dscp (inet:dscp) + + YANG Description: Value of diffserv codepoint. + """ + return self.__dscp + + def _set_dscp(self, v, load=False): + """ + Setter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/dscp (inet:dscp) + If this variable is read-only (config: false) in the + source YANG file, then _set_dscp is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_dscp() directly. + + YANG Description: Value of diffserv codepoint. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:dscp', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """dscp must be of a type compatible with inet:dscp""", + 'defined-type': "inet:dscp", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:dscp', is_config=False)""", + }) + + self.__dscp = t + if hasattr(self, '_set'): + self._set() + + def _unset_dscp(self): + self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='inet:dscp', is_config=False) + + + def _get_protocol(self): + """ + Getter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/protocol (oc-pkt-match-types:ip-protocol-type) + + YANG Description: Internet Protocol number. + """ + return self.__protocol + + def _set_protocol(self, v, load=False): + """ + Setter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/protocol (oc-pkt-match-types:ip-protocol-type) + If this variable is read-only (config: false) in the + source YANG file, then _set_protocol is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_protocol() directly. + + YANG Description: Internet Protocol number. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..254']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """protocol must be of a type compatible with oc-pkt-match-types:ip-protocol-type""", + 'defined-type': "oc-pkt-match-types:ip-protocol-type", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..254']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False)""", + }) + + self.__protocol = t + if hasattr(self, '_set'): + self._set() + + def _unset_protocol(self): + self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..254']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'oc-pkt-match-types:IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_L2TP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_TCP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_AUTH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_GRE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_RSVP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_PIM': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_UDP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:IP_IGMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'IP_ICMP': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False) + + + def _get_hop_limit(self): + """ + Getter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/hop_limit (uint8) + + YANG Description: The IP packet's hop limit -- known as TTL (in hops) in +IPv4 packets, and hop limit in IPv6 + """ + return self.__hop_limit + + def _set_hop_limit(self, v, load=False): + """ + Setter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state/hop_limit (uint8) + If this variable is read-only (config: false) in the + source YANG file, then _set_hop_limit is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_hop_limit() directly. + + YANG Description: The IP packet's hop limit -- known as TTL (in hops) in +IPv4 packets, and hop limit in IPv6 + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """hop_limit must be of a type compatible with uint8""", + 'defined-type': "uint8", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)""", + }) + + self.__hop_limit = t + if hasattr(self, '_set'): + self._set() + + def _unset_hop_limit(self): + self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': [u'0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False) + + ip_version = __builtin__.property(_get_ip_version) + source_ip_address = __builtin__.property(_get_source_ip_address) + source_ip_flow_label = __builtin__.property(_get_source_ip_flow_label) + destination_ip_address = __builtin__.property(_get_destination_ip_address) + destination_ip_flow_label = __builtin__.property(_get_destination_ip_flow_label) + dscp = __builtin__.property(_get_dscp) + protocol = __builtin__.property(_get_protocol) + hop_limit = __builtin__.property(_get_hop_limit) + + + _pyangbind_elements = {'ip_version': ip_version, 'source_ip_address': source_ip_address, 'source_ip_flow_label': source_ip_flow_label, 'destination_ip_address': destination_ip_address, 'destination_ip_flow_label': destination_ip_flow_label, 'dscp': dscp, 'protocol': protocol, 'hop_limit': hop_limit, } + + +class yc_ip_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/ip. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Top level container + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__config','__state',) + + _yang_name = 'ip' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'ip'] + + def _get_config(self): + """ + Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config (container) + + YANG Description: Configuration data + """ + return self.__config + + def _set_config(self, v, load=False): + """ + Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/config (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_config is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_config() directly. + + YANG Description: Configuration data + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """config must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__config = t + if hasattr(self, '_set'): + self._set() + + def _unset_config(self): + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state (container) + + YANG Description: State information + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: State information + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + config = __builtin__.property(_get_config, _set_config) + state = __builtin__.property(_get_state, _set_state) + + + _pyangbind_elements = {'config': config, 'state': state, } + + +class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_config(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/transport/config. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Configuration data + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__source_port','__destination_port','__tcp_flags',) + + _yang_name = 'config' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__source_port = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True) + self.__tcp_flags = YANGDynClass(base=TypedListType(allowed_type=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True) + self.__destination_port = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'transport', u'config'] + + def _get_source_port(self): + """ + Getter method for source_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/source_port (oc-pkt-match-types:port-num-range) + + YANG Description: Source port or range + """ + return self.__source_port + + def _set_source_port(self, v, load=False): + """ + Setter method for source_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/source_port (oc-pkt-match-types:port-num-range) + If this variable is read-only (config: false) in the + source YANG file, then _set_source_port is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_source_port() directly. + + YANG Description: Source port or range + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """source_port must be of a type compatible with oc-pkt-match-types:port-num-range""", + 'defined-type': "oc-pkt-match-types:port-num-range", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True)""", + }) + + self.__source_port = t + if hasattr(self, '_set'): + self._set() + + def _unset_source_port(self): + self.__source_port = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True) + + + def _get_destination_port(self): + """ + Getter method for destination_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/destination_port (oc-pkt-match-types:port-num-range) + + YANG Description: Destination port or range + """ + return self.__destination_port + + def _set_destination_port(self, v, load=False): + """ + Setter method for destination_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/destination_port (oc-pkt-match-types:port-num-range) + If this variable is read-only (config: false) in the + source YANG file, then _set_destination_port is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_destination_port() directly. + + YANG Description: Destination port or range + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """destination_port must be of a type compatible with oc-pkt-match-types:port-num-range""", + 'defined-type': "oc-pkt-match-types:port-num-range", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True)""", + }) + + self.__destination_port = t + if hasattr(self, '_set'): + self._set() + + def _unset_destination_port(self): + self.__destination_port = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True) + + + def _get_tcp_flags(self): + """ + Getter method for tcp_flags, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/tcp_flags (identityref) + + YANG Description: List of TCP flags to match + """ + return self.__tcp_flags + + def _set_tcp_flags(self, v, load=False): + """ + Setter method for tcp_flags, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/tcp_flags (identityref) + If this variable is read-only (config: false) in the + source YANG file, then _set_tcp_flags is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_tcp_flags() directly. + + YANG Description: List of TCP flags to match + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=TypedListType(allowed_type=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """tcp_flags must be of a type compatible with identityref""", + 'defined-type': "openconfig-acl:identityref", + 'generated-type': """YANGDynClass(base=TypedListType(allowed_type=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)""", + }) + + self.__tcp_flags = t + if hasattr(self, '_set'): + self._set() + + def _unset_tcp_flags(self): + self.__tcp_flags = YANGDynClass(base=TypedListType(allowed_type=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True) + + source_port = __builtin__.property(_get_source_port, _set_source_port) + destination_port = __builtin__.property(_get_destination_port, _set_destination_port) + tcp_flags = __builtin__.property(_get_tcp_flags, _set_tcp_flags) + + + _pyangbind_elements = {'source_port': source_port, 'destination_port': destination_port, 'tcp_flags': tcp_flags, } + + +class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/transport/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: State data + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__source_port','__destination_port','__tcp_flags',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__source_port = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False) + self.__tcp_flags = YANGDynClass(base=TypedListType(allowed_type=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + self.__destination_port = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'transport', u'state'] + + def _get_source_port(self): + """ + Getter method for source_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/source_port (oc-pkt-match-types:port-num-range) + + YANG Description: Source port or range + """ + return self.__source_port + + def _set_source_port(self, v, load=False): + """ + Setter method for source_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/source_port (oc-pkt-match-types:port-num-range) + If this variable is read-only (config: false) in the + source YANG file, then _set_source_port is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_source_port() directly. + + YANG Description: Source port or range + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """source_port must be of a type compatible with oc-pkt-match-types:port-num-range""", + 'defined-type': "oc-pkt-match-types:port-num-range", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False)""", + }) + + self.__source_port = t + if hasattr(self, '_set'): + self._set() + + def _unset_source_port(self): + self.__source_port = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False) + + + def _get_destination_port(self): + """ + Getter method for destination_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/destination_port (oc-pkt-match-types:port-num-range) + + YANG Description: Destination port or range + """ + return self.__destination_port + + def _set_destination_port(self, v, load=False): + """ + Setter method for destination_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/destination_port (oc-pkt-match-types:port-num-range) + If this variable is read-only (config: false) in the + source YANG file, then _set_destination_port is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_destination_port() directly. + + YANG Description: Destination port or range + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """destination_port must be of a type compatible with oc-pkt-match-types:port-num-range""", + 'defined-type': "oc-pkt-match-types:port-num-range", + 'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False)""", + }) + + self.__destination_port = t + if hasattr(self, '_set'): + self._set() + + def _unset_destination_port(self): + self.__destination_port = YANGDynClass(base=[RestrictedClassType(base_type=unicode, restriction_dict={'pattern': u'^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)\\.\\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?[0-9]?)$'}),RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': [u'0..65535']}),RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False) + + + def _get_tcp_flags(self): + """ + Getter method for tcp_flags, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/tcp_flags (identityref) + + YANG Description: List of TCP flags to match + """ + return self.__tcp_flags + + def _set_tcp_flags(self, v, load=False): + """ + Setter method for tcp_flags, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/tcp_flags (identityref) + If this variable is read-only (config: false) in the + source YANG file, then _set_tcp_flags is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_tcp_flags() directly. + + YANG Description: List of TCP flags to match + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=TypedListType(allowed_type=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """tcp_flags must be of a type compatible with identityref""", + 'defined-type': "openconfig-acl:identityref", + 'generated-type': """YANGDynClass(base=TypedListType(allowed_type=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)""", + }) + + self.__tcp_flags = t + if hasattr(self, '_set'): + self._set() + + def _unset_tcp_flags(self): + self.__tcp_flags = YANGDynClass(base=TypedListType(allowed_type=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ACK': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_SYN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_CWR': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_URG': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_RST': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_FIN': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_ECE': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}, u'oc-pkt-match-types:TCP_PSH': {'@namespace': u'http://openconfig.net/yang/packet-match-types', '@module': u'openconfig-packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + + source_port = __builtin__.property(_get_source_port) + destination_port = __builtin__.property(_get_destination_port) + tcp_flags = __builtin__.property(_get_tcp_flags) + + + _pyangbind_elements = {'source_port': source_port, 'destination_port': destination_port, 'tcp_flags': tcp_flags, } + + +class yc_transport_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/transport. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Transport fields container + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__config','__state',) + + _yang_name = 'transport' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'transport'] + + def _get_config(self): + """ + Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config (container) + + YANG Description: Configuration data + """ + return self.__config + + def _set_config(self, v, load=False): + """ + Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_config is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_config() directly. + + YANG Description: Configuration data + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """config must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__config = t + if hasattr(self, '_set'): + self._set() + + def _unset_config(self): + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state (container) + + YANG Description: State data + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: State data + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + config = __builtin__.property(_get_config, _set_config) + state = __builtin__.property(_get_state, _set_state) + + + _pyangbind_elements = {'config': config, 'state': state, } + + +class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_config(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/input-interface/interface-ref/config. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Configured reference to interface / subinterface + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__interface','__subinterface',) + + _yang_name = 'config' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__interface = YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + self.__subinterface = YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'input-interface', u'interface-ref', u'config'] + + def _get_interface(self): + """ + Getter method for interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config/interface (leafref) + + YANG Description: Reference to a base interface. If a reference to a +subinterface is required, this leaf must be specified +to indicate the base interface. + """ + return self.__interface + + def _set_interface(self, v, load=False): + """ + Setter method for interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config/interface (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_interface is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_interface() directly. + + YANG Description: Reference to a base interface. If a reference to a +subinterface is required, this leaf must be specified +to indicate the base interface. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """interface must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""", + }) + + self.__interface = t + if hasattr(self, '_set'): + self._set() + + def _unset_interface(self): + self.__interface = YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + + def _get_subinterface(self): + """ + Getter method for subinterface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config/subinterface (leafref) + + YANG Description: Reference to a subinterface -- this requires the base +interface to be specified using the interface leaf in +this container. If only a reference to a base interface +is requuired, this leaf should not be set. + """ + return self.__subinterface + + def _set_subinterface(self, v, load=False): + """ + Setter method for subinterface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config/subinterface (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_subinterface is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_subinterface() directly. + + YANG Description: Reference to a subinterface -- this requires the base +interface to be specified using the interface leaf in +this container. If only a reference to a base interface +is requuired, this leaf should not be set. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """subinterface must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""", + }) + + self.__subinterface = t + if hasattr(self, '_set'): + self._set() + + def _unset_subinterface(self): + self.__subinterface = YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + interface = __builtin__.property(_get_interface, _set_interface) + subinterface = __builtin__.property(_get_subinterface, _set_subinterface) + + + _pyangbind_elements = {'interface': interface, 'subinterface': subinterface, } + + +class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/input-interface/interface-ref/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Operational state for interface-ref + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__interface','__subinterface',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__interface = YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + self.__subinterface = YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'input-interface', u'interface-ref', u'state'] + + def _get_interface(self): + """ + Getter method for interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state/interface (leafref) + + YANG Description: Reference to a base interface. If a reference to a +subinterface is required, this leaf must be specified +to indicate the base interface. + """ + return self.__interface + + def _set_interface(self, v, load=False): + """ + Setter method for interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state/interface (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_interface is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_interface() directly. + + YANG Description: Reference to a base interface. If a reference to a +subinterface is required, this leaf must be specified +to indicate the base interface. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """interface must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""", + }) + + self.__interface = t + if hasattr(self, '_set'): + self._set() + + def _unset_interface(self): + self.__interface = YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + + def _get_subinterface(self): + """ + Getter method for subinterface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state/subinterface (leafref) + + YANG Description: Reference to a subinterface -- this requires the base +interface to be specified using the interface leaf in +this container. If only a reference to a base interface +is requuired, this leaf should not be set. + """ + return self.__subinterface + + def _set_subinterface(self, v, load=False): + """ + Setter method for subinterface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state/subinterface (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_subinterface is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_subinterface() directly. + + YANG Description: Reference to a subinterface -- this requires the base +interface to be specified using the interface leaf in +this container. If only a reference to a base interface +is requuired, this leaf should not be set. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """subinterface must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""", + }) + + self.__subinterface = t + if hasattr(self, '_set'): + self._set() + + def _unset_subinterface(self): + self.__subinterface = YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + interface = __builtin__.property(_get_interface) + subinterface = __builtin__.property(_get_subinterface) + + + _pyangbind_elements = {'interface': interface, 'subinterface': subinterface, } + + +class yc_interface_ref_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/input-interface/interface-ref. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Reference to an interface or subinterface + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__config','__state',) + + _yang_name = 'interface-ref' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'input-interface', u'interface-ref'] + + def _get_config(self): + """ + Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config (container) + + YANG Description: Configured reference to interface / subinterface + """ + return self.__config + + def _set_config(self, v, load=False): + """ + Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_config is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_config() directly. + + YANG Description: Configured reference to interface / subinterface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """config must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__config = t + if hasattr(self, '_set'): + self._set() + + def _unset_config(self): + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state (container) + + YANG Description: Operational state for interface-ref + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: Operational state for interface-ref + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + config = __builtin__.property(_get_config, _set_config) + state = __builtin__.property(_get_state, _set_state) + + + _pyangbind_elements = {'config': config, 'state': state, } + + +class yc_input_interface_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/input-interface. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Input interface container + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__interface_ref',) + + _yang_name = 'input-interface' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__interface_ref = YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'input-interface'] + + def _get_interface_ref(self): + """ + Getter method for interface_ref, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref (container) + + YANG Description: Reference to an interface or subinterface + """ + return self.__interface_ref + + def _set_interface_ref(self, v, load=False): + """ + Setter method for interface_ref, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_interface_ref is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_interface_ref() directly. + + YANG Description: Reference to an interface or subinterface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_interface_ref_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """interface_ref must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__interface_ref = t + if hasattr(self, '_set'): + self._set() + + def _unset_interface_ref(self): + self.__interface_ref = YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + interface_ref = __builtin__.property(_get_interface_ref, _set_interface_ref) + + + _pyangbind_elements = {'interface_ref': interface_ref, } + + +class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_config(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/actions/config. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Config data for ACL actions + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__forwarding_action','__log_action',) + + _yang_name = 'config' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__forwarding_action = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True) + self.__log_action = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), default=unicode("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'actions', u'config'] + + def _get_forwarding_action(self): + """ + Getter method for forwarding_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config/forwarding_action (identityref) + + YANG Description: Specifies the forwarding action. One forwarding action +must be specified for each ACL entry + """ + return self.__forwarding_action + + def _set_forwarding_action(self, v, load=False): + """ + Setter method for forwarding_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config/forwarding_action (identityref) + If this variable is read-only (config: false) in the + source YANG file, then _set_forwarding_action is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_forwarding_action() directly. + + YANG Description: Specifies the forwarding action. One forwarding action +must be specified for each ACL entry + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """forwarding_action must be of a type compatible with identityref""", + 'defined-type': "openconfig-acl:identityref", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)""", + }) + + self.__forwarding_action = t + if hasattr(self, '_set'): + self._set() + + def _unset_forwarding_action(self): + self.__forwarding_action = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True) + + + def _get_log_action(self): + """ + Getter method for log_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config/log_action (identityref) + + YANG Description: Specifies the log action and destination for +matched packets. The default is not to log the +packet. + """ + return self.__log_action + + def _set_log_action(self, v, load=False): + """ + Setter method for log_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config/log_action (identityref) + If this variable is read-only (config: false) in the + source YANG file, then _set_log_action is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_log_action() directly. + + YANG Description: Specifies the log action and destination for +matched packets. The default is not to log the +packet. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), default=unicode("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """log_action must be of a type compatible with identityref""", + 'defined-type': "openconfig-acl:identityref", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), default=unicode("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)""", + }) + + self.__log_action = t + if hasattr(self, '_set'): + self._set() + + def _unset_log_action(self): + self.__log_action = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), default=unicode("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True) + + forwarding_action = __builtin__.property(_get_forwarding_action, _set_forwarding_action) + log_action = __builtin__.property(_get_log_action, _set_log_action) + + + _pyangbind_elements = {'forwarding_action': forwarding_action, 'log_action': log_action, } + + +class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/actions/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: State information for ACL actions + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__forwarding_action','__log_action',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__forwarding_action = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + self.__log_action = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), default=unicode("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'actions', u'state'] + + def _get_forwarding_action(self): + """ + Getter method for forwarding_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state/forwarding_action (identityref) + + YANG Description: Specifies the forwarding action. One forwarding action +must be specified for each ACL entry + """ + return self.__forwarding_action + + def _set_forwarding_action(self, v, load=False): + """ + Setter method for forwarding_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state/forwarding_action (identityref) + If this variable is read-only (config: false) in the + source YANG file, then _set_forwarding_action is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_forwarding_action() directly. + + YANG Description: Specifies the forwarding action. One forwarding action +must be specified for each ACL entry + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """forwarding_action must be of a type compatible with identityref""", + 'defined-type': "openconfig-acl:identityref", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)""", + }) + + self.__forwarding_action = t + if hasattr(self, '_set'): + self._set() + + def _unset_forwarding_action(self): + self.__forwarding_action = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'REJECT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:ACCEPT': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:DROP': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + + + def _get_log_action(self): + """ + Getter method for log_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state/log_action (identityref) + + YANG Description: Specifies the log action and destination for +matched packets. The default is not to log the +packet. + """ + return self.__log_action + + def _set_log_action(self, v, load=False): + """ + Setter method for log_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state/log_action (identityref) + If this variable is read-only (config: false) in the + source YANG file, then _set_log_action is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_log_action() directly. + + YANG Description: Specifies the log action and destination for +matched packets. The default is not to log the +packet. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), default=unicode("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """log_action must be of a type compatible with identityref""", + 'defined-type': "openconfig-acl:identityref", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), default=unicode("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)""", + }) + + self.__log_action = t + if hasattr(self, '_set'): + self._set() + + def _unset_log_action(self): + self.__log_action = YANGDynClass(base=RestrictedClassType(base_type=unicode, restriction_type="dict_key", restriction_arg={u'LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_SYSLOG': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}, u'oc-acl:LOG_NONE': {'@namespace': u'http://openconfig.net/yang/acl', '@module': u'openconfig-acl'}},), default=unicode("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False) + + forwarding_action = __builtin__.property(_get_forwarding_action) + log_action = __builtin__.property(_get_log_action) + + + _pyangbind_elements = {'forwarding_action': forwarding_action, 'log_action': log_action, } + + +class yc_actions_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/actions. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Enclosing container for list of ACL actions associated +with an entry + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__config','__state',) + + _yang_name = 'actions' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry', u'actions'] + + def _get_config(self): + """ + Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config (container) + + YANG Description: Config data for ACL actions + """ + return self.__config + + def _set_config(self, v, load=False): + """ + Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_config is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_config() directly. + + YANG Description: Config data for ACL actions + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """config must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__config = t + if hasattr(self, '_set'): + self._set() + + def _unset_config(self): + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state (container) + + YANG Description: State information for ACL actions + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: State information for ACL actions + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + config = __builtin__.property(_get_config, _set_config) + state = __builtin__.property(_get_state, _set_state) + + + _pyangbind_elements = {'config': config, 'state': state, } + + +class yc_acl_entry_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: List of ACL entries comprising an ACL set + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__sequence_id','__config','__state','__l2','__ip','__transport','__input_interface','__actions',) + + _yang_name = 'acl-entry' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__ip = YANGDynClass(base=yc_ip_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip, is_container='container', yang_name="ip", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__input_interface = YANGDynClass(base=yc_input_interface_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface, is_container='container', yang_name="input-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__actions = YANGDynClass(base=yc_actions_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__sequence_id = YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + self.__l2 = YANGDynClass(base=yc_l2_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2, is_container='container', yang_name="l2", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__transport = YANGDynClass(base=yc_transport_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport, is_container='container', yang_name="transport", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries', u'acl-entry'] + + def _get_sequence_id(self): + """ + Getter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/sequence_id (leafref) + + YANG Description: references the list key + """ + return self.__sequence_id + + def _set_sequence_id(self, v, load=False): + """ + Setter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/sequence_id (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_sequence_id is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_sequence_id() directly. + + YANG Description: references the list key + """ + parent = getattr(self, "_parent", None) + if parent is not None and load is False: + raise AttributeError("Cannot set keys directly when" + + " within an instantiated list") + + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """sequence_id must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""", + }) + + self.__sequence_id = t + if hasattr(self, '_set'): + self._set() + + def _unset_sequence_id(self): + self.__sequence_id = YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + + def _get_config(self): + """ + Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config (container) + + YANG Description: Access list entries config + """ + return self.__config + + def _set_config(self, v, load=False): + """ + Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_config is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_config() directly. + + YANG Description: Access list entries config + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """config must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__config = t + if hasattr(self, '_set'): + self._set() + + def _unset_config(self): + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state (container) + + YANG Description: State information for ACL entries + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: State information for ACL entries + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_l2(self): + """ + Getter method for l2, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2 (container) + + YANG Description: Ethernet header fields + """ + return self.__l2 + + def _set_l2(self, v, load=False): + """ + Setter method for l2, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2 (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_l2 is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_l2() directly. + + YANG Description: Ethernet header fields + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_l2_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2, is_container='container', yang_name="l2", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """l2 must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_l2_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2, is_container='container', yang_name="l2", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__l2 = t + if hasattr(self, '_set'): + self._set() + + def _unset_l2(self): + self.__l2 = YANGDynClass(base=yc_l2_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2, is_container='container', yang_name="l2", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_ip(self): + """ + Getter method for ip, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip (container) + + YANG Description: Top level container + """ + return self.__ip + + def _set_ip(self, v, load=False): + """ + Setter method for ip, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ip (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_ip is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_ip() directly. + + YANG Description: Top level container + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_ip_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip, is_container='container', yang_name="ip", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """ip must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_ip_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip, is_container='container', yang_name="ip", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__ip = t + if hasattr(self, '_set'): + self._set() + + def _unset_ip(self): + self.__ip = YANGDynClass(base=yc_ip_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ip, is_container='container', yang_name="ip", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_transport(self): + """ + Getter method for transport, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport (container) + + YANG Description: Transport fields container + """ + return self.__transport + + def _set_transport(self, v, load=False): + """ + Setter method for transport, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_transport is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_transport() directly. + + YANG Description: Transport fields container + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_transport_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport, is_container='container', yang_name="transport", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """transport must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_transport_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport, is_container='container', yang_name="transport", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__transport = t + if hasattr(self, '_set'): + self._set() + + def _unset_transport(self): + self.__transport = YANGDynClass(base=yc_transport_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport, is_container='container', yang_name="transport", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_input_interface(self): + """ + Getter method for input_interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface (container) + + YANG Description: Input interface container + """ + return self.__input_interface + + def _set_input_interface(self, v, load=False): + """ + Setter method for input_interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_input_interface is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_input_interface() directly. + + YANG Description: Input interface container + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_input_interface_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface, is_container='container', yang_name="input-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """input_interface must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_input_interface_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface, is_container='container', yang_name="input-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__input_interface = t + if hasattr(self, '_set'): + self._set() + + def _unset_input_interface(self): + self.__input_interface = YANGDynClass(base=yc_input_interface_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface, is_container='container', yang_name="input-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_actions(self): + """ + Getter method for actions, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions (container) + + YANG Description: Enclosing container for list of ACL actions associated +with an entry + """ + return self.__actions + + def _set_actions(self, v, load=False): + """ + Setter method for actions, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_actions is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_actions() directly. + + YANG Description: Enclosing container for list of ACL actions associated +with an entry + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_actions_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """actions must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_actions_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__actions = t + if hasattr(self, '_set'): + self._set() + + def _unset_actions(self): + self.__actions = YANGDynClass(base=yc_actions_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + sequence_id = __builtin__.property(_get_sequence_id, _set_sequence_id) + config = __builtin__.property(_get_config, _set_config) + state = __builtin__.property(_get_state, _set_state) + l2 = __builtin__.property(_get_l2, _set_l2) + ip = __builtin__.property(_get_ip, _set_ip) + transport = __builtin__.property(_get_transport, _set_transport) + input_interface = __builtin__.property(_get_input_interface, _set_input_interface) + actions = __builtin__.property(_get_actions, _set_actions) + + + _pyangbind_elements = {'sequence_id': sequence_id, 'config': config, 'state': state, 'l2': l2, 'ip': ip, 'transport': transport, 'input_interface': input_interface, 'actions': actions, } + + +class yc_acl_entries_openconfig_acl__acl_acl_sets_acl_set_acl_entries(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Access list entries container + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__acl_entry',) + + _yang_name = 'acl-entries' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set', u'acl-entries'] + + def _get_acl_entry(self): + """ + Getter method for acl_entry, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry (list) + + YANG Description: List of ACL entries comprising an ACL set + """ + return self.__acl_entry + + def _set_acl_entry(self, v, load=False): + """ + Setter method for acl_entry, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry (list) + If this variable is read-only (config: false) in the + source YANG file, then _set_acl_entry is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_acl_entry() directly. + + YANG Description: List of ACL entries comprising an ACL set + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """acl_entry must be of a type compatible with list""", + 'defined-type': "list", + 'generated-type': """YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)""", + }) + + self.__acl_entry = t + if hasattr(self, '_set'): + self._set() + + def _unset_acl_entry(self): + self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + + acl_entry = __builtin__.property(_get_acl_entry, _set_acl_entry) + + + _pyangbind_elements = {'acl_entry': acl_entry, } + + +class yc_acl_set_openconfig_acl__acl_acl_sets_acl_set(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: List of ACL sets, each comprising of a list of ACL +entries + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__name','__config','__state','__acl_entries',) + + _yang_name = 'acl-set' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__name = YANGDynClass(base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_acl_sets_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets', u'acl-set'] + + def _get_name(self): + """ + Getter method for name, mapped from YANG variable /acl/acl_sets/acl_set/name (leafref) + + YANG Description: Reference to the name list key + """ + return self.__name + + def _set_name(self, v, load=False): + """ + Setter method for name, mapped from YANG variable /acl/acl_sets/acl_set/name (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_name is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_name() directly. + + YANG Description: Reference to the name list key + """ + parent = getattr(self, "_parent", None) + if parent is not None and load is False: + raise AttributeError("Cannot set keys directly when" + + " within an instantiated list") + + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """name must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""", + }) + + self.__name = t + if hasattr(self, '_set'): + self._set() + + def _unset_name(self): + self.__name = YANGDynClass(base=unicode, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + + def _get_config(self): + """ + Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/config (container) + + YANG Description: Access list config + """ + return self.__config + + def _set_config(self, v, load=False): + """ + Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/config (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_config is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_config() directly. + + YANG Description: Access list config + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """config must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__config = t + if hasattr(self, '_set'): + self._set() + + def _unset_config(self): + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/state (container) + + YANG Description: Access list state information + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: Access list state information + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_acl_entries(self): + """ + Getter method for acl_entries, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries (container) + + YANG Description: Access list entries container + """ + return self.__acl_entries + + def _set_acl_entries(self, v, load=False): + """ + Setter method for acl_entries, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_acl_entries is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_acl_entries() directly. + + YANG Description: Access list entries container + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_acl_entries_openconfig_acl__acl_acl_sets_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """acl_entries must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_acl_sets_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__acl_entries = t + if hasattr(self, '_set'): + self._set() + + def _unset_acl_entries(self): + self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_acl_sets_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + name = __builtin__.property(_get_name, _set_name) + config = __builtin__.property(_get_config, _set_config) + state = __builtin__.property(_get_state, _set_state) + acl_entries = __builtin__.property(_get_acl_entries, _set_acl_entries) + + + _pyangbind_elements = {'name': name, 'config': config, 'state': state, 'acl_entries': acl_entries, } + + +class yc_acl_sets_openconfig_acl__acl_acl_sets(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/acl-sets. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Access list entries variables enclosing container + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__acl_set',) + + _yang_name = 'acl-sets' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__acl_set = YANGDynClass(base=YANGListType("name",yc_acl_set_openconfig_acl__acl_acl_sets_acl_set, yang_name="acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'acl-sets'] + + def _get_acl_set(self): + """ + Getter method for acl_set, mapped from YANG variable /acl/acl_sets/acl_set (list) + + YANG Description: List of ACL sets, each comprising of a list of ACL +entries + """ + return self.__acl_set + + def _set_acl_set(self, v, load=False): + """ + Setter method for acl_set, mapped from YANG variable /acl/acl_sets/acl_set (list) + If this variable is read-only (config: false) in the + source YANG file, then _set_acl_set is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_acl_set() directly. + + YANG Description: List of ACL sets, each comprising of a list of ACL +entries + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=YANGListType("name",yc_acl_set_openconfig_acl__acl_acl_sets_acl_set, yang_name="acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """acl_set must be of a type compatible with list""", + 'defined-type': "list", + 'generated-type': """YANGDynClass(base=YANGListType("name",yc_acl_set_openconfig_acl__acl_acl_sets_acl_set, yang_name="acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)""", + }) + + self.__acl_set = t + if hasattr(self, '_set'): + self._set() + + def _unset_acl_set(self): + self.__acl_set = YANGDynClass(base=YANGListType("name",yc_acl_set_openconfig_acl__acl_acl_sets_acl_set, yang_name="acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + + acl_set = __builtin__.property(_get_acl_set, _set_acl_set) + + + _pyangbind_elements = {'acl_set': acl_set, } + + +class yc_config_openconfig_acl__acl_interfaces_interface_config(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/config. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Configuration for ACL per-interface data + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__id',) + + _yang_name = 'config' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__id = YANGDynClass(base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'config'] + + def _get_id(self): + """ + Getter method for id, mapped from YANG variable /acl/interfaces/interface/config/id (oc-if:interface-id) + + YANG Description: User-defined identifier for the interface -- a common +convention could be '.' + """ + return self.__id + + def _set_id(self, v, load=False): + """ + Setter method for id, mapped from YANG variable /acl/interfaces/interface/config/id (oc-if:interface-id) + If this variable is read-only (config: false) in the + source YANG file, then _set_id is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_id() directly. + + YANG Description: User-defined identifier for the interface -- a common +convention could be '.' + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """id must be of a type compatible with oc-if:interface-id""", + 'defined-type': "oc-if:interface-id", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=True)""", + }) + + self.__id = t + if hasattr(self, '_set'): + self._set() + + def _unset_id(self): + self.__id = YANGDynClass(base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=True) + + id = __builtin__.property(_get_id, _set_id) + + + _pyangbind_elements = {'id': id, } + + +class yc_state_openconfig_acl__acl_interfaces_interface_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Operational state for ACL per-interface data + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__id',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__id = YANGDynClass(base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'state'] + + def _get_id(self): + """ + Getter method for id, mapped from YANG variable /acl/interfaces/interface/state/id (oc-if:interface-id) + + YANG Description: User-defined identifier for the interface -- a common +convention could be '.' + """ + return self.__id + + def _set_id(self, v, load=False): + """ + Setter method for id, mapped from YANG variable /acl/interfaces/interface/state/id (oc-if:interface-id) + If this variable is read-only (config: false) in the + source YANG file, then _set_id is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_id() directly. + + YANG Description: User-defined identifier for the interface -- a common +convention could be '.' + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """id must be of a type compatible with oc-if:interface-id""", + 'defined-type': "oc-if:interface-id", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=False)""", + }) + + self.__id = t + if hasattr(self, '_set'): + self._set() + + def _unset_id(self): + self.__id = YANGDynClass(base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=False) + + id = __builtin__.property(_get_id) + + + _pyangbind_elements = {'id': id, } + + +class yc_config_openconfig_acl__acl_interfaces_interface_interface_ref_config(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/interface-ref/config. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Configured reference to interface / subinterface + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__interface','__subinterface',) + + _yang_name = 'config' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__interface = YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + self.__subinterface = YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'interface-ref', u'config'] + + def _get_interface(self): + """ + Getter method for interface, mapped from YANG variable /acl/interfaces/interface/interface_ref/config/interface (leafref) + + YANG Description: Reference to a base interface. If a reference to a +subinterface is required, this leaf must be specified +to indicate the base interface. + """ + return self.__interface + + def _set_interface(self, v, load=False): + """ + Setter method for interface, mapped from YANG variable /acl/interfaces/interface/interface_ref/config/interface (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_interface is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_interface() directly. + + YANG Description: Reference to a base interface. If a reference to a +subinterface is required, this leaf must be specified +to indicate the base interface. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """interface must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""", + }) + + self.__interface = t + if hasattr(self, '_set'): + self._set() + + def _unset_interface(self): + self.__interface = YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + + def _get_subinterface(self): + """ + Getter method for subinterface, mapped from YANG variable /acl/interfaces/interface/interface_ref/config/subinterface (leafref) + + YANG Description: Reference to a subinterface -- this requires the base +interface to be specified using the interface leaf in +this container. If only a reference to a base interface +is requuired, this leaf should not be set. + """ + return self.__subinterface + + def _set_subinterface(self, v, load=False): + """ + Setter method for subinterface, mapped from YANG variable /acl/interfaces/interface/interface_ref/config/subinterface (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_subinterface is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_subinterface() directly. + + YANG Description: Reference to a subinterface -- this requires the base +interface to be specified using the interface leaf in +this container. If only a reference to a base interface +is requuired, this leaf should not be set. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """subinterface must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""", + }) + + self.__subinterface = t + if hasattr(self, '_set'): + self._set() + + def _unset_subinterface(self): + self.__subinterface = YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + interface = __builtin__.property(_get_interface, _set_interface) + subinterface = __builtin__.property(_get_subinterface, _set_subinterface) + + + _pyangbind_elements = {'interface': interface, 'subinterface': subinterface, } + + +class yc_state_openconfig_acl__acl_interfaces_interface_interface_ref_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/interface-ref/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Operational state for interface-ref + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__interface','__subinterface',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__interface = YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + self.__subinterface = YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'interface-ref', u'state'] + + def _get_interface(self): + """ + Getter method for interface, mapped from YANG variable /acl/interfaces/interface/interface_ref/state/interface (leafref) + + YANG Description: Reference to a base interface. If a reference to a +subinterface is required, this leaf must be specified +to indicate the base interface. + """ + return self.__interface + + def _set_interface(self, v, load=False): + """ + Setter method for interface, mapped from YANG variable /acl/interfaces/interface/interface_ref/state/interface (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_interface is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_interface() directly. + + YANG Description: Reference to a base interface. If a reference to a +subinterface is required, this leaf must be specified +to indicate the base interface. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """interface must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""", + }) + + self.__interface = t + if hasattr(self, '_set'): + self._set() + + def _unset_interface(self): + self.__interface = YANGDynClass(base=unicode, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + + def _get_subinterface(self): + """ + Getter method for subinterface, mapped from YANG variable /acl/interfaces/interface/interface_ref/state/subinterface (leafref) + + YANG Description: Reference to a subinterface -- this requires the base +interface to be specified using the interface leaf in +this container. If only a reference to a base interface +is requuired, this leaf should not be set. + """ + return self.__subinterface + + def _set_subinterface(self, v, load=False): + """ + Setter method for subinterface, mapped from YANG variable /acl/interfaces/interface/interface_ref/state/subinterface (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_subinterface is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_subinterface() directly. + + YANG Description: Reference to a subinterface -- this requires the base +interface to be specified using the interface leaf in +this container. If only a reference to a base interface +is requuired, this leaf should not be set. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """subinterface must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""", + }) + + self.__subinterface = t + if hasattr(self, '_set'): + self._set() + + def _unset_subinterface(self): + self.__subinterface = YANGDynClass(base=unicode, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + interface = __builtin__.property(_get_interface) + subinterface = __builtin__.property(_get_subinterface) + + + _pyangbind_elements = {'interface': interface, 'subinterface': subinterface, } + + +class yc_interface_ref_openconfig_acl__acl_interfaces_interface_interface_ref(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/interface-ref. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Reference to an interface or subinterface + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__config','__state',) + + _yang_name = 'interface-ref' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'interface-ref'] + + def _get_config(self): + """ + Getter method for config, mapped from YANG variable /acl/interfaces/interface/interface_ref/config (container) + + YANG Description: Configured reference to interface / subinterface + """ + return self.__config + + def _set_config(self, v, load=False): + """ + Setter method for config, mapped from YANG variable /acl/interfaces/interface/interface_ref/config (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_config is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_config() directly. + + YANG Description: Configured reference to interface / subinterface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_interfaces_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """config must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__config = t + if hasattr(self, '_set'): + self._set() + + def _unset_config(self): + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/interfaces/interface/interface_ref/state (container) + + YANG Description: Operational state for interface-ref + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/interfaces/interface/interface_ref/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: Operational state for interface-ref + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + config = __builtin__.property(_get_config, _set_config) + state = __builtin__.property(_get_state, _set_state) + + + _pyangbind_elements = {'config': config, 'state': state, } + + +class yc_config_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_config(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set/config. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Configuration data + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__set_name',) + + _yang_name = 'config' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'ingress-acl-sets', u'ingress-acl-set', u'config'] + + def _get_set_name(self): + """ + Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/config/set_name (leafref) + + YANG Description: Reference to the ACL set applied on ingress + """ + return self.__set_name + + def _set_set_name(self, v, load=False): + """ + Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/config/set_name (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_set_name is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_set_name() directly. + + YANG Description: Reference to the ACL set applied on ingress + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """set_name must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""", + }) + + self.__set_name = t + if hasattr(self, '_set'): + self._set() + + def _unset_set_name(self): + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + set_name = __builtin__.property(_get_set_name, _set_set_name) + + + _pyangbind_elements = {'set_name': set_name, } + + +class yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Operational state data for interface ingress ACLs + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__set_name',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'ingress-acl-sets', u'ingress-acl-set', u'state'] + + def _get_set_name(self): + """ + Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/state/set_name (leafref) + + YANG Description: Reference to the ACL set applied on ingress + """ + return self.__set_name + + def _set_set_name(self, v, load=False): + """ + Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/state/set_name (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_set_name is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_set_name() directly. + + YANG Description: Reference to the ACL set applied on ingress + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """set_name must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""", + }) + + self.__set_name = t + if hasattr(self, '_set'): + self._set() + + def _unset_set_name(self): + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + set_name = __builtin__.property(_get_set_name) + + + _pyangbind_elements = {'set_name': set_name, } + + +class yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set/acl-entries/acl-entry/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Operational state data for per-interface ACL entries + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__sequence_id','__matched_packets','__matched_octets',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__sequence_id = YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'ingress-acl-sets', u'ingress-acl-set', u'acl-entries', u'acl-entry', u'state'] + + def _get_sequence_id(self): + """ + Getter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/sequence_id (leafref) + + YANG Description: Reference to an entry in the ACL set applied to an +interface + """ + return self.__sequence_id + + def _set_sequence_id(self, v, load=False): + """ + Setter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/sequence_id (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_sequence_id is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_sequence_id() directly. + + YANG Description: Reference to an entry in the ACL set applied to an +interface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """sequence_id must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""", + }) + + self.__sequence_id = t + if hasattr(self, '_set'): + self._set() + + def _unset_sequence_id(self): + self.__sequence_id = YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + + def _get_matched_packets(self): + """ + Getter method for matched_packets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/matched_packets (yang:counter64) + + YANG Description: Count of the number of packets matching the current ACL +entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + return self.__matched_packets + + def _set_matched_packets(self, v, load=False): + """ + Setter method for matched_packets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/matched_packets (yang:counter64) + If this variable is read-only (config: false) in the + source YANG file, then _set_matched_packets is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_matched_packets() directly. + + YANG Description: Count of the number of packets matching the current ACL +entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """matched_packets must be of a type compatible with yang:counter64""", + 'defined-type': "yang:counter64", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False)""", + }) + + self.__matched_packets = t + if hasattr(self, '_set'): + self._set() + + def _unset_matched_packets(self): + self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + + + def _get_matched_octets(self): + """ + Getter method for matched_octets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/matched_octets (yang:counter64) + + YANG Description: Count of the number of octets (bytes) matching the current +ACL entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + return self.__matched_octets + + def _set_matched_octets(self, v, load=False): + """ + Setter method for matched_octets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/matched_octets (yang:counter64) + If this variable is read-only (config: false) in the + source YANG file, then _set_matched_octets is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_matched_octets() directly. + + YANG Description: Count of the number of octets (bytes) matching the current +ACL entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """matched_octets must be of a type compatible with yang:counter64""", + 'defined-type': "yang:counter64", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False)""", + }) + + self.__matched_octets = t + if hasattr(self, '_set'): + self._set() + + def _unset_matched_octets(self): + self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + + sequence_id = __builtin__.property(_get_sequence_id) + matched_packets = __builtin__.property(_get_matched_packets) + matched_octets = __builtin__.property(_get_matched_octets) + + + _pyangbind_elements = {'sequence_id': sequence_id, 'matched_packets': matched_packets, 'matched_octets': matched_octets, } + + +class yc_acl_entry_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set/acl-entries/acl-entry. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: List of ACL entries assigned to an interface + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__sequence_id','__state',) + + _yang_name = 'acl-entry' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__sequence_id = YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'ingress-acl-sets', u'ingress-acl-set', u'acl-entries', u'acl-entry'] + + def _get_sequence_id(self): + """ + Getter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/sequence_id (leafref) + + YANG Description: Reference to per-interface acl entry key + """ + return self.__sequence_id + + def _set_sequence_id(self, v, load=False): + """ + Setter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/sequence_id (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_sequence_id is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_sequence_id() directly. + + YANG Description: Reference to per-interface acl entry key + """ + parent = getattr(self, "_parent", None) + if parent is not None and load is False: + raise AttributeError("Cannot set keys directly when" + + " within an instantiated list") + + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """sequence_id must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""", + }) + + self.__sequence_id = t + if hasattr(self, '_set'): + self._set() + + def _unset_sequence_id(self): + self.__sequence_id = YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state (container) + + YANG Description: Operational state data for per-interface ACL entries + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: Operational state data for per-interface ACL entries + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False) + + sequence_id = __builtin__.property(_get_sequence_id) + state = __builtin__.property(_get_state) + + + _pyangbind_elements = {'sequence_id': sequence_id, 'state': state, } + + +class yc_acl_entries_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set/acl-entries. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Enclosing container for list of references to ACLs + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__acl_entry',) + + _yang_name = 'acl-entries' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'ingress-acl-sets', u'ingress-acl-set', u'acl-entries'] + + def _get_acl_entry(self): + """ + Getter method for acl_entry, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry (list) + + YANG Description: List of ACL entries assigned to an interface + """ + return self.__acl_entry + + def _set_acl_entry(self, v, load=False): + """ + Setter method for acl_entry, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry (list) + If this variable is read-only (config: false) in the + source YANG file, then _set_acl_entry is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_acl_entry() directly. + + YANG Description: List of ACL entries assigned to an interface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """acl_entry must be of a type compatible with list""", + 'defined-type': "list", + 'generated-type': """YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False)""", + }) + + self.__acl_entry = t + if hasattr(self, '_set'): + self._set() + + def _unset_acl_entry(self): + self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False) + + acl_entry = __builtin__.property(_get_acl_entry) + + + _pyangbind_elements = {'acl_entry': acl_entry, } + + +class yc_ingress_acl_set_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: List of ingress ACLs on the interface + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__set_name','__config','__state','__acl_entries',) + + _yang_name = 'ingress-acl-set' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'ingress-acl-sets', u'ingress-acl-set'] + + def _get_set_name(self): + """ + Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/set_name (leafref) + + YANG Description: Reference to set name list key + """ + return self.__set_name + + def _set_set_name(self, v, load=False): + """ + Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/set_name (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_set_name is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_set_name() directly. + + YANG Description: Reference to set name list key + """ + parent = getattr(self, "_parent", None) + if parent is not None and load is False: + raise AttributeError("Cannot set keys directly when" + + " within an instantiated list") + + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """set_name must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""", + }) + + self.__set_name = t + if hasattr(self, '_set'): + self._set() + + def _unset_set_name(self): + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + + def _get_config(self): + """ + Getter method for config, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/config (container) + + YANG Description: Configuration data + """ + return self.__config + + def _set_config(self, v, load=False): + """ + Setter method for config, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/config (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_config is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_config() directly. + + YANG Description: Configuration data + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """config must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__config = t + if hasattr(self, '_set'): + self._set() + + def _unset_config(self): + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/state (container) + + YANG Description: Operational state data for interface ingress ACLs + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: Operational state data for interface ingress ACLs + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_acl_entries(self): + """ + Getter method for acl_entries, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries (container) + + YANG Description: Enclosing container for list of references to ACLs + """ + return self.__acl_entries + + def _set_acl_entries(self, v, load=False): + """ + Setter method for acl_entries, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_acl_entries is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_acl_entries() directly. + + YANG Description: Enclosing container for list of references to ACLs + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """acl_entries must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__acl_entries = t + if hasattr(self, '_set'): + self._set() + + def _unset_acl_entries(self): + self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + set_name = __builtin__.property(_get_set_name, _set_set_name) + config = __builtin__.property(_get_config, _set_config) + state = __builtin__.property(_get_state, _set_state) + acl_entries = __builtin__.property(_get_acl_entries, _set_acl_entries) + + + _pyangbind_elements = {'set_name': set_name, 'config': config, 'state': state, 'acl_entries': acl_entries, } + + +class yc_ingress_acl_sets_openconfig_acl__acl_interfaces_interface_ingress_acl_sets(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Enclosing container the list of ingress ACLs on the +interface + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__ingress_acl_set',) + + _yang_name = 'ingress-acl-sets' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__ingress_acl_set = YANGDynClass(base=YANGListType("set_name",yc_ingress_acl_set_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set, yang_name="ingress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name', extensions=None), is_container='list', yang_name="ingress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'ingress-acl-sets'] + + def _get_ingress_acl_set(self): + """ + Getter method for ingress_acl_set, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set (list) + + YANG Description: List of ingress ACLs on the interface + """ + return self.__ingress_acl_set + + def _set_ingress_acl_set(self, v, load=False): + """ + Setter method for ingress_acl_set, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set (list) + If this variable is read-only (config: false) in the + source YANG file, then _set_ingress_acl_set is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_ingress_acl_set() directly. + + YANG Description: List of ingress ACLs on the interface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=YANGListType("set_name",yc_ingress_acl_set_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set, yang_name="ingress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name', extensions=None), is_container='list', yang_name="ingress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """ingress_acl_set must be of a type compatible with list""", + 'defined-type': "list", + 'generated-type': """YANGDynClass(base=YANGListType("set_name",yc_ingress_acl_set_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set, yang_name="ingress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name', extensions=None), is_container='list', yang_name="ingress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)""", + }) + + self.__ingress_acl_set = t + if hasattr(self, '_set'): + self._set() + + def _unset_ingress_acl_set(self): + self.__ingress_acl_set = YANGDynClass(base=YANGListType("set_name",yc_ingress_acl_set_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set, yang_name="ingress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name', extensions=None), is_container='list', yang_name="ingress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + + ingress_acl_set = __builtin__.property(_get_ingress_acl_set, _set_ingress_acl_set) + + + _pyangbind_elements = {'ingress_acl_set': ingress_acl_set, } + + +class yc_config_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_config(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set/config. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Configuration data + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__set_name',) + + _yang_name = 'config' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'egress-acl-sets', u'egress-acl-set', u'config'] + + def _get_set_name(self): + """ + Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/config/set_name (leafref) + + YANG Description: Reference to the ACL set applied on egress + """ + return self.__set_name + + def _set_set_name(self, v, load=False): + """ + Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/config/set_name (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_set_name is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_set_name() directly. + + YANG Description: Reference to the ACL set applied on egress + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """set_name must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""", + }) + + self.__set_name = t + if hasattr(self, '_set'): + self._set() + + def _unset_set_name(self): + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + set_name = __builtin__.property(_get_set_name, _set_set_name) + + + _pyangbind_elements = {'set_name': set_name, } + + +class yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Operational state data for interface egress ACLs + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__set_name',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'egress-acl-sets', u'egress-acl-set', u'state'] + + def _get_set_name(self): + """ + Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/state/set_name (leafref) + + YANG Description: Reference to the ACL set applied on egress + """ + return self.__set_name + + def _set_set_name(self, v, load=False): + """ + Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/state/set_name (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_set_name is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_set_name() directly. + + YANG Description: Reference to the ACL set applied on egress + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """set_name must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""", + }) + + self.__set_name = t + if hasattr(self, '_set'): + self._set() + + def _unset_set_name(self): + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + set_name = __builtin__.property(_get_set_name) + + + _pyangbind_elements = {'set_name': set_name, } + + +class yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry_state(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set/acl-entries/acl-entry/state. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Operational state data for per-interface ACL entries + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__sequence_id','__matched_packets','__matched_octets',) + + _yang_name = 'state' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__sequence_id = YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'egress-acl-sets', u'egress-acl-set', u'acl-entries', u'acl-entry', u'state'] + + def _get_sequence_id(self): + """ + Getter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/sequence_id (leafref) + + YANG Description: Reference to an entry in the ACL set applied to an +interface + """ + return self.__sequence_id + + def _set_sequence_id(self, v, load=False): + """ + Setter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/sequence_id (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_sequence_id is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_sequence_id() directly. + + YANG Description: Reference to an entry in the ACL set applied to an +interface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """sequence_id must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""", + }) + + self.__sequence_id = t + if hasattr(self, '_set'): + self._set() + + def _unset_sequence_id(self): + self.__sequence_id = YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + + def _get_matched_packets(self): + """ + Getter method for matched_packets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/matched_packets (yang:counter64) + + YANG Description: Count of the number of packets matching the current ACL +entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + return self.__matched_packets + + def _set_matched_packets(self, v, load=False): + """ + Setter method for matched_packets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/matched_packets (yang:counter64) + If this variable is read-only (config: false) in the + source YANG file, then _set_matched_packets is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_matched_packets() directly. + + YANG Description: Count of the number of packets matching the current ACL +entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """matched_packets must be of a type compatible with yang:counter64""", + 'defined-type': "yang:counter64", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False)""", + }) + + self.__matched_packets = t + if hasattr(self, '_set'): + self._set() + + def _unset_matched_packets(self): + self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + + + def _get_matched_octets(self): + """ + Getter method for matched_octets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/matched_octets (yang:counter64) + + YANG Description: Count of the number of octets (bytes) matching the current +ACL entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + return self.__matched_octets + + def _set_matched_octets(self, v, load=False): + """ + Setter method for matched_octets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/matched_octets (yang:counter64) + If this variable is read-only (config: false) in the + source YANG file, then _set_matched_octets is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_matched_octets() directly. + + YANG Description: Count of the number of octets (bytes) matching the current +ACL entry. + +An implementation should provide this counter on a +per-interface per-ACL-entry if possible. + +If an implementation only supports ACL counters per entry +(i.e., not broken out per interface), then the value +should be equal to the aggregate count across all interfaces. + +An implementation that provides counters per entry per +interface is not required to also provide an aggregate count, +e.g., per entry -- the user is expected to be able implement +the required aggregation if such a count is needed. + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """matched_octets must be of a type compatible with yang:counter64""", + 'defined-type': "yang:counter64", + 'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False)""", + }) + + self.__matched_octets = t + if hasattr(self, '_set'): + self._set() + + def _unset_matched_octets(self): + self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='yang:counter64', is_config=False) + + sequence_id = __builtin__.property(_get_sequence_id) + matched_packets = __builtin__.property(_get_matched_packets) + matched_octets = __builtin__.property(_get_matched_octets) + + + _pyangbind_elements = {'sequence_id': sequence_id, 'matched_packets': matched_packets, 'matched_octets': matched_octets, } + + +class yc_acl_entry_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set/acl-entries/acl-entry. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: List of ACL entries assigned to an interface + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__sequence_id','__state',) + + _yang_name = 'acl-entry' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__sequence_id = YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'egress-acl-sets', u'egress-acl-set', u'acl-entries', u'acl-entry'] + + def _get_sequence_id(self): + """ + Getter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/sequence_id (leafref) + + YANG Description: Reference to per-interface acl entry key + """ + return self.__sequence_id + + def _set_sequence_id(self, v, load=False): + """ + Setter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/sequence_id (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_sequence_id is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_sequence_id() directly. + + YANG Description: Reference to per-interface acl entry key + """ + parent = getattr(self, "_parent", None) + if parent is not None and load is False: + raise AttributeError("Cannot set keys directly when" + + " within an instantiated list") + + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """sequence_id must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""", + }) + + self.__sequence_id = t + if hasattr(self, '_set'): + self._set() + + def _unset_sequence_id(self): + self.__sequence_id = YANGDynClass(base=unicode, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state (container) + + YANG Description: Operational state data for per-interface ACL entries + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: Operational state data for per-interface ACL entries + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False) + + sequence_id = __builtin__.property(_get_sequence_id) + state = __builtin__.property(_get_state) + + + _pyangbind_elements = {'sequence_id': sequence_id, 'state': state, } + + +class yc_acl_entries_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set/acl-entries. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Enclosing container for list of references to ACLs + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__acl_entry',) + + _yang_name = 'acl-entries' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'egress-acl-sets', u'egress-acl-set', u'acl-entries'] + + def _get_acl_entry(self): + """ + Getter method for acl_entry, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry (list) + + YANG Description: List of ACL entries assigned to an interface + """ + return self.__acl_entry + + def _set_acl_entry(self, v, load=False): + """ + Setter method for acl_entry, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry (list) + If this variable is read-only (config: false) in the + source YANG file, then _set_acl_entry is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_acl_entry() directly. + + YANG Description: List of ACL entries assigned to an interface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """acl_entry must be of a type compatible with list""", + 'defined-type': "list", + 'generated-type': """YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False)""", + }) + + self.__acl_entry = t + if hasattr(self, '_set'): + self._set() + + def _unset_acl_entry(self): + self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False) + + acl_entry = __builtin__.property(_get_acl_entry) + + + _pyangbind_elements = {'acl_entry': acl_entry, } + + +class yc_egress_acl_set_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: List of egress ACLs on the interface + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__set_name','__config','__state','__acl_entries',) + + _yang_name = 'egress-acl-set' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'egress-acl-sets', u'egress-acl-set'] + + def _get_set_name(self): + """ + Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/set_name (leafref) + + YANG Description: Reference to set name list key + """ + return self.__set_name + + def _set_set_name(self, v, load=False): + """ + Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/set_name (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_set_name is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_set_name() directly. + + YANG Description: Reference to set name list key + """ + parent = getattr(self, "_parent", None) + if parent is not None and load is False: + raise AttributeError("Cannot set keys directly when" + + " within an instantiated list") + + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """set_name must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""", + }) + + self.__set_name = t + if hasattr(self, '_set'): + self._set() + + def _unset_set_name(self): + self.__set_name = YANGDynClass(base=unicode, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + + def _get_config(self): + """ + Getter method for config, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/config (container) + + YANG Description: Configuration data + """ + return self.__config + + def _set_config(self, v, load=False): + """ + Setter method for config, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/config (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_config is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_config() directly. + + YANG Description: Configuration data + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """config must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__config = t + if hasattr(self, '_set'): + self._set() + + def _unset_config(self): + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/state (container) + + YANG Description: Operational state data for interface egress ACLs + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: Operational state data for interface egress ACLs + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_acl_entries(self): + """ + Getter method for acl_entries, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries (container) + + YANG Description: Enclosing container for list of references to ACLs + """ + return self.__acl_entries + + def _set_acl_entries(self, v, load=False): + """ + Setter method for acl_entries, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_acl_entries is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_acl_entries() directly. + + YANG Description: Enclosing container for list of references to ACLs + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """acl_entries must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__acl_entries = t + if hasattr(self, '_set'): + self._set() + + def _unset_acl_entries(self): + self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + set_name = __builtin__.property(_get_set_name, _set_set_name) + config = __builtin__.property(_get_config, _set_config) + state = __builtin__.property(_get_state, _set_state) + acl_entries = __builtin__.property(_get_acl_entries, _set_acl_entries) + + + _pyangbind_elements = {'set_name': set_name, 'config': config, 'state': state, 'acl_entries': acl_entries, } + + +class yc_egress_acl_sets_openconfig_acl__acl_interfaces_interface_egress_acl_sets(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Enclosing container the list of egress ACLs on the +interface + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__egress_acl_set',) + + _yang_name = 'egress-acl-sets' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__egress_acl_set = YANGDynClass(base=YANGListType("set_name",yc_egress_acl_set_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set, yang_name="egress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name', extensions=None), is_container='list', yang_name="egress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface', u'egress-acl-sets'] + + def _get_egress_acl_set(self): + """ + Getter method for egress_acl_set, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set (list) + + YANG Description: List of egress ACLs on the interface + """ + return self.__egress_acl_set + + def _set_egress_acl_set(self, v, load=False): + """ + Setter method for egress_acl_set, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set (list) + If this variable is read-only (config: false) in the + source YANG file, then _set_egress_acl_set is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_egress_acl_set() directly. + + YANG Description: List of egress ACLs on the interface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=YANGListType("set_name",yc_egress_acl_set_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set, yang_name="egress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name', extensions=None), is_container='list', yang_name="egress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """egress_acl_set must be of a type compatible with list""", + 'defined-type': "list", + 'generated-type': """YANGDynClass(base=YANGListType("set_name",yc_egress_acl_set_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set, yang_name="egress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name', extensions=None), is_container='list', yang_name="egress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)""", + }) + + self.__egress_acl_set = t + if hasattr(self, '_set'): + self._set() + + def _unset_egress_acl_set(self): + self.__egress_acl_set = YANGDynClass(base=YANGListType("set_name",yc_egress_acl_set_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set, yang_name="egress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name', extensions=None), is_container='list', yang_name="egress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + + egress_acl_set = __builtin__.property(_get_egress_acl_set, _set_egress_acl_set) + + + _pyangbind_elements = {'egress_acl_set': egress_acl_set, } + + +class yc_interface_openconfig_acl__acl_interfaces_interface(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces/interface. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: List of interfaces on which ACLs are set + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__id','__config','__state','__interface_ref','__ingress_acl_sets','__egress_acl_sets',) + + _yang_name = 'interface' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__ingress_acl_sets = YANGDynClass(base=yc_ingress_acl_sets_openconfig_acl__acl_interfaces_interface_ingress_acl_sets, is_container='container', yang_name="ingress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__egress_acl_sets = YANGDynClass(base=yc_egress_acl_sets_openconfig_acl__acl_interfaces_interface_egress_acl_sets, is_container='container', yang_name="egress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__id = YANGDynClass(base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + self.__interface_ref = YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_interfaces_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces', u'interface'] + + def _get_id(self): + """ + Getter method for id, mapped from YANG variable /acl/interfaces/interface/id (leafref) + + YANG Description: Reference to the interface id list key + """ + return self.__id + + def _set_id(self, v, load=False): + """ + Setter method for id, mapped from YANG variable /acl/interfaces/interface/id (leafref) + If this variable is read-only (config: false) in the + source YANG file, then _set_id is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_id() directly. + + YANG Description: Reference to the interface id list key + """ + parent = getattr(self, "_parent", None) + if parent is not None and load is False: + raise AttributeError("Cannot set keys directly when" + + " within an instantiated list") + + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """id must be of a type compatible with leafref""", + 'defined-type': "leafref", + 'generated-type': """YANGDynClass(base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""", + }) + + self.__id = t + if hasattr(self, '_set'): + self._set() + + def _unset_id(self): + self.__id = YANGDynClass(base=unicode, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True) + + + def _get_config(self): + """ + Getter method for config, mapped from YANG variable /acl/interfaces/interface/config (container) + + YANG Description: Configuration for ACL per-interface data + """ + return self.__config + + def _set_config(self, v, load=False): + """ + Setter method for config, mapped from YANG variable /acl/interfaces/interface/config (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_config is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_config() directly. + + YANG Description: Configuration for ACL per-interface data + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """config must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__config = t + if hasattr(self, '_set'): + self._set() + + def _unset_config(self): + self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/interfaces/interface/state (container) + + YANG Description: Operational state for ACL per-interface data + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/interfaces/interface/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: Operational state for ACL per-interface data + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_interface_ref(self): + """ + Getter method for interface_ref, mapped from YANG variable /acl/interfaces/interface/interface_ref (container) + + YANG Description: Reference to an interface or subinterface + """ + return self.__interface_ref + + def _set_interface_ref(self, v, load=False): + """ + Setter method for interface_ref, mapped from YANG variable /acl/interfaces/interface/interface_ref (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_interface_ref is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_interface_ref() directly. + + YANG Description: Reference to an interface or subinterface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_interface_ref_openconfig_acl__acl_interfaces_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """interface_ref must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_interfaces_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__interface_ref = t + if hasattr(self, '_set'): + self._set() + + def _unset_interface_ref(self): + self.__interface_ref = YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_interfaces_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_ingress_acl_sets(self): + """ + Getter method for ingress_acl_sets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets (container) + + YANG Description: Enclosing container the list of ingress ACLs on the +interface + """ + return self.__ingress_acl_sets + + def _set_ingress_acl_sets(self, v, load=False): + """ + Setter method for ingress_acl_sets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_ingress_acl_sets is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_ingress_acl_sets() directly. + + YANG Description: Enclosing container the list of ingress ACLs on the +interface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_ingress_acl_sets_openconfig_acl__acl_interfaces_interface_ingress_acl_sets, is_container='container', yang_name="ingress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """ingress_acl_sets must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_ingress_acl_sets_openconfig_acl__acl_interfaces_interface_ingress_acl_sets, is_container='container', yang_name="ingress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__ingress_acl_sets = t + if hasattr(self, '_set'): + self._set() + + def _unset_ingress_acl_sets(self): + self.__ingress_acl_sets = YANGDynClass(base=yc_ingress_acl_sets_openconfig_acl__acl_interfaces_interface_ingress_acl_sets, is_container='container', yang_name="ingress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_egress_acl_sets(self): + """ + Getter method for egress_acl_sets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets (container) + + YANG Description: Enclosing container the list of egress ACLs on the +interface + """ + return self.__egress_acl_sets + + def _set_egress_acl_sets(self, v, load=False): + """ + Setter method for egress_acl_sets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_egress_acl_sets is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_egress_acl_sets() directly. + + YANG Description: Enclosing container the list of egress ACLs on the +interface + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_egress_acl_sets_openconfig_acl__acl_interfaces_interface_egress_acl_sets, is_container='container', yang_name="egress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """egress_acl_sets must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_egress_acl_sets_openconfig_acl__acl_interfaces_interface_egress_acl_sets, is_container='container', yang_name="egress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__egress_acl_sets = t + if hasattr(self, '_set'): + self._set() + + def _unset_egress_acl_sets(self): + self.__egress_acl_sets = YANGDynClass(base=yc_egress_acl_sets_openconfig_acl__acl_interfaces_interface_egress_acl_sets, is_container='container', yang_name="egress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + id = __builtin__.property(_get_id, _set_id) + config = __builtin__.property(_get_config, _set_config) + state = __builtin__.property(_get_state, _set_state) + interface_ref = __builtin__.property(_get_interface_ref, _set_interface_ref) + ingress_acl_sets = __builtin__.property(_get_ingress_acl_sets, _set_ingress_acl_sets) + egress_acl_sets = __builtin__.property(_get_egress_acl_sets, _set_egress_acl_sets) + + + _pyangbind_elements = {'id': id, 'config': config, 'state': state, 'interface_ref': interface_ref, 'ingress_acl_sets': ingress_acl_sets, 'egress_acl_sets': egress_acl_sets, } + + +class yc_interfaces_openconfig_acl__acl_interfaces(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl/interfaces. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Enclosing container for the list of interfaces on which +ACLs are set + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__interface',) + + _yang_name = 'interfaces' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__interface = YANGDynClass(base=YANGListType("id",yc_interface_openconfig_acl__acl_interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='id', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl', u'interfaces'] + + def _get_interface(self): + """ + Getter method for interface, mapped from YANG variable /acl/interfaces/interface (list) + + YANG Description: List of interfaces on which ACLs are set + """ + return self.__interface + + def _set_interface(self, v, load=False): + """ + Setter method for interface, mapped from YANG variable /acl/interfaces/interface (list) + If this variable is read-only (config: false) in the + source YANG file, then _set_interface is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_interface() directly. + + YANG Description: List of interfaces on which ACLs are set + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=YANGListType("id",yc_interface_openconfig_acl__acl_interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='id', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """interface must be of a type compatible with list""", + 'defined-type': "list", + 'generated-type': """YANGDynClass(base=YANGListType("id",yc_interface_openconfig_acl__acl_interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='id', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)""", + }) + + self.__interface = t + if hasattr(self, '_set'): + self._set() + + def _unset_interface(self): + self.__interface = YANGDynClass(base=YANGListType("id",yc_interface_openconfig_acl__acl_interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='id', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True) + + interface = __builtin__.property(_get_interface, _set_interface) + + + _pyangbind_elements = {'interface': interface, } + + +class yc_acl_openconfig_acl__acl(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /acl. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: Top level enclosing container for ACL model config +and operational state data + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__state','__acl_sets','__interfaces',) + + _yang_name = 'acl' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__acl_sets = YANGDynClass(base=yc_acl_sets_openconfig_acl__acl_acl_sets, is_container='container', yang_name="acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + self.__interfaces = YANGDynClass(base=yc_interfaces_openconfig_acl__acl_interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [u'acl'] + + def _get_state(self): + """ + Getter method for state, mapped from YANG variable /acl/state (container) + + YANG Description: Global operational state data for ACLs + """ + return self.__state + + def _set_state(self, v, load=False): + """ + Setter method for state, mapped from YANG variable /acl/state (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_state is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_state() directly. + + YANG Description: Global operational state data for ACLs + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """state must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__state = t + if hasattr(self, '_set'): + self._set() + + def _unset_state(self): + self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_acl_sets(self): + """ + Getter method for acl_sets, mapped from YANG variable /acl/acl_sets (container) + + YANG Description: Access list entries variables enclosing container + """ + return self.__acl_sets + + def _set_acl_sets(self, v, load=False): + """ + Setter method for acl_sets, mapped from YANG variable /acl/acl_sets (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_acl_sets is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_acl_sets() directly. + + YANG Description: Access list entries variables enclosing container + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_acl_sets_openconfig_acl__acl_acl_sets, is_container='container', yang_name="acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """acl_sets must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_acl_sets_openconfig_acl__acl_acl_sets, is_container='container', yang_name="acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__acl_sets = t + if hasattr(self, '_set'): + self._set() + + def _unset_acl_sets(self): + self.__acl_sets = YANGDynClass(base=yc_acl_sets_openconfig_acl__acl_acl_sets, is_container='container', yang_name="acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + + def _get_interfaces(self): + """ + Getter method for interfaces, mapped from YANG variable /acl/interfaces (container) + + YANG Description: Enclosing container for the list of interfaces on which +ACLs are set + """ + return self.__interfaces + + def _set_interfaces(self, v, load=False): + """ + Setter method for interfaces, mapped from YANG variable /acl/interfaces (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_interfaces is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_interfaces() directly. + + YANG Description: Enclosing container for the list of interfaces on which +ACLs are set + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_interfaces_openconfig_acl__acl_interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """interfaces must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_interfaces_openconfig_acl__acl_interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__interfaces = t + if hasattr(self, '_set'): + self._set() + + def _unset_interfaces(self): + self.__interfaces = YANGDynClass(base=yc_interfaces_openconfig_acl__acl_interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + state = __builtin__.property(_get_state, _set_state) + acl_sets = __builtin__.property(_get_acl_sets, _set_acl_sets) + interfaces = __builtin__.property(_get_interfaces, _set_interfaces) + + + _pyangbind_elements = {'state': state, 'acl_sets': acl_sets, 'interfaces': interfaces, } + + +class openconfig_acl(PybindBase): + """ + This class was auto-generated by the PythonClass plugin for PYANG + from YANG module openconfig-acl - based on the path /openconfig-acl. Each member element of + the container is represented as a class variable - with a specific + YANG type. + + YANG Description: This module defines configuration and operational state +data for network access control lists (i.e., filters, rules, +etc.). ACLs are organized into ACL sets, with each set +containing one or more ACL entries. ACL sets are identified +by a unique name, while each entry within a set is assigned +a sequence-id that determines the order in which the ACL +rules are applied to a packet. + +The model allows individual ACL rules to combine match criteria +from various fields in the packet, along with an action that +defines how matching packets should be handled. Note that some +device implementations may require separate entries for match +criteria that cross protocol layers, e.g., MAC layer and IP +layer matches. + """ + __slots__ = ('_pybind_generated_by', '_path_helper', '_yang_name', '_extmethods', '__acl',) + + _yang_name = 'openconfig-acl' + + _pybind_generated_by = 'container' + + def __init__(self, *args, **kwargs): + + self._path_helper = False + + self._extmethods = False + self.__acl = YANGDynClass(base=yc_acl_openconfig_acl__acl, is_container='container', yang_name="acl", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + load = kwargs.pop("load", None) + if args: + if len(args) > 1: + raise TypeError("cannot create a YANG container with >1 argument") + all_attr = True + for e in self._pyangbind_elements: + if not hasattr(args[0], e): + all_attr = False + break + if not all_attr: + raise ValueError("Supplied object did not have the correct attributes") + for e in self._pyangbind_elements: + nobj = getattr(args[0], e) + if nobj._changed() is False: + continue + setmethod = getattr(self, "_set_%s" % e) + if load is None: + setmethod(getattr(args[0], e)) + else: + setmethod(getattr(args[0], e), load=load) + + def _path(self): + if hasattr(self, "_parent"): + return self._parent._path()+[self._yang_name] + else: + return [] + + def _get_acl(self): + """ + Getter method for acl, mapped from YANG variable /acl (container) + + YANG Description: Top level enclosing container for ACL model config +and operational state data + """ + return self.__acl + + def _set_acl(self, v, load=False): + """ + Setter method for acl, mapped from YANG variable /acl (container) + If this variable is read-only (config: false) in the + source YANG file, then _set_acl is considered as a private + method. Backends looking to populate this variable should + do so via calling thisObj._set_acl() directly. + + YANG Description: Top level enclosing container for ACL model config +and operational state data + """ + if hasattr(v, "_utype"): + v = v._utype(v) + try: + t = YANGDynClass(v,base=yc_acl_openconfig_acl__acl, is_container='container', yang_name="acl", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + except (TypeError, ValueError): + raise ValueError({ + 'error-string': """acl must be of a type compatible with container""", + 'defined-type': "container", + 'generated-type': """YANGDynClass(base=yc_acl_openconfig_acl__acl, is_container='container', yang_name="acl", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""", + }) + + self.__acl = t + if hasattr(self, '_set'): + self._set() + + def _unset_acl(self): + self.__acl = YANGDynClass(base=yc_acl_openconfig_acl__acl, is_container='container', yang_name="acl", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True) + + acl = __builtin__.property(_get_acl, _set_acl) + + + _pyangbind_elements = {'acl': acl, } + + diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py index 1a0cae5882fb..5a0a144cb35d 100644 --- a/src/sonic-config-engine/setup.py +++ b/src/sonic-config-engine/setup.py @@ -27,9 +27,9 @@ def get_test_suite(): author='Taoyu Li', author_email='taoyl@microsoft.com', url='https://github.com/Azure/sonic-buildimage', - py_modules=['minigraph'], - scripts=['sonic-cfggen'], + py_modules=['minigraph', 'openconfig_acl'], + scripts=['sonic-cfggen', 'translate_acl'], data_files=get_platform_file_list(), - install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'pyyaml'], + install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'pyyaml', 'pyangbind'], test_suite='setup.get_test_suite', ) diff --git a/src/sonic-config-engine/translate_acl b/src/sonic-config-engine/translate_acl new file mode 100755 index 000000000000..29b4597b9c9c --- /dev/null +++ b/src/sonic-config-engine/translate_acl @@ -0,0 +1,139 @@ +#!/usr/bin/env python + +import openconfig_acl +import pyangbind.lib.pybindJSON as pybindJSON + +import sys +import os.path +import json +import argparse + +def dump_json(filename, data): + with open(filename, 'w') as outfile: + json.dump(data, outfile, indent=4, sort_keys=True, separators=(',', ':')) + +def generate_rule_json(table_name, rule, max_priority): + rule_idx = rule.config.sequence_id + rule_props = {} + rule_data = {} + rule_data["ACL_RULE_TABLE:"+table_name+":Rule_"+str(rule_idx)] = rule_props + rule_data["OP"] = "SET" + + rule_props["priority"] = max_priority - rule_idx + if rule.actions.config.forwarding_action == "ACCEPT": + rule_props["PACKET_ACTION"] = "FORWARD" + elif rule.actions.config.forwarding_action == "DROP": + rule_props["PACKET_ACTION"] = "DROP" + elif rule.actions.config.forwarding_action == "REJECT": + rule_props["PACKET_ACTION"] = "DROP" + else: + print "Unknown rule action %s in table %s, rule %d!" % (rule.actions.config.forwarding_action, table_name, rule_idx) + return {} + + ip_protocol_map = { + "IP_TCP" : 6, + "IP_ICMP" : 1, + "IP_UDP" : 17, + "IP_IGMP" : 2, + "IP_PIM" : 103, + "IP_RSVP" : 46, + "IP_GRE" : 47, + "IP_AUTH" : 51, + "IP_L2TP" : 115 + } + + if not rule.ip.config.protocol: + pass + elif ip_protocol_map.has_key(rule.ip.config.protocol): + rule_props["IP_PROTOCOL"] = ip_protocol_map[rule.ip.config.protocol] + else: + try: + int(rule.ip.config.protocol) + except: + print "Unknown rule protocol %s in table %s, rule %d!" % (rule.ip.config.protocol, table_name, rule_idx) + return {} + else: + rule_props["IP_PROTOCOL"] = rule.ip.config.protocol + + if rule.ip.config.source_ip_address != "": + rule_props["SRC_IP"] = rule.ip.config.source_ip_address + if rule.ip.config.destination_ip_address != "": + rule_props["DST_IP"] = rule.ip.config.destination_ip_address + + if rule.transport.config.source_port == "": + pass + elif str(rule.transport.config.source_port).find("..") < 0: + rule_props["L4_SRC_PORT"] = rule.transport.config.source_port + else: + rule_props["L4_SRC_PORT_RANGE"] = str(rule.transport.config.source_port).replace("..", "-") + + if rule.transport.config.destination_port == "": + pass + elif str(rule.transport.config.destination_port).find("..") < 0: + rule_props["L4_DST_PORT"] = rule.transport.config.destination_port + else: + rule_props["L4_DST_PORT_RANGE"] = str(rule.transport.config.destination_port).replace("..", "-") + + tcp_flags = 0x00; + for flag in rule.transport.config.tcp_flags: + if flag == "TCP_FIN": + tcp_flags = tcp_flags | 0x01 + if flag == "TCP_SYN": + tcp_flags = tcp_flags | 0x02 + if flag == "TCP_RST": + tcp_flags = tcp_flags | 0x04 + if flag == "TCP_PSH": + tcp_flags = tcp_flags | 0x08 + if flag == "TCP_ACK": + tcp_flags = tcp_flags | 0x10 + if flag == "TCP_URG": + tcp_flags = tcp_flags | 0x20 + if flag == "TCP_ECE": + tcp_flags = tcp_flags | 0x40 + if flag == "TCP_CWR": + tcp_flags = tcp_flags | 0x80 + if tcp_flags != 0x00: + rule_props["TCP_FLAGS"] = '0x{:02x}'.format(tcp_flags) + return rule_data + +def generate_table_json(aclset, aclname, port, max_priority, output_path='.'): + table_name = aclname.replace(" ", "_") + #table_name = generate_random_table_name() + + table_props = {} + table_props["policy_desc"] = table_name + table_props["type"] = "L3" + table_props["ports"] = port + + table_data = [{}] + table_data[0]["ACL_TABLE:"+table_name] = table_props + table_data[0]["OP"] = "SET" + dump_json(os.path.join(output_path, "table_"+table_name+".json"), table_data) + + rule_data = [] + for aclentryname in aclset.acl_entries.acl_entry: + aclentry = aclset.acl_entries.acl_entry[aclentryname] + rule_props = generate_rule_json(table_name, aclentry, max_priority) + if rule_props: + rule_data.append(rule_props) + + dump_json(os.path.join(output_path, "rules_for_"+table_name+".json"), rule_data) + +def translate_acl(filename, output_path, port, max_priority): + yang_acl = pybindJSON.load(filename, openconfig_acl, "openconfig_acl") + for aclsetname in yang_acl.acl.acl_sets.acl_set: + aclset = yang_acl.acl.acl_sets.acl_set[aclsetname] + generate_table_json(aclset, aclsetname, port, max_priority, output_path) + return + +def main(): + parser = argparse.ArgumentParser(description="Translate openconfig ACL json into SONiC ACL jsons") + parser.add_argument('input', metavar='INPUT', help='input json file in openconfig format') + parser.add_argument('-p', '--port', default='Ethernet0', help='the port(s) that this ACL is binding to') + parser.add_argument('-m', '--max-priority', type=int, default=10000, help='the priority number of the first rule in ACL entries') + parser.add_argument('-o', '--output-path', default='.', help='output directory where SONiC ACL jsons will be generated') + args = parser.parse_args() + translate_acl(args.input, args.output_path, args.port, args.max_priority) + +if __name__ == "__main__": + main() From 783be14a5d1ff1a94c85141f30d9cfa464a0c320 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 17 Mar 2017 16:48:13 -0700 Subject: [PATCH 0376/1011] [minigraph]: Add portchannels/vlans dictionary and update teamd templates (#408) - minigraph_portchannel_interfaces and minigraph_vlan_interfaces are lists of interfaces and the name could duplicate due to multiple IPs - Add minigraph_portchannels and minigraph_vlans dictionaries to support querying port channels and vlans via the name - Update teamd.j2 template and config.sh file in docker-teamd - Update zebra.conf.j2 template to add port channel interfaces Signed-off-by: Shuotian Cheng --- dockers/docker-fpm/zebra.conf.j2 | 5 +++++ dockers/docker-teamd/config.sh | 2 +- dockers/docker-teamd/teamd.j2 | 4 ++-- src/sonic-config-engine/minigraph.py | 12 ++++++++++-- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/dockers/docker-fpm/zebra.conf.j2 b/dockers/docker-fpm/zebra.conf.j2 index ad05dcbe4e90..dc2061f8a02a 100644 --- a/dockers/docker-fpm/zebra.conf.j2 +++ b/dockers/docker-fpm/zebra.conf.j2 @@ -19,6 +19,11 @@ interface {{ interface['alias'] }} link-detect ! {% endfor %} +{% for interface in minigraph_portchannel_interfaces %} +interface {{ interface['name'] }} +link-detect +! +{% endfor %} {% endblock interfaces %} ! {% block default_route %} diff --git a/dockers/docker-teamd/config.sh b/dockers/docker-teamd/config.sh index d1b34f426428..c08a580b80d2 100755 --- a/dockers/docker-teamd/config.sh +++ b/dockers/docker-teamd/config.sh @@ -2,7 +2,7 @@ mkdir -p /etc/teamd -for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml -v "' '.join(minigraph_portchannel_interfaces.keys())"`; do +for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_portchannels.keys() | join(' ')"`; do sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'"}' -t /usr/share/sonic/templates/teamd.j2 >/etc/teamd/$pc.conf done diff --git a/dockers/docker-teamd/teamd.j2 b/dockers/docker-teamd/teamd.j2 index ebc5bba43fd9..386f4465713b 100644 --- a/dockers/docker-teamd/teamd.j2 +++ b/dockers/docker-teamd/teamd.j2 @@ -4,14 +4,14 @@ "name": "lacp", "active": true, {# Use 75% links upperbound as min-links #} - "min_ports": {{ minigraph_portchannel_interfaces[pc] | length * 0.75 | round(0, 'ceil') | int}}, + "min_ports": {{ minigraph_portchannels[pc]['members'] | length * 0.75 | round(0, 'ceil') | int}}, "tx_hash": ["eth", "ipv4", "ipv6"] }, "link_watch": { "name": "ethtool" }, "ports": { - {% for member in minigraph_portchannel_interfaces[pc] %} + {% for member in minigraph_portchannels[pc]['members'] %} "{{member}}": {}{% if not loop.last %},{% endif %} {% endfor %} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 7cba925928ca..33f927a4b29e 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -180,6 +180,7 @@ def parse_dpg(dpg, hname): pcintfs = child.find(str(QName(ns, "PortChannelInterfaces"))) pc_intfs = [] + pcs = {} for pcintf in pcintfs.findall(str(QName(ns, "PortChannel"))): pcintfname = pcintf.find(str(QName(ns, "Name"))).text pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text @@ -191,6 +192,7 @@ def parse_dpg(dpg, hname): for addrtuple in pc_map.get(pcintfname, []): pc_attributes.update(addrtuple) pc_intfs.append(copy.deepcopy(pc_attributes)) + pcs[pcintfname] = pc_attributes lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces"))) lo_intfs = [] @@ -221,6 +223,7 @@ def parse_dpg(dpg, hname): vlanintfs = child.find(str(QName(ns, "VlanInterfaces"))) vlan_intfs = [] + vlans = {} for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))): vintfname = vintf.find(str(QName(ns, "Name"))).text vlanid = vintf.find(str(QName(ns, "VlanID"))).text @@ -233,9 +236,10 @@ def parse_dpg(dpg, hname): for addrtuple in vlan_map.get(vintfname, []): vlan_attributes.update(addrtuple) vlan_intfs.append(copy.deepcopy(vlan_attributes)) + vlans[vintfname] = vlan_attributes - return intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs + return intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs, vlans, pcs return None, None, None, None, None def parse_cpg(cpg, hname): @@ -362,6 +366,8 @@ def parse_xml(filename, platform=None): intfs = None vlan_intfs = None pc_intfs = None + vlans = None + pcs = None mgmt_intf = None lo_intf = None neighbors = None @@ -386,7 +392,7 @@ def parse_xml(filename, platform=None): for child in root: if child.tag == str(QName(ns, "DpgDec")): - (intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs) = parse_dpg(child, hostname) + (intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs, vlans, pcs) = parse_dpg(child, hostname) elif child.tag == str(QName(ns, "CpgDec")): (bgp_sessions, bgp_asn) = parse_cpg(child, hostname) elif child.tag == str(QName(ns, "PngDec")): @@ -409,6 +415,8 @@ def parse_xml(filename, platform=None): results['minigraph_interfaces'] = sorted(intfs, key=lambda x: x['name']) results['minigraph_vlan_interfaces'] = vlan_intfs results['minigraph_portchannel_interfaces'] = pc_intfs + results['minigraph_vlans'] = vlans + results['minigraph_portchannels'] = pcs results['minigraph_mgmt_interface'] = mgmt_intf results['minigraph_lo_interfaces'] = lo_intfs results['minigraph_neighbors'] = neighbors From 4212efde6c67a73c19836916c6597808567975ef Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 17 Mar 2017 17:41:23 -0700 Subject: [PATCH 0377/1011] [sonic-utilities]: update sonic-utilities module (#412) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index dea6e8000f16..22b3d7addd81 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit dea6e8000f160b30e962d59adbaaba41744fe7c2 +Subproject commit 22b3d7addd812acd65b267abc7172c00d042e47e From 7b7a61693a7d8898f5cc2b058132bec2460d65e3 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 17 Mar 2017 21:38:20 -0700 Subject: [PATCH 0378/1011] [sonic-cfggen]: Add -p option and add teamd.j2 test (#414) - Add -p --port-config option to feed sonic-cfggen with port_config.ini file when necessary. - Update minigraph.py file to accept the -p option - Add test_j2files.py test to test config.sh and all .j2 templates * Currently test_teamd is added to test both the config.sh and teamd.j2 file works well with the t0 sample minigraph and sample port config file * The sample output is added to the folder sample_output for comparison Signed-off-by: Shuotian Cheng --- dockers/docker-teamd/teamd.j2 | 6 +- src/sonic-config-engine/minigraph.py | 9 +- src/sonic-config-engine/setup.py | 0 src/sonic-config-engine/sonic-cfggen | 11 +- src/sonic-config-engine/tests/.gitignore | 1 + .../tests/sample_output/PortChannel01.conf | 16 + .../tests/sample_output/PortChannel02.conf | 16 + .../tests/sample_output/PortChannel03.conf | 16 + .../tests/sample_output/PortChannel04.conf | 16 + .../tests/t0-sample-graph.xml | 315 ++++++++++++++++++ .../tests/t0-sample-port-config.ini | 33 ++ src/sonic-config-engine/tests/test_j2files.py | 40 +++ 12 files changed, 470 insertions(+), 9 deletions(-) mode change 100644 => 100755 src/sonic-config-engine/setup.py create mode 100644 src/sonic-config-engine/tests/.gitignore create mode 100644 src/sonic-config-engine/tests/sample_output/PortChannel01.conf create mode 100644 src/sonic-config-engine/tests/sample_output/PortChannel02.conf create mode 100644 src/sonic-config-engine/tests/sample_output/PortChannel03.conf create mode 100644 src/sonic-config-engine/tests/sample_output/PortChannel04.conf create mode 100644 src/sonic-config-engine/tests/t0-sample-graph.xml create mode 100644 src/sonic-config-engine/tests/t0-sample-port-config.ini create mode 100644 src/sonic-config-engine/tests/test_j2files.py diff --git a/dockers/docker-teamd/teamd.j2 b/dockers/docker-teamd/teamd.j2 index 386f4465713b..e2ef239c8266 100644 --- a/dockers/docker-teamd/teamd.j2 +++ b/dockers/docker-teamd/teamd.j2 @@ -11,10 +11,10 @@ "name": "ethtool" }, "ports": { - {% for member in minigraph_portchannels[pc]['members'] %} -"{{member}}": {}{% if not loop.last %},{% endif %} +{% for member in minigraph_portchannels[pc]['members'] %} + "{{member}}": {}{% if not loop.last %},{% endif %} - {% endfor %} +{% endfor %} } } diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 33f927a4b29e..54f9efe3c16e 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -328,8 +328,10 @@ def get_mgmt_info(devices, dev, port): return ret_val -def get_alias_map_list(hwsku, platform=None): +def get_alias_map_list(hwsku, platform=None, port_config_file=None): port_config_candidates = [] + if port_config_file != None: + port_config_candidates.append(port_config_file) port_config_candidates.append('/usr/share/sonic/hwsku/port_config.ini') if platform != None: port_config_candidates.append(os.path.join('/usr/share/sonic/device', platform, hwsku, 'port_config.ini')) @@ -354,7 +356,7 @@ def get_alias_map_list(hwsku, platform=None): alias_map_list.append({'sonic': tokens[0], 'origin': tokens[2].strip()}) return alias_map_list -def parse_xml(filename, platform=None): +def parse_xml(filename, platform=None, port_config_file=None): root = ET.parse(filename).getroot() mini_graph_path = filename @@ -385,7 +387,7 @@ def parse_xml(filename, platform=None): if child.tag == str(hostname_qn): hostname = child.text - alias_map_list = get_alias_map_list(hwsku, platform) + alias_map_list = get_alias_map_list(hwsku, platform, port_config_file) if alias_map_list != None: for item in alias_map_list: port_alias_map[item['origin']] = item['sonic'] @@ -438,7 +440,6 @@ def parse_xml(filename, platform=None): port_alias_map = {} - def print_parse_xml(filename): results = parse_xml(filename) print(json.dumps(results, indent=3, cls=minigraph_encoder)) diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py old mode 100644 new mode 100755 diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 93f27a30442d..c10fb8c104cd 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -60,6 +60,7 @@ def get_machine_info(): def main(): parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") parser.add_argument("-m", "--minigraph", help="minigraph xml file") + parser.add_argument("-p", "--port-config", help="port config file, used with -m") parser.add_argument("-y", "--yaml", help="yaml file that contains addtional variables") parser.add_argument("-a", "--additional-data", help="addition data, in json string") group = parser.add_mutually_exclusive_group() @@ -83,9 +84,15 @@ def main(): if args.minigraph != None: minigraph = args.minigraph if data.has_key('platform'): - data.update(parse_xml(minigraph, data['platform'])) + if args.port_config != None: + data.update(parse_xml(minigraph, data['platform'], args.port_config)) + else: + data.update(parse_xml(minigraph, data['platform'])) else: - data.update(parse_xml(minigraph)) + if args.port_config != None: + data.update(parse_xml(minigraph, port_config_file=args.port_config)) + else: + data.update(parse_xml(minigraph)) if args.yaml != None: with open(args.yaml, 'r') as stream: diff --git a/src/sonic-config-engine/tests/.gitignore b/src/sonic-config-engine/tests/.gitignore new file mode 100644 index 000000000000..bee8a64b79a9 --- /dev/null +++ b/src/sonic-config-engine/tests/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel01.conf b/src/sonic-config-engine/tests/sample_output/PortChannel01.conf new file mode 100644 index 000000000000..95369ce06a2e --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/PortChannel01.conf @@ -0,0 +1,16 @@ +{ + "device": "PortChannel01", + "runner": { + "name": "lacp", + "active": true, + "min_ports": 1, + "tx_hash": ["eth", "ipv4", "ipv6"] + }, + "link_watch": { + "name": "ethtool" + }, + "ports": { + "Ethernet112": {} + } +} + diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel02.conf b/src/sonic-config-engine/tests/sample_output/PortChannel02.conf new file mode 100644 index 000000000000..960ca2d0db65 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/PortChannel02.conf @@ -0,0 +1,16 @@ +{ + "device": "PortChannel02", + "runner": { + "name": "lacp", + "active": true, + "min_ports": 1, + "tx_hash": ["eth", "ipv4", "ipv6"] + }, + "link_watch": { + "name": "ethtool" + }, + "ports": { + "Ethernet116": {} + } +} + diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel03.conf b/src/sonic-config-engine/tests/sample_output/PortChannel03.conf new file mode 100644 index 000000000000..d26ad7795e54 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/PortChannel03.conf @@ -0,0 +1,16 @@ +{ + "device": "PortChannel03", + "runner": { + "name": "lacp", + "active": true, + "min_ports": 1, + "tx_hash": ["eth", "ipv4", "ipv6"] + }, + "link_watch": { + "name": "ethtool" + }, + "ports": { + "Ethernet120": {} + } +} + diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel04.conf b/src/sonic-config-engine/tests/sample_output/PortChannel04.conf new file mode 100644 index 000000000000..76c97b3f7c03 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/PortChannel04.conf @@ -0,0 +1,16 @@ +{ + "device": "PortChannel04", + "runner": { + "name": "lacp", + "active": true, + "min_ports": 1, + "tx_hash": ["eth", "ipv4", "ipv6"] + }, + "link_watch": { + "name": "ethtool" + }, + "ports": { + "Ethernet124": {} + } +} + diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml new file mode 100644 index 000000000000..413aedf7e234 --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-graph.xml @@ -0,0 +1,315 @@ + + + + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 180 + 60 + + + switch-t0 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 180 + 60 + + + switch-t0 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 180 + 60 + + + + + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/112 + + + + PortChannel02 + fortyGigE0/116 + + + + PortChannel03 + fortyGigE0/120 + + + + PortChannel04 + fortyGigE0/124 + + + + + + Vlan1000 + fortyGigE0/4;fortyGigE0/8;fortyGigE0/12;fortyGigE0/16;fortyGigE0/20;fortyGigE0/24;fortyGigE0/28;fortyGigE0/32;fortyGigE0/36;fortyGigE0/40;fortyGigE0/44;fortyGigE0/48;fortyGigE0/52;fortyGigE0/56;fortyGigE0/60;fortyGigE0/64;fortyGigE0/68;fortyGigE0/72;fortyGigE0/76;fortyGigE0/80;fortyGigE0/84;fortyGigE0/88;fortyGigE0/92;fortyGigE0/96 + False + 0.0.0.0/0 + + 1000 + 1000 + 192.168.0.0/27 + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + PortChannel02 + 10.0.0.58/31 + + + + PortChannel02 + FC00::75/126 + + + + PortChannel03 + 10.0.0.60/31 + + + + PortChannel03 + FC00::79/126 + + + + PortChannel04 + 10.0.0.62/31 + + + + PortChannel04 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/27 + + + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1/1 + switch-t0 + fortyGigE0/112 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1/1 + switch-t0 + fortyGigE0/116 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1/1 + switch-t0 + fortyGigE0/120 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1/1 + switch-t0 + fortyGigE0/124 + + + + + switch-t0 + Force10-S6000 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/t0-sample-port-config.ini b/src/sonic-config-engine/tests/t0-sample-port-config.ini new file mode 100644 index 000000000000..06898f1d7964 --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-port-config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 29,30,31,32 fortyGigE0/0 +Ethernet4 25,26,27,28 fortyGigE0/4 +Ethernet8 37,38,39,40 fortyGigE0/8 +Ethernet12 33,34,35,36 fortyGigE0/12 +Ethernet16 41,42,43,44 fortyGigE0/16 +Ethernet20 45,46,47,48 fortyGigE0/20 +Ethernet24 5,6,7,8 fortyGigE0/24 +Ethernet28 1,2,3,4 fortyGigE0/28 +Ethernet32 9,10,11,12 fortyGigE0/32 +Ethernet36 13,14,15,16 fortyGigE0/36 +Ethernet40 21,22,23,24 fortyGigE0/40 +Ethernet44 17,18,19,20 fortyGigE0/44 +Ethernet48 49,50,51,52 fortyGigE0/48 +Ethernet52 53,54,55,56 fortyGigE0/52 +Ethernet56 61,62,63,64 fortyGigE0/56 +Ethernet60 57,58,59,60 fortyGigE0/60 +Ethernet64 65,66,67,68 fortyGigE0/64 +Ethernet68 69,70,71,72 fortyGigE0/68 +Ethernet72 77,78,79,80 fortyGigE0/72 +Ethernet76 73,74,75,76 fortyGigE0/76 +Ethernet80 105,106,107,108 fortyGigE0/80 +Ethernet84 109,110,111,112 fortyGigE0/84 +Ethernet88 117,118,119,120 fortyGigE0/88 +Ethernet92 113,114,115,116 fortyGigE0/92 +Ethernet96 121,122,123,124 fortyGigE0/96 +Ethernet100 125,126,127,128 fortyGigE0/100 +Ethernet104 85,86,87,88 fortyGigE0/104 +Ethernet108 81,82,83,84 fortyGigE0/108 +Ethernet112 89,90,91,92 fortyGigE0/112 +Ethernet116 93,94,95,96 fortyGigE0/116 +Ethernet120 97,98,99,100 fortyGigE0/120 +Ethernet124 101,102,103,104 fortyGigE0/124 diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py new file mode 100644 index 000000000000..e2ad2f54a2ac --- /dev/null +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -0,0 +1,40 @@ +import filecmp +import os +import subprocess + +from unittest import TestCase + +class TestJ2Files(TestCase): + def setUp(self): + self.test_dir = os.path.dirname(os.path.realpath(__file__)) + self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfggen') + self.t0_minigraph = os.path.join(self.test_dir, 't0-sample-graph.xml') + self.t0_port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') + self.output_file = os.path.join(self.test_dir, 'output') + + def run_script(self, argument): + print 'CMD: sonic-cfggen ' + argument + return subprocess.check_output(self.script_file + ' ' + argument, shell=True) + + def test_teamd(self): + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -v "minigraph_portchannels.keys() | join(\' \')"' + output = self.run_script(argument) # Mock the output via config.sh in docker-teamd + pc_list = output.split() + + def test_render_teamd(self, pc): + teamd_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-teamd', 'teamd.j2') + sample_output_file = os.path.join(self.test_dir, 'sample_output',pc + '.conf') + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -a \'{\"pc\":\"' + pc + '\"}\' -t ' + teamd_file + ' > ' + self.output_file + self.run_script(argument) + assert filecmp.cmp(sample_output_file, self.output_file) + + for i in range(1, 5): + pc_name = 'PortChannel0' + str(i) + assert pc_name in pc_list + test_render_teamd(self, pc_name) + + def tearDown(self): + try: + os.remove(self.output_file) + except OSError: + pass From 7a16e02ec158943500f56e75550afb7ba2856108 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 20 Mar 2017 14:04:18 -0700 Subject: [PATCH 0379/1011] [cfggen]: Fix the path to sonic-cfggen due to the path change in #388 (#416) The path moved from /usr/bin/ to /usr/local/bin due to the installation change from deb to whl --- files/build_templates/docker_image_ctl.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 5a753471911d..be62b4351556 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -1,8 +1,8 @@ #!/bin/bash # Obtain our platform and HWSKU as we will mount directories with these names in each docker -PLATFORM=`/usr/bin/sonic-cfggen -v platform` -HWSKU=`/usr/bin/sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` +PLATFORM=`sonic-cfggen -v platform` +HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` start() { docker inspect --type container {{docker_container_name}} &>/dev/null From 0444ca7c346f04c90ddc99d0bd6a4458a6597833 Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Mon, 20 Mar 2017 15:28:49 -0700 Subject: [PATCH 0380/1011] [submodule]: Update sonic-utilities submodule (#415) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 22b3d7addd81..4da9efed9355 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 22b3d7addd812acd65b267abc7172c00d042e47e +Subproject commit 4da9efed9355fad8cdf9b1ca2c0a18dd9445eaba From 6a6bc88dcb9255bb1bf80b7a5f1b2e019c991bc4 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 20 Mar 2017 21:39:09 -0700 Subject: [PATCH 0381/1011] [interfaces]: Remove bridge-utils from swss docker and add it to base image (#417) The reason is that /etc/network/interfaces file is in base image. After booting, docker-swss is not ready and thus the empty VLAN interfaces cannot be created when the brctl is pointing to the binary inside the swss docker. Add the bridge-utils into the base image and add bridge_ports none to the /etc/network/interfaces file so that after boot-up the empty VLAN interfaces will be created to let the members to join later. Signed-off-by: Shuotian Cheng --- build_debian.sh | 1 + dockers/docker-orchagent/Dockerfile.j2 | 2 +- dockers/docker-orchagent/base_image_files/brctl | 4 ---- files/image_config/interfaces/interfaces.j2 | 2 +- platform/broadcom/docker-orchagent-brcm.mk | 1 - platform/cavium/docker-orchagent-cavm.mk | 1 - platform/centec/docker-orchagent-centec.mk | 1 - platform/mellanox/docker-orchagent-mlnx.mk | 1 - 8 files changed, 3 insertions(+), 10 deletions(-) delete mode 100755 dockers/docker-orchagent/base_image_files/brctl diff --git a/build_debian.sh b/build_debian.sh index 46cb4bce5259..a303691b1dcc 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -171,6 +171,7 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in file \ ifupdown \ iproute2 \ + bridge-utils \ isc-dhcp-client \ sudo \ vim \ diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 0376c2c4d86d..507b0bf03355 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -5,7 +5,7 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -RUN apt-get install -f -y ifupdown bridge-utils libdbus-1-3 libdaemon0 libjansson4 +RUN apt-get install -f -y ifupdown libdbus-1-3 libdaemon0 libjansson4 ## Install redis-tools dependencies ## TODO: implicitly install dependencies diff --git a/dockers/docker-orchagent/base_image_files/brctl b/dockers/docker-orchagent/base_image_files/brctl deleted file mode 100755 index b02d74479f17..000000000000 --- a/dockers/docker-orchagent/base_image_files/brctl +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -docker exec -i swss brctl "$@" - diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index acf7b247fcf0..8cca143ed606 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -75,8 +75,8 @@ iface {{ interface }} inet manual {% block vlan_interfaces %} {% for vlan_interface in minigraph_vlan_interfaces %} auto {{ vlan_interface['name'] }} -allow-hotplug {{ vlan_interface['name'] }} iface {{ vlan_interface['name'] }} {{ 'inet' if vlan_interface['addr'] | ipv4 else 'inet6' }} static + bridge_ports none address {{ vlan_interface['addr'] }} netmask {{ vlan_interface['mask'] }} # diff --git a/platform/broadcom/docker-orchagent-brcm.mk b/platform/broadcom/docker-orchagent-brcm.mk index 37fdb9c66ac5..e49b67c2c2cc 100644 --- a/platform/broadcom/docker-orchagent-brcm.mk +++ b/platform/broadcom/docker-orchagent-brcm.mk @@ -16,4 +16,3 @@ $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_BRCM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel -$(DOCKER_ORCHAGENT_BRCM)_BASE_IMAGE_FILES += brctl:/usr/bin/brctl diff --git a/platform/cavium/docker-orchagent-cavm.mk b/platform/cavium/docker-orchagent-cavm.mk index 65ddd9eac252..8130ca8dc1cb 100644 --- a/platform/cavium/docker-orchagent-cavm.mk +++ b/platform/cavium/docker-orchagent-cavm.mk @@ -16,4 +16,3 @@ $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_CAVM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel -$(DOCKER_ORCHAGENT_CAVM)_BASE_IMAGE_FILES += brctl:/usr/bin/brctl diff --git a/platform/centec/docker-orchagent-centec.mk b/platform/centec/docker-orchagent-centec.mk index a3738f6aa2ca..0613fb510de3 100644 --- a/platform/centec/docker-orchagent-centec.mk +++ b/platform/centec/docker-orchagent-centec.mk @@ -16,4 +16,3 @@ $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_CENTEC)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel -$(DOCKER_ORCHAGENT_CENTEC)_BASE_IMAGE_FILES += brctl:/usr/bin/brctl diff --git a/platform/mellanox/docker-orchagent-mlnx.mk b/platform/mellanox/docker-orchagent-mlnx.mk index d081e8af5f3b..505804fb8c17 100644 --- a/platform/mellanox/docker-orchagent-mlnx.mk +++ b/platform/mellanox/docker-orchagent-mlnx.mk @@ -16,4 +16,3 @@ $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_MLNX)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel -$(DOCKER_ORCHAGENT_MLNX)_BASE_IMAGE_FILES += brctl:/usr/bin/brctl From bd77f9a38ae42be60651b08bd67135cd20ee9be6 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 21 Mar 2017 21:42:07 -0700 Subject: [PATCH 0382/1011] [sonic-cfggen]: Read ACL interfaces information from minigrap (#419) * Enable translate_acl to read acl attaching from minigraph * Add AclInterfaces into test t0 graph * Expose minigraph_ports according --- src/sonic-config-engine/minigraph.py | 31 ++++++++++++--- .../tests/t0-sample-graph.xml | 9 ++++- src/sonic-config-engine/tests/test_cfggen.py | 6 +++ src/sonic-config-engine/translate_acl | 38 ++++++++++++++----- 4 files changed, 68 insertions(+), 16 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 54f9efe3c16e..144593557aac 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -124,6 +124,7 @@ def parse_dpg(dpg, hname): ipintfs = child.find(str(QName(ns, "IPInterfaces"))) intfs = [] + intfnames = {} vlan_map = {} pc_map = {} for ipintf in ipintfs.findall(str(QName(ns, "IPInterface"))): @@ -177,6 +178,7 @@ def parse_dpg(dpg, hname): if peer_addr_val is not None: intf['peer_addr'] = ipaddress.IPAddress(peer_addr_val) intfs.append(intf) + intfnames[intf['alias']] = { 'alias': intf['name'] } pcintfs = child.find(str(QName(ns, "PortChannelInterfaces"))) pc_intfs = [] @@ -237,10 +239,27 @@ def parse_dpg(dpg, hname): vlan_attributes.update(addrtuple) vlan_intfs.append(copy.deepcopy(vlan_attributes)) vlans[vintfname] = vlan_attributes - - - return intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs, vlans, pcs - return None, None, None, None, None + aclintfs = child.find(str(QName(ns, "AclInterfaces"))) + acls = {} + for aclintf in aclintfs.findall(str(QName(ns, "AclInterface"))): + aclname = aclintf.find(str(QName(ns, "InAcl"))).text + aclattach = aclintf.find(str(QName(ns, "AttachTo"))).text.split(';') + acl_intfs = [] + for member in aclattach: + member = member.strip() + if port_alias_map.has_key(member): + member = port_alias_map[member] + if pcs.has_key(member): + acl_intfs.extend(pcs[member]['members']) # For ACL attaching to port channels, we break them into port channel members + elif vlans.has_key(member): + print >> sys.stderr, "Warning: ACL "+aclname+" is attached to a Vlan interface, which is currently not supported" + elif intfnames.has_key(member): + acl_intfs.append(member) + if acl_intfs: + acls[aclname] = acl_intfs + + return intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs, intfnames, vlans, pcs, acls + return None, None, None, None, None, None, None, None def parse_cpg(cpg, hname): bgp_sessions = [] @@ -394,7 +413,7 @@ def parse_xml(filename, platform=None, port_config_file=None): for child in root: if child.tag == str(QName(ns, "DpgDec")): - (intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs, vlans, pcs) = parse_dpg(child, hostname) + (intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs, ports, vlans, pcs, acls) = parse_dpg(child, hostname) elif child.tag == str(QName(ns, "CpgDec")): (bgp_sessions, bgp_asn) = parse_cpg(child, hostname) elif child.tag == str(QName(ns, "PngDec")): @@ -418,9 +437,11 @@ def parse_xml(filename, platform=None, port_config_file=None): results['minigraph_vlan_interfaces'] = vlan_intfs results['minigraph_portchannel_interfaces'] = pc_intfs results['minigraph_vlans'] = vlans + results['minigraph_ports'] = ports results['minigraph_portchannels'] = pcs results['minigraph_mgmt_interface'] = mgmt_intf results['minigraph_lo_interfaces'] = lo_intfs + results['minigraph_acls'] = acls results['minigraph_neighbors'] = neighbors results['minigraph_devices'] = devices results['minigraph_underlay_neighbors'] = u_neighbors diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml index 413aedf7e234..41e62dca29c2 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph.xml @@ -251,7 +251,14 @@
- + + + + PortChannel01;PortChannel02;PortChannel03;PortChannel04 + + DataAcl + + diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 894f069c1ef8..0d0570acf44e 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -8,6 +8,7 @@ def setUp(self): self.test_dir = os.path.dirname(os.path.realpath(__file__)) self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfggen') self.sample_graph = os.path.join(self.test_dir, 'sample_graph.xml') + self.sample_graph_t0 = os.path.join(self.test_dir, 't0-sample-graph.xml') def run_script(self, argument): print '\n Running sonic-cfggen ' + argument @@ -59,3 +60,8 @@ def test_render_template(self): output = self.run_script(argument) self.assertEqual(output.strip(), 'value1\nvalue2') + def test_minigraph_acl(self): + argument = '-m "' + self.sample_graph_t0 + '" -v minigraph_acls' + output = self.run_script(argument) + self.assertEqual(output.strip(), "{'DataAcl': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}") + diff --git a/src/sonic-config-engine/translate_acl b/src/sonic-config-engine/translate_acl index 29b4597b9c9c..f706fe1f52e4 100755 --- a/src/sonic-config-engine/translate_acl +++ b/src/sonic-config-engine/translate_acl @@ -1,13 +1,14 @@ #!/usr/bin/env python -import openconfig_acl -import pyangbind.lib.pybindJSON as pybindJSON - import sys import os.path import json import argparse +import openconfig_acl +import pyangbind.lib.pybindJSON as pybindJSON +from minigraph import parse_xml + def dump_json(filename, data): with open(filename, 'w') as outfile: json.dump(data, outfile, indent=4, sort_keys=True, separators=(',', ':')) @@ -97,7 +98,7 @@ def generate_rule_json(table_name, rule, max_priority): return rule_data def generate_table_json(aclset, aclname, port, max_priority, output_path='.'): - table_name = aclname.replace(" ", "_") + table_name = aclname.replace(" ", "_").replace("-", "_") #table_name = generate_random_table_name() table_props = {} @@ -119,21 +120,38 @@ def generate_table_json(aclset, aclname, port, max_priority, output_path='.'): dump_json(os.path.join(output_path, "rules_for_"+table_name+".json"), rule_data) -def translate_acl(filename, output_path, port, max_priority): +def translate_acl_fixed_port(filename, output_path, port, max_priority): + yang_acl = pybindJSON.load(filename, openconfig_acl, "openconfig_acl") + for aclsetname in yang_acl.acl.acl_sets.acl_set: + aclset = yang_acl.acl.acl_sets.acl_set[aclsetname] + generate_table_json(aclset, aclsetname, port, max_priority, output_path) + return + +def translate_acl(filename, output_path, attach_to, max_priority): yang_acl = pybindJSON.load(filename, openconfig_acl, "openconfig_acl") + print attach_to.keys() for aclsetname in yang_acl.acl.acl_sets.acl_set: - aclset = yang_acl.acl.acl_sets.acl_set[aclsetname] - generate_table_json(aclset, aclsetname, port, max_priority, output_path) + tablename = aclsetname.replace(" ", "_").replace("-", "_") + if attach_to.has_key(tablename): + port = ','.join(attach_to[tablename]) + aclset = yang_acl.acl.acl_sets.acl_set[aclsetname] + generate_table_json(aclset, aclsetname, port, max_priority, output_path) return def main(): parser = argparse.ArgumentParser(description="Translate openconfig ACL json into SONiC ACL jsons") parser.add_argument('input', metavar='INPUT', help='input json file in openconfig format') - parser.add_argument('-p', '--port', default='Ethernet0', help='the port(s) that this ACL is binding to') - parser.add_argument('-m', '--max-priority', type=int, default=10000, help='the priority number of the first rule in ACL entries') + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('-p', '--port', help='the port(s) that this ACL is attached to') + group.add_argument('-m', '--minigraph', help='read ACL attaching information from minigraph') + parser.add_argument('-n', '--max-priority', type=int, default=10000, help='the priority number of the first rule in ACL entries') parser.add_argument('-o', '--output-path', default='.', help='output directory where SONiC ACL jsons will be generated') args = parser.parse_args() - translate_acl(args.input, args.output_path, args.port, args.max_priority) + if args.port: + translate_acl_fixed_port(args.input, args.output_path, args.port, args.max_priority) + elif args.minigraph: + mini_data = parse_xml(args.minigraph) + translate_acl(args.input, args.output_path, mini_data['minigraph_acls'], args.max_priority) if __name__ == "__main__": main() From 42ae02b66503a1eb10bcea59f574e3829cf6ef45 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 22 Mar 2017 13:04:48 -0700 Subject: [PATCH 0383/1011] [oneimage]: Fix race condition in systemd container services (#421) When Type=simple, systemd will consider the service activated immediately after specified in ExecStart process is started. If there is downstream service depending on the state prepared in ExecStart, there will be race condition. For example, issue #390. In this case, database.service calls database.sh, which calls docker run or docker start -a to start database container. However, systemd considers database.service successfully started at the time database.sh begins, not after docker run finishes. As database.service is consider started, bgp.service can be started. The redis database, which bgp service depends on, might or might not have been started at this time point. To fix this issue (and still keeping the functionality to monitor docker status with systemd), we split the ExecStart process into an ExecStartPre part and an ExecStart part. docker run is splitted into docker run -d then docker attach , while docker start -a is splitted into docker start and then docker attach. In this way, we make sure the downstream services are blocked until container is successfully started. --- files/build_templates/bgp.service.j2 | 3 ++- files/build_templates/database.service.j2 | 3 ++- files/build_templates/dhcp_relay.service.j2 | 3 ++- files/build_templates/docker_image_ctl.j2 | 12 ++++++++---- files/build_templates/lldp.service.j2 | 3 ++- files/build_templates/pmon.service.j2 | 3 ++- files/build_templates/snmp.service.j2 | 3 ++- files/build_templates/swss.service.j2 | 6 +++--- files/build_templates/teamd.service.j2 | 3 ++- 9 files changed, 25 insertions(+), 14 deletions(-) diff --git a/files/build_templates/bgp.service.j2 b/files/build_templates/bgp.service.j2 index 7fa3c0eb1150..c7ba8b8a5f52 100644 --- a/files/build_templates/bgp.service.j2 +++ b/files/build_templates/bgp.service.j2 @@ -5,7 +5,8 @@ After=database.service [Service] User={{ sonicadmin_user }} -ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStartPre=/usr/bin/{{docker_container_name}}.sh start +ExecStart=/usr/bin/{{docker_container_name}}.sh attach ExecStop=/usr/bin/{{docker_container_name}}.sh stop [Install] diff --git a/files/build_templates/database.service.j2 b/files/build_templates/database.service.j2 index fd4f34435e6a..c353653e4562 100644 --- a/files/build_templates/database.service.j2 +++ b/files/build_templates/database.service.j2 @@ -5,7 +5,8 @@ After=docker.service [Service] User={{ sonicadmin_user }} -ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStartPre=/usr/bin/{{docker_container_name}}.sh start +ExecStart=/usr/bin/{{docker_container_name}}.sh attach ExecStop=/usr/bin/{{docker_container_name}}.sh stop [Install] diff --git a/files/build_templates/dhcp_relay.service.j2 b/files/build_templates/dhcp_relay.service.j2 index 95d66c605f85..c0e993eec065 100644 --- a/files/build_templates/dhcp_relay.service.j2 +++ b/files/build_templates/dhcp_relay.service.j2 @@ -5,7 +5,8 @@ After=interfaces-config.service [Service] User={{ sonicadmin_user }} -ExecStart=/usr/bin/{{ docker_container_name }}.sh start +ExecStartPre=/usr/bin/{{ docker_container_name }}.sh start +ExecStart=/usr/bin/{{ docker_container_name }}.sh attach ExecStop=/usr/bin/{{ docker_container_name }}.sh stop [Install] diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index be62b4351556..10679765eb3a 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -7,25 +7,29 @@ HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` start() { docker inspect --type container {{docker_container_name}} &>/dev/null if [ "$?" -eq "0" ]; then - docker start -a {{docker_container_name}} + docker start {{docker_container_name}} else - docker run {{docker_image_run_opt}} \ + docker run -d {{docker_image_run_opt}} \ -v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \ -v /usr/share/sonic/device/$PLATFORM/$HWSKU:/usr/share/sonic/hwsku:ro \ --name={{docker_container_name}} {{docker_image_name}} fi } +attach() { + docker attach --no-stdin {{docker_container_name}} +} + stop() { docker stop {{docker_container_name}} } case "$1" in - start|stop) + start|stop|attach) $1 ;; *) - echo "Usage: $0 {start|stop}" + echo "Usage: $0 {start|stop|attach}" exit 1 ;; esac diff --git a/files/build_templates/lldp.service.j2 b/files/build_templates/lldp.service.j2 index f66e9d682af6..1ddda15a49c4 100644 --- a/files/build_templates/lldp.service.j2 +++ b/files/build_templates/lldp.service.j2 @@ -5,7 +5,8 @@ After=database.service [Service] User={{ sonicadmin_user }} -ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStartPre=/usr/bin/{{docker_container_name}}.sh start +ExecStart=/usr/bin/{{docker_container_name}}.sh attach ExecStop=/usr/bin/{{docker_container_name}}.sh stop [Install] diff --git a/files/build_templates/pmon.service.j2 b/files/build_templates/pmon.service.j2 index d50f5be628de..9f1a0298240c 100644 --- a/files/build_templates/pmon.service.j2 +++ b/files/build_templates/pmon.service.j2 @@ -5,7 +5,8 @@ After=database.service [Service] User={{ sonicadmin_user }} -ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStartPre=/usr/bin/{{docker_container_name}}.sh start +ExecStart=/usr/bin/{{docker_container_name}}.sh attach ExecStop=/usr/bin/{{docker_container_name}}.sh stop [Install] diff --git a/files/build_templates/snmp.service.j2 b/files/build_templates/snmp.service.j2 index 3744c586896f..493d6bd8fcfd 100644 --- a/files/build_templates/snmp.service.j2 +++ b/files/build_templates/snmp.service.j2 @@ -5,7 +5,8 @@ After=database.service [Service] User={{ sonicadmin_user }} -ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStartPre=/usr/bin/{{docker_container_name}}.sh start +ExecStart=/usr/bin/{{docker_container_name}}.sh attach ExecStop=/usr/bin/{{docker_container_name}}.sh stop [Install] diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index 3ec8161fa00a..7466e8c14577 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -20,9 +20,9 @@ ExecStartPre=-/etc/init.d/xpnet.sh stop ExecStartPre=/etc/init.d/xpnet.sh start {% endif %} -# systemd allows only one parent process within service, -# so we spawn both dockers from single bash parent -ExecStart=/bin/bash -c "/usr/bin/{{docker_container_name}}.sh start & /usr/bin/syncd.sh start & wait -n 0" +ExecStartPre=/usr/bin/{{docker_container_name}}.sh start +ExecStartPre=/usr/bin/syncd.sh start +ExecStart=/usr/bin/{{docker_container_name}}.sh attach ExecStop=/usr/bin/{{docker_container_name}}.sh stop ExecStopPost=/usr/bin/syncd.sh stop diff --git a/files/build_templates/teamd.service.j2 b/files/build_templates/teamd.service.j2 index 49ecb640d895..e291a39b387d 100644 --- a/files/build_templates/teamd.service.j2 +++ b/files/build_templates/teamd.service.j2 @@ -5,7 +5,8 @@ After=database.service [Service] User={{ sonicadmin_user }} -ExecStart=/usr/bin/{{docker_container_name}}.sh start +ExecStartPre=/usr/bin/{{docker_container_name}}.sh start +ExecStart=/usr/bin/{{docker_container_name}}.sh attach ExecStop=/usr/bin/{{docker_container_name}}.sh stop [Install] From 91cca8966d0055a35820023d7ba6800486ce55e3 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 22 Mar 2017 16:38:51 -0700 Subject: [PATCH 0384/1011] [docker-syncd-*-rpc]: Fix build (#423) * Fix docker-syncd-brcm-rpc build * Fix docker-syncd-mlnx-rpc build * Rename docker-syncd-rpc to docker-syncd-brcm-rpc * Add fix for mlnx platform too --- .../Dockerfile | 10 +++++----- .../ptf_nn_agent.conf | 0 .../supervisord.conf | 0 dockers/docker-syncd-mlnx-rpc/Dockerfile | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) rename dockers/{docker-syncd-rpc => docker-syncd-brcm-rpc}/Dockerfile (88%) rename dockers/{docker-syncd-rpc => docker-syncd-brcm-rpc}/ptf_nn_agent.conf (100%) rename dockers/{docker-syncd-rpc => docker-syncd-brcm-rpc}/supervisord.conf (100%) diff --git a/dockers/docker-syncd-rpc/Dockerfile b/dockers/docker-syncd-brcm-rpc/Dockerfile similarity index 88% rename from dockers/docker-syncd-rpc/Dockerfile rename to dockers/docker-syncd-brcm-rpc/Dockerfile index ed75d1a1f0ec..23f5e7a25f6a 100644 --- a/dockers/docker-syncd-rpc/Dockerfile +++ b/dockers/docker-syncd-brcm-rpc/Dockerfile @@ -1,4 +1,4 @@ -FROM docker-syncd +FROM docker-syncd-brcm ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -43,7 +43,7 @@ RUN apt-get update \ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf -ENTRYPOINT service rsyslog start \ - && sysctl -w net.core.rmem_max=509430500 \ - && service syncd start \ - && /usr/bin/supervisord +RUN sed -i 's/read/sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord/' /usr/bin/start.sh + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/dockers/docker-syncd-rpc/ptf_nn_agent.conf b/dockers/docker-syncd-brcm-rpc/ptf_nn_agent.conf similarity index 100% rename from dockers/docker-syncd-rpc/ptf_nn_agent.conf rename to dockers/docker-syncd-brcm-rpc/ptf_nn_agent.conf diff --git a/dockers/docker-syncd-rpc/supervisord.conf b/dockers/docker-syncd-brcm-rpc/supervisord.conf similarity index 100% rename from dockers/docker-syncd-rpc/supervisord.conf rename to dockers/docker-syncd-brcm-rpc/supervisord.conf diff --git a/dockers/docker-syncd-mlnx-rpc/Dockerfile b/dockers/docker-syncd-mlnx-rpc/Dockerfile index 3b891784b226..42e24be7ecb5 100644 --- a/dockers/docker-syncd-mlnx-rpc/Dockerfile +++ b/dockers/docker-syncd-mlnx-rpc/Dockerfile @@ -43,7 +43,7 @@ RUN apt-get update \ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf -ENTRYPOINT service rsyslog start \ - && sysctl -w net.core.rmem_max=509430500 \ - && service syncd start \ - && /usr/bin/supervisord +RUN sed -i 's/read/sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord/' /usr/bin/start.sh + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] From f08874db360b940b5c1705dc05161297184393ee Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 22 Mar 2017 16:59:12 -0700 Subject: [PATCH 0385/1011] [platform-monitor]: Fix sensors.conf file path (#426) sensors.conf file was moved in #316. --- dockers/docker-platform-monitor/config.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/dockers/docker-platform-monitor/config.sh b/dockers/docker-platform-monitor/config.sh index a74c2f5c9097..7021f18aacb8 100755 --- a/dockers/docker-platform-monitor/config.sh +++ b/dockers/docker-platform-monitor/config.sh @@ -1,12 +1,9 @@ #!/bin/bash mkdir -p /etc/sensors.d - -hwsku=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` - -if [ -e /usr/share/sonic/$hwsku/sensors.conf ] +if [ -e /usr/share/sonic/platform/sensors.conf ] then - /bin/cp -rf /usr/share/sonic/$hwsku/sensors.conf /etc/sensors.d/ + /bin/cp -rf /usr/share/sonic/platform/sensors.conf /etc/sensors.d/ fi mkdir -p /var/sonic From dccef8f557f933bc2c29385bce8ea8213e8ab7cb Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 22 Mar 2017 18:56:51 -0700 Subject: [PATCH 0386/1011] [submodule]: Update common/swss/sairedis submodules (#422) Signed-off-by: Shuotian Cheng --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 426589a7f6be..383ed119845a 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 426589a7f6be8f021207734fd277882eb051fc5f +Subproject commit 383ed119845ad726788c4198aa05e3e31c20c78f diff --git a/src/sonic-swss b/src/sonic-swss index 6f06b59971e5..3e713cc33b78 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 6f06b59971e5ee75b721d3630878ba03f28f9831 +Subproject commit 3e713cc33b78f0a21d51573ebb604fe3ffddc874 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index b1c829a0b2f4..68e6c409b4a9 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit b1c829a0b2f4dd0dfef8ec1e6b6cd67bcf334d7c +Subproject commit 68e6c409b4a96a677ea90a831172df7ae68acbef From a8fdd1f42d0b46b06487dcdeca792d8db67b4558 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 22 Mar 2017 20:13:55 -0700 Subject: [PATCH 0387/1011] [oneimage] Enable forcing mgmt route through minigraph (#424) --- files/image_config/interfaces/interfaces.j2 | 6 ++++++ src/sonic-config-engine/minigraph.py | 9 +++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 8cca143ed606..c6156dab8bf9 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -28,9 +28,15 @@ iface eth0 inet static # management port up rules up ip route add default via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 table default up ip rule add from {{ minigraph_mgmt_interface['addr'] }}/32 table default +{% for prefix in forced_mgmt_routes %} + up ip route add {{ prefix }} via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 +{% endfor %} # management port down rules down ip route delete default via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 table default down ip rule delete from {{ minigraph_mgmt_interface['addr'] }}/32 table default +{% for prefix in forced_mgmt_routes %} + down ip route delete {{ prefix }} via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 +{% endfor %} {# TODO: COPP policy type rules #} {% else %} iface eth0 inet dhcp diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 144593557aac..20c5aeb5b5f1 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -301,6 +301,7 @@ def parse_meta(meta, hname): syslog_servers = [] dhcp_servers = [] ntp_servers = [] + mgmt_routes = [] 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: @@ -315,7 +316,9 @@ def parse_meta(meta, hname): ntp_servers = value_group elif name == "SyslogResources": syslog_servers = value_group - return syslog_servers, dhcp_servers, ntp_servers + elif name == "ForcedMgmtRoutes": + mgmt_routes = value_group + return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes def get_console_info(devices, dev, port): for k, v in devices.items(): @@ -397,6 +400,7 @@ def parse_xml(filename, platform=None, port_config_file=None): syslog_servers = [] dhcp_servers = [] ntp_servers = [] + mgmt_routes = [] hwsku_qn = QName(ns, "HwSku") hostname_qn = QName(ns, "Hostname") @@ -421,7 +425,7 @@ def parse_xml(filename, platform=None, port_config_file=None): 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) = parse_meta(child, hostname) + (syslog_servers, dhcp_servers, ntp_servers, mgmt_routes) = parse_meta(child, hostname) Tree = lambda: defaultdict(Tree) @@ -455,6 +459,7 @@ def parse_xml(filename, platform=None, port_config_file=None): results['syslog_servers'] = syslog_servers results['dhcp_servers'] = dhcp_servers results['ntp_servers'] = ntp_servers + results['forced_mgmt_routes'] = mgmt_routes results['alias_map'] = alias_map_list return results From e2cc409f8a9dfeefccc192ba76b71c7fd4c02c10 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 23 Mar 2017 12:18:52 -0700 Subject: [PATCH 0388/1011] [database]: Mount /var/run/redis/ folder from host for all dockers (#418) - Create /var/run/redis/ folder on the host - Install Python client for Redis on the host - Mount /var/run/redis/ as read/write from host for all dockers - Enable accessing the database everywhere including on the host and from remote Signed-off-by: Shuotian Cheng --- build_debian.sh | 3 +++ files/build_templates/docker_image_ctl.j2 | 2 ++ files/build_templates/sonic_debian_extension.j2 | 5 ++++- platform/broadcom/docker-orchagent-brcm.mk | 1 - platform/broadcom/docker-syncd-brcm.mk | 1 - platform/cavium/docker-orchagent-cavm.mk | 1 - platform/cavium/docker-syncd-cavm.mk | 1 - platform/centec/docker-orchagent-centec.mk | 1 - platform/centec/docker-syncd-centec.mk | 1 - platform/mellanox/docker-orchagent-mlnx.mk | 1 - platform/mellanox/docker-syncd-mlnx.mk | 1 - rules/docker-database.mk | 2 -- rules/docker-fpm-gobgp.mk | 2 -- rules/docker-fpm.mk | 1 - rules/docker-lldp-sv2.mk | 1 - rules/docker-snmp-sv2.mk | 1 - rules/docker-teamd.mk | 2 -- 17 files changed, 9 insertions(+), 18 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index a303691b1dcc..0bce39736b9f 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -240,6 +240,9 @@ sudo LANG=C chroot $FILESYSTEM_ROOT easy_install pip sudo LANG=C chroot $FILESYSTEM_ROOT pip install 'docker-py==1.6.0' ## Note: keep pip installed for maintainance purpose +## Create /var/run/redis folder for docker-database to mount +sudo mkdir -p $FILESYSTEM_ROOT/var/run/redis + ## Config DHCP for eth0 sudo tee -a $FILESYSTEM_ROOT/etc/network/interfaces > /dev/null < Date: Thu, 23 Mar 2017 16:30:18 -0700 Subject: [PATCH 0389/1011] [interfaces]: Restart networking service after the file is updated (#430) Signed-off-by: Shuotian Cheng --- files/image_config/interfaces/interfaces-config.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index f36f45b55576..e26060197619 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -1,6 +1,4 @@ #!/bin/bash sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/interfaces.j2 >/etc/network/interfaces -ifdown eth0 && ifup eth0 -ifdown lo && ifup lo - +service networking restart From b010e23725fcc9a36c9ed07a50d012a93f0ac3c6 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 23 Mar 2017 16:30:37 -0700 Subject: [PATCH 0390/1011] [sonic-cfggen]: Remove deprecated platform folder and update related files (#429) Signed-off-by: Shuotian Cheng --- src/sonic-config-engine/MANIFEST.in | 1 - .../platform/ACS-MSN2700/port_config.ini | 33 -------- .../platform/ACS-MSN2700/sensors.conf | 21 ----- .../platform/AS7512/port_config.ini | 33 -------- .../platform/Arista-7050-QX32/port_config.ini | 33 -------- .../platform/Arista-7050-QX32/sensors.conf | 79 ------------------- .../Arista-7060-CX32S/port_config.ini | 33 -------- .../platform/Arista-7060-CX32S/sensors.conf | 47 ----------- .../platform/Force10-S6000/port_config.ini | 33 -------- .../platform/Force10-S6000/sensors.conf | 57 ------------- .../platform/Force10-S6100/port_config.ini | 65 --------------- .../platform/Force10-Z9100/port_config.ini | 33 -------- .../INGRASYS-S9100-C32/port_config.ini | 33 -------- .../platform/INGRASYS-S9100-C32/sensors.conf | 35 -------- src/sonic-config-engine/setup.py | 13 --- 15 files changed, 549 deletions(-) delete mode 100644 src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini delete mode 100644 src/sonic-config-engine/platform/ACS-MSN2700/sensors.conf delete mode 100644 src/sonic-config-engine/platform/AS7512/port_config.ini delete mode 100644 src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini delete mode 100644 src/sonic-config-engine/platform/Arista-7050-QX32/sensors.conf delete mode 100644 src/sonic-config-engine/platform/Arista-7060-CX32S/port_config.ini delete mode 100644 src/sonic-config-engine/platform/Arista-7060-CX32S/sensors.conf delete mode 100644 src/sonic-config-engine/platform/Force10-S6000/port_config.ini delete mode 100644 src/sonic-config-engine/platform/Force10-S6000/sensors.conf delete mode 100644 src/sonic-config-engine/platform/Force10-S6100/port_config.ini delete mode 100644 src/sonic-config-engine/platform/Force10-Z9100/port_config.ini delete mode 100644 src/sonic-config-engine/platform/INGRASYS-S9100-C32/port_config.ini delete mode 100644 src/sonic-config-engine/platform/INGRASYS-S9100-C32/sensors.conf diff --git a/src/sonic-config-engine/MANIFEST.in b/src/sonic-config-engine/MANIFEST.in index c228a249adfb..a7038d546e9c 100644 --- a/src/sonic-config-engine/MANIFEST.in +++ b/src/sonic-config-engine/MANIFEST.in @@ -1,2 +1 @@ -recursive-include platform *.json *.ini *.conf recursive-include tests *.j2 *.yml *.xml diff --git a/src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini b/src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini deleted file mode 100644 index 816bb0e94a70..000000000000 --- a/src/sonic-config-engine/platform/ACS-MSN2700/port_config.ini +++ /dev/null @@ -1,33 +0,0 @@ -# name lanes -Ethernet0 0,1,2,3 -Ethernet4 4,5,6,7 -Ethernet8 8,9,10,11 -Ethernet12 12,13,14,15 -Ethernet16 16,17,18,19 -Ethernet20 20,21,22,23 -Ethernet24 24,25,26,27 -Ethernet28 28,29,30,31 -Ethernet32 32,33,34,35 -Ethernet36 36,37,38,39 -Ethernet40 40,41,42,43 -Ethernet44 44,45,46,47 -Ethernet48 48,49,50,51 -Ethernet52 52,53,54,55 -Ethernet56 56,57,58,59 -Ethernet60 60,61,62,63 -Ethernet64 64,65,66,67 -Ethernet68 68,69,70,71 -Ethernet72 72,73,74,75 -Ethernet76 76,77,78,79 -Ethernet80 80,81,82,83 -Ethernet84 84,85,86,87 -Ethernet88 88,89,90,91 -Ethernet92 92,93,94,95 -Ethernet96 96,97,98,99 -Ethernet100 100,101,102,103 -Ethernet104 104,105,106,107 -Ethernet108 108,109,110,111 -Ethernet112 112,113,114,115 -Ethernet116 116,117,118,119 -Ethernet120 120,121,122,123 -Ethernet124 124,125,126,127 diff --git a/src/sonic-config-engine/platform/ACS-MSN2700/sensors.conf b/src/sonic-config-engine/platform/ACS-MSN2700/sensors.conf deleted file mode 100644 index a3e30391863e..000000000000 --- a/src/sonic-config-engine/platform/ACS-MSN2700/sensors.conf +++ /dev/null @@ -1,21 +0,0 @@ -bus "i2c-7" "i2c-1-mux (chan_id 5)" -chip "lm75-i2c-7-4a" - label temp1 "Ambient Port Temp" - -bus "i2c-5" "i2c-1-mux (chan_id 3)" -chip "ucd9200-i2c-5-27" - label in1 "UCD1 vin" - label in2 "ASIC 3.3 vout" - label in3 "ASIC 1.2 vout" - label temp1 "UCD1 Temp" - label temp2 "UCD1 Temp2" - -chip "ucd9200-i2c-5-41" - label in1 "UCD2 vin" - label in2 "ASIC Vcore vout" - label temp1 "UCD2 Temp1" - label temp2 "UCD2 Temp2" - -bus "i2c-17" "i2c-1-mux (chan_id 7)" -chip "lm75-i2c-17-49" - label temp1 "Ambient Board Temp" diff --git a/src/sonic-config-engine/platform/AS7512/port_config.ini b/src/sonic-config-engine/platform/AS7512/port_config.ini deleted file mode 100644 index c10cd2786941..000000000000 --- a/src/sonic-config-engine/platform/AS7512/port_config.ini +++ /dev/null @@ -1,33 +0,0 @@ -# name lanes -Ethernet0 16,17,18,19 -Ethernet4 20,21,22,23 -Ethernet8 24,25,26,27 -Ethernet12 28,29,30,31 -Ethernet16 32,33,34,35 -Ethernet20 36,37,38,39 -Ethernet24 40,41,42,43 -Ethernet28 44,45,46,47 -Ethernet32 0,1,2,3 -Ethernet36 4,5,6,7 -Ethernet40 8,9,10,11 -Ethernet44 12,13,14,15 -Ethernet48 48,49,50,51 -Ethernet52 52,53,54,55 -Ethernet56 56,57,58,59 -Ethernet60 60,61,62,63 -Ethernet64 127,126,125,124 -Ethernet68 123,122,121,120 -Ethernet72 115,114,113,112 -Ethernet76 119,118,117,116 -Ethernet80 79,78,77,76 -Ethernet84 75,74,73,72 -Ethernet88 64,65,66,67 -Ethernet92 71,70,68,69 -Ethernet96 111,110,109,108 -Ethernet100 107,106,105,104 -Ethernet104 103,102,101,100 -Ethernet108 99,98,97,96 -Ethernet112 95,94,93,92 -Ethernet116 91,90,89,88 -Ethernet120 87,86,85,84 -Ethernet124 83,82,81,80 diff --git a/src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini b/src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini deleted file mode 100644 index b9ab8854a2ec..000000000000 --- a/src/sonic-config-engine/platform/Arista-7050-QX32/port_config.ini +++ /dev/null @@ -1,33 +0,0 @@ -# name lanes alias -Ethernet0 125,126,127,128 Ethernet1/1 -Ethernet4 121,122,123,124 Ethernet2/1 -Ethernet8 13,14,15,16 Ethernet3/1 -Ethernet12 9,10,11,12 Ethernet4/1 -Ethernet16 17,18,19,20 Ethernet5/1 -Ethernet20 21,22,23,24 Ethernet6/1 -Ethernet24 25,26,27,28 Ethernet7/1 -Ethernet28 29,30,31,32 Ethernet8/1 -Ethernet32 37,38,39,40 Ethernet9/1 -Ethernet36 33,34,35,36 Ethernet10/1 -Ethernet40 45,46,47,48 Ethernet11/1 -Ethernet44 41,42,43,44 Ethernet12/1 -Ethernet48 53,54,55,56 Ethernet13/1 -Ethernet52 49,50,51,52 Ethernet14/1 -Ethernet56 69,70,71,72 Ethernet15/1 -Ethernet60 65,66,67,68 Ethernet16/1 -Ethernet64 77,78,79,80 Ethernet17/1 -Ethernet68 73,74,75,76 Ethernet18/1 -Ethernet72 93,94,95,96 Ethernet19/1 -Ethernet76 89,90,91,92 Ethernet20/1 -Ethernet80 101,102,103,104 Ethernet21/1 -Ethernet84 97,98,99,100 Ethernet22/1 -Ethernet88 109,110,111,112 Ethernet23/1 -Ethernet92 105,106,107,108 Ethernet24/1 -Ethernet96 61,62,63,64 Ethernet25 -Ethernet100 57,58,59,60 Ethernet26 -Ethernet104 81,82,83,84 Ethernet27 -Ethernet108 85,86,87,88 Ethernet28 -Ethernet112 117,118,119,120 Ethernet29 -Ethernet116 113,114,115,116 Ethernet30 -Ethernet120 5,6,7,8 Ethernet31 -Ethernet124 1,2,3,4 Ethernet32 diff --git a/src/sonic-config-engine/platform/Arista-7050-QX32/sensors.conf b/src/sonic-config-engine/platform/Arista-7050-QX32/sensors.conf deleted file mode 100644 index 7745054a05ca..000000000000 --- a/src/sonic-config-engine/platform/Arista-7050-QX32/sensors.conf +++ /dev/null @@ -1,79 +0,0 @@ -# libsensors configuration file -# ---------------------------------------------- -# - -bus "i2c-2" "SCD SMBus master 0 bus 0" -bus "i2c-3" "SCD SMBus master 0 bus 1" -bus "i2c-5" "SCD SMBus master 0 bus 3" -bus "i2c-6" "SCD SMBus master 0 bus 4" -bus "i2c-7" "SCD SMBus master 0 bus 5" - -chip "k10temp-pci-00c3" - label temp1 "Cpu temp sensor" - -chip "lm73-i2c-3-48" - label temp1 "Rear Temp Sensor" - set temp1_max 65 - #set temp1_max_alarm 75 # read-only - -chip "lm86-i2c-2-4c" - label temp1 "Board Temp Sensor" - set temp1_max 65 - set temp1_crit 75 - - label temp2 "Front-panel Temp Sensor" - set temp2_max 65 - set temp2_crit 75 - -chip "pmbus-i2c-3-4e" - label temp1 "Power Controller Sensor 1" - set temp1_max 60 - set temp1_crit 70 - - label temp2 "Power Controller Sensor 2" - set temp2_max 60 - set temp2_crit 70 - - ignore curr1 - -chip "pmbus-i2c-5-58" - label temp1 "Power Supply 1 Sensor 1" - set temp1_max 60 - set temp1_crit 70 - - label temp2 "Power Supply 1 Sensor 2" - set temp2_max 60 - set temp2_crit 70 - - ignore temp3 - - set in1_max 250 - set in1_crit 255 - set power1_max 525 - set power2_max 460 - set power2_crit 462 - set curr1_max 5.28 - set curr1_crit 5.30 - set curr2_max 36 - set curr2_crit 37 - -chip "pmbus-i2c-6-58" - label temp1 "Power Supply 2 Sensor 1" - set temp1_max 60 - set temp1_crit 70 - - label temp2 "Power Supply 2 Sensor 2" - set temp2_max 60 - set temp2_crit 70 - - ignore temp3 - - set in1_max 250 - set in1_crit 255 - set power1_max 525 - set power2_max 460 - set power2_crit 462 - set curr1_max 5.28 - set curr1_crit 5.30 - set curr2_max 36 - set curr2_crit 37 diff --git a/src/sonic-config-engine/platform/Arista-7060-CX32S/port_config.ini b/src/sonic-config-engine/platform/Arista-7060-CX32S/port_config.ini deleted file mode 100644 index 414fb94efbc1..000000000000 --- a/src/sonic-config-engine/platform/Arista-7060-CX32S/port_config.ini +++ /dev/null @@ -1,33 +0,0 @@ -# name lanes alias -Ethernet0 33,34,35,36 Ethernet1/1 -Ethernet4 37,38,39,40 Ethernet2/1 -Ethernet8 41,42,43,44 Ethernet3/1 -Ethernet12 45,46,47,48 Ethernet4/1 -Ethernet16 49,50,51,52 Ethernet5/1 -Ethernet20 53,54,55,56 Ethernet6/1 -Ethernet24 57,58,59,60 Ethernet7/1 -Ethernet28 61,62,63,64 Ethernet8/1 -Ethernet32 65,66,67,68 Ethernet9/1 -Ethernet36 69,70,71,72 Ethernet10/1 -Ethernet40 73,74,75,76 Ethernet11/1 -Ethernet44 77,78,79,80 Ethernet12/1 -Ethernet48 81,82,83,84 Ethernet13/1 -Ethernet52 85,86,87,88 Ethernet14/1 -Ethernet56 89,90,91,92 Ethernet15/1 -Ethernet60 93,94,95,96 Ethernet16/1 -Ethernet64 97,98,99,100 Ethernet17/1 -Ethernet68 101,102,103,104 Ethernet18/1 -Ethernet72 105,106,107,108 Ethernet19/1 -Ethernet76 109,110,111,112 Ethernet20/1 -Ethernet80 113,114,115,116 Ethernet21/1 -Ethernet84 117,118,119,120 Ethernet22/1 -Ethernet88 121,122,123,124 Ethernet23/1 -Ethernet92 125,126,127,128 Ethernet24/1 -Ethernet96 1,2,3,4 Ethernet25/1 -Ethernet100 5,6,7,8 Ethernet26/1 -Ethernet104 9,10,11,12 Ethernet27/1 -Ethernet108 13,14,15,16 Ethernet28/1 -Ethernet112 17,18,19,20 Ethernet29/1 -Ethernet116 21,22,23,24 Ethernet30/1 -Ethernet120 25,26,27,28 Ethernet31/1 -Ethernet124 29,30,31,32 Ethernet32/1 diff --git a/src/sonic-config-engine/platform/Arista-7060-CX32S/sensors.conf b/src/sonic-config-engine/platform/Arista-7060-CX32S/sensors.conf deleted file mode 100644 index 3b4dd2385322..000000000000 --- a/src/sonic-config-engine/platform/Arista-7060-CX32S/sensors.conf +++ /dev/null @@ -1,47 +0,0 @@ -# libsensors configuration file for DCS-7060CX-32S -# ------------------------------------------------ -# - -bus "i2c-2" "SCD SMBus master 0 bus 0" -bus "i2c-3" "SCD SMBus master 0 bus 1" -bus "i2c-5" "SCD SMBus master 0 bus 3" -bus "i2c-6" "SCD SMBus master 0 bus 4" -bus "i2c-7" "SCD SMBus master 0 bus 5" - -chip "k10temp-pci-00c3" - label temp1 "Cpu temp sensor" - -# missing support for -# chip "max6697-i2c-2-1a" -# board sensor 65 75 -# (1) switch chip left sensor 95 105 -# (5) switch chip right sensor 95 105 -# (6) front panel temp sensor 65 75 - -chip "max6658-i2c-3-4c" - label temp1 "Cpu board temp sensor" - set temp1_max 75 - set temp1_crit 80 - - label temp2 "Back panel temp sensor" - set temp2_max 75 - set temp2_crit 80 - -chip "pmbus-i2c-3-4e" - label temp1 "Power controller 1 sensor 1" - label temp2 "Power controller 1 sensor 2" - -chip "pmbus-i2c-7-4e" - label temp1 "Power controller 2 sensor 1" - label temp2 "Power controller 2 sensor 2" - -chip "pmbus-i2c-6-58" - label temp1 "Power supply 1 hotspot sensor" - label temp2 "Power supply 1 inlet temp sensor" - label temp3 "Power supply 1 sensor" - -chip "pmbus-i2c-5-58" - label temp1 "Power supply 2 hotspot sensor" - label temp2 "Power supply 2 inlet temp sensor" - label temp3 "Power supply 2 sensor" - diff --git a/src/sonic-config-engine/platform/Force10-S6000/port_config.ini b/src/sonic-config-engine/platform/Force10-S6000/port_config.ini deleted file mode 100644 index 06898f1d7964..000000000000 --- a/src/sonic-config-engine/platform/Force10-S6000/port_config.ini +++ /dev/null @@ -1,33 +0,0 @@ -# name lanes alias -Ethernet0 29,30,31,32 fortyGigE0/0 -Ethernet4 25,26,27,28 fortyGigE0/4 -Ethernet8 37,38,39,40 fortyGigE0/8 -Ethernet12 33,34,35,36 fortyGigE0/12 -Ethernet16 41,42,43,44 fortyGigE0/16 -Ethernet20 45,46,47,48 fortyGigE0/20 -Ethernet24 5,6,7,8 fortyGigE0/24 -Ethernet28 1,2,3,4 fortyGigE0/28 -Ethernet32 9,10,11,12 fortyGigE0/32 -Ethernet36 13,14,15,16 fortyGigE0/36 -Ethernet40 21,22,23,24 fortyGigE0/40 -Ethernet44 17,18,19,20 fortyGigE0/44 -Ethernet48 49,50,51,52 fortyGigE0/48 -Ethernet52 53,54,55,56 fortyGigE0/52 -Ethernet56 61,62,63,64 fortyGigE0/56 -Ethernet60 57,58,59,60 fortyGigE0/60 -Ethernet64 65,66,67,68 fortyGigE0/64 -Ethernet68 69,70,71,72 fortyGigE0/68 -Ethernet72 77,78,79,80 fortyGigE0/72 -Ethernet76 73,74,75,76 fortyGigE0/76 -Ethernet80 105,106,107,108 fortyGigE0/80 -Ethernet84 109,110,111,112 fortyGigE0/84 -Ethernet88 117,118,119,120 fortyGigE0/88 -Ethernet92 113,114,115,116 fortyGigE0/92 -Ethernet96 121,122,123,124 fortyGigE0/96 -Ethernet100 125,126,127,128 fortyGigE0/100 -Ethernet104 85,86,87,88 fortyGigE0/104 -Ethernet108 81,82,83,84 fortyGigE0/108 -Ethernet112 89,90,91,92 fortyGigE0/112 -Ethernet116 93,94,95,96 fortyGigE0/116 -Ethernet120 97,98,99,100 fortyGigE0/120 -Ethernet124 101,102,103,104 fortyGigE0/124 diff --git a/src/sonic-config-engine/platform/Force10-S6000/sensors.conf b/src/sonic-config-engine/platform/Force10-S6000/sensors.conf deleted file mode 100644 index 2208bb6340d1..000000000000 --- a/src/sonic-config-engine/platform/Force10-S6000/sensors.conf +++ /dev/null @@ -1,57 +0,0 @@ -# libsensors configuration file -# -------------------------------------------------- -# - -# tmp75-i2c-11-4c has sensors close to Networking ASIC. -# tmp75-i2c-11-4d has sensors close to NIC. -# tmp75-i2c-11-4e is an ambient temperature sensor. - -chip "tmp75-*" - set temp1_max 50 - set temp1_max_hyst 25 - -# emc1403-i2c-10-4d has following temperature sensors: -# temp1: CPU0 external Temp Sensor -# temp2: CPU1 external Temp Sensor -# temp3: CPU Internal DTS (Internal die, max of all die readings) - -chip "emc1403-*" - set temp1_crit 85 - set temp1_max 50 - set temp2_crit 85 - set temp2_max 50 - set temp3_crit 85 - set temp3_max 50 - -chip "max6620-i2c-*-2a" - ignore fan3 - ignore fan4 - -chip "w83627dhg-*" - label in0 "VCore 1" - label in1 "VCore 2" - set in0_min 0 - set in0_max 1.74 - set in1_min 0 - set in1_max 1.74 - ignore fan1 - ignore fan2 - ignore fan3 - ignore fan4 - ignore fan5 - ignore in4 - ignore in5 - ignore in6 - ignore temp1 - ignore temp2 - ignore temp3 - ignore cpu0_vid - ignore intrusion0 - -chip "jc42-*" - set temp1_max 50 - set temp1_crit 85 - -chip "dni_dps460-*" - set temp1_max 50 - set temp2_max 50 diff --git a/src/sonic-config-engine/platform/Force10-S6100/port_config.ini b/src/sonic-config-engine/platform/Force10-S6100/port_config.ini deleted file mode 100644 index dcdd6548c198..000000000000 --- a/src/sonic-config-engine/platform/Force10-S6100/port_config.ini +++ /dev/null @@ -1,65 +0,0 @@ -# name lanes alias -Ethernet0 101,102 fortyGigE1/1/1 -Ethernet1 103,104 fortyGigE1/1/2 -Ethernet2 97,98 fortyGigE1/1/3 -Ethernet3 99,100 fortyGigE1/1/4 -Ethernet4 69,70 fortyGigE1/1/5 -Ethernet5 71,72 fortyGigE1/1/6 -Ethernet6 65,66 fortyGigE1/1/7 -Ethernet7 67,68 fortyGigE1/1/8 -Ethernet8 53,54 fortyGigE1/1/9 -Ethernet9 55,56 fortyGigE1/1/10 -Ethernet10 49,50 fortyGigE1/1/11 -Ethernet11 51,52 fortyGigE1/1/12 -Ethernet12 21,22 fortyGigE1/1/13 -Ethernet13 23,24 fortyGigE1/1/14 -Ethernet14 17,18 fortyGigE1/1/15 -Ethernet15 19,20 fortyGigE1/1/16 -Ethernet16 25,26 fortyGigE1/2/1 -Ethernet17 27,28 fortyGigE1/2/2 -Ethernet18 29,30 fortyGigE1/2/3 -Ethernet19 31,32 fortyGigE1/2/4 -Ethernet20 57,58 fortyGigE1/2/5 -Ethernet21 59,60 fortyGigE1/2/6 -Ethernet22 61,62 fortyGigE1/2/7 -Ethernet23 63,64 fortyGigE1/2/8 -Ethernet24 73,74 fortyGigE1/2/9 -Ethernet25 75,76 fortyGigE1/2/10 -Ethernet26 77,78 fortyGigE1/2/11 -Ethernet27 79,80 fortyGigE1/2/12 -Ethernet28 105,106 fortyGigE1/2/13 -Ethernet29 107,108 fortyGigE1/2/14 -Ethernet30 109,110 fortyGigE1/2/15 -Ethernet31 111,112 fortyGigE1/2/16 -Ethernet32 13,14 fortyGigE1/3/1 -Ethernet33 15,16 fortyGigE1/3/2 -Ethernet34 9,10 fortyGigE1/3/3 -Ethernet35 11,12 fortyGigE1/3/4 -Ethernet36 125,126 fortyGigE1/3/5 -Ethernet37 127,128 fortyGigE1/3/6 -Ethernet38 121,122 fortyGigE1/3/7 -Ethernet39 123,124 fortyGigE1/3/8 -Ethernet40 93,94 fortyGigE1/3/9 -Ethernet41 95,96 fortyGigE1/3/10 -Ethernet42 89,90 fortyGigE1/3/11 -Ethernet43 91,92 fortyGigE1/3/12 -Ethernet44 45,46 fortyGigE1/3/13 -Ethernet45 47,48 fortyGigE1/3/14 -Ethernet46 41,42 fortyGigE1/3/15 -Ethernet47 43,44 fortyGigE1/3/16 -Ethernet48 113,114 fortyGigE1/4/1 -Ethernet49 115,116 fortyGigE1/4/2 -Ethernet50 117,118 fortyGigE1/4/3 -Ethernet51 119,120 fortyGigE1/4/4 -Ethernet52 1,2 fortyGigE1/4/5 -Ethernet53 3,4 fortyGigE1/4/6 -Ethernet54 5,6 fortyGigE1/4/7 -Ethernet55 7,8 fortyGigE1/4/8 -Ethernet56 33,34 fortyGigE1/4/9 -Ethernet57 35,36 fortyGigE1/4/10 -Ethernet58 37,38 fortyGigE1/4/11 -Ethernet59 39,40 fortyGigE1/4/12 -Ethernet60 81,82 fortyGigE1/4/13 -Ethernet61 83,84 fortyGigE1/4/14 -Ethernet62 85,86 fortyGigE1/4/15 -Ethernet63 87,88 fortyGigE1/4/16 diff --git a/src/sonic-config-engine/platform/Force10-Z9100/port_config.ini b/src/sonic-config-engine/platform/Force10-Z9100/port_config.ini deleted file mode 100644 index e000f29bef38..000000000000 --- a/src/sonic-config-engine/platform/Force10-Z9100/port_config.ini +++ /dev/null @@ -1,33 +0,0 @@ -# name lanes alias -Ethernet0 49,50,51,52 hundredGigE1/1 -Ethernet4 53,54,55,56 hundredGigE1/2 -Ethernet8 57,58,59,60 hundredGigE1/3 -Ethernet12 61,62,63,64 hundredGigE1/4 -Ethernet16 65,66,67,68 hundredGigE1/5 -Ethernet20 69,70,71,72 hundredGigE1/6 -Ethernet24 73,74,75,76 hundredGigE1/7 -Ethernet28 77,78,79,80 hundredGigE1/8 -Ethernet32 37,38,39,40 hundredGigE1/9 -Ethernet36 33,34,35,36 hundredGigE1/10 -Ethernet40 45,46,47,48 hundredGigE1/11 -Ethernet44 41,42,43,44 hundredGigE1/12 -Ethernet48 81,82,83,84 hundredGigE1/13 -Ethernet52 85,86,87,88 hundredGigE1/14 -Ethernet56 89,90,91,92 hundredGigE1/15 -Ethernet60 93,94,95,96 hundredGigE1/16 -Ethernet64 97,98,99,100 hundredGigE1/17 -Ethernet68 101,102,103,104 hundredGigE1/18 -Ethernet72 105,106,107,108 hundredGigE1/19 -Ethernet76 109,110,111,112 hundredGigE1/20 -Ethernet80 21,22,23,24 hundredGigE1/21 -Ethernet84 17,18,19,20 hundredGigE1/22 -Ethernet88 29,30,31,32 hundredGigE1/23 -Ethernet92 25,26,27,28 hundredGigE1/24 -Ethernet96 117,118,119,120 hundredGigE1/25 -Ethernet100 113,114,115,116 hundredGigE1/26 -Ethernet104 125,126,127,128 hundredGigE1/27 -Ethernet108 121,122,123,124 hundredGigE1/28 -Ethernet112 5,6,7,8 hundredGigE1/29 -Ethernet116 1,2,3,4 hundredGigE1/30 -Ethernet120 13,14,15,16 hundredGigE1/31 -Ethernet124 9,10,11,12 hundredGigE1/32 diff --git a/src/sonic-config-engine/platform/INGRASYS-S9100-C32/port_config.ini b/src/sonic-config-engine/platform/INGRASYS-S9100-C32/port_config.ini deleted file mode 100644 index d2b36ebf5e2a..000000000000 --- a/src/sonic-config-engine/platform/INGRASYS-S9100-C32/port_config.ini +++ /dev/null @@ -1,33 +0,0 @@ -# name lanes alias -Ethernet0 5,6,7,8 Ethernet0 -Ethernet4 1,2,3,4 Ethernet4 -Ethernet8 13,14,15,16 Ethernet8 -Ethernet12 9,10,11,12 Ethernet12 -Ethernet16 21,22,23,24 Ethernet16 -Ethernet20 17,18,19,20 Ethernet20 -Ethernet24 29,30,31,32 Ethernet24 -Ethernet28 25,26,27,28 Ethernet28 -Ethernet32 37,38,39,40 Ethernet32 -Ethernet36 33,34,35,36 Ethernet36 -Ethernet40 45,46,47,48 Ethernet40 -Ethernet44 41,42,43,44 Ethernet44 -Ethernet48 53,54,55,56 Ethernet48 -Ethernet52 49,50,51,52 Ethernet52 -Ethernet56 61,62,63,64 Ethernet56 -Ethernet60 57,58,59,60 Ethernet60 -Ethernet64 69,70,71,72 Ethernet64 -Ethernet68 65,66,67,68 Ethernet68 -Ethernet72 77,78,79,80 Ethernet72 -Ethernet76 73,74,75,76 Ethernet76 -Ethernet80 85,86,87,88 Ethernet80 -Ethernet84 81,82,83,84 Ethernet84 -Ethernet88 93,94,95,96 Ethernet88 -Ethernet92 89,90,91,92 Ethernet92 -Ethernet96 101,102,103,104 Ethernet96 -Ethernet100 97,98,99,100 Ethernet100 -Ethernet104 109,110,111,112 Ethernet104 -Ethernet108 105,106,107,108 Ethernet108 -Ethernet112 117,118,119,120 Ethernet112 -Ethernet116 113,114,115,116 Ethernet116 -Ethernet120 125,126,127,128 Ethernet120 -Ethernet124 121,122,123,124 Ethernet124 diff --git a/src/sonic-config-engine/platform/INGRASYS-S9100-C32/sensors.conf b/src/sonic-config-engine/platform/INGRASYS-S9100-C32/sensors.conf deleted file mode 100644 index 44eedb4b11b0..000000000000 --- a/src/sonic-config-engine/platform/INGRASYS-S9100-C32/sensors.conf +++ /dev/null @@ -1,35 +0,0 @@ -# libsensors configuration file -chip "i350bb-*" - ignore loc1 - -chip "jc42-*" - label temp1 "DIMM Temp" - set temp1_max 50 - set temp1_crit 85 - -chip "w83795adg-*" - label in0 "1.0V" - label in1 "1.0V_ROV" - label in2 "1.25V" - label in3 "1.8V" - ignore in4 - ignore in5 - ignore in6 - ignore in7 - label in12 "+3.3V" - ignore in14 - ignore in15 - ignore in16 - label fan1 "FANTRAY 1-A" - label fan2 "FANTRAY 1-B" - label fan3 "FANTRAY 2-A" - label fan4 "FANTRAY 2-B" - label fan5 "FANTRAY 3-A" - label fan6 "FANTRAY 3-B" - label fan7 "FANTRAY 4-A" - label fan8 "FANTRAY 4-B" - label temp1 "Front MAC Temp" - label temp2 "Rear MAC Temp" - ignore temp3 - ignore temp4 - ignore intrusion0 diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py index 5a0a144cb35d..b9e6ace7cccf 100755 --- a/src/sonic-config-engine/setup.py +++ b/src/sonic-config-engine/setup.py @@ -4,18 +4,6 @@ import os.path import unittest -def get_platform_file_list(): - data_files = [] - repo_path = os.path.abspath(os.path.dirname(__file__)) - data_path = os.path.join(repo_path, 'platform') - platforms = os.listdir(data_path) - for platform in platforms: - files = ['platform/' + platform + '/port_config.ini'] - if os.path.isfile( os.path.join(data_path, platform, 'sensors.conf') ): - files.append('platform/' + platform + '/sensors.conf') #Not all platforms need to have a sensors.conf file - data_files.append( (os.path.join('/usr/share/sonic', platform), files) ) - return data_files - def get_test_suite(): test_loader = unittest.TestLoader() test_suite = test_loader.discover('tests', pattern='*.py') @@ -29,7 +17,6 @@ def get_test_suite(): url='https://github.com/Azure/sonic-buildimage', py_modules=['minigraph', 'openconfig_acl'], scripts=['sonic-cfggen', 'translate_acl'], - data_files=get_platform_file_list(), install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'pyyaml', 'pyangbind'], test_suite='setup.get_test_suite', ) From 6308420db913b10b8ca9eb977c4869b83cb9f180 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 24 Mar 2017 16:29:23 -0700 Subject: [PATCH 0391/1011] [swss]: Enforce swss dependency with opennsl-modules (#434) - This change ensures that when shuting down, opennsl-modules will not stop until swss stops. Otherwise it will cause kernel stack trace. Signed-off-by: Shuotian Cheng --- files/build_templates/swss.service.j2 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index 7466e8c14577..87db5eb3b652 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -1,7 +1,13 @@ [Unit] Description=switch state service Requires=database.service +{% if sonic_asic_platform == 'broadcom' %} +Requires=opennsl-modules-3.16.0-4-amd64.service +{% endif %} After=database.service +{% if sonic_asic_platform == 'broadcom' %} +After=opennsl-modules-3.16.0-4-amd64.service +{% endif %} [Service] User=root @@ -36,6 +42,5 @@ ExecStopPost=/etc/init.d/xpnet.sh stop ExecStopPost=/etc/init.d/xpnet.sh start {% endif %} - [Install] WantedBy=multi-user.target From 9e8df96ca76acb1b56e87782b51135ddd0e18ce1 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 24 Mar 2017 18:12:44 -0700 Subject: [PATCH 0392/1011] [interface-config] Fix a loopback addr config bug (#437) Fix a bug introduced in PR 430 that addresses on lo are not configured correctly. --- files/image_config/interfaces/interfaces-config.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index e26060197619..3e2f852c1263 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -2,3 +2,4 @@ sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/interfaces.j2 >/etc/network/interfaces service networking restart +ifdown lo && ifup lo From 5314230980f16ea865882dce746ce0d214e034df Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 24 Mar 2017 18:36:56 -0700 Subject: [PATCH 0393/1011] [docker-syncd-%-rpc]: Integrate syncd dockers with rpc (#431) * Build docker-syncd-*-rpc for brcm and mlnx * Fix errors * Update make files for rpc * Fix mistypes --- .gitignore | 4 +++- platform/broadcom/docker-syncd-brcm-rpc.mk | 8 ++++++++ .../docker-syncd-brcm-rpc/Dockerfile.j2 | 17 +++++++++++++---- .../docker-syncd-brcm-rpc/ptf_nn_agent.conf | 0 .../docker-syncd-brcm-rpc/supervisord.conf | 0 platform/broadcom/rules.mk | 4 +++- platform/mellanox/docker-syncd-mlnx-rpc.mk | 8 ++++++++ .../docker-syncd-mlnx-rpc/Dockerfile.j2 | 17 +++++++++++++---- .../docker-syncd-mlnx-rpc/ptf_nn_agent.conf | 0 .../docker-syncd-mlnx-rpc/supervisord.conf | 0 platform/mellanox/rules.mk | 4 +++- 11 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 platform/broadcom/docker-syncd-brcm-rpc.mk rename dockers/docker-syncd-brcm-rpc/Dockerfile => platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 (81%) rename {dockers => platform/broadcom}/docker-syncd-brcm-rpc/ptf_nn_agent.conf (100%) rename {dockers => platform/broadcom}/docker-syncd-brcm-rpc/supervisord.conf (100%) create mode 100644 platform/mellanox/docker-syncd-mlnx-rpc.mk rename dockers/docker-syncd-mlnx-rpc/Dockerfile => platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 (81%) rename {dockers => platform/mellanox}/docker-syncd-mlnx-rpc/ptf_nn_agent.conf (100%) rename {dockers => platform/mellanox}/docker-syncd-mlnx-rpc/supervisord.conf (100%) diff --git a/.gitignore b/.gitignore index ffcc741d83ef..81a7535baec7 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,6 @@ dockers/docker-team/Dockerfile dockers/docker-teamd/Dockerfile dockers/docker-config-engine/Dockerfile dockers/docker-base/Dockerfile -platform/broadcom/docker-syncd-brcm/Dockerfile +platform/*/docker-syncd-*/Dockerfile +platform/*/docker-syncd-*-rpc/Dockerfile + diff --git a/platform/broadcom/docker-syncd-brcm-rpc.mk b/platform/broadcom/docker-syncd-brcm-rpc.mk new file mode 100644 index 000000000000..2fbca8f30978 --- /dev/null +++ b/platform/broadcom/docker-syncd-brcm-rpc.mk @@ -0,0 +1,8 @@ +# docker image for brcm syncd with rpc + +DOCKER_SYNCD_BRCM_RPC = docker-syncd-brcm-rpc.gz +$(DOCKER_SYNCD_BRCM_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-brcm-rpc +$(DOCKER_SYNCD_BRCM_RPC)_DEPENDS += $(SYNCD) $(LIBTHRIFT) +$(DOCKER_SYNCD_BRCM_RPC)_FILES += $(DSSERVE) $(BCMCMD) +$(DOCKER_SYNCD_BRCM_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_BRCM) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM_RPC) diff --git a/dockers/docker-syncd-brcm-rpc/Dockerfile b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 similarity index 81% rename from dockers/docker-syncd-brcm-rpc/Dockerfile rename to platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 index 23f5e7a25f6a..912f52cf73a7 100644 --- a/dockers/docker-syncd-brcm-rpc/Dockerfile +++ b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 @@ -3,7 +3,19 @@ FROM docker-syncd-brcm ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -COPY deps /deps +COPY \ +{% for deb in docker_syncd_brcm_rpc_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -r syncd + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ +dpkg_apt \ +{% for deb in docker_syncd_brcm_rpc_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} ## Pre-install the fundamental packages RUN apt-get update \ @@ -34,9 +46,6 @@ RUN apt-get update \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ && dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ - && dpkg -r syncd \ - && dpkg_apt /deps/syncd_*.deb \ - && dpkg_apt /deps/libthrift-0.9.3_*.deb \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ && rm -rf /deps diff --git a/dockers/docker-syncd-brcm-rpc/ptf_nn_agent.conf b/platform/broadcom/docker-syncd-brcm-rpc/ptf_nn_agent.conf similarity index 100% rename from dockers/docker-syncd-brcm-rpc/ptf_nn_agent.conf rename to platform/broadcom/docker-syncd-brcm-rpc/ptf_nn_agent.conf diff --git a/dockers/docker-syncd-brcm-rpc/supervisord.conf b/platform/broadcom/docker-syncd-brcm-rpc/supervisord.conf similarity index 100% rename from dockers/docker-syncd-brcm-rpc/supervisord.conf rename to platform/broadcom/docker-syncd-brcm-rpc/supervisord.conf diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 37e18ba80285..79d01b02f7eb 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -6,6 +6,7 @@ include $(PLATFORM_PATH)/platform-modules-arista.mk include $(PLATFORM_PATH)/platform-modules-ingrasys-s9100.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk +include $(PLATFORM_PATH)/docker-syncd-brcm-rpc.mk include $(PLATFORM_PATH)/one-image.mk include $(PLATFORM_PATH)/one-aboot.mk @@ -18,7 +19,8 @@ $(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/dsserve?sv SONIC_ONLINE_FILES += $(BCMCMD) $(DSSERVE) SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT_IMAGE) \ - $(DOCKER_FPM_GOBGP) + $(DOCKER_FPM_GOBGP) \ + $(DOCKER_SYNCD_BRCM_RPC) # Inject brcm sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) diff --git a/platform/mellanox/docker-syncd-mlnx-rpc.mk b/platform/mellanox/docker-syncd-mlnx-rpc.mk new file mode 100644 index 000000000000..7aab3c802327 --- /dev/null +++ b/platform/mellanox/docker-syncd-mlnx-rpc.mk @@ -0,0 +1,8 @@ +# docker image for mlnx syncd with rpc + +DOCKER_SYNCD_MLNX_RPC = docker-syncd-mlnx-rpc.gz +$(DOCKER_SYNCD_MLNX_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-mlnx-rpc +$(DOCKER_SYNCD_MLNX_RPC)_DEPENDS += $(SYNCD) $(LIBTHRIFT) +$(DOCKER_SYNCD_MLNX_RPC)_FILES += $(MLNX_FW) +$(DOCKER_SYNCD_MLNX_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_MLNX) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX_RPC) diff --git a/dockers/docker-syncd-mlnx-rpc/Dockerfile b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 similarity index 81% rename from dockers/docker-syncd-mlnx-rpc/Dockerfile rename to platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 index 42e24be7ecb5..15c998385abc 100644 --- a/dockers/docker-syncd-mlnx-rpc/Dockerfile +++ b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 @@ -3,7 +3,19 @@ FROM docker-syncd-mlnx ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -COPY deps /deps +COPY \ +{% for deb in docker_syncd_mlnx_rpc_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -r syncd + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ +dpkg_apt \ +{% for deb in docker_syncd_mlnx_rpc_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} ## Pre-install the fundamental packages RUN apt-get update \ @@ -34,9 +46,6 @@ RUN apt-get update \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ && dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ - && dpkg -r syncd \ - && dpkg_apt /deps/syncd_*.deb \ - && dpkg_apt /deps/libthrift-0.9.3_*.deb \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ && rm -rf /deps diff --git a/dockers/docker-syncd-mlnx-rpc/ptf_nn_agent.conf b/platform/mellanox/docker-syncd-mlnx-rpc/ptf_nn_agent.conf similarity index 100% rename from dockers/docker-syncd-mlnx-rpc/ptf_nn_agent.conf rename to platform/mellanox/docker-syncd-mlnx-rpc/ptf_nn_agent.conf diff --git a/dockers/docker-syncd-mlnx-rpc/supervisord.conf b/platform/mellanox/docker-syncd-mlnx-rpc/supervisord.conf similarity index 100% rename from dockers/docker-syncd-mlnx-rpc/supervisord.conf rename to platform/mellanox/docker-syncd-mlnx-rpc/supervisord.conf diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index 8bcb8d0278b4..5a57e57fbc4e 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -4,11 +4,13 @@ include $(PLATFORM_PATH)/mft.mk include $(PLATFORM_PATH)/mlnx-sai.mk include $(PLATFORM_PATH)/hw-management.mk include $(PLATFORM_PATH)/docker-syncd-mlnx.mk +include $(PLATFORM_PATH)/docker-syncd-mlnx-rpc.mk include $(PLATFORM_PATH)/docker-orchagent-mlnx.mk include $(PLATFORM_PATH)/one-image.mk SONIC_ALL += $(SONIC_ONE_IMAGE) \ - $(DOCKER_FPM_GOBGP) + $(DOCKER_FPM_GOBGP) \ + $(DOCKER_SYNCD_MLNX_RPC) # Inject mlnx sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) From 713f6fc3183340e648dd576756dac2779212928f Mon Sep 17 00:00:00 2001 From: Nadiya Date: Tue, 28 Mar 2017 00:22:04 +0300 Subject: [PATCH 0394/1011] [sonic-cfggen] Add check to generate valid bgpconfig (#440) * [sonic-cfggen]Add check to generate valid bgpconfig Signed-off-by: Nadiya.Stetskovych * Use builtin none instead of None Signed-off-by: Nadiya.Stetskovych --- dockers/docker-fpm/bgpd.conf.j2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dockers/docker-fpm/bgpd.conf.j2 b/dockers/docker-fpm/bgpd.conf.j2 index ed9afe0c3388..5f4bb25e0010 100644 --- a/dockers/docker-fpm/bgpd.conf.j2 +++ b/dockers/docker-fpm/bgpd.conf.j2 @@ -14,6 +14,7 @@ log facility local4 ! enable password {# {{ en_passwd }} TODO: param needed #} {% endblock system_init %} ! +{% if minigraph_bgp_asn is not none %} {% block bgp_init %} ! ! bgp multiple-instance @@ -34,6 +35,7 @@ router bgp {{ minigraph_bgp_asn }} {% endif %} {% endfor %} {% endblock bgp_init %} +{% endif %} {% block vlan_advertisement %} {% for vlan_interface in minigraph_vlan_interfaces %} network {{ vlan_interface['subnet'] }} @@ -57,8 +59,10 @@ router bgp {{ minigraph_bgp_asn }} {% endfor %} {% endblock bgp_sessions %} ! +{% if minigraph_bgp_asn is not none %} maximum-paths 64 ! route-map ISOLATE permit 10 set as-path prepend {{ minigraph_bgp_asn }} +{% endif %} ! From 8caa4cccd90167d1450d7d97b4097531c01b753a Mon Sep 17 00:00:00 2001 From: krambn Date: Mon, 27 Mar 2017 15:23:43 -0700 Subject: [PATCH 0395/1011] [p4]: Update p4-switch submodule (#444) - Increase P4 IPV4_LPM_TABLE_SIZE and IPV4_HOST_TABLE_SIZE --- platform/p4/p4-switch/switch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/p4/p4-switch/switch b/platform/p4/p4-switch/switch index 584571b17dda..e934752f356d 160000 --- a/platform/p4/p4-switch/switch +++ b/platform/p4/p4-switch/switch @@ -1 +1 @@ -Subproject commit 584571b17ddafcaa45a3d46eacc403b7e18cac1b +Subproject commit e934752f356d3ad48cbec99067f47c83795ddcec From fcaba688f764ba5783e736b45a0d77dd60211fbd Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 27 Mar 2017 15:27:20 -0700 Subject: [PATCH 0396/1011] [database]: Fix ENTRYPOINT for docker-database to ensure redis-server starts as PID 1 (#442) --- dockers/docker-database/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index af77177c58d0..59f90a897a9f 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -30,4 +30,4 @@ RUN sed -ri 's/^daemonize yes$/daemonize no/; s/^# unixsocket/unixsocket/ \ ' /etc/redis/redis.conf -ENTRYPOINT service redis-server start +ENTRYPOINT ["/usr/bin/redis-server", "/etc/redis/redis.conf"] From 70cc4994ef8a8cd9fc03b5b04357f368762e3965 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 27 Mar 2017 16:38:18 -0700 Subject: [PATCH 0397/1011] Fix qos configuration for TD2 platform (#439) --- dockers/docker-orchagent/start.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 6e05782b3d75..c18f2733789e 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -35,14 +35,14 @@ SWSSCONFIG_ARGS="00-copp.config.json " if [ "$HWSKU" == "Force10-S6000" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - SWSSCONFIG_ARGS+="td2.32ports.qos.json td2.32ports.buffers.json " + SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [ "$HWSKU" == "Force10-S6100" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "Force10-Z9100" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "Arista-7050-QX32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - SWSSCONFIG_ARGS+="td2.32ports.qos.json td2.32ports.buffers.json " + SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [ "$HWSKU" == "Arista-7060-CX32S" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "AS7512" ]; then From 91615c0241657dc74379d7a444167436859d2880 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Tue, 28 Mar 2017 21:27:07 +0300 Subject: [PATCH 0398/1011] [sonic-sairedis]: Update sonic-sairedis module. (#449) --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 383ed119845a..81c19878217c 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 383ed119845ad726788c4198aa05e3e31c20c78f +Subproject commit 81c19878217c26d71b64e93dbdbf777faa1d3cfa From 75272f4bbfd6cabd68613747fa598c2df0044344 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Tue, 28 Mar 2017 11:32:58 -0700 Subject: [PATCH 0399/1011] [libsaithrift]: Add libsaithrift debian packages (#443) * add saithrift library for brcm, mlnx, cavm, centec platforms --- .gitmodules | 5 +++++ platform/broadcom/libsaithrift-dev.mk | 7 +++++++ platform/broadcom/python-saithrift.mk | 6 ++++++ platform/broadcom/rules.mk | 2 ++ platform/cavium/libsaithrift-dev.mk | 7 +++++++ platform/cavium/python-saithrift.mk | 6 ++++++ platform/cavium/rules.mk | 2 ++ platform/centec/libsaithrift-dev.mk | 7 +++++++ platform/centec/python-saithrift.mk | 6 ++++++ platform/centec/rules.mk | 2 ++ platform/mellanox/libsaithrift-dev.mk | 7 +++++++ platform/mellanox/python-saithrift.mk | 6 ++++++ platform/mellanox/rules.mk | 2 ++ src/SAI | 1 + 14 files changed, 66 insertions(+) create mode 100644 platform/broadcom/libsaithrift-dev.mk create mode 100644 platform/broadcom/python-saithrift.mk create mode 100644 platform/cavium/libsaithrift-dev.mk create mode 100644 platform/cavium/python-saithrift.mk create mode 100644 platform/centec/libsaithrift-dev.mk create mode 100644 platform/centec/python-saithrift.mk create mode 100644 platform/mellanox/libsaithrift-dev.mk create mode 100644 platform/mellanox/python-saithrift.mk create mode 160000 src/SAI diff --git a/.gitmodules b/.gitmodules index c8fb78edcdff..131b4634b514 100644 --- a/.gitmodules +++ b/.gitmodules @@ -56,3 +56,8 @@ [submodule "platform/broadcom/sonic-platform-modules-ingrasys-s9100"] path = platform/broadcom/sonic-platform-modules-ingrasys-s9100 url = https://github.com/Ingrasys-sonic/sonic-platform-ingrasys-s9100 +[submodule "src/SAI"] + path = src/SAI + url = https://github.com/opencomputeproject/SAI + branch = v0.9.4 + diff --git a/platform/broadcom/libsaithrift-dev.mk b/platform/broadcom/libsaithrift-dev.mk new file mode 100644 index 000000000000..c809539b47fe --- /dev/null +++ b/platform/broadcom/libsaithrift-dev.mk @@ -0,0 +1,7 @@ +# libsaithrift-dev package + +LIBSAITHRIFT_DEV_BRCM = libsaithrift-dev_0.9.4_amd64.deb +$(LIBSAITHRIFT_DEV_BRCM)_SRC_PATH = $(SRC_PATH)/SAI +$(LIBSAITHRIFT_DEV_BRCM)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(BRCM_SAI) $(BRCM_SAI_DEV) +$(LIBSAITHRIFT_DEV_BRCM)_RDEPENDS += $(LIBTHRIFT) $(BRCM_SAI) +SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_BRCM) diff --git a/platform/broadcom/python-saithrift.mk b/platform/broadcom/python-saithrift.mk new file mode 100644 index 000000000000..f9da4143c7d9 --- /dev/null +++ b/platform/broadcom/python-saithrift.mk @@ -0,0 +1,6 @@ +# python-saithrift package + +PYTHON_SAITHRIFT_BRCM = python-saithrift_0.9.4_amd64.deb +$(PYTHON_SAITHRIFT_BRCM)_SRC_PATH = $(SRC_PATH)/SAI +$(PYTHON_SAITHRIFT_BRCM)_DEPENDS += $(BRCM_SAI_DEV) $(THRIFT_COMPILER) $(PYTHON_THRIFT) $(LIBTHRIFT_DEV) +SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_BRCM) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 79d01b02f7eb..aaf5f5dc5fbc 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -9,6 +9,8 @@ include $(PLATFORM_PATH)/docker-syncd-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm-rpc.mk include $(PLATFORM_PATH)/one-image.mk include $(PLATFORM_PATH)/one-aboot.mk +include $(PLATFORM_PATH)/libsaithrift-dev.mk +include $(PLATFORM_PATH)/python-saithrift.mk BCMCMD = bcmcmd $(BCMCMD)_URL = "https://sonicstorage.blob.core.windows.net/packages/bcmcmd?sv=2015-04-05&sr=b&sig=X3bFApmsNFmcnWM9mSGRxBugPcg%2FgJCHh5hhSuV1M2c%3D&se=2030-08-23T14%3A41%3A56Z&sp=r" diff --git a/platform/cavium/libsaithrift-dev.mk b/platform/cavium/libsaithrift-dev.mk new file mode 100644 index 000000000000..4a19fabffaf2 --- /dev/null +++ b/platform/cavium/libsaithrift-dev.mk @@ -0,0 +1,7 @@ +# libsaithrift-dev package + +LIBSAITHRIFT_DEV_CAVM = libsaithrift-dev_0.9.4_amd64.deb +$(LIBSAITHRIFT_DEV_CAVM)_SRC_PATH = $(SRC_PATH)/SAI +$(LIBSAITHRIFT_DEV_CAVM)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(CAVM_LIBSAI) $(CAVM_SAI) +$(LIBSAITHRIFT_DEV_CAVM)_RDEPENDS += $(LIBTHRIFT) $(CAVM_SAI) +SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_CAVM) diff --git a/platform/cavium/python-saithrift.mk b/platform/cavium/python-saithrift.mk new file mode 100644 index 000000000000..91d00ebaebc0 --- /dev/null +++ b/platform/cavium/python-saithrift.mk @@ -0,0 +1,6 @@ +# python-saithrift package + +PYTHON_SAITHRIFT_CAVM = python-saithrift_0.9.4_amd64.deb +$(PYTHON_SAITHRIFT_CAVM)_SRC_PATH = $(SRC_PATH)/SAI +$(PYTHON_SAITHRIFT_CAVM)_DEPENDS += $(CAVM_LIBSAI) $(CAVM_SAI) $(THRIFT_COMPILER) $(PYTHON_THRIFT) $(LIBTHRIFT_DEV) +SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_CAVM) diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index 05312066719f..f72989c241b8 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -3,6 +3,8 @@ include $(PLATFORM_PATH)/docker-syncd-cavm.mk include $(PLATFORM_PATH)/docker-orchagent-cavm.mk include $(PLATFORM_PATH)/cavm_platform_modules.mk include $(PLATFORM_PATH)/one-image.mk +include $(PLATFORM_PATH)/libsaithrift-dev.mk +include $(PLATFORM_PATH)/python-saithrift.mk SONIC_ALL += $(SONIC_ONE_IMAGE) \ $(DOCKER_FPM_GOBGP) diff --git a/platform/centec/libsaithrift-dev.mk b/platform/centec/libsaithrift-dev.mk new file mode 100644 index 000000000000..b8fddbdf7731 --- /dev/null +++ b/platform/centec/libsaithrift-dev.mk @@ -0,0 +1,7 @@ +# libsaithrift-dev package + +LIBSAITHRIFT_DEV_CENTEC = libsaithrift-dev_0.9.4_amd64.deb +$(LIBSAITHRIFT_DEV_CENTEC)_SRC_PATH = $(SRC_PATH)/SAI +$(LIBSAITHRIFT_DEV_CENTEC)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(CENTEC_SAI) +$(LIBSAITHRIFT_DEV_CENTEC)_RDEPENDS += $(LIBTHRIFT) $(CENTEC_SAI) +SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_CENTEC) diff --git a/platform/centec/python-saithrift.mk b/platform/centec/python-saithrift.mk new file mode 100644 index 000000000000..37d1e935c041 --- /dev/null +++ b/platform/centec/python-saithrift.mk @@ -0,0 +1,6 @@ +# python-saithrift package + +PYTHON_SAITHRIFT_CENTEC = python-saithrift_0.9.4_amd64.deb +$(PYTHON_SAITHRIFT_CENTEC)_SRC_PATH = $(SRC_PATH)/SAI +$(PYTHON_SAITHRIFT_CENTEC)_DEPENDS += $(CENTEC_SAI) $(THRIFT_COMPILER) $(PYTHON_THRIFT) $(LIBTHRIFT_DEV) +SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_CENTEC) diff --git a/platform/centec/rules.mk b/platform/centec/rules.mk index d8c3568f0cc0..9e53996c0a36 100644 --- a/platform/centec/rules.mk +++ b/platform/centec/rules.mk @@ -3,6 +3,8 @@ include $(PLATFORM_PATH)/sai.mk include $(PLATFORM_PATH)/docker-orchagent-centec.mk include $(PLATFORM_PATH)/docker-syncd-centec.mk include $(PLATFORM_PATH)/one-image.mk +include $(PLATFORM_PATH)/libsaithrift-dev.mk +include $(PLATFORM_PATH)/python-saithrift.mk SONIC_ALL += $(SONIC_ONE_IMAGE) diff --git a/platform/mellanox/libsaithrift-dev.mk b/platform/mellanox/libsaithrift-dev.mk new file mode 100644 index 000000000000..0fc6d3f4eb84 --- /dev/null +++ b/platform/mellanox/libsaithrift-dev.mk @@ -0,0 +1,7 @@ +# libsaithrift-dev package + +LIBSAITHRIFT_DEV_MLNX = libsaithrift-dev_0.9.4_amd64.deb +$(LIBSAITHRIFT_DEV_MLNX)_SRC_PATH = $(SRC_PATH)/SAI +$(LIBSAITHRIFT_DEV_MLNX)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(MLNX_SAI) $(MLNX_SAI_DEV) +$(LIBSAITHRIFT_DEV_MLNX)_RDEPENDS += $(LIBTHRIFT) $(MLNX_SAI) +SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_MLNX) diff --git a/platform/mellanox/python-saithrift.mk b/platform/mellanox/python-saithrift.mk new file mode 100644 index 000000000000..cbe5af29b3e2 --- /dev/null +++ b/platform/mellanox/python-saithrift.mk @@ -0,0 +1,6 @@ +# python-saithrift package + +PYTHON_SAITHRIFT_MLNX = python-saithrift_0.9.4_amd64.deb +$(PYTHON_SAITHRIFT_MLNX)_SRC_PATH = $(SRC_PATH)/SAI +$(PYTHON_SAITHRIFT_MLNX)_DEPENDS += $(MLNX_SAI_DEV) $(MLNX_SAI) $(THRIFT_COMPILER) $(PYTHON_THRIFT) $(LIBTHRIFT_DEV) +SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_MLNX) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index 5a57e57fbc4e..f0e8d4fcdb07 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -7,6 +7,8 @@ include $(PLATFORM_PATH)/docker-syncd-mlnx.mk include $(PLATFORM_PATH)/docker-syncd-mlnx-rpc.mk include $(PLATFORM_PATH)/docker-orchagent-mlnx.mk include $(PLATFORM_PATH)/one-image.mk +include $(PLATFORM_PATH)/libsaithrift-dev.mk +include $(PLATFORM_PATH)/python-saithrift.mk SONIC_ALL += $(SONIC_ONE_IMAGE) \ $(DOCKER_FPM_GOBGP) \ diff --git a/src/SAI b/src/SAI new file mode 160000 index 000000000000..20f7dffba5dc --- /dev/null +++ b/src/SAI @@ -0,0 +1 @@ +Subproject commit 20f7dffba5dcb0922a4af6e945804b821a3772c1 From 7a2a37491728de349113c80a3079919f7eaddaef Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 28 Mar 2017 15:48:29 -0700 Subject: [PATCH 0400/1011] [docker-snmp]: Disable snmpd IP module and use snmp subagent implementation (#447) * Disable snmpd ip module, will use snmp subagent implementation * Update git submodule --- dockers/docker-snmp-sv2/supervisord.conf | 2 +- src/sonic-snmpagent | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-snmp-sv2/supervisord.conf b/dockers/docker-snmp-sv2/supervisord.conf index eed4bf83cb0e..cf5990ec31e8 100644 --- a/dockers/docker-snmp-sv2/supervisord.conf +++ b/dockers/docker-snmp-sv2/supervisord.conf @@ -2,7 +2,7 @@ nodaemon=true [program:snmpd] -command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable,inetCidrRouteTable -p /run/snmpd.pid +command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable,inetCidrRouteTable,ip -p /run/snmpd.pid priority=100 [program:snmp-subagent] diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index c1b22019810c..c0e022addaaa 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit c1b22019810c0c6bf3516f5def320e1c84ca7e12 +Subproject commit c0e022addaaa0af857331d36e3766a88a2095941 From 27dae9072620b4abbcc832a54c9a126bd8b410f5 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 28 Mar 2017 15:49:48 -0700 Subject: [PATCH 0401/1011] [docker-teamd]: Clean /etc/teamd/ folder before adding new configurations (#451) Signed-off-by: Shuotian Cheng --- dockers/docker-teamd/config.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/dockers/docker-teamd/config.sh b/dockers/docker-teamd/config.sh index c08a580b80d2..9351966f233f 100755 --- a/dockers/docker-teamd/config.sh +++ b/dockers/docker-teamd/config.sh @@ -1,6 +1,7 @@ #!/bin/bash mkdir -p /etc/teamd +rm -f /etc/teamd/* for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_portchannels.keys() | join(' ')"`; do sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'"}' -t /usr/share/sonic/templates/teamd.j2 >/etc/teamd/$pc.conf From 423a1acac1b509da2ff14c50048092f733bc623a Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 29 Mar 2017 04:17:49 -0700 Subject: [PATCH 0402/1011] [installer]: Move platform-specific files under new device/ tree (#450) * Move platform-specific ONIE installer config files with rest of device-specific files * Merge contents of dell-s6000-replace-reboot.sh into s6000 installer conf file * Remove dell-s6000-replace-reboot.sh --- .gitignore | 3 ++- build_image.sh | 12 ++++++++++++ .../x86_64-accton_as7512_32x-r0/installer.conf | 0 .../x86_64-centec_e582_48x6q-r0/installer.conf | 0 .../dell/x86_64-dell_s6000_s1220-r0/installer.conf | 2 +- .../dell/x86_64-dell_s6100_c2538-r0/installer.conf | 0 .../dell/x86_64-dell_z9100_c2538-r0/installer.conf | 0 .../x86_64-ew_es6220_x48q2h4-r0/installer.conf | 0 .../x86_64-facebook_wedge100-r0/installer.conf | 0 .../ingrasys/x86_64-ingrasys_s9100-r0/installer.conf | 0 .../mellanox/x86_64-mlnx_msn2700-r0/installer.conf | 0 .../x86_64-mlnx_x86-r5.0.1400/installer.conf | 0 .../x86_64/platforms/x86_64-dell_s6000_s1220-r0 | 2 -- 13 files changed, 15 insertions(+), 4 deletions(-) rename installer/x86_64/platforms/x86_64-accton_as7512_32x-r0 => device/accton/x86_64-accton_as7512_32x-r0/installer.conf (100%) rename installer/x86_64/platforms/x86_64-centec_e582_48x6q-r0 => device/centec/x86_64-centec_e582_48x6q-r0/installer.conf (100%) rename installer/x86_64/dell-s6000-replace-reboot.sh => device/dell/x86_64-dell_s6000_s1220-r0/installer.conf (87%) mode change 100755 => 100644 rename installer/x86_64/platforms/x86_64-dell_s6100_c2538-r0 => device/dell/x86_64-dell_s6100_c2538-r0/installer.conf (100%) rename installer/x86_64/platforms/x86_64-dell_z9100_c2538-r0 => device/dell/x86_64-dell_z9100_c2538-r0/installer.conf (100%) rename installer/x86_64/platforms/x86_64-ew_es6220_x48q2h4-r0 => device/embedway/x86_64-ew_es6220_x48q2h4-r0/installer.conf (100%) rename installer/x86_64/platforms/x86_64-facebook_wedge100-r0 => device/facebook/x86_64-facebook_wedge100-r0/installer.conf (100%) rename installer/x86_64/platforms/x86_64-ingrasys_s9100-r0 => device/ingrasys/x86_64-ingrasys_s9100-r0/installer.conf (100%) rename installer/x86_64/platforms/x86_64-mlnx_msn2700-r0 => device/mellanox/x86_64-mlnx_msn2700-r0/installer.conf (100%) rename installer/x86_64/platforms/x86_64-mlnx_x86-r5.0.1400 => device/mellanox/x86_64-mlnx_x86-r5.0.1400/installer.conf (100%) delete mode 100644 installer/x86_64/platforms/x86_64-dell_s6000_s1220-r0 diff --git a/.gitignore b/.gitignore index 81a7535baec7..00f97edcec97 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ # Build system related .platform -.sku # Build artifacts fsroot/ @@ -39,3 +38,5 @@ dockers/docker-base/Dockerfile platform/*/docker-syncd-*/Dockerfile platform/*/docker-syncd-*-rpc/Dockerfile +# Installer-related files and directories +installer/x86_64/platforms/ diff --git a/build_image.sh b/build_image.sh index ab2e85b4836d..2da70ad57cf9 100755 --- a/build_image.sh +++ b/build_image.sh @@ -27,6 +27,18 @@ if [ "$IMAGE_TYPE" = "onie" ]; then echo "Build ONIE installer" mkdir -p `dirname $OUTPUT_ONIE_IMAGE` sudo rm -f $OUTPUT_ONIE_IMAGE + + # Copy platform-specific ONIE installer config files where onie-mk-demo.sh expects them + rm -rf ./installer/x86_64/platforms/ + mkdir -p ./installer/x86_64/platforms/ + for VENDOR in `ls ./device`; do + for PLATFORM in `ls ./device/$VENDOR`; do + if [ -f ./device/$VENDOR/$PLATFORM/installer.conf ]; then + cp ./device/$VENDOR/$PLATFORM/installer.conf ./installer/x86_64/platforms/$PLATFORM + fi + done + done + ## Generate an ONIE installer image ## Note: Don't leave blank between lines. It is single line command. ./onie-mk-demo.sh $TARGET_PLATFORM $TARGET_MACHINE $TARGET_PLATFORM-$TARGET_MACHINE-$ONIEIMAGE_VERSION \ diff --git a/installer/x86_64/platforms/x86_64-accton_as7512_32x-r0 b/device/accton/x86_64-accton_as7512_32x-r0/installer.conf similarity index 100% rename from installer/x86_64/platforms/x86_64-accton_as7512_32x-r0 rename to device/accton/x86_64-accton_as7512_32x-r0/installer.conf diff --git a/installer/x86_64/platforms/x86_64-centec_e582_48x6q-r0 b/device/centec/x86_64-centec_e582_48x6q-r0/installer.conf similarity index 100% rename from installer/x86_64/platforms/x86_64-centec_e582_48x6q-r0 rename to device/centec/x86_64-centec_e582_48x6q-r0/installer.conf diff --git a/installer/x86_64/dell-s6000-replace-reboot.sh b/device/dell/x86_64-dell_s6000_s1220-r0/installer.conf old mode 100755 new mode 100644 similarity index 87% rename from installer/x86_64/dell-s6000-replace-reboot.sh rename to device/dell/x86_64-dell_s6000_s1220-r0/installer.conf index 5854133cc4a4..eb135bee0ff1 --- a/installer/x86_64/dell-s6000-replace-reboot.sh +++ b/device/dell/x86_64-dell_s6000_s1220-r0/installer.conf @@ -1,4 +1,4 @@ -#!/bin/sh +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="processor.max_cstate=1 intel_idle.max_cstate=0" echo "Replace ONIE reboot with Dell reset commands" diff --git a/installer/x86_64/platforms/x86_64-dell_s6100_c2538-r0 b/device/dell/x86_64-dell_s6100_c2538-r0/installer.conf similarity index 100% rename from installer/x86_64/platforms/x86_64-dell_s6100_c2538-r0 rename to device/dell/x86_64-dell_s6100_c2538-r0/installer.conf diff --git a/installer/x86_64/platforms/x86_64-dell_z9100_c2538-r0 b/device/dell/x86_64-dell_z9100_c2538-r0/installer.conf similarity index 100% rename from installer/x86_64/platforms/x86_64-dell_z9100_c2538-r0 rename to device/dell/x86_64-dell_z9100_c2538-r0/installer.conf diff --git a/installer/x86_64/platforms/x86_64-ew_es6220_x48q2h4-r0 b/device/embedway/x86_64-ew_es6220_x48q2h4-r0/installer.conf similarity index 100% rename from installer/x86_64/platforms/x86_64-ew_es6220_x48q2h4-r0 rename to device/embedway/x86_64-ew_es6220_x48q2h4-r0/installer.conf diff --git a/installer/x86_64/platforms/x86_64-facebook_wedge100-r0 b/device/facebook/x86_64-facebook_wedge100-r0/installer.conf similarity index 100% rename from installer/x86_64/platforms/x86_64-facebook_wedge100-r0 rename to device/facebook/x86_64-facebook_wedge100-r0/installer.conf diff --git a/installer/x86_64/platforms/x86_64-ingrasys_s9100-r0 b/device/ingrasys/x86_64-ingrasys_s9100-r0/installer.conf similarity index 100% rename from installer/x86_64/platforms/x86_64-ingrasys_s9100-r0 rename to device/ingrasys/x86_64-ingrasys_s9100-r0/installer.conf diff --git a/installer/x86_64/platforms/x86_64-mlnx_msn2700-r0 b/device/mellanox/x86_64-mlnx_msn2700-r0/installer.conf similarity index 100% rename from installer/x86_64/platforms/x86_64-mlnx_msn2700-r0 rename to device/mellanox/x86_64-mlnx_msn2700-r0/installer.conf diff --git a/installer/x86_64/platforms/x86_64-mlnx_x86-r5.0.1400 b/device/mellanox/x86_64-mlnx_x86-r5.0.1400/installer.conf similarity index 100% rename from installer/x86_64/platforms/x86_64-mlnx_x86-r5.0.1400 rename to device/mellanox/x86_64-mlnx_x86-r5.0.1400/installer.conf diff --git a/installer/x86_64/platforms/x86_64-dell_s6000_s1220-r0 b/installer/x86_64/platforms/x86_64-dell_s6000_s1220-r0 deleted file mode 100644 index f778372ded1e..000000000000 --- a/installer/x86_64/platforms/x86_64-dell_s6000_s1220-r0 +++ /dev/null @@ -1,2 +0,0 @@ -ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="processor.max_cstate=1 intel_idle.max_cstate=0" -./dell-s6000-replace-reboot.sh From 4359f137f4efa9685102fe6e6b63d445a3937fb6 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 29 Mar 2017 09:14:47 -0700 Subject: [PATCH 0403/1011] [sonic-utilities]: Update sonic-utilities submodule (#452) Signed-off-by: Shuotian Cheng --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 4da9efed9355..edbda4670027 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 4da9efed9355fad8cdf9b1ca2c0a18dd9445eaba +Subproject commit edbda467002700230f89a7362a21b3d3909b1079 From 4546372f488db8c8760164aa8dff62f4e07c98ee Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 29 Mar 2017 13:33:54 -0700 Subject: [PATCH 0404/1011] [config/acl] Get ACL config from DHCP and load it in swss container (#432) Get ACL config from DHCP and load it in swss container --- dockers/docker-orchagent/start.sh | 13 ++++++++++ files/dhcp/dhclient.conf | 3 ++- files/dhcp/graphserviceurl | 3 +++ files/image_config/updategraph/updategraph | 30 ++++++++++++++++++++++ src/sonic-config-engine/translate_acl | 4 +-- 5 files changed, 50 insertions(+), 3 deletions(-) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index c18f2733789e..d73416ac9b1a 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -12,6 +12,18 @@ function start_app { done } +function config_acl { + if [ -f "/etc/sonic/acl.json" ]; then + mkdir -p /etc/swss/config.d/acl + rm -rf /etc/swss/config.d/acl/* + translate_acl -m /etc/sonic/minigraph.xml -o /etc/swss/config.d/acl /etc/sonic/acl.json + for filename in /etc/swss/config.d/acl/*.json; do + [ -e "$filename" ] || break + swssconfig $filename + done + fi +} + function clean_up { pkill -9 orchagent pkill -9 portsyncd @@ -60,6 +72,7 @@ while true; do result=`echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p` if [ "$result" != "0" ]; then start_app + config_acl read fi sleep 1 diff --git a/files/dhcp/dhclient.conf b/files/dhcp/dhclient.conf index ce4ac4d9f445..4a8bb037cd68 100644 --- a/files/dhcp/dhclient.conf +++ b/files/dhcp/dhclient.conf @@ -14,11 +14,12 @@ option rfc3442-classless-static-routes code 121 = array of unsigned integer 8; option snmp-community code 224 = text; option minigraph-url code 225 = text; +option acl-url code 226 = text; send host-name = gethostname(); request subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, domain-search, host-name, dhcp6.name-servers, dhcp6.domain-search, netbios-name-servers, netbios-scope, interface-mtu, - rfc3442-classless-static-routes, ntp-servers, snmp-community, minigraph-url; + rfc3442-classless-static-routes, ntp-servers, snmp-community, minigraph-url, acl-url; diff --git a/files/dhcp/graphserviceurl b/files/dhcp/graphserviceurl index 0e8b1b83e141..f255cdff9877 100644 --- a/files/dhcp/graphserviceurl +++ b/files/dhcp/graphserviceurl @@ -5,5 +5,8 @@ case $reason in else echo "N/A" > /tmp/dhcp_graph_url fi + if [ -n "$new_acl_url" ]; then + echo $new_acl_url > /tmp/dhcp_acl_url + fi ;; esac diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index 68fbe6eb9c19..0d3b248bc436 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -12,6 +12,8 @@ if [ "$enabled" != "true" ]; then exit 0 fi +ACL_URL=$acl_src + if [ "$src" = "dhcp" ]; then while [ ! -f /tmp/dhcp_graph_url ]; do echo "Waiting for DHCP response..." @@ -38,6 +40,18 @@ if [ "$src" = "dhcp" ]; then sed -i "/src=/d" /etc/sonic/updategraph.conf echo "src=\"$GRAPH_URL\"" >> /etc/sonic/updategraph.conf fi + + if [ -f /tmp/dhcp_acl_url ]; then + ACL_URL=`sonic-cfggen -t /tmp/dhcp_acl_url -a "{\"hostname\": \"$HOSTNAME\"}"` + if [[ ! $ACL_URL =~ $URL_REGEX ]]; then + echo "\"$ACL_URL\" is not a valid url. Skipping acl update." + ACL_URL="" + fi + if [ "$dhcp_as_static" = "true" ]; then + sed -i "/acl_src=/d" /etc/sonic/updategraph.conf + echo "acl_src=\"$ACL_URL\"" >> /etc/sonic/updategraph.conf + fi + fi else GRAPH_URL=$src fi @@ -53,3 +67,19 @@ while true; do curl -f $GRAPH_URL -o /etc/sonic/minigraph.xml --connect-timeout 15 && break sleep 5 done + +if [ -n "$ACL_URL" ]; then + if [ -f /etc/sonic/acl.json ]; then + echo "Renaming acl.json to acl.json.old" + mv /etc/sonic/acl.json /etc/sonic/acl.json.old + fi + echo "Getting ACL config from $ACL_URL" + + while true; do + curl -f $ACL_URL -o /etc/sonic/acl.json --connect-timeout 15 && break + sleep 5 + done +else + echo "Skip ACL config download." +fi + diff --git a/src/sonic-config-engine/translate_acl b/src/sonic-config-engine/translate_acl index f706fe1f52e4..2c4410615d6e 100755 --- a/src/sonic-config-engine/translate_acl +++ b/src/sonic-config-engine/translate_acl @@ -129,7 +129,6 @@ def translate_acl_fixed_port(filename, output_path, port, max_priority): def translate_acl(filename, output_path, attach_to, max_priority): yang_acl = pybindJSON.load(filename, openconfig_acl, "openconfig_acl") - print attach_to.keys() for aclsetname in yang_acl.acl.acl_sets.acl_set: tablename = aclsetname.replace(" ", "_").replace("-", "_") if attach_to.has_key(tablename): @@ -151,7 +150,8 @@ def main(): translate_acl_fixed_port(args.input, args.output_path, args.port, args.max_priority) elif args.minigraph: mini_data = parse_xml(args.minigraph) - translate_acl(args.input, args.output_path, mini_data['minigraph_acls'], args.max_priority) + if mini_data['minigraph_acls']: + translate_acl(args.input, args.output_path, mini_data['minigraph_acls'], args.max_priority) if __name__ == "__main__": main() From 7f703a9c8fda699f6d0b436576630abbd4442c85 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 29 Mar 2017 17:47:21 -0700 Subject: [PATCH 0405/1011] [docker-lldp]: Do not use TTY mode on lldpctl command (#454) Signed-off-by: Shuotian Cheng --- dockers/docker-lldp-sv2/base_image_files/lldpctl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-lldp-sv2/base_image_files/lldpctl b/dockers/docker-lldp-sv2/base_image_files/lldpctl index c55e5ce8e2fb..068a6e3b5048 100755 --- a/dockers/docker-lldp-sv2/base_image_files/lldpctl +++ b/dockers/docker-lldp-sv2/base_image_files/lldpctl @@ -1,2 +1,2 @@ #!/bin/bash -docker exec -it lldp lldpctl "$@" +docker exec -i lldp lldpctl "$@" From 814fd87e63c60dd306696a5cb4ec7610b7dcab2d Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 29 Mar 2017 18:07:25 -0700 Subject: [PATCH 0406/1011] Remove /var/run/rsyslogd.pid bofore starting rsyslog (#453) --- dockers/docker-basic_router/Dockerfile | 3 ++- dockers/docker-dhcp-relay/Dockerfile | 1 - dockers/docker-dhcp-relay/start.sh | 3 +++ dockers/docker-fpm-gobgp/start.sh | 1 + dockers/docker-fpm/start.sh | 1 + dockers/docker-lldp-sv2/config.sh | 1 + dockers/docker-orchagent/start.sh | 1 + dockers/docker-platform-monitor/config.sh | 1 + dockers/docker-saiserver-brcm/start.sh | 1 + dockers/docker-saiserver-cavm/start.sh | 1 + dockers/docker-saiserver-mlnx/start.sh | 1 + dockers/docker-snmp-sv2/config.sh | 1 + dockers/docker-teamd/start.sh | 1 + dockers/docker-vas/Dockerfile | 3 ++- platform/broadcom/docker-syncd-brcm/start.sh | 1 + platform/cavium/docker-syncd-cavm/start.sh | 1 + platform/centec/docker-syncd-centec/start.sh | 1 + platform/p4/docker-sonic-p4/startup.sh | 1 + 18 files changed, 21 insertions(+), 3 deletions(-) diff --git a/dockers/docker-basic_router/Dockerfile b/dockers/docker-basic_router/Dockerfile index 8bf1875ab98c..7176fac14b3b 100644 --- a/dockers/docker-basic_router/Dockerfile +++ b/dockers/docker-basic_router/Dockerfile @@ -17,5 +17,6 @@ RUN dpkg -i /deps/libopennsl_*.deb; \ RUN mv /deps/basic_router /usr/sbin/basic_router -ENTRYPOINT service rsyslog start \ +ENTRYPOINT rm -f /var/run/rsyslogd.pid \ + && service rsyslog start \ && /bin/bash diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile index 5c9ee3fb643b..315ea605f3ee 100644 --- a/dockers/docker-dhcp-relay/Dockerfile +++ b/dockers/docker-dhcp-relay/Dockerfile @@ -18,6 +18,5 @@ COPY ["config.sh", "/usr/bin/"] COPY ["start.sh", "/usr/bin/"] ENTRYPOINT /usr/bin/config.sh \ - && service rsyslog start \ && /usr/bin/start.sh \ && /bin/bash diff --git a/dockers/docker-dhcp-relay/start.sh b/dockers/docker-dhcp-relay/start.sh index 05a7693268dc..ff8a629d98eb 100755 --- a/dockers/docker-dhcp-relay/start.sh +++ b/dockers/docker-dhcp-relay/start.sh @@ -1,5 +1,8 @@ #!/bin/bash +rm -f /var/run/rsyslogd.pid +service rsyslog start + VLAN_IFACE_NAME=`sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_vlan_interfaces[0]['name']"` # Wait for the VLAN to come up (i.e., 'ip link show' returns 0) diff --git a/dockers/docker-fpm-gobgp/start.sh b/dockers/docker-fpm-gobgp/start.sh index 90a1d515fa3a..0aa3f68091a1 100755 --- a/dockers/docker-fpm-gobgp/start.sh +++ b/dockers/docker-fpm-gobgp/start.sh @@ -1,5 +1,6 @@ #!/bin/bash +rm -f /var/run/rsyslogd.pid service rsyslog start service quagga start fpmsyncd & diff --git a/dockers/docker-fpm/start.sh b/dockers/docker-fpm/start.sh index 90a1d515fa3a..0aa3f68091a1 100755 --- a/dockers/docker-fpm/start.sh +++ b/dockers/docker-fpm/start.sh @@ -1,5 +1,6 @@ #!/bin/bash +rm -f /var/run/rsyslogd.pid service rsyslog start service quagga start fpmsyncd & diff --git a/dockers/docker-lldp-sv2/config.sh b/dockers/docker-lldp-sv2/config.sh index 842a10306c4f..1263cb7a5154 100755 --- a/dockers/docker-lldp-sv2/config.sh +++ b/dockers/docker-lldp-sv2/config.sh @@ -5,3 +5,4 @@ sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/lldpd.con mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status +rm -f /var/run/rsyslogd.pid diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index d73416ac9b1a..088d0fe1bcf0 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -65,6 +65,7 @@ elif [ "$HWSKU" == "ACS-MSN2700" ]; then SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json " fi +rm -f /var/run/rsyslogd.pid service rsyslog start while true; do diff --git a/dockers/docker-platform-monitor/config.sh b/dockers/docker-platform-monitor/config.sh index 7021f18aacb8..a88bdf594f95 100755 --- a/dockers/docker-platform-monitor/config.sh +++ b/dockers/docker-platform-monitor/config.sh @@ -9,3 +9,4 @@ fi mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status +rm -f /var/run/rsyslogd.pid diff --git a/dockers/docker-saiserver-brcm/start.sh b/dockers/docker-saiserver-brcm/start.sh index 07d03b41a9ba..1d65e4a069e7 100755 --- a/dockers/docker-saiserver-brcm/start.sh +++ b/dockers/docker-saiserver-brcm/start.sh @@ -13,6 +13,7 @@ start_bcm() trap clean_up SIGTERM SIGKILL +rm -f /var/run/rsyslogd.pid service rsyslog start start_bcm diff --git a/dockers/docker-saiserver-cavm/start.sh b/dockers/docker-saiserver-cavm/start.sh index 8d683c0a016a..5c3185613184 100755 --- a/dockers/docker-saiserver-cavm/start.sh +++ b/dockers/docker-saiserver-cavm/start.sh @@ -6,6 +6,7 @@ function clean_up { trap clean_up SIGTERM SIGKILL +rm -f /var/run/rsyslogd.pid service rsyslog start /usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini diff --git a/dockers/docker-saiserver-mlnx/start.sh b/dockers/docker-saiserver-mlnx/start.sh index 4e1aa752d3a5..e3356be12025 100755 --- a/dockers/docker-saiserver-mlnx/start.sh +++ b/dockers/docker-saiserver-mlnx/start.sh @@ -11,6 +11,7 @@ start_mlnx() trap clean_up SIGTERM SIGKILL +rm -f /var/run/rsyslogd.pid service rsyslog start start_mlnx diff --git a/dockers/docker-snmp-sv2/config.sh b/dockers/docker-snmp-sv2/config.sh index b6216e8353b0..16b4507b09a2 100755 --- a/dockers/docker-snmp-sv2/config.sh +++ b/dockers/docker-snmp-sv2/config.sh @@ -13,3 +13,4 @@ sonic-cfggen -m /etc/sonic/minigraph.xml -s >/etc/snmp/alias_map.json mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status +rm -f /var/run/rsyslogd.pid diff --git a/dockers/docker-teamd/start.sh b/dockers/docker-teamd/start.sh index 6ea5eb01b328..5397475defb7 100755 --- a/dockers/docker-teamd/start.sh +++ b/dockers/docker-teamd/start.sh @@ -28,6 +28,7 @@ function clean_up { trap clean_up SIGTERM SIGKILL +rm -f /var/run/rsyslogd.pid service rsyslog start # Before teamd could automatically add newly created host interfaces into the diff --git a/dockers/docker-vas/Dockerfile b/dockers/docker-vas/Dockerfile index fb207d07199e..245bbd6baeb7 100755 --- a/dockers/docker-vas/Dockerfile +++ b/dockers/docker-vas/Dockerfile @@ -30,7 +30,8 @@ VOLUME /var/opt/quest/vas/vasd/ VOLUME /home/ ## Delete the symlinks and create full copies to host folder -ENTRYPOINT service rsyslog start \ +ENTRYPOINT rm -f /var/run/rsyslogd.pid \ + && service rsyslog start \ && cp --remove-destination /opt/quest/lib64/nss/libnss_vas4.so.2 \ /host/lib/x86_64-linux-gnu/ \ && cp --remove-destination /opt/quest/lib64/security/pam_vas3.so \ diff --git a/platform/broadcom/docker-syncd-brcm/start.sh b/platform/broadcom/docker-syncd-brcm/start.sh index 3e5b941a7658..6a08b7151432 100755 --- a/platform/broadcom/docker-syncd-brcm/start.sh +++ b/platform/broadcom/docker-syncd-brcm/start.sh @@ -8,6 +8,7 @@ function clean_up { trap clean_up SIGTERM SIGKILL +rm -f /var/run/rsyslogd.pid service rsyslog start service syncd start diff --git a/platform/cavium/docker-syncd-cavm/start.sh b/platform/cavium/docker-syncd-cavm/start.sh index 21d61e707344..b6c77ff235b5 100755 --- a/platform/cavium/docker-syncd-cavm/start.sh +++ b/platform/cavium/docker-syncd-cavm/start.sh @@ -2,6 +2,7 @@ export XP_ROOT=/usr/bin/ +rm -f /var/run/rsyslogd.pid service rsyslog start while true; do diff --git a/platform/centec/docker-syncd-centec/start.sh b/platform/centec/docker-syncd-centec/start.sh index 3e5b941a7658..6a08b7151432 100755 --- a/platform/centec/docker-syncd-centec/start.sh +++ b/platform/centec/docker-syncd-centec/start.sh @@ -8,6 +8,7 @@ function clean_up { trap clean_up SIGTERM SIGKILL +rm -f /var/run/rsyslogd.pid service rsyslog start service syncd start diff --git a/platform/p4/docker-sonic-p4/startup.sh b/platform/p4/docker-sonic-p4/startup.sh index e5221f834259..18cd4716580b 100755 --- a/platform/p4/docker-sonic-p4/startup.sh +++ b/platform/p4/docker-sonic-p4/startup.sh @@ -4,6 +4,7 @@ echo "Set onie_platform to x86_64-barefoot_p4-r0" export onie_platform=x86_64-barefoot_p4-r0 echo "Start rsyslog" +rm -f /var/run/rsyslogd.pid service rsyslog start echo "Start redis server" From 94934f7b3b55d75d1fd51602eb68003a258360c5 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 29 Mar 2017 20:11:46 -0700 Subject: [PATCH 0407/1011] Revert 432 taoyl/acl dhcp (#457) * Revert "[config/acl] Get ACL config from DHCP and load it in swss container (#432)" This reverts commit 4546372f488db8c8760164aa8dff62f4e07c98ee. --- dockers/docker-orchagent/start.sh | 13 ---------- files/dhcp/dhclient.conf | 3 +-- files/dhcp/graphserviceurl | 3 --- files/image_config/updategraph/updategraph | 30 ---------------------- src/sonic-config-engine/translate_acl | 4 +-- 5 files changed, 3 insertions(+), 50 deletions(-) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 088d0fe1bcf0..dd0a469efb93 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -12,18 +12,6 @@ function start_app { done } -function config_acl { - if [ -f "/etc/sonic/acl.json" ]; then - mkdir -p /etc/swss/config.d/acl - rm -rf /etc/swss/config.d/acl/* - translate_acl -m /etc/sonic/minigraph.xml -o /etc/swss/config.d/acl /etc/sonic/acl.json - for filename in /etc/swss/config.d/acl/*.json; do - [ -e "$filename" ] || break - swssconfig $filename - done - fi -} - function clean_up { pkill -9 orchagent pkill -9 portsyncd @@ -73,7 +61,6 @@ while true; do result=`echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p` if [ "$result" != "0" ]; then start_app - config_acl read fi sleep 1 diff --git a/files/dhcp/dhclient.conf b/files/dhcp/dhclient.conf index 4a8bb037cd68..ce4ac4d9f445 100644 --- a/files/dhcp/dhclient.conf +++ b/files/dhcp/dhclient.conf @@ -14,12 +14,11 @@ option rfc3442-classless-static-routes code 121 = array of unsigned integer 8; option snmp-community code 224 = text; option minigraph-url code 225 = text; -option acl-url code 226 = text; send host-name = gethostname(); request subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, domain-search, host-name, dhcp6.name-servers, dhcp6.domain-search, netbios-name-servers, netbios-scope, interface-mtu, - rfc3442-classless-static-routes, ntp-servers, snmp-community, minigraph-url, acl-url; + rfc3442-classless-static-routes, ntp-servers, snmp-community, minigraph-url; diff --git a/files/dhcp/graphserviceurl b/files/dhcp/graphserviceurl index f255cdff9877..0e8b1b83e141 100644 --- a/files/dhcp/graphserviceurl +++ b/files/dhcp/graphserviceurl @@ -5,8 +5,5 @@ case $reason in else echo "N/A" > /tmp/dhcp_graph_url fi - if [ -n "$new_acl_url" ]; then - echo $new_acl_url > /tmp/dhcp_acl_url - fi ;; esac diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index 0d3b248bc436..68fbe6eb9c19 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -12,8 +12,6 @@ if [ "$enabled" != "true" ]; then exit 0 fi -ACL_URL=$acl_src - if [ "$src" = "dhcp" ]; then while [ ! -f /tmp/dhcp_graph_url ]; do echo "Waiting for DHCP response..." @@ -40,18 +38,6 @@ if [ "$src" = "dhcp" ]; then sed -i "/src=/d" /etc/sonic/updategraph.conf echo "src=\"$GRAPH_URL\"" >> /etc/sonic/updategraph.conf fi - - if [ -f /tmp/dhcp_acl_url ]; then - ACL_URL=`sonic-cfggen -t /tmp/dhcp_acl_url -a "{\"hostname\": \"$HOSTNAME\"}"` - if [[ ! $ACL_URL =~ $URL_REGEX ]]; then - echo "\"$ACL_URL\" is not a valid url. Skipping acl update." - ACL_URL="" - fi - if [ "$dhcp_as_static" = "true" ]; then - sed -i "/acl_src=/d" /etc/sonic/updategraph.conf - echo "acl_src=\"$ACL_URL\"" >> /etc/sonic/updategraph.conf - fi - fi else GRAPH_URL=$src fi @@ -67,19 +53,3 @@ while true; do curl -f $GRAPH_URL -o /etc/sonic/minigraph.xml --connect-timeout 15 && break sleep 5 done - -if [ -n "$ACL_URL" ]; then - if [ -f /etc/sonic/acl.json ]; then - echo "Renaming acl.json to acl.json.old" - mv /etc/sonic/acl.json /etc/sonic/acl.json.old - fi - echo "Getting ACL config from $ACL_URL" - - while true; do - curl -f $ACL_URL -o /etc/sonic/acl.json --connect-timeout 15 && break - sleep 5 - done -else - echo "Skip ACL config download." -fi - diff --git a/src/sonic-config-engine/translate_acl b/src/sonic-config-engine/translate_acl index 2c4410615d6e..f706fe1f52e4 100755 --- a/src/sonic-config-engine/translate_acl +++ b/src/sonic-config-engine/translate_acl @@ -129,6 +129,7 @@ def translate_acl_fixed_port(filename, output_path, port, max_priority): def translate_acl(filename, output_path, attach_to, max_priority): yang_acl = pybindJSON.load(filename, openconfig_acl, "openconfig_acl") + print attach_to.keys() for aclsetname in yang_acl.acl.acl_sets.acl_set: tablename = aclsetname.replace(" ", "_").replace("-", "_") if attach_to.has_key(tablename): @@ -150,8 +151,7 @@ def main(): translate_acl_fixed_port(args.input, args.output_path, args.port, args.max_priority) elif args.minigraph: mini_data = parse_xml(args.minigraph) - if mini_data['minigraph_acls']: - translate_acl(args.input, args.output_path, mini_data['minigraph_acls'], args.max_priority) + translate_acl(args.input, args.output_path, mini_data['minigraph_acls'], args.max_priority) if __name__ == "__main__": main() From 71d299bed4350eed6e51355baf01538ddee24654 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 30 Mar 2017 11:51:05 -0700 Subject: [PATCH 0408/1011] [swsssdk]: Update nomenclature: 'sswsdk' -> 'swsssdk' (#445) --- dockers/docker-lldp-sv2/Dockerfile.j2 | 8 ++++---- dockers/docker-lldp/Dockerfile | 16 ++++++++-------- dockers/docker-snmp-sv2/Dockerfile.j2 | 3 ++- dockers/docker-snmp/Dockerfile | 1 - rules/asyncsnmp-py3.mk | 2 +- rules/dbsyncd-py2.mk | 2 +- rules/sswsdk-py2.mk | 6 ------ rules/sswsdk-py3.mk | 8 -------- rules/swsssdk-py2.mk | 6 ++++++ rules/swsssdk-py3.mk | 8 ++++++++ src/sonic-dbsyncd | 2 +- src/sonic-py-swsssdk | 2 +- src/sonic-snmpagent | 2 +- src/sonic-utilities | 2 +- 14 files changed, 34 insertions(+), 34 deletions(-) delete mode 100644 rules/sswsdk-py2.mk delete mode 100644 rules/sswsdk-py3.mk create mode 100644 rules/swsssdk-py2.mk create mode 100644 rules/swsssdk-py3.mk diff --git a/dockers/docker-lldp-sv2/Dockerfile.j2 b/dockers/docker-lldp-sv2/Dockerfile.j2 index 4ff66944fe07..1910e0d79fe3 100644 --- a/dockers/docker-lldp-sv2/Dockerfile.j2 +++ b/dockers/docker-lldp-sv2/Dockerfile.j2 @@ -13,16 +13,16 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y python-pip supervisor libbsd0 libevent-2.0-5 libjansson4 libwrap0 libxml2 libpci3 libperl5.20 -## Pre-install the fundamental packages -## Install Python SSWSDK -## Install LLDP Sync Daemon +# Pre-install the fundamental packages +# Install Python SwSS SDK +# Install LLDP Sync Daemon RUN dpkg -i \ {% for deb in docker_lldp_sv2_debs.split(' ') -%} debs/{{ deb }}{{' '}} {%- endfor %} -RUN pip install /python-wheels/sswsdk-2.0.1-py2-none-any.whl && \ +RUN pip install /python-wheels/swsssdk-2.0.1-py2-none-any.whl && \ pip install /python-wheels/sonic_d-2.0.0-py2-none-any.whl && \ apt-get remove -y python-pip && \ apt-get purge -y && apt-get autoclean -y && apt-get autoremove -y && \ diff --git a/dockers/docker-lldp/Dockerfile b/dockers/docker-lldp/Dockerfile index 044e16953e83..595c41bcd85e 100644 --- a/dockers/docker-lldp/Dockerfile +++ b/dockers/docker-lldp/Dockerfile @@ -1,21 +1,21 @@ FROM docker-base -COPY deps/sswsdk*.whl deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ +COPY deps/swsssdk*.whl deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ -## Make apt-get non-interactive +# Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -## Pre-install the fundamental packages -## Install Python SSWSDK (lldpsyncd dependency) -## Install LLDP Sync Daemon -## Note: dpkg_apt function has the benefit to detect missing .deb file -## Clean up +# Pre-install the fundamental packages +# Install Python SwSS SDK (lldpsyncd dependency) +# Install LLDP Sync Daemon +# Note: dpkg_apt function has the benefit to detect missing .deb file +# Clean up RUN apt-get update && \ dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ dpkg_apt /deps/lldpd_*.deb && \ dpkg_apt /deps/lldpsyncd_*.deb && \ apt-get install -y python-pip supervisor && \ - pip install /deps/sswsdk*.whl && \ + pip install /deps/swsssdk*.whl && \ apt-get remove -y python-pip && \ apt-get purge -y && apt-get autoclean -y && apt-get autoremove -y && \ rm -rf /deps ~/.cache diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index db5a6a574f48..fed2d1b85d58 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -6,7 +6,8 @@ COPY [ \ {%- endfor %} \ "/debs/"] -COPY python-wheels/sswsdk-*-py3-*.whl /python-wheels/ +# Install Python SwSSSDK (SNMP subagent dependency) +COPY python-wheels/swsssdk-*-py3-*.whl /python-wheels/ COPY python-wheels/asyncsnmp-*-py3-*.whl /python-wheels/ # enable -O for all Python calls diff --git a/dockers/docker-snmp/Dockerfile b/dockers/docker-snmp/Dockerfile index c13428563e33..6a79db976adc 100644 --- a/dockers/docker-snmp/Dockerfile +++ b/dockers/docker-snmp/Dockerfile @@ -10,7 +10,6 @@ ENV PYTHONOPTIMIZE 1 ENV DEBIAN_FRONTEND=noninteractive ## Pre-install the fundamental packages -## Install Python SSWSDK (SNMP subagent dependency) ## Install SNMP subagent ## Note: dpkg_apt function has the benefit to detect missing .deb file ## Clean up diff --git a/rules/asyncsnmp-py3.mk b/rules/asyncsnmp-py3.mk index 68566b1fa49d..a5a078e15bc3 100644 --- a/rules/asyncsnmp-py3.mk +++ b/rules/asyncsnmp-py3.mk @@ -3,5 +3,5 @@ ASYNCSNMP_PY3 = asyncsnmp-2.1.0-py3-none-any.whl $(ASYNCSNMP_PY3)_SRC_PATH = $(SRC_PATH)/sonic-snmpagent $(ASYNCSNMP_PY3)_PYTHON_VERSION = 3 -$(ASYNCSNMP_PY3)_DEPENDS += $(SSWSDK_PY3) +$(ASYNCSNMP_PY3)_DEPENDS += $(SWSSSDK_PY3) SONIC_PYTHON_WHEELS += $(ASYNCSNMP_PY3) diff --git a/rules/dbsyncd-py2.mk b/rules/dbsyncd-py2.mk index cd85b9ed7f60..220dc5fe7a1d 100644 --- a/rules/dbsyncd-py2.mk +++ b/rules/dbsyncd-py2.mk @@ -3,5 +3,5 @@ DBSYNCD_PY2 = sonic_d-2.0.0-py2-none-any.whl $(DBSYNCD_PY2)_SRC_PATH = $(SRC_PATH)/sonic-dbsyncd $(DBSYNCD_PY2)_PYTHON_VERSION = 2 -$(DBSYNCD_PY2)_DEPENDS += $(SSWSDK_PY2) +$(DBSYNCD_PY2)_DEPENDS += $(SWSSSDK_PY2) SONIC_PYTHON_WHEELS += $(DBSYNCD_PY2) diff --git a/rules/sswsdk-py2.mk b/rules/sswsdk-py2.mk deleted file mode 100644 index b50ea229ab7e..000000000000 --- a/rules/sswsdk-py2.mk +++ /dev/null @@ -1,6 +0,0 @@ -# sswsdk python2 wheel - -SSWSDK_PY2 = sswsdk-2.0.1-py2-none-any.whl -$(SSWSDK_PY2)_SRC_PATH = $(SRC_PATH)/sonic-py-swsssdk -$(SSWSDK_PY2)_PYTHON_VERSION = 2 -SONIC_PYTHON_WHEELS += $(SSWSDK_PY2) diff --git a/rules/sswsdk-py3.mk b/rules/sswsdk-py3.mk deleted file mode 100644 index 4dd0e7805bb1..000000000000 --- a/rules/sswsdk-py3.mk +++ /dev/null @@ -1,8 +0,0 @@ -# sswsdk python3 wheel - -SSWSDK_PY3 = sswsdk-2.0.1-py3-none-any.whl -$(SSWSDK_PY3)_SRC_PATH = $(SRC_PATH)/sonic-py-swsssdk -$(SSWSDK_PY3)_PYTHON_VERSION = 3 -# Synthetic dependency just to avoid race condition -$(SSWSDK_PY3)_DEPENDS += $(SSWSDK_PY2) -SONIC_PYTHON_WHEELS += $(SSWSDK_PY3) diff --git a/rules/swsssdk-py2.mk b/rules/swsssdk-py2.mk new file mode 100644 index 000000000000..a45677ae5882 --- /dev/null +++ b/rules/swsssdk-py2.mk @@ -0,0 +1,6 @@ +# swsssdk python2 wheel + +SWSSSDK_PY2 = swsssdk-2.0.1-py2-none-any.whl +$(SWSSSDK_PY2)_SRC_PATH = $(SRC_PATH)/sonic-py-swsssdk +$(SWSSSDK_PY2)_PYTHON_VERSION = 2 +SONIC_PYTHON_WHEELS += $(SWSSSDK_PY2) diff --git a/rules/swsssdk-py3.mk b/rules/swsssdk-py3.mk new file mode 100644 index 000000000000..e2f3519e00ca --- /dev/null +++ b/rules/swsssdk-py3.mk @@ -0,0 +1,8 @@ +# swsssdk python3 wheel + +SWSSSDK_PY3 = swsssdk-2.0.1-py3-none-any.whl +$(SWSSSDK_PY3)_SRC_PATH = $(SRC_PATH)/sonic-py-swsssdk +$(SWSSSDK_PY3)_PYTHON_VERSION = 3 +# Synthetic dependency just to avoid race condition +$(SWSSSDK_PY3)_DEPENDS += $(SWSSSDK_PY2) +SONIC_PYTHON_WHEELS += $(SWSSSDK_PY3) diff --git a/src/sonic-dbsyncd b/src/sonic-dbsyncd index 3d30cfc9318d..812f2cd50f83 160000 --- a/src/sonic-dbsyncd +++ b/src/sonic-dbsyncd @@ -1 +1 @@ -Subproject commit 3d30cfc9318d03652df01c0871090f5ef6c8ccb2 +Subproject commit 812f2cd50f83c1b83fbfc2688752e969cd5cd6f9 diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 497bdfe64c3d..ebb5ec6870ac 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 497bdfe64c3ddc2ce711ec8a2b0839d9d26f5666 +Subproject commit ebb5ec6870acccfde267e513d68d107873b0960e diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index c0e022addaaa..d39b66b354af 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit c0e022addaaa0af857331d36e3766a88a2095941 +Subproject commit d39b66b354af4db07313af82341fdc20762e89fc diff --git a/src/sonic-utilities b/src/sonic-utilities index edbda4670027..5c59ec6b8e06 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit edbda467002700230f89a7362a21b3d3909b1079 +Subproject commit 5c59ec6b8e067dab8c3d786432d6d2c9b961ec78 From fed908fc6bf6df77644d68df9a3ac787cea148c3 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 30 Mar 2017 15:25:31 -0700 Subject: [PATCH 0409/1011] [config-engine] minigraph.py refactoring (#448) * Refactor minigraph.py See description in https://github.com/Azure/sonic-buildimage/pull/448 for detail --- dockers/docker-dhcp-relay/isc-dhcp-relay.j2 | 2 +- dockers/docker-dhcp-relay/start.sh | 2 +- dockers/docker-fpm-gobgp/zebra.conf.j2 | 7 +- dockers/docker-fpm/zebra.conf.j2 | 6 +- dockers/docker-lldp-sv2/lldpd.conf.j2 | 4 +- dockers/docker-snmp-sv2/alias_map.j2 | 5 + dockers/docker-snmp-sv2/config.sh | 2 +- files/image_config/interfaces/interfaces.j2 | 56 ++--- slave.mk | 3 +- src/sonic-config-engine/minigraph.py | 165 +++++++------- src/sonic-config-engine/sonic-cfggen | 13 -- .../tests/simple-sample-graph.xml | 205 ++++++++++++++++++ src/sonic-config-engine/tests/test_cfggen.py | 34 ++- src/sonic-config-engine/tests/test_j2files.py | 5 + 14 files changed, 366 insertions(+), 143 deletions(-) create mode 100644 dockers/docker-snmp-sv2/alias_map.j2 create mode 100644 src/sonic-config-engine/tests/simple-sample-graph.xml diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 index 812e2bb8e1e4..aa5e21ac279a 100644 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 @@ -1,6 +1,6 @@ SERVERS="{{ dhcp_servers | join(' ') }}" -INTERFACES="{{ minigraph_vlan_interfaces[0]['name'] }}" +INTERFACES="{{ minigraph_vlan_interfaces[0]['attachto'] }}" # '-a' option provides option 82 circuit id information OPTIONS="-a" diff --git a/dockers/docker-dhcp-relay/start.sh b/dockers/docker-dhcp-relay/start.sh index ff8a629d98eb..f5bdf49396d3 100755 --- a/dockers/docker-dhcp-relay/start.sh +++ b/dockers/docker-dhcp-relay/start.sh @@ -3,7 +3,7 @@ rm -f /var/run/rsyslogd.pid service rsyslog start -VLAN_IFACE_NAME=`sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_vlan_interfaces[0]['name']"` +VLAN_IFACE_NAME=`sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_vlan_interfaces[0]['attachto']"` # Wait for the VLAN to come up (i.e., 'ip link show' returns 0) until ip link show $VLAN_IFACE_NAME > /dev/null 2>&1; do diff --git a/dockers/docker-fpm-gobgp/zebra.conf.j2 b/dockers/docker-fpm-gobgp/zebra.conf.j2 index ad05dcbe4e90..1ce06eecd2d9 100644 --- a/dockers/docker-fpm-gobgp/zebra.conf.j2 +++ b/dockers/docker-fpm-gobgp/zebra.conf.j2 @@ -15,7 +15,12 @@ enable password zebra {% block interfaces %} ! Enable link-detect (default disabled) {% for interface in minigraph_interfaces %} -interface {{ interface['alias'] }} +interface {{ interface['attachto'] }} +link-detect +! +{% endfor %} +{% for interface in minigraph_portchannels.keys() %} +interface {{ interface }} link-detect ! {% endfor %} diff --git a/dockers/docker-fpm/zebra.conf.j2 b/dockers/docker-fpm/zebra.conf.j2 index dc2061f8a02a..1ce06eecd2d9 100644 --- a/dockers/docker-fpm/zebra.conf.j2 +++ b/dockers/docker-fpm/zebra.conf.j2 @@ -15,12 +15,12 @@ enable password zebra {% block interfaces %} ! Enable link-detect (default disabled) {% for interface in minigraph_interfaces %} -interface {{ interface['alias'] }} +interface {{ interface['attachto'] }} link-detect ! {% endfor %} -{% for interface in minigraph_portchannel_interfaces %} -interface {{ interface['name'] }} +{% for interface in minigraph_portchannels.keys() %} +interface {{ interface }} link-detect ! {% endfor %} diff --git a/dockers/docker-lldp-sv2/lldpd.conf.j2 b/dockers/docker-lldp-sv2/lldpd.conf.j2 index d6be1e3ce0f2..1943c04ed73f 100644 --- a/dockers/docker-lldp-sv2/lldpd.conf.j2 +++ b/dockers/docker-lldp-sv2/lldpd.conf.j2 @@ -1,3 +1,3 @@ -{% for member in alias_map %} -configure ports {{member['sonic']}} lldp portidsubtype local {{member['origin']}} +{% for member in minigraph_ports.keys() %} +configure ports {{member}} lldp portidsubtype local {{minigraph_ports[member]['alias']}} {% endfor %} diff --git a/dockers/docker-snmp-sv2/alias_map.j2 b/dockers/docker-snmp-sv2/alias_map.j2 new file mode 100644 index 000000000000..76acb057480e --- /dev/null +++ b/dockers/docker-snmp-sv2/alias_map.j2 @@ -0,0 +1,5 @@ +{ +{% for member in minigraph_ports.keys() %} + "{{member}}": "{{minigraph_ports[member]['alias']}}" +{% endfor %} +} diff --git a/dockers/docker-snmp-sv2/config.sh b/dockers/docker-snmp-sv2/config.sh index 16b4507b09a2..62e8278ae41b 100755 --- a/dockers/docker-snmp-sv2/config.sh +++ b/dockers/docker-snmp-sv2/config.sh @@ -8,7 +8,7 @@ mkdir -p /etc/snmp sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/snmp.yml -t /usr/share/sonic/templates/snmpd.conf.j2 >/etc/snmp/snmpd.conf -sonic-cfggen -m /etc/sonic/minigraph.xml -s >/etc/snmp/alias_map.json +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/alias_map.j2 >/etc/snmp/alias_map.json mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index c6156dab8bf9..87efc8cfa8ef 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -37,7 +37,7 @@ iface eth0 inet static {% for prefix in forced_mgmt_routes %} down ip route delete {{ prefix }} via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 {% endfor %} - {# TODO: COPP policy type rules #} +{# TODO: COPP policy type rules #} {% else %} iface eth0 inet dhcp {% endif %} @@ -46,53 +46,53 @@ iface eth0 inet dhcp {% block front_panel_interfaces %} # The switch front panel interfaces {% for interface in minigraph_interfaces %} -auto {{ interface['alias'] }} -allow-hotplug {{ interface['alias'] }} -iface {{ interface['alias'] }} {{ 'inet' if interface['addr'] | ipv4 else 'inet6' }} static +auto {{ interface['attachto'] }} +allow-hotplug {{ interface['attachto'] }} +iface {{ interface['attachto'] }} {{ 'inet' if interface['addr'] | ipv4 else 'inet6' }} static address {{ interface['addr'] }} netmask {{ interface['mask'] }} # {% endfor %} -{% for vlan_interface in minigraph_vlan_interfaces|unique_name %} -{% for interface in vlan_interface['members'] %} -auto {{ interface }} -allow-hotplug {{ interface }} -iface {{ interface }} inet manual - pre-up ifconfig {{ interface }} up - post-up brctl addif {{ vlan_interface['name'] }} {{ interface }} - post-down ifconfig {{ interface }} down +{% for vlan in minigraph_vlans.keys()|sort %} +{% for member in minigraph_vlans[vlan]['members'] %} +auto {{ member }} +allow-hotplug {{ member }} +iface {{ member }} inet manual + pre-up ifconfig {{ member }} up + post-up brctl addif {{ vlan }} {{ member }} + post-down ifconfig {{ member }} down # {% endfor %} {% endfor %} -# Add || true to suppress the error when docker-teamd starts after docker-swss -{% for pc_interface in minigraph_portchannel_interfaces|unique_name %} -{% for interface in pc_interface['members'] %} -{% if pc_interface['name'] not in pc_set %} -auto {{ interface }} -allow-hotplug {{ interface }} -iface {{ interface }} inet manual - pre-up teamdctl {{ pc_interface['name'] }} port add {{ interface }} || true - post-down ifconfig {{ interface }} down +# "|| true" is added to suppress the error when docker-teamd starts after docker-swss +{% for pc in minigraph_portchannels.keys()|sort %} +{% for member in minigraph_portchannels[pc]['members'] %} +auto {{ member }} +allow-hotplug {{ member }} +iface {{ member }} inet manual + pre-up teamdctl {{ pc }} port add {{ member }} || true + post-down ifconfig {{ member }} down # -{% endif %} {% endfor %} {% endfor %} {% endblock front_panel_interfaces %} {% block vlan_interfaces %} +# Vlan interfaces {% for vlan_interface in minigraph_vlan_interfaces %} -auto {{ vlan_interface['name'] }} -iface {{ vlan_interface['name'] }} {{ 'inet' if vlan_interface['addr'] | ipv4 else 'inet6' }} static +auto {{ vlan_interface['attachto'] }} +iface {{ vlan_interface['attachto'] }} {{ 'inet' if vlan_interface['addr'] | ipv4 else 'inet6' }} static bridge_ports none address {{ vlan_interface['addr'] }} netmask {{ vlan_interface['mask'] }} -# {% endfor %} +# {% endblock vlan_interfaces %} {% block pc_interfaces %} +# Portchannel interfaces {% for pc_interface in minigraph_portchannel_interfaces %} -auto {{ pc_interface['name'] }} -allow-hotplug {{ pc_interface['name'] }} -iface {{ pc_interface['name'] }} {{ 'inet' if pc_interface['addr'] | ipv4 else 'inet6' }} static +auto {{ pc_interface['attachto'] }} +allow-hotplug {{ pc_interface['attachto'] }} +iface {{ pc_interface['attachto'] }} {{ 'inet' if pc_interface['addr'] | ipv4 else 'inet6' }} static address {{ pc_interface['addr'] }} netmask {{ pc_interface['mask'] }} # diff --git a/slave.mk b/slave.mk index 2b7e45a07e92..52d06c38fd93 100644 --- a/slave.mk +++ b/slave.mk @@ -229,12 +229,13 @@ $(SONIC_INSTALL_TARGETS) : $(DEBS_PATH)/%-install : .platform $$(addsuffix -inst # $(SOME_NEW_WHL)_SRC_PATH = $(SRC_PATH)/project_name # $(SOME_NEW_WHL)_PYTHON_VERSION = 2 (or 3) # $(SOME_NEW_WHL)_DEPENDS = $(SOME_OTHER_WHL1) $(SOME_OTHER_WHL2) ... -# SONIC_PYTHON_WHEELS += $(SOME_NEW_DEB) +# SONIC_PYTHON_WHEELS += $(SOME_NEW_WHL) $(addprefix $(PYTHON_WHEELS_PATH)/, $(SONIC_PYTHON_WHEELS)) : $(PYTHON_WHEELS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*_DEPENDS))) $(HEADER) pushd $($*_SRC_PATH) $(LOG) # apply series of patches if exist if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; fi + python$($*_PYTHON_VERSION) setup.py test $(LOG) python$($*_PYTHON_VERSION) setup.py bdist_wheel $(LOG) # clean up if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then quilt pop -a -f; fi diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 20c5aeb5b5f1..523c11ea1ada 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -39,12 +39,15 @@ ns2 = "Microsoft.Search.Autopilot.NetMux" ns3 = "http://www.w3.org/2001/XMLSchema-instance" + class minigraph_encoder(json.JSONEncoder): def default(self, obj): - if isinstance(obj, (ipaddress.IPv4Network, ipaddress.IPv6Network, ipaddress.IPv4Address, ipaddress.IPv6Address)): + if isinstance(obj, + (ipaddress.IPv4Network, ipaddress.IPv6Network, ipaddress.IPv4Address, ipaddress.IPv6Address)): return str(obj) return json.JSONEncoder.default(self, obj) + def parse_png(png, hname): neighbors = {} devices = {} @@ -112,7 +115,6 @@ def parse_png(png, hname): elif node.tag == str(QName(ns, "EndDevice")): mgmt_dev = node.text - return (neighbors, devices, console_dev, console_port, mgmt_dev, mgmt_port) @@ -124,11 +126,12 @@ def parse_dpg(dpg, hname): ipintfs = child.find(str(QName(ns, "IPInterfaces"))) intfs = [] - intfnames = {} - vlan_map = {} - pc_map = {} for ipintf in ipintfs.findall(str(QName(ns, "IPInterface"))): - intfname = ipintf.find(str(QName(ns, "AttachTo"))).text + intfalias = ipintf.find(str(QName(ns, "AttachTo"))).text + if port_alias_map.has_key(intfalias): + intfname = port_alias_map[intfalias] + else: + intfname = intfalias ipprefix = ipintf.find(str(QName(ns, "Prefix"))).text ipn = ipaddress.IPNetwork(ipprefix) ipaddr = ipn.ip @@ -142,59 +145,24 @@ def parse_dpg(dpg, hname): intf['mask'] = ipmask else: intf['mask'] = str(prefix_len) - - if intfname[0:4] == "Vlan": - if intfname in vlan_map: - vlan_map[intfname].append(intf) + intf.update({'attachto': intfname, 'prefixlen': int(prefix_len)}) + + # TODO: remove peer_addr after dependency removed + ipaddr_val = int(ipn.ip) + peer_addr_val = None + if int(prefix_len) == addr_bits - 2: + if ipaddr_val & 0x3 == 1: + peer_addr_val = ipaddr_val + 1 else: - vlan_map[intfname] = [intf] - elif intfname[0:11] == "PortChannel": - if intfname in pc_map: - pc_map[intfname].append(intf) + peer_addr_val = ipaddr_val - 1 + elif int(prefix_len) == addr_bits - 1: + if ipaddr_val & 0x1 == 0: + peer_addr_val = ipaddr_val + 1 else: - pc_map[intfname] = [intf] - else: - intf.update({'name': intfname, 'prefixlen': int(prefix_len)}) - - if port_alias_map.has_key(intfname): - intf['alias'] = port_alias_map[intfname] - else: - intf['alias'] = intfname - - # TODO: remove peer_addr after dependency removed - ipaddr_val = int(ipn.ip) - peer_addr_val = None - if int(prefix_len) == addr_bits - 2: - if ipaddr_val & 0x3 == 1: - peer_addr_val = ipaddr_val + 1 - else: - peer_addr_val = ipaddr_val - 1 - elif int(prefix_len) == addr_bits - 1: - if ipaddr_val & 0x1 == 0: - peer_addr_val = ipaddr_val + 1 - else: - peer_addr_val = ipaddr_val - 1 - - if peer_addr_val is not None: - intf['peer_addr'] = ipaddress.IPAddress(peer_addr_val) - intfs.append(intf) - intfnames[intf['alias']] = { 'alias': intf['name'] } - - pcintfs = child.find(str(QName(ns, "PortChannelInterfaces"))) - pc_intfs = [] - pcs = {} - for pcintf in pcintfs.findall(str(QName(ns, "PortChannel"))): - pcintfname = pcintf.find(str(QName(ns, "Name"))).text - pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text - pcmbr_list = pcintfmbr.split(';', 1) - for i,member in enumerate(pcmbr_list): - if port_alias_map.has_key(member): - pcmbr_list[i] = port_alias_map[member] - pc_attributes = {'name': pcintfname, 'members': pcmbr_list} - for addrtuple in pc_map.get(pcintfname, []): - pc_attributes.update(addrtuple) - pc_intfs.append(copy.deepcopy(pc_attributes)) - pcs[pcintfname] = pc_attributes + peer_addr_val = ipaddr_val - 1 + if peer_addr_val is not None: + intf['peer_addr'] = ipaddress.IPAddress(peer_addr_val) + intfs.append(intf) lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces"))) lo_intfs = [] @@ -223,6 +191,17 @@ def parse_dpg(dpg, hname): gwaddr = ipaddress.IPAddress(int(mgmtipn.network) + 1) mgmt_intf = {'addr': ipaddr, 'prefixlen': prefix_len, 'mask': ipmask, 'gwaddr': gwaddr} + pcintfs = child.find(str(QName(ns, "PortChannelInterfaces"))) + pc_intfs = [] + pcs = {} + for pcintf in pcintfs.findall(str(QName(ns, "PortChannel"))): + pcintfname = pcintf.find(str(QName(ns, "Name"))).text + pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text + pcmbr_list = pcintfmbr.split(';', 1) + for i, member in enumerate(pcmbr_list): + pcmbr_list[i] = port_alias_map[member] + pcs[pcintfname] = {'name': pcintfname, 'members': pcmbr_list} + vlanintfs = child.find(str(QName(ns, "VlanInterfaces"))) vlan_intfs = [] vlans = {} @@ -231,14 +210,11 @@ def parse_dpg(dpg, hname): vlanid = vintf.find(str(QName(ns, "VlanID"))).text vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text vmbr_list = vintfmbr.split(';') - for i,member in enumerate(vmbr_list): - if port_alias_map.has_key(member): - vmbr_list[i] = port_alias_map[member] + for i, member in enumerate(vmbr_list): + vmbr_list[i] = port_alias_map[member] vlan_attributes = {'name': vintfname, 'members': vmbr_list, 'vlanid': vlanid} - for addrtuple in vlan_map.get(vintfname, []): - vlan_attributes.update(addrtuple) - vlan_intfs.append(copy.deepcopy(vlan_attributes)) vlans[vintfname] = vlan_attributes + aclintfs = child.find(str(QName(ns, "AclInterfaces"))) acls = {} for aclintf in aclintfs.findall(str(QName(ns, "AclInterface"))): @@ -247,20 +223,19 @@ def parse_dpg(dpg, hname): acl_intfs = [] for member in aclattach: member = member.strip() - if port_alias_map.has_key(member): - member = port_alias_map[member] if pcs.has_key(member): acl_intfs.extend(pcs[member]['members']) # For ACL attaching to port channels, we break them into port channel members elif vlans.has_key(member): - print >> sys.stderr, "Warning: ACL "+aclname+" is attached to a Vlan interface, which is currently not supported" - elif intfnames.has_key(member): - acl_intfs.append(member) + print >> sys.stderr, "Warning: ACL " + aclname + " is attached to a Vlan interface, which is currently not supported" + elif port_alias_map.has_key(member): + acl_intfs.append(port_alias_map[member]) if acl_intfs: acls[aclname] = acl_intfs - return intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs, intfnames, vlans, pcs, acls + return intfs, lo_intfs, mgmt_intf, vlans, pcs, acls return None, None, None, None, None, None, None, None + def parse_cpg(cpg, hname): bgp_sessions = [] myasn = None @@ -297,6 +272,7 @@ def parse_cpg(cpg, hname): return bgp_sessions, myasn + def parse_meta(meta, hname): syslog_servers = [] dhcp_servers = [] @@ -320,6 +296,7 @@ def parse_meta(meta, hname): mgmt_routes = value_group return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes + def get_console_info(devices, dev, port): for k, v in devices.items(): if k == dev: @@ -335,6 +312,7 @@ def get_console_info(devices, dev, port): return ret_val + def get_mgmt_info(devices, dev, port): for k, v in devices.items(): if k == dev: @@ -350,7 +328,8 @@ def get_mgmt_info(devices, dev, port): return ret_val -def get_alias_map_list(hwsku, platform=None, port_config_file=None): + +def parse_port_config(hwsku, platform=None, port_config_file=None): port_config_candidates = [] if port_config_file != None: port_config_candidates.append(port_config_file) @@ -367,16 +346,23 @@ def get_alias_map_list(hwsku, platform=None, port_config_file=None): if port_config == None: return None - alias_map_list = [] + ports = {} with open(port_config) as data: for line in data: if line.startswith('#'): continue tokens = line.split() - if len(tokens) < 3: + if len(tokens) < 2: continue - alias_map_list.append({'sonic': tokens[0], 'origin': tokens[2].strip()}) - return alias_map_list + name = tokens[0].strip() + if len(tokens) == 2: + alias = name + else: + alias = tokens[2].strip() + ports[name] = {'name': name, 'alias': alias} + port_alias_map[alias] = name + return ports + def parse_xml(filename, platform=None, port_config_file=None): root = ET.parse(filename).getroot() @@ -410,14 +396,11 @@ def parse_xml(filename, platform=None, port_config_file=None): if child.tag == str(hostname_qn): hostname = child.text - alias_map_list = get_alias_map_list(hwsku, platform, port_config_file) - if alias_map_list != None: - for item in alias_map_list: - port_alias_map[item['origin']] = item['sonic'] + ports = parse_port_config(hwsku, platform, port_config_file) for child in root: if child.tag == str(QName(ns, "DpgDec")): - (intfs, lo_intfs, mgmt_intf, vlan_intfs, pc_intfs, ports, vlans, pcs, acls) = parse_dpg(child, hostname) + (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) elif child.tag == str(QName(ns, "PngDec")): @@ -437,11 +420,24 @@ def parse_xml(filename, platform=None, port_config_file=None): results['minigraph_bgp'] = sorted(bgp_sessions, key=lambda x: x['addr']) results['minigraph_bgp_asn'] = bgp_asn # TODO: sort does not work properly on all interfaces of varying lengths. Need to sort by integer group(s). - results['minigraph_interfaces'] = sorted(intfs, key=lambda x: x['name']) - results['minigraph_vlan_interfaces'] = vlan_intfs - results['minigraph_portchannel_interfaces'] = pc_intfs - results['minigraph_vlans'] = vlans + + phyport_intfs = [] + vlan_intfs = [] + pc_intfs = [] + for intf in intfs: + intfname = intf['attachto'] + if intfname[0:4] == 'Vlan': + vlan_intfs.append(intf) + elif intfname[0:11] == 'PortChannel': + pc_intfs.append(intf) + else: + phyport_intfs.append(intf) + + results['minigraph_interfaces'] = sorted(phyport_intfs, key=lambda x: x['attachto']) + results['minigraph_vlan_interfaces'] = sorted(vlan_intfs, key=lambda x: x['attachto']) + results['minigraph_portchannel_interfaces'] = sorted(pc_intfs, key=lambda x: x['attachto']) results['minigraph_ports'] = ports + results['minigraph_vlans'] = vlans results['minigraph_portchannels'] = pcs results['minigraph_mgmt_interface'] = mgmt_intf results['minigraph_lo_interfaces'] = lo_intfs @@ -460,7 +456,6 @@ def parse_xml(filename, platform=None, port_config_file=None): results['dhcp_servers'] = dhcp_servers results['ntp_servers'] = ntp_servers results['forced_mgmt_routes'] = mgmt_routes - results['alias_map'] = alias_map_list return results @@ -469,5 +464,3 @@ def parse_xml(filename, platform=None, port_config_file=None): def print_parse_xml(filename): results = parse_xml(filename) print(json.dumps(results, indent=3, cls=minigraph_encoder)) - - diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index c10fb8c104cd..e47985cf17fc 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -65,10 +65,8 @@ def main(): parser.add_argument("-a", "--additional-data", help="addition data, in json string") group = parser.add_mutually_exclusive_group() group.add_argument("-t", "--template", help="render the data with the template file") - group.add_argument("-s", "--alias-mapping", help="print alias mapping json if available", action='store_true') group.add_argument("-v", "--var", help="print the value of a variable, support jinja2 expression") group.add_argument("--var-json", help="print the value of a variable, in json format") - group.add_argument("--var-keys", help="print all keys of a map variable - to be deprecated, use -v and keys()") group.add_argument("--print-data", help="print all data", action='store_true') args = parser.parse_args() @@ -118,17 +116,6 @@ def main(): if args.var_json != None: print json.dumps(data[args.var_json], indent=4, cls=minigraph_encoder) - if args.var_keys != None: - for key in data[args.var_keys].keys(): - print key - - if args.alias_mapping: - mapping = {} - if data.has_key('alias_map'): - for item in data['alias_map']: - mapping[item['sonic']] = item['origin'] - print json.dumps(mapping) - if args.print_data: print json.dumps(data, indent=4, cls=minigraph_encoder) diff --git a/src/sonic-config-engine/tests/simple-sample-graph.xml b/src/sonic-config-engine/tests/simple-sample-graph.xml new file mode 100644 index 000000000000..20bfb07f00d0 --- /dev/null +++ b/src/sonic-config-engine/tests/simple-sample-graph.xml @@ -0,0 +1,205 @@ + + + + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + + + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/4 + + + + + + Vlan1000 + fortyGigE0/8 + 1000 + 1000 + 192.168.0.0/27 + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + fortyGigE0/0 + 10.0.0.58/31 + + + + fortyGigE0/0 + FC00::75/126 + + + + Vlan1000 + 192.168.0.1/27 + + + + + + + PortChannel01 + + DataAcl + + + + + + + + + + + switch-t0 + Force10-S6000 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 0d0570acf44e..4f04d0ea5932 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -9,6 +9,8 @@ def setUp(self): self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfggen') self.sample_graph = os.path.join(self.test_dir, 'sample_graph.xml') self.sample_graph_t0 = os.path.join(self.test_dir, 't0-sample-graph.xml') + self.sample_graph_simple = os.path.join(self.test_dir, 'simple-sample-graph.xml') + self.port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') def run_script(self, argument): print '\n Running sonic-cfggen ' + argument @@ -40,11 +42,6 @@ def test_jinja_expression(self): output = self.run_script(argument) self.assertEqual(output.strip(), 'LeafRouter') - def test_print_alias_mapping(self): - argument = '-s' - output = self.run_script(argument) - self.assertTrue(len(output.strip()) > 0) - def test_additional_json_data(self): argument = '-a \'{"key1":"value1"}\' -v key1' output = self.run_script(argument) @@ -61,7 +58,32 @@ def test_render_template(self): self.assertEqual(output.strip(), 'value1\nvalue2') def test_minigraph_acl(self): - argument = '-m "' + self.sample_graph_t0 + '" -v minigraph_acls' + argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v minigraph_acls' output = self.run_script(argument) self.assertEqual(output.strip(), "{'DataAcl': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}") + def test_minigraph_interfaces(self): + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_interfaces' + output = self.run_script(argument) + self.assertEqual(output.strip(), "[{'subnet': IPv4Network('10.0.0.58/31'), 'peer_addr': IPv4Address('10.0.0.59'), 'addr': IPv4Address('10.0.0.58'), 'mask': IPv4Address('255.255.255.254'), 'attachto': 'Ethernet0', 'prefixlen': 31}, {'subnet': IPv6Network('fc00::74/126'), 'peer_addr': IPv6Address('fc00::76'), 'addr': IPv6Address('fc00::75'), 'mask': '126', 'attachto': 'Ethernet0', 'prefixlen': 126}]") + + def test_minigraph_vlans(self): + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_vlans' + output = self.run_script(argument) + self.assertEqual(output.strip(), "{'Vlan1000': {'name': 'Vlan1000', 'members': ['Ethernet8'], 'vlanid': '1000'}}") + + def test_minigraph_vlan_interfaces(self): + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_vlan_interfaces' + output = self.run_script(argument) + self.assertEqual(output.strip(), "[{'prefixlen': 27, 'subnet': IPv4Network('192.168.0.0/27'), 'mask': IPv4Address('255.255.255.224'), 'addr': IPv4Address('192.168.0.1'), 'attachto': 'Vlan1000'}]") + + def test_minigraph_portchannels(self): + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_portchannels' + output = self.run_script(argument) + self.assertEqual(output.strip(), "{'PortChannel01': {'name': 'PortChannel01', 'members': ['Ethernet4']}}") + + def test_minigraph_portchannels(self): + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_portchannel_interfaces' + output = self.run_script(argument) + self.assertEqual(output.strip(), "[{'subnet': IPv4Network('10.0.0.56/31'), 'peer_addr': IPv4Address('10.0.0.57'), 'addr': IPv4Address('10.0.0.56'), 'mask': IPv4Address('255.255.255.254'), 'attachto': 'PortChannel01', 'prefixlen': 31}, {'subnet': IPv6Network('fc00::70/126'), 'peer_addr': IPv6Address('fc00::72'), 'addr': IPv6Address('fc00::71'), 'mask': '126', 'attachto': 'PortChannel01', 'prefixlen': 126}]") + diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index e2ad2f54a2ac..30a67f0b6cd3 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -16,6 +16,11 @@ def run_script(self, argument): print 'CMD: sonic-cfggen ' + argument return subprocess.check_output(self.script_file + ' ' + argument, shell=True) + def test_interfaces(self): + interfaces_template = os.path.join(self.test_dir, '..', '..', '..', 'files', 'image_config', 'interfaces', 'interfaces.j2') + argument = '-m "' + self.t0_minigraph + '" -p "' + self.t0_port_config + '" -t "' + interfaces_template + '"' + output = self.run_script(argument) + def test_teamd(self): argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -v "minigraph_portchannels.keys() | join(\' \')"' output = self.run_script(argument) # Mock the output via config.sh in docker-teamd From 823bc36bd9018acd044b7e907d5823d482f8bf7e Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 31 Mar 2017 13:25:39 -0700 Subject: [PATCH 0410/1011] Enable graceful restart feature for ToR router (#466) --- dockers/docker-fpm/bgpd.conf.j2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dockers/docker-fpm/bgpd.conf.j2 b/dockers/docker-fpm/bgpd.conf.j2 index 5f4bb25e0010..fff27678c95b 100644 --- a/dockers/docker-fpm/bgpd.conf.j2 +++ b/dockers/docker-fpm/bgpd.conf.j2 @@ -22,6 +22,10 @@ log facility local4 router bgp {{ minigraph_bgp_asn }} bgp log-neighbor-changes bgp bestpath as-path multipath-relax +{# Advertise graceful restart capability for ToR #} +{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} + bgp graceful-restart +{% endif %} {# TODO: use lo[0] for backward compatibility, will revisit the case with multiple lo interfaces #} bgp router-id {{ minigraph_lo_interfaces[0]['addr'] }} {# advertise loopback #} From 5604b59be50737a96ac7b1b8219644b7cbd44d02 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 31 Mar 2017 15:51:38 -0700 Subject: [PATCH 0411/1011] Remove deprecated docker-bgp (#465) --- dockers/docker-bgp/Dockerfile | 16 ---------------- dockers/docker-bgp/daemons | 31 ------------------------------- 2 files changed, 47 deletions(-) delete mode 100755 dockers/docker-bgp/Dockerfile delete mode 100644 dockers/docker-bgp/daemons diff --git a/dockers/docker-bgp/Dockerfile b/dockers/docker-bgp/Dockerfile deleted file mode 100755 index 17c58524a079..000000000000 --- a/dockers/docker-bgp/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM docker-base - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -COPY deps/quagga_*.deb /deps/ -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ - dpkg_apt /deps/quagga_*.deb && \ - apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ - rm -rf /deps - -COPY daemons /etc/quagga/ - -ENTRYPOINT service rsyslog start \ - && service quagga start \ - && /bin/bash diff --git a/dockers/docker-bgp/daemons b/dockers/docker-bgp/daemons deleted file mode 100644 index cb7c2322c9fb..000000000000 --- a/dockers/docker-bgp/daemons +++ /dev/null @@ -1,31 +0,0 @@ -# This file tells the quagga package which daemons to start. -# -# Entries are in the format: =(yes|no|priority) -# 0, "no" = disabled -# 1, "yes" = highest priority -# 2 .. 10 = lower priorities -# Read /usr/share/doc/quagga/README.Debian for details. -# -# Sample configurations for these daemons can be found in -# /usr/share/doc/quagga/examples/. -# -# ATTENTION: -# -# When activation a daemon at the first time, a config file, even if it is -# empty, has to be present *and* be owned by the user and group "quagga", else -# the daemon will not be started by /etc/init.d/quagga. The permissions should -# be u=rw,g=r,o=. -# When using "vtysh" such a config file is also needed. It should be owned by -# group "quaggavty" and set to ug=rw,o= though. Check /etc/pam.d/quagga, too. -# -# The watchquagga daemon is always started. Per default in monitoring-only but -# that can be changed via /etc/quagga/debian.conf. -# -zebra=yes -bgpd=yes -ospfd=no -ospf6d=no -ripd=no -ripngd=no -isisd=no -babeld=no From ed746c100c8729095727c17904a930143e91e16f Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 31 Mar 2017 23:51:09 -0700 Subject: [PATCH 0412/1011] Update sairedis and utilities to get fast-reboot support (#467) --- src/sonic-sairedis | 2 +- src/sonic-utilities | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 81c19878217c..e28e4c038572 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 81c19878217c26d71b64e93dbdbf777faa1d3cfa +Subproject commit e28e4c038572aeea65491424a86fcb4f1ac229de diff --git a/src/sonic-utilities b/src/sonic-utilities index 5c59ec6b8e06..64826397a860 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 5c59ec6b8e067dab8c3d786432d6d2c9b961ec78 +Subproject commit 64826397a860fda4495ae073b17e88020ddad56c From 9841f8338b392db7bdfbe2072e8a82c056b27ffc Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 31 Mar 2017 23:51:31 -0700 Subject: [PATCH 0413/1011] [redis]: Disable snapshotting completely (#463) Signed-off-by: Shuotian Cheng --- dockers/docker-database/Dockerfile.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index 59f90a897a9f..a213dd079062 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -24,7 +24,8 @@ debs/{{ deb }}{{' '}} RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -RUN sed -ri 's/^daemonize yes$/daemonize no/; \ +RUN sed -ri 's/^(save .*$)/# \1/g; \ + s/^daemonize yes$/daemonize no/; \ s/^logfile .*$/logfile ""/; \ s/^# syslog-enabled no$/syslog-enabled no/; \ s/^# unixsocket/unixsocket/ \ From 5c8bcef1ac2a87fbd0dbcfca438a92f39732880a Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Fri, 31 Mar 2017 23:51:59 -0700 Subject: [PATCH 0414/1011] [boot0]:remove no need files before extract image (#460) * [Aboot]:remove no need files before extract image Signed-off-by: Sihui Han * use and remove boot0 in the check Signed-off-by: Sihui Han * change the comments accordingly Signed-off-by: Sihui Han --- files/Aboot/boot0.j2 | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index d30a44e520c2..0905faad4c5d 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -41,11 +41,13 @@ parse_environment_config() { } extract_image() { - ## Clean old directory for read-write layer - rm -rf "$target_path/rw" - - ## Clean docker directory - rm -rf "$target_path/{{ DOCKERFS_DIR }}" + ## Remove all the other unnecssary files except swi file, boot-config + for f in $(ls -A $target_path); do + if [ $f != "${swipath##*/}" ] && [ $f != "boot-config" ]; then + rm -rf "$target_path/$f" + fi + done + ## Unzip the image unzip -oq "$swipath" -x boot0 -d "$target_path" From a0c80d8a41f5465f2c6f12816b4285e69a0cf974 Mon Sep 17 00:00:00 2001 From: Nadiya Date: Mon, 3 Apr 2017 09:43:57 +0300 Subject: [PATCH 0415/1011] Update cavium libsai (#470) Signed-off-by: Nadiya.Stetskovych --- platform/cavium/cavm-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/cavium/cavm-sai.mk b/platform/cavium/cavm-sai.mk index 9308766e16e1..1b88b1ae1978 100644 --- a/platform/cavium/cavm-sai.mk +++ b/platform/cavium/cavm-sai.mk @@ -1,6 +1,6 @@ # Cavium SAI -CAVM_SAI_GITHUB = https://github.com/XPliant/OpenXPS/raw/d8868c604ef32dd3f254c3ba58b3453d21bc5722/SAI/cavm-sai/ +CAVM_SAI_GITHUB = https://github.com/XPliant/OpenXPS/raw/1b28b78400656114c3b1ce46381e0e8ab3ecd6da/SAI/cavm-sai/ CAVM_LIBSAI = libsai.deb CAVM_SAI = sai.deb From 8c76556efb82c834e7fda631a70b8941d0d2d4c7 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 3 Apr 2017 16:12:32 -0700 Subject: [PATCH 0416/1011] Re-commit PR #432 (SHA 4546372) (#474) * [config/acl] Get ACL config from DHCP and load it in swss container (#432) * Temporarily disable DHCP option 226 --- dockers/docker-orchagent/start.sh | 13 ++++++++++ files/dhcp/dhclient.conf | 1 + files/dhcp/graphserviceurl | 3 +++ files/image_config/updategraph/updategraph | 30 ++++++++++++++++++++++ src/sonic-config-engine/translate_acl | 4 +-- 5 files changed, 49 insertions(+), 2 deletions(-) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index dd0a469efb93..088d0fe1bcf0 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -12,6 +12,18 @@ function start_app { done } +function config_acl { + if [ -f "/etc/sonic/acl.json" ]; then + mkdir -p /etc/swss/config.d/acl + rm -rf /etc/swss/config.d/acl/* + translate_acl -m /etc/sonic/minigraph.xml -o /etc/swss/config.d/acl /etc/sonic/acl.json + for filename in /etc/swss/config.d/acl/*.json; do + [ -e "$filename" ] || break + swssconfig $filename + done + fi +} + function clean_up { pkill -9 orchagent pkill -9 portsyncd @@ -61,6 +73,7 @@ while true; do result=`echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p` if [ "$result" != "0" ]; then start_app + config_acl read fi sleep 1 diff --git a/files/dhcp/dhclient.conf b/files/dhcp/dhclient.conf index ce4ac4d9f445..f97b56dfd5a6 100644 --- a/files/dhcp/dhclient.conf +++ b/files/dhcp/dhclient.conf @@ -14,6 +14,7 @@ option rfc3442-classless-static-routes code 121 = array of unsigned integer 8; option snmp-community code 224 = text; option minigraph-url code 225 = text; +option acl-url code 226 = text; send host-name = gethostname(); request subnet-mask, broadcast-address, time-offset, routers, diff --git a/files/dhcp/graphserviceurl b/files/dhcp/graphserviceurl index 0e8b1b83e141..f255cdff9877 100644 --- a/files/dhcp/graphserviceurl +++ b/files/dhcp/graphserviceurl @@ -5,5 +5,8 @@ case $reason in else echo "N/A" > /tmp/dhcp_graph_url fi + if [ -n "$new_acl_url" ]; then + echo $new_acl_url > /tmp/dhcp_acl_url + fi ;; esac diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index 68fbe6eb9c19..0d3b248bc436 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -12,6 +12,8 @@ if [ "$enabled" != "true" ]; then exit 0 fi +ACL_URL=$acl_src + if [ "$src" = "dhcp" ]; then while [ ! -f /tmp/dhcp_graph_url ]; do echo "Waiting for DHCP response..." @@ -38,6 +40,18 @@ if [ "$src" = "dhcp" ]; then sed -i "/src=/d" /etc/sonic/updategraph.conf echo "src=\"$GRAPH_URL\"" >> /etc/sonic/updategraph.conf fi + + if [ -f /tmp/dhcp_acl_url ]; then + ACL_URL=`sonic-cfggen -t /tmp/dhcp_acl_url -a "{\"hostname\": \"$HOSTNAME\"}"` + if [[ ! $ACL_URL =~ $URL_REGEX ]]; then + echo "\"$ACL_URL\" is not a valid url. Skipping acl update." + ACL_URL="" + fi + if [ "$dhcp_as_static" = "true" ]; then + sed -i "/acl_src=/d" /etc/sonic/updategraph.conf + echo "acl_src=\"$ACL_URL\"" >> /etc/sonic/updategraph.conf + fi + fi else GRAPH_URL=$src fi @@ -53,3 +67,19 @@ while true; do curl -f $GRAPH_URL -o /etc/sonic/minigraph.xml --connect-timeout 15 && break sleep 5 done + +if [ -n "$ACL_URL" ]; then + if [ -f /etc/sonic/acl.json ]; then + echo "Renaming acl.json to acl.json.old" + mv /etc/sonic/acl.json /etc/sonic/acl.json.old + fi + echo "Getting ACL config from $ACL_URL" + + while true; do + curl -f $ACL_URL -o /etc/sonic/acl.json --connect-timeout 15 && break + sleep 5 + done +else + echo "Skip ACL config download." +fi + diff --git a/src/sonic-config-engine/translate_acl b/src/sonic-config-engine/translate_acl index f706fe1f52e4..2c4410615d6e 100755 --- a/src/sonic-config-engine/translate_acl +++ b/src/sonic-config-engine/translate_acl @@ -129,7 +129,6 @@ def translate_acl_fixed_port(filename, output_path, port, max_priority): def translate_acl(filename, output_path, attach_to, max_priority): yang_acl = pybindJSON.load(filename, openconfig_acl, "openconfig_acl") - print attach_to.keys() for aclsetname in yang_acl.acl.acl_sets.acl_set: tablename = aclsetname.replace(" ", "_").replace("-", "_") if attach_to.has_key(tablename): @@ -151,7 +150,8 @@ def main(): translate_acl_fixed_port(args.input, args.output_path, args.port, args.max_priority) elif args.minigraph: mini_data = parse_xml(args.minigraph) - translate_acl(args.input, args.output_path, mini_data['minigraph_acls'], args.max_priority) + if mini_data['minigraph_acls']: + translate_acl(args.input, args.output_path, mini_data['minigraph_acls'], args.max_priority) if __name__ == "__main__": main() From 4ff0f865b6d045ecdda36e4199e87bb5bc2dc751 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 3 Apr 2017 17:01:12 -0700 Subject: [PATCH 0417/1011] Update sonic-utilities (#475) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 64826397a860..03488ff6e768 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 64826397a860fda4495ae073b17e88020ddad56c +Subproject commit 03488ff6e7684c807351158db8f70d89f126d8b2 From 6f04867954f971f72a2eced978c372fd82f346ba Mon Sep 17 00:00:00 2001 From: Nadiya Date: Tue, 4 Apr 2017 05:13:29 +0300 Subject: [PATCH 0418/1011] [oneimage] Add cavium packet driver (#469) * [oneimage] Add cavium packet driver Signed-off-by: Nadiya.Stetskovych * Rename cavm_platform_modules.mk and cavm_xpnet.mk to fit naming convetion Signed-off-by: Nadiya.Stetskovych * Allow dpkg -i for cavm_xpnet Signed-off-by: Nadiya.Stetskovych --- files/build_templates/sonic_debian_extension.j2 | 6 +++--- files/build_templates/swss.service.j2 | 1 - .../{cavm_platform_modules.mk => cavm-platform-modules.mk} | 0 platform/cavium/cavm-xpnet.mk | 6 ++++++ platform/cavium/one-image.mk | 3 ++- platform/cavium/rules.mk | 3 ++- 6 files changed, 13 insertions(+), 6 deletions(-) rename platform/cavium/{cavm_platform_modules.mk => cavm-platform-modules.mk} (100%) create mode 100644 platform/cavium/cavm-xpnet.mk diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index c5df3f9ac741..2720514960a8 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -138,11 +138,11 @@ sudo chmod a+x $FILESYSTEM_ROOT/usr/sbin/policy-rc.d {% if installer_debs.strip() -%} {% for deb in installer_debs.strip().split(' ') -%} -if [ $sonic_asic_platform == "mellanox" ]; then +{% if sonic_asic_platform == "mellanox" %} sudo dpkg --extract {{deb}} $FILESYSTEM_ROOT -else +{% else %} sudo dpkg --root=$FILESYSTEM_ROOT -i {{deb}} || sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f -fi +{% endif %} {% endfor %} {% endif %} diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index 87db5eb3b652..6e5152223616 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -22,7 +22,6 @@ ExecStartPre=/etc/init.d/sxdkernel start ExecStartPre=/usr/bin/mst start ExecStartPre=/etc/mlnx/msn2700 start {% elif sonic_asic_platform == 'cavium' %} -ExecStartPre=-/etc/init.d/xpnet.sh stop ExecStartPre=/etc/init.d/xpnet.sh start {% endif %} diff --git a/platform/cavium/cavm_platform_modules.mk b/platform/cavium/cavm-platform-modules.mk similarity index 100% rename from platform/cavium/cavm_platform_modules.mk rename to platform/cavium/cavm-platform-modules.mk diff --git a/platform/cavium/cavm-xpnet.mk b/platform/cavium/cavm-xpnet.mk new file mode 100644 index 000000000000..0ae3c147039f --- /dev/null +++ b/platform/cavium/cavm-xpnet.mk @@ -0,0 +1,6 @@ +CAVM_SAI_URL = https://github.com/XPliant/OpenXPS/raw/18cd5fb556b6262943c0af70375e2631ac3fe08d/SAI + +CAVM_XPNET_DEB = xp80-Pcie-Endpoint.deb +$(CAVM_XPNET_DEB)_URL = $(CAVM_SAI_URL)/netdev/$(CAVM_XPNET_DEB) + +SONIC_ONLINE_DEBS += $(CAVM_XPNET_DEB) diff --git a/platform/cavium/one-image.mk b/platform/cavium/one-image.mk index 0b011f77ac48..33bcd92cc047 100644 --- a/platform/cavium/one-image.mk +++ b/platform/cavium/one-image.mk @@ -3,6 +3,7 @@ SONIC_ONE_IMAGE = sonic-cavium.bin $(SONIC_ONE_IMAGE)_MACHINE = cavium $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_ONE_IMAGE)_DEPENDS += $(CAVM_PLATFORM_DEB) +$(SONIC_ONE_IMAGE)_DEPENDS += $(CAVM_PLATFORM_DEB) +$(SONIC_ONE_IMAGE)_DEPENDS += $(CAVM_XPNET_DEB) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index f72989c241b8..0c112860192e 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -1,7 +1,8 @@ include $(PLATFORM_PATH)/cavm-sai.mk include $(PLATFORM_PATH)/docker-syncd-cavm.mk include $(PLATFORM_PATH)/docker-orchagent-cavm.mk -include $(PLATFORM_PATH)/cavm_platform_modules.mk +include $(PLATFORM_PATH)/cavm-platform-modules.mk +include $(PLATFORM_PATH)/cavm-xpnet.mk include $(PLATFORM_PATH)/one-image.mk include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk From 8391d7f8b55f79dc3c42c10825b52594418ba2d1 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 3 Apr 2017 21:34:18 -0700 Subject: [PATCH 0419/1011] [snmp] Fix a bug in SNMP alias mapping (#473) * [snmp] Fix a bug in SNMP alias mapping Which was introduced in #448. --- dockers/docker-snmp-sv2/alias_map.j2 | 2 +- src/sonic-config-engine/tests/test_j2files.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/dockers/docker-snmp-sv2/alias_map.j2 b/dockers/docker-snmp-sv2/alias_map.j2 index 76acb057480e..0f91fa26eabe 100644 --- a/dockers/docker-snmp-sv2/alias_map.j2 +++ b/dockers/docker-snmp-sv2/alias_map.j2 @@ -1,5 +1,5 @@ { {% for member in minigraph_ports.keys() %} - "{{member}}": "{{minigraph_ports[member]['alias']}}" + "{{member}}": "{{minigraph_ports[member]['alias']}}"{% if not loop.last %},{% endif %} {% endfor %} } diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 30a67f0b6cd3..cf1e32aea519 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -1,6 +1,7 @@ import filecmp import os import subprocess +import json from unittest import TestCase @@ -21,6 +22,13 @@ def test_interfaces(self): argument = '-m "' + self.t0_minigraph + '" -p "' + self.t0_port_config + '" -t "' + interfaces_template + '"' output = self.run_script(argument) + def test_alias_map(self): + alias_map_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-snmp-sv2', 'alias_map.j2') + argument = '-m "' + self.t0_minigraph + '" -p "' + self.t0_port_config + '" -t "' + alias_map_template + '"' + output = self.run_script(argument) + data = json.loads(output) + self.assertEqual(data["Ethernet4"], "fortyGigE0/4") + def test_teamd(self): argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -v "minigraph_portchannels.keys() | join(\' \')"' output = self.run_script(argument) # Mock the output via config.sh in docker-teamd From b7d2009b14f9f3728e0dbd985102c57a65813d39 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 3 Apr 2017 23:56:15 -0700 Subject: [PATCH 0420/1011] [base image]: Install SwSS SDK Python 2 package into base image (#461) * [base image]: Install SwSS SDK Python packages (Python 2 & 3) into base image * Fix typo in existing variable name * Only install Python 2 version, as Python 3 is not installed in base image --- .../build_templates/sonic_debian_extension.j2 | 21 ++++++++++++------- slave.mk | 11 +++++----- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 2720514960a8..ed9d7d0b5075 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -61,14 +61,21 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in python-yaml \ python-bitarray -# Install SONiC config engine -CONFIG_ENGINE_WHL_NAME=`basename {{config_engine}}` -sudo cp {{config_engine}} $FILESYSTEM_ROOT/$CONFIG_ENGINE_WHL_NAME -sudo LANG=C chroot $FILESYSTEM_ROOT pip install $CONFIG_ENGINE_WHL_NAME +# Install SONiC config engine Python package +CONFIG_ENGINE_WHEEL_NAME=$(basename {{config_engine_wheel_path}}) +sudo cp {{config_engine_wheel_path}} $FILESYSTEM_ROOT/$CONFIG_ENGINE_WHEEL_NAME +sudo LANG=C chroot $FILESYSTEM_ROOT pip install $CONFIG_ENGINE_WHEEL_NAME +sudo rm -rf $FILESYSTEM_ROOT/$CONFIG_ENGINE_WHEEL_NAME # Install Python client for Redis sudo LANG=C chroot $FILESYSTEM_ROOT pip install redis +# Install SwSS SDK Python 2 package +SWSSSDK_PY2_WHEEL_NAME=$(basename {{swsssdk_py2_wheel_path}}) +sudo cp {{swsssdk_py2_wheel_path}} $FILESYSTEM_ROOT/$SWSSSDK_PY2_WHEEL_NAME +sudo LANG=C chroot $FILESYSTEM_ROOT pip install $SWSSSDK_PY2_WHEEL_NAME +sudo rm -rf $FILESYSTEM_ROOT/$SWSSSDK_PY2_WHEEL_NAME + # Install SONiC Utilities (and its dependencies via 'apt-get -y install -f') sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/python-sonic-utilities_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f @@ -120,7 +127,7 @@ sudo cp $IMAGE_CONFIGS/snmp/snmp.yml $FILESYSTEM_ROOT/etc/sonic/ # Generate build version file export git_revision=$(git rev-parse --short HEAD) -export debian_version=`cat $FILESYSTEM_ROOT/etc/debian_version` +export debian_version=$(cat $FILESYSTEM_ROOT/etc/debian_version) export kernel_version={{kversion}} j2 $BUILD_TEMPLATES/sonic_version.yml.j2 > sonic_version.yml sudo mv sonic_version.yml $FILESYSTEM_ROOT/etc/sonic/ @@ -162,7 +169,7 @@ sudo dpkg --root=$FILESYSTEM_ROOT -i {{deb}} || sudo LANG=C DEBIAN_FRONTEND=noni sudo mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}} sudo cp {{ deb }} $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/ -for f in `find $FILESYSTEM_ROOT/var/cache/apt/archives -name "*.deb"`; do +for f in $(find $FILESYSTEM_ROOT/var/cache/apt/archives -name "*.deb"); do sudo mv $f $FILESYSTEM_ROOT/$PLATFORM_DIR/{{dev}}/ done @@ -181,7 +188,7 @@ sudo cp $IMAGE_CONFIGS/platform/rc.local $FILESYSTEM_ROOT/etc/ sudo LANG=C chroot $FILESYSTEM_ROOT docker load < {{image}} {% endfor %} sudo chroot $FILESYSTEM_ROOT service docker stop -{% for script in installer_start_scrips.split(' ') -%} +{% for script in installer_start_scripts.split(' ') -%} sudo cp {{script}} $FILESYSTEM_ROOT/usr/bin/ {% endfor %} {% for service in installer_services.split(' ') -%} diff --git a/slave.mk b/slave.mk index 52d06c38fd93..77967c858bdf 100644 --- a/slave.mk +++ b/slave.mk @@ -307,14 +307,15 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" export linux_kernel="$(DEBS_PATH)/$(LINUX_KERNEL)" export kversion="$(KVERSION)" - 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))" - export config_engine="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE))" export image_type="$($*_IMAGE_TYPE)" export sonicadmin_user="$(USERNAME)" export sonic_asic_platform="$(CONFIGURED_PLATFORM)" export enable_dhcp_graph_service="$(ENABLE_DHCP_GRAPH_SERVICE)" + 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))" + export config_engine_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE))" + export swsssdk_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SWSSSDK_PY2))" $(foreach docker, $($*_DOCKERS),\ export docker_image="$(docker)" @@ -328,7 +329,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform chmod +x $($(docker)_CONTAINER_NAME).sh ) - export installer_start_scrips="$(foreach docker, $($*_DOCKERS),$(addsuffix .sh, $($(docker)_CONTAINER_NAME)))" + export installer_start_scripts="$(foreach docker, $($*_DOCKERS),$(addsuffix .sh, $($(docker)_CONTAINER_NAME)))" export installer_services="$(foreach docker, $($*_DOCKERS),$(addsuffix .service, $($(docker)_CONTAINER_NAME)))" export installer_extra_files="$(foreach docker, $($*_DOCKERS), $(foreach file, $($(docker)_BASE_IMAGE_FILES), $($(docker)_PATH)/base_image_files/$(file)))" From bd6976a6fa74f0f6a540590ccfd7eb268a2c769d Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 4 Apr 2017 01:41:42 -0700 Subject: [PATCH 0421/1011] [interfaces]: Support ifup/ifdown on VLAN/LAG members (#462) - This change is added so that when doing ifdown/ifup to flap the interface, it will success even when the interface is already enslaved as a member of VLAN. - LAG members do not have IP addresses. Thus ifconfig command is needed. - Do not display comments when not necessary. Signed-off-by: Shuotian Cheng --- files/image_config/interfaces/interfaces.j2 | 14 ++++++++++++-- src/sonic-config-engine/tests/test_cfggen.py | 12 ++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 87efc8cfa8ef..53d324d68e8d 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -53,29 +53,36 @@ iface {{ interface['attachto'] }} {{ 'inet' if interface['addr'] | ipv4 else 'in netmask {{ interface['mask'] }} # {% endfor %} +{% if minigraph_vlans.keys() | length %} +# "|| true" is added to suppress the error when interface is already a member of VLAN +{% endif %} {% for vlan in minigraph_vlans.keys()|sort %} {% for member in minigraph_vlans[vlan]['members'] %} auto {{ member }} allow-hotplug {{ member }} iface {{ member }} inet manual pre-up ifconfig {{ member }} up - post-up brctl addif {{ vlan }} {{ member }} + post-up brctl addif {{ vlan }} {{ member }} || true post-down ifconfig {{ member }} down # {% endfor %} {% endfor %} -# "|| true" is added to suppress the error when docker-teamd starts after docker-swss +{% if minigraph_portchannels.keys() | length %} +# "|| true" is added to suppress the error when interface is already a member of LAG +{% endif %} {% for pc in minigraph_portchannels.keys()|sort %} {% for member in minigraph_portchannels[pc]['members'] %} auto {{ member }} allow-hotplug {{ member }} iface {{ member }} inet manual pre-up teamdctl {{ pc }} port add {{ member }} || true + post-up ifconfig {{ member }} up post-down ifconfig {{ member }} down # {% endfor %} {% endfor %} {% endblock front_panel_interfaces %} +{% if minigraph_vlans.keys() | length %} {% block vlan_interfaces %} # Vlan interfaces {% for vlan_interface in minigraph_vlan_interfaces %} @@ -87,6 +94,8 @@ iface {{ vlan_interface['attachto'] }} {{ 'inet' if vlan_interface['addr'] | ipv {% endfor %} # {% endblock vlan_interfaces %} +{% endif %} +{% if minigraph_portchannels.keys() | length %} {% block pc_interfaces %} # Portchannel interfaces {% for pc_interface in minigraph_portchannel_interfaces %} @@ -98,3 +107,4 @@ iface {{ pc_interface['attachto'] }} {{ 'inet' if pc_interface['addr'] | ipv4 el # {% endfor %} {% endblock pc_interfaces %} +{% endif %} diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 4f04d0ea5932..eb3e355718d7 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -53,7 +53,7 @@ def test_read_yaml(self): self.assertEqual(output.strip(), '[\'value1\', \'value2\']') def test_render_template(self): - argument = '-y ' + os.path.join(self.test_dir, 'test.yml') + ' -t' + os.path.join(self.test_dir, 'test.j2') + argument = '-y ' + os.path.join(self.test_dir, 'test.yml') + ' -t ' + os.path.join(self.test_dir, 'test.j2') output = self.run_script(argument) self.assertEqual(output.strip(), 'value1\nvalue2') @@ -63,27 +63,27 @@ def test_minigraph_acl(self): self.assertEqual(output.strip(), "{'DataAcl': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}") def test_minigraph_interfaces(self): - argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_interfaces' + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_interfaces' output = self.run_script(argument) self.assertEqual(output.strip(), "[{'subnet': IPv4Network('10.0.0.58/31'), 'peer_addr': IPv4Address('10.0.0.59'), 'addr': IPv4Address('10.0.0.58'), 'mask': IPv4Address('255.255.255.254'), 'attachto': 'Ethernet0', 'prefixlen': 31}, {'subnet': IPv6Network('fc00::74/126'), 'peer_addr': IPv6Address('fc00::76'), 'addr': IPv6Address('fc00::75'), 'mask': '126', 'attachto': 'Ethernet0', 'prefixlen': 126}]") def test_minigraph_vlans(self): - argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_vlans' + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_vlans' output = self.run_script(argument) self.assertEqual(output.strip(), "{'Vlan1000': {'name': 'Vlan1000', 'members': ['Ethernet8'], 'vlanid': '1000'}}") def test_minigraph_vlan_interfaces(self): - argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_vlan_interfaces' + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_vlan_interfaces' output = self.run_script(argument) self.assertEqual(output.strip(), "[{'prefixlen': 27, 'subnet': IPv4Network('192.168.0.0/27'), 'mask': IPv4Address('255.255.255.224'), 'addr': IPv4Address('192.168.0.1'), 'attachto': 'Vlan1000'}]") def test_minigraph_portchannels(self): - argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_portchannels' + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_portchannels' output = self.run_script(argument) self.assertEqual(output.strip(), "{'PortChannel01': {'name': 'PortChannel01', 'members': ['Ethernet4']}}") def test_minigraph_portchannels(self): - argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_portchannel_interfaces' + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_portchannel_interfaces' output = self.run_script(argument) self.assertEqual(output.strip(), "[{'subnet': IPv4Network('10.0.0.56/31'), 'peer_addr': IPv4Address('10.0.0.57'), 'addr': IPv4Address('10.0.0.56'), 'mask': IPv4Address('255.255.255.254'), 'attachto': 'PortChannel01', 'prefixlen': 31}, {'subnet': IPv6Network('fc00::70/126'), 'peer_addr': IPv6Address('fc00::72'), 'addr': IPv6Address('fc00::71'), 'mask': '126', 'attachto': 'PortChannel01', 'prefixlen': 126}]") From b0537eab73a0d5def6e9126e1704b10b7e7ad316 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 5 Apr 2017 13:16:20 -0700 Subject: [PATCH 0422/1011] [oneimage] Update dhclient.conf (#479) Add option 226 back and do slight adjustment to make sure the total option amount is not 16. --- files/dhcp/dhclient.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/files/dhcp/dhclient.conf b/files/dhcp/dhclient.conf index f97b56dfd5a6..363a67b50f9e 100644 --- a/files/dhcp/dhclient.conf +++ b/files/dhcp/dhclient.conf @@ -19,7 +19,7 @@ option acl-url code 226 = text; send host-name = gethostname(); request subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, domain-search, host-name, - dhcp6.name-servers, dhcp6.domain-search, - netbios-name-servers, netbios-scope, interface-mtu, - rfc3442-classless-static-routes, ntp-servers, snmp-community, minigraph-url; + dhcp6.name-servers, dhcp6.domain-search, interface-mtu, + rfc3442-classless-static-routes, ntp-servers, + snmp-community, minigraph-url, acl-url; From e0a3c2aa57c1fa5884dec5fba670902f48b9aad2 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 5 Apr 2017 14:20:02 -0700 Subject: [PATCH 0423/1011] [oneimage] Add ":latest" to docker run script (#477) --- files/build_templates/docker_image_ctl.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 09d39db09577..3df04b698ccb 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -14,7 +14,7 @@ start() { -v /var/run/redis:/var/run/redis:rw \ -v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \ -v /usr/share/sonic/device/$PLATFORM/$HWSKU:/usr/share/sonic/hwsku:ro \ - --name={{docker_container_name}} {{docker_image_name}} + --name={{docker_container_name}} {{docker_image_name}}:latest fi } From f4bc4a68b8e7296b62f28ad397e16f69851a5afb Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 5 Apr 2017 14:25:59 -0700 Subject: [PATCH 0424/1011] [sonic-cfggen]: Remove extra Nones when return (#481) Signed-off-by: Shuotian Cheng --- src/sonic-config-engine/minigraph.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 523c11ea1ada..db4137a44a39 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -233,7 +233,7 @@ def parse_dpg(dpg, hname): acls[aclname] = acl_intfs return intfs, lo_intfs, mgmt_intf, vlans, pcs, acls - return None, None, None, None, None, None, None, None + return None, None, None, None, None, None def parse_cpg(cpg, hname): From 803c530adf45ed75dca5931bc0210721725cfcd7 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 5 Apr 2017 14:32:03 -0700 Subject: [PATCH 0425/1011] [installer]: remove dockerfs archive file after unzip (#476) --- installer/x86_64/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 0d2d76a2cd9e..94cf0e29881c 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -402,7 +402,7 @@ ${onie_bin} mount -t ext4 -o defaults,rw $demo_dev $demo_mnt || { unzip $ONIE_INSTALLER_PAYLOAD -d $demo_mnt if [ -f $demo_mnt/$FILESYSTEM_DOCKERFS ]; then - cd $demo_mnt && mkdir -p $DOCKERFS_DIR && tar xf $FILESYSTEM_DOCKERFS -C $DOCKERFS_DIR; cd $OLDPWD + cd $demo_mnt && mkdir -p $DOCKERFS_DIR && tar xf $FILESYSTEM_DOCKERFS -C $DOCKERFS_DIR && rm -f $FILESYSTEM_DOCKERFS; cd $OLDPWD fi # Create loop device for /var/log to limit its size to $VAR_LOG_SIZE MB From 6dbe979e5f4dfcaddcbbef612d76f29d39c242d8 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 6 Apr 2017 02:14:41 +0300 Subject: [PATCH 0426/1011] [build]: Include SONiC version into installer. (#472) * [build]: Include SONiC version into installer. Signed-off-by: marian-pritsak * Append dirty if contains local changes Signed-off-by: marian-pritsak * Update config * Use correct name for kernel version field * Update sysDescription.j2 --- Makefile | 3 ++- build_debian.sh | 11 +++++++++++ build_image.sh | 15 +++------------ dockers/docker-snmp-sv2/sysDescription.j2 | 2 +- files/build_templates/sonic_debian_extension.j2 | 7 ------- files/build_templates/sonic_version.yml.j2 | 5 ----- functions.sh | 15 +++++++++++++++ rules/config | 4 ---- slave.mk | 3 ++- sonic-slave/Dockerfile | 4 ++++ 10 files changed, 38 insertions(+), 31 deletions(-) delete mode 100644 files/build_templates/sonic_version.yml.j2 diff --git a/Makefile b/Makefile index 3b9a8645ce92..38e90f2bfae0 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,7 @@ DOCKER_BUILD = docker build --no-cache \ --build-arg user=$(USER) \ --build-arg uid=$(shell id -u) \ --build-arg guid=$(shell id -g) \ + --build-arg hostname=$(shell echo $$HOSTNAME) \ -t $(SLAVE_IMAGE) \ sonic-slave && \ docker tag $(SLAVE_IMAGE):latest $(SLAVE_IMAGE):$(SLAVE_TAG) @@ -36,7 +37,7 @@ DOCKER_BUILD = docker build --no-cache \ -C sonic \ -f slave.mk \ PLATFORM=$(PLATFORM) \ - DEBUG_BUILD=$(DEBUG_BUILD) \ + BUILD_NUMBER=$(BUILD_NUMBER) \ ENABLE_DHCP_GRAPH_SERVICE=$(ENABLE_DHCP_GRAPH_SERVICE) \ $@ diff --git a/build_debian.sh b/build_debian.sh index 0bce39736b9f..a796a243363d 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -257,6 +257,17 @@ sudo cp files/dhcp/graphserviceurl $FILESYSTEM_ROOT/etc/dhcp/dhclient-exit-hooks sudo cp files/dhcp/snmpcommunity $FILESYSTEM_ROOT/etc/dhcp/dhclient-exit-hooks.d/ sudo cp files/dhcp/dhclient.conf $FILESYSTEM_ROOT/etc/dhcp/ +## Version file +sudo mkdir -p $FILESYSTEM_ROOT/etc/sonic +sudo tee $FILESYSTEM_ROOT/etc/sonic/sonic_version.yml > /dev/null < files/Aboot/boot0 pushd files/Aboot && zip -g $OLDPWD/$OUTPUT_ABOOT_IMAGE boot0; popd pushd files/Aboot && zip -g $OLDPWD/$ABOOT_BOOT_IMAGE boot0; popd - echo "$GIT_REVISION" >> .imagehash + echo "$IMAGE_VERSION" >> .imagehash zip -g $OUTPUT_ABOOT_IMAGE .imagehash zip -g $ABOOT_BOOT_IMAGE .imagehash rm .imagehash diff --git a/dockers/docker-snmp-sv2/sysDescription.j2 b/dockers/docker-snmp-sv2/sysDescription.j2 index 54860a229d8b..648ed161046e 100644 --- a/dockers/docker-snmp-sv2/sysDescription.j2 +++ b/dockers/docker-snmp-sv2/sysDescription.j2 @@ -1 +1 @@ -SONiC Software Version: {{ build_version }}.SONiC.v2 - HwSku: {{ minigraph_hwsku }} - Distribution: Debian {{ debian_version }} - Kernel: {{ kernel_version }} +SONiC Software Version: SONiC.{{ build_version }} - HwSku: {{ minigraph_hwsku }} - Distribution: Debian {{ debian_version }} - Kernel: {{ kernel_version }} diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index ed9d7d0b5075..77fcd1f38655 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -125,13 +125,6 @@ sudo bash -c "echo enabled=false > $FILESYSTEM_ROOT/etc/sonic/updategraph.conf" # Copy SNMP configuration files sudo cp $IMAGE_CONFIGS/snmp/snmp.yml $FILESYSTEM_ROOT/etc/sonic/ -# Generate build version file -export git_revision=$(git rev-parse --short HEAD) -export debian_version=$(cat $FILESYSTEM_ROOT/etc/debian_version) -export kernel_version={{kversion}} -j2 $BUILD_TEMPLATES/sonic_version.yml.j2 > sonic_version.yml -sudo mv sonic_version.yml $FILESYSTEM_ROOT/etc/sonic/ - # Copy sudoers configuration file sudo cp $IMAGE_CONFIGS/sudoers/sudoers $FILESYSTEM_ROOT/etc/ diff --git a/files/build_templates/sonic_version.yml.j2 b/files/build_templates/sonic_version.yml.j2 deleted file mode 100644 index 6eb8a6d6c5e4..000000000000 --- a/files/build_templates/sonic_version.yml.j2 +++ /dev/null @@ -1,5 +0,0 @@ -build_version: {{git_revision}} -debian_version: {{debian_version}} -kernel_version: {{kernel_version}} -asic_type: {{sonic_asic_platform}} - diff --git a/functions.sh b/functions.sh index b808f727278f..8b2cdb7c50dd 100644 --- a/functions.sh +++ b/functions.sh @@ -49,3 +49,18 @@ docker_try_rmi() { docker rmi $image_name } } + +sonic_get_version() { + local describe=$(git describe --tags) + local latest_tag=$(git describe --tags --abbrev=0) + if [ -n "$(git status --untracked-files=no -s --ignore-submodules)" ]; then + local dirty="-dirty" + fi + BUILD_NUMBER=${BUILD_NUMBER:-0} + ## Check if we are on tagged commit + if [ "$describe" == "$latest_tag" ]; then + echo "${latest_tag}${dirty}" + else + echo "${latest_tag}.${BUILD_NUMBER}${dirty:--$(git rev-parse --short HEAD)}" + fi +} diff --git a/rules/config b/rules/config index d016288e4776..dcfa40c7459e 100644 --- a/rules/config +++ b/rules/config @@ -11,10 +11,6 @@ # Uncomment next line to enable: # SONIC_CONFIG_PRINT_DEPENDENCIES = y -# DEBUG_BUILD - enable building image with uncommitted local changes. -# Uncomment next line to enable: -# DEBUG_BUILD = y - # SONIC_CONFIG_BUILD_JOBS - set number of jobs for parallel build. # Corresponding -j argument will be passed to make command inside docker # container. diff --git a/slave.mk b/slave.mk index 77967c858bdf..4f3761aa2263 100644 --- a/slave.mk +++ b/slave.mk @@ -26,6 +26,7 @@ PROJECT_ROOT = $(shell pwd) CONFIGURED_PLATFORM := $(shell [ -f .platform ] && cat .platform || echo generic) PLATFORM_PATH = platform/$(CONFIGURED_PLATFORM) +export BUILD_NUMBER ############################################################################### ## Utility rules @@ -342,7 +343,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform ) ./build_debian.sh "$(USERNAME)" "$(shell perl -e 'print crypt("$(PASSWORD)", "salt"),"\n"')" $(LOG) - TARGET_MACHINE=$($*_MACHINE) IMAGE_TYPE=$($*_IMAGE_TYPE) DEBUG_BUILD=$(DEBUG_BUILD) ./build_image.sh $(LOG) + TARGET_MACHINE=$($*_MACHINE) IMAGE_TYPE=$($*_IMAGE_TYPE) ./build_image.sh $(LOG) $(foreach docker, $($*_DOCKERS), \ rm -f $($(docker)_CONTAINER_NAME).sh diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index b8b31940a98d..bec18bfbaed7 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -110,6 +110,10 @@ RUN echo "DOCKER_OPTS=\"--experimental\"" >> /etc/default/docker ARG user ARG uid ARG guid +ARG hostname + +ENV BUILD_HOSTNAME $hostname +ENV USER $user RUN groupadd -f -r -g $guid g$user From eef859baf98ec27a6ef4d46725045771b9042230 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 5 Apr 2017 16:22:19 -0700 Subject: [PATCH 0427/1011] [interfaces]: Do not bring up LAG members when LAG is not up (#480) - Do not bring up LAG member ports when LAG is not created. This is because LAG member ports must be DOWN when joining the teamd instances due to teamd design. Therefore, we cannot bring up a LAG member port first and then join the port to a LAG. Signed-off-by: Shuotian Cheng --- files/image_config/interfaces/interfaces.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 53d324d68e8d..40e127e54ce8 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -76,7 +76,7 @@ auto {{ member }} allow-hotplug {{ member }} iface {{ member }} inet manual pre-up teamdctl {{ pc }} port add {{ member }} || true - post-up ifconfig {{ member }} up + post-up ip link show {{ pc }} && ifconfig {{ member }} up post-down ifconfig {{ member }} down # {% endfor %} From 84a8b0d1f79488136560de3e38444a33950d8b8e Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 6 Apr 2017 14:59:30 -0700 Subject: [PATCH 0428/1011] [minigraph]: Fix a bug of minigraph_neighbors (#485) Signed-off-by: Shuotian Cheng --- src/sonic-config-engine/minigraph.py | 2 +- src/sonic-config-engine/tests/test_cfggen.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index db4137a44a39..2b020456475f 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -73,7 +73,7 @@ def parse_png(png, hname): neighbors[endport] = {'name': startdevice, 'port': startport} else: if port_alias_map.has_key(startport): - endport = port_alias_map[startport] + startport = port_alias_map[startport] neighbors[startport] = {'name': enddevice, 'port': endport} if child.tag == str(QName(ns, "Devices")): diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index eb3e355718d7..e4017a51f8c6 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -87,3 +87,7 @@ def test_minigraph_portchannels(self): output = self.run_script(argument) self.assertEqual(output.strip(), "[{'subnet': IPv4Network('10.0.0.56/31'), 'peer_addr': IPv4Address('10.0.0.57'), 'addr': IPv4Address('10.0.0.56'), 'mask': IPv4Address('255.255.255.254'), 'attachto': 'PortChannel01', 'prefixlen': 31}, {'subnet': IPv6Network('fc00::70/126'), 'peer_addr': IPv6Address('fc00::72'), 'addr': IPv6Address('fc00::71'), 'mask': '126', 'attachto': 'PortChannel01', 'prefixlen': 126}]") + def test_minigraph_neighbors(self): + argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v minigraph_neighbors' + output = self.run_script(argument) + self.assertEqual(output.strip(), "{'Ethernet116': {'name': 'ARISTA02T1', 'port': 'Ethernet1/1'}, 'Ethernet124': {'name': 'ARISTA04T1', 'port': 'Ethernet1/1'}, 'Ethernet112': {'name': 'ARISTA01T1', 'port': 'Ethernet1/1'}, 'Ethernet120': {'name': 'ARISTA03T1', 'port': 'Ethernet1/1'}}") From 0db93789dbd5467903d0366fa0ab9ea73652a2c6 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 6 Apr 2017 23:40:12 -0700 Subject: [PATCH 0429/1011] [sonic-utilities]: Update submodule to include CLI fixes (#484) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 03488ff6e768..52cff2aa4412 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 03488ff6e7684c807351158db8f70d89f126d8b2 +Subproject commit 52cff2aa4412d3da78f4bb7cfe3018d427fb5d01 From ebed2d0182856074635fe35ce419b9a540ce1204 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 7 Apr 2017 01:10:05 -0700 Subject: [PATCH 0430/1011] [config/acl] Support everflow config translation (#468) --- sonic-slave/Dockerfile | 1 + src/sonic-config-engine/MANIFEST.in | 2 +- src/sonic-config-engine/minigraph.py | 11 +- .../sample_output/rules_for_dataacl.json | 29 ++ .../sample_output/rules_for_everflow.json | 14 + .../tests/sample_output/table_dataacl.json | 10 + .../tests/sample_output/table_everflow.json | 10 + .../tests/t0-sample-acl.json | 97 ++++++ .../tests/t0-sample-graph-everflow.xml | 320 ++++++++++++++++++ src/sonic-config-engine/tests/test_acl.py | 58 ++++ src/sonic-config-engine/tests/test_cfggen.py | 2 +- src/sonic-config-engine/translate_acl | 31 +- 12 files changed, 567 insertions(+), 18 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json create mode 100644 src/sonic-config-engine/tests/sample_output/rules_for_everflow.json create mode 100644 src/sonic-config-engine/tests/sample_output/table_dataacl.json create mode 100644 src/sonic-config-engine/tests/sample_output/table_everflow.json create mode 100644 src/sonic-config-engine/tests/t0-sample-acl.json create mode 100644 src/sonic-config-engine/tests/t0-sample-graph-everflow.xml create mode 100644 src/sonic-config-engine/tests/test_acl.py diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index bec18bfbaed7..6ca6e93c5f45 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -91,6 +91,7 @@ RUN apt-get update && apt-get install -y docutils-common libjs-sphinxdoc libjs-u # For sonic config engine testing RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml +RUN pip install pyangbind # For templating RUN pip install j2cli diff --git a/src/sonic-config-engine/MANIFEST.in b/src/sonic-config-engine/MANIFEST.in index a7038d546e9c..8861dd66030e 100644 --- a/src/sonic-config-engine/MANIFEST.in +++ b/src/sonic-config-engine/MANIFEST.in @@ -1 +1 @@ -recursive-include tests *.j2 *.yml *.xml +recursive-include tests *.j2 *.yml *.xml *.json diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 2b020456475f..709a7a2846ff 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -218,9 +218,10 @@ def parse_dpg(dpg, hname): aclintfs = child.find(str(QName(ns, "AclInterfaces"))) acls = {} for aclintf in aclintfs.findall(str(QName(ns, "AclInterface"))): - aclname = aclintf.find(str(QName(ns, "InAcl"))).text + aclname = aclintf.find(str(QName(ns, "InAcl"))).text.lower().replace(" ", "_").replace("-", "_") aclattach = aclintf.find(str(QName(ns, "AttachTo"))).text.split(';') acl_intfs = [] + is_mirror = False for member in aclattach: member = member.strip() if pcs.has_key(member): @@ -229,9 +230,13 @@ def parse_dpg(dpg, hname): print >> sys.stderr, "Warning: ACL " + aclname + " is attached to a Vlan interface, which is currently not supported" elif port_alias_map.has_key(member): acl_intfs.append(port_alias_map[member]) + elif member.lower() == 'erspan': + is_mirror = True; + # Erspan session will be attached to all front panel ports + acl_intfs = port_alias_map.values() + break; if acl_intfs: - acls[aclname] = acl_intfs - + acls[aclname] = { 'AttachTo': acl_intfs, 'IsMirror': is_mirror } return intfs, lo_intfs, mgmt_intf, vlans, pcs, acls return None, None, None, None, None, None diff --git a/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json b/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json new file mode 100644 index 000000000000..9fd0199c4cf2 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json @@ -0,0 +1,29 @@ +[ + { + "ACL_RULE_TABLE:dataacl:Rule_1":{ + "IP_PROTOCOL":17, + "PACKET_ACTION":"FORWARD", + "SRC_IP":"10.0.0.0/8", + "priority":9999 + }, + "OP":"SET" + }, + { + "ACL_RULE_TABLE:dataacl:Rule_3":{ + "IP_PROTOCOL":17, + "PACKET_ACTION":"FORWARD", + "SRC_IP":"25.0.0.0/8", + "priority":9997 + }, + "OP":"SET" + }, + { + "ACL_RULE_TABLE:dataacl:Rule_2":{ + "IP_PROTOCOL":17, + "PACKET_ACTION":"FORWARD", + "SRC_IP":"100.64.0.0/10", + "priority":9998 + }, + "OP":"SET" + } +] \ No newline at end of file diff --git a/src/sonic-config-engine/tests/sample_output/rules_for_everflow.json b/src/sonic-config-engine/tests/sample_output/rules_for_everflow.json new file mode 100644 index 000000000000..c31965e31e27 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/rules_for_everflow.json @@ -0,0 +1,14 @@ +[ + { + "ACL_RULE_TABLE:everflow:Rule_1":{ + "DST_IP":"127.0.0.1/32", + "IP_PROTOCOL":6, + "L4_DST_PORT":0, + "L4_SRC_PORT":0, + "MIRROR_ACTION":"everflow", + "SRC_IP":"127.0.0.1/32", + "priority":9999 + }, + "OP":"SET" + } +] \ No newline at end of file diff --git a/src/sonic-config-engine/tests/sample_output/table_dataacl.json b/src/sonic-config-engine/tests/sample_output/table_dataacl.json new file mode 100644 index 000000000000..ed10f3195636 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/table_dataacl.json @@ -0,0 +1,10 @@ +[ + { + "ACL_TABLE:dataacl":{ + "policy_desc":"dataacl", + "ports":"Ethernet112,Ethernet116,Ethernet120,Ethernet124", + "type":"L3" + }, + "OP":"SET" + } +] \ No newline at end of file diff --git a/src/sonic-config-engine/tests/sample_output/table_everflow.json b/src/sonic-config-engine/tests/sample_output/table_everflow.json new file mode 100644 index 000000000000..4f3411ed8874 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/table_everflow.json @@ -0,0 +1,10 @@ +[ + { + "ACL_TABLE:everflow":{ + "policy_desc":"everflow", + "ports":"Ethernet24,Ethernet40,Ethernet20,Ethernet44,Ethernet48,Ethernet28,Ethernet96,Ethernet92,Ethernet76,Ethernet116,Ethernet72,Ethernet112,Ethernet52,Ethernet108,Ethernet56,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet120,Ethernet8,Ethernet4,Ethernet0,Ethernet124,Ethernet68,Ethernet84,Ethernet100,Ethernet80,Ethernet60,Ethernet104,Ethernet64,Ethernet88", + "type":"mirror" + }, + "OP":"SET" + } +] \ No newline at end of file diff --git a/src/sonic-config-engine/tests/t0-sample-acl.json b/src/sonic-config-engine/tests/t0-sample-acl.json new file mode 100644 index 000000000000..e04971e5f2ec --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-acl.json @@ -0,0 +1,97 @@ +{ + "acl": { + "acl-sets": { + "acl-set": { + "dataacl": { + "acl-entries": { + "acl-entry": { + "1": { + "actions": { + "config": { + "forwarding-action": "ACCEPT" + } + }, + "config": { + "sequence-id": 1 + }, + "ip": { + "config": { + "protocol": "IP_UDP", + "source-ip-address": "10.0.0.0/8" + } + } + }, + "2": { + "actions": { + "config": { + "forwarding-action": "ACCEPT" + } + }, + "config": { + "sequence-id": 2 + }, + "ip": { + "config": { + "protocol": "IP_UDP", + "source-ip-address": "100.64.0.0/10" + } + } + }, + "3": { + "actions": { + "config": { + "forwarding-action": "ACCEPT" + } + }, + "config": { + "sequence-id": 3 + }, + "ip": { + "config": { + "protocol": "IP_UDP", + "source-ip-address": "25.0.0.0/8" + } + } + } + } + }, + "config": { + "name": "dataacl" + } + }, + "everflow": { + "acl-entries": { + "acl-entry": { + "1": { + "actions": { + "config": { + "forwarding-action": "ACCEPT" + } + }, + "config": { + "sequence-id": 1 + }, + "ip": { + "config": { + "destination-ip-address": "127.0.0.1/32", + "protocol": "IP_TCP", + "source-ip-address": "127.0.0.1/32" + } + }, + "transport": { + "config": { + "destination-port": "0", + "source-port": "0" + } + } + } + } + }, + "config": { + "name": "everflow" + } + } + } + } + } +} diff --git a/src/sonic-config-engine/tests/t0-sample-graph-everflow.xml b/src/sonic-config-engine/tests/t0-sample-graph-everflow.xml new file mode 100644 index 000000000000..355f01122f0d --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-graph-everflow.xml @@ -0,0 +1,320 @@ + + + + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 180 + 60 + + + switch-t0 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 180 + 60 + + + switch-t0 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 180 + 60 + + + + + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/112 + + + + PortChannel02 + fortyGigE0/116 + + + + PortChannel03 + fortyGigE0/120 + + + + PortChannel04 + fortyGigE0/124 + + + + + + Vlan1000 + fortyGigE0/4;fortyGigE0/8;fortyGigE0/12;fortyGigE0/16;fortyGigE0/20;fortyGigE0/24;fortyGigE0/28;fortyGigE0/32;fortyGigE0/36;fortyGigE0/40;fortyGigE0/44;fortyGigE0/48;fortyGigE0/52;fortyGigE0/56;fortyGigE0/60;fortyGigE0/64;fortyGigE0/68;fortyGigE0/72;fortyGigE0/76;fortyGigE0/80;fortyGigE0/84;fortyGigE0/88;fortyGigE0/92;fortyGigE0/96 + False + 0.0.0.0/0 + + 1000 + 1000 + 192.168.0.0/27 + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + PortChannel02 + 10.0.0.58/31 + + + + PortChannel02 + FC00::75/126 + + + + PortChannel03 + 10.0.0.60/31 + + + + PortChannel03 + FC00::79/126 + + + + PortChannel04 + 10.0.0.62/31 + + + + PortChannel04 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/27 + + + + + + ERSPAN + everflow + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1/1 + switch-t0 + fortyGigE0/112 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1/1 + switch-t0 + fortyGigE0/116 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1/1 + switch-t0 + fortyGigE0/120 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1/1 + switch-t0 + fortyGigE0/124 + + + + + switch-t0 + Force10-S6000 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/test_acl.py b/src/sonic-config-engine/tests/test_acl.py new file mode 100644 index 000000000000..319b2c1f73a7 --- /dev/null +++ b/src/sonic-config-engine/tests/test_acl.py @@ -0,0 +1,58 @@ +import filecmp +import os +import subprocess + +from unittest import TestCase + +class TestAcl(TestCase): + def setUp(self): + self.test_dir = os.path.dirname(os.path.realpath(__file__)) + self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfggen') + self.acl_script_file = os.path.join(self.test_dir, '..', 'translate_acl') + self.t0_minigraph = os.path.join(self.test_dir, 't0-sample-graph.xml') + self.t0_minigraph_everflow = os.path.join(self.test_dir, 't0-sample-graph-everflow.xml') + self.t0_acl = os.path.join(self.test_dir, 't0-sample-acl.json') + self.t0_port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') + + def run_script(self, argument): + print 'CMD: sonic-cfggen ' + argument + output = '' + try: + output = subprocess.check_output(self.script_file + ' ' + argument, shell=True, stderr=subprocess.STDOUT) + except subprocess.CalledProcessError, (p): + print 'CalledProcessError: CMD:%s returncode:%s' % (p.cmd, p.returncode) + print p.output + return output + + def run_acl_script(self, argument): + print 'CMD: translate_acl ' + argument + output = '' + try: + output = subprocess.check_output(self.acl_script_file + ' ' + argument, shell=True, stderr=subprocess.STDOUT) + except subprocess.CalledProcessError, (p): + print 'CalledProcessError: CMD:%s returncode:%s' % (p.cmd, p.returncode) + print p.output + return output + + def test_translate_acl(self): + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -o ' + self.test_dir + ' ' + self.t0_acl + self.run_acl_script(argument) + for filename in ['rules_for_dataacl.json','table_dataacl.json']: + sample_output_file = os.path.join(self.test_dir, 'sample_output', filename) + output_file = os.path.join(self.test_dir, filename) + assert filecmp.cmp(sample_output_file, output_file) + + def test_translate_everflow(self): + argument = '-m ' + self.t0_minigraph_everflow + ' -p ' + self.t0_port_config + ' -o ' + self.test_dir + ' ' + self.t0_acl + self.run_acl_script(argument) + for filename in ['rules_for_everflow.json','table_everflow.json']: + sample_output_file = os.path.join(self.test_dir, 'sample_output', filename) + output_file = os.path.join(self.test_dir, filename) + assert filecmp.cmp(sample_output_file, output_file) + + def tearDown(self): + for filename in ['rules_for_dataacl.json','table_dataacl.json','rules_for_everflow.json','table_everflow.json']: + try: + os.remove(os.path.join(self.test_dir, filename)) + except OSError: + pass diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index e4017a51f8c6..83c678fff7b9 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -60,7 +60,7 @@ def test_render_template(self): def test_minigraph_acl(self): argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v minigraph_acls' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'DataAcl': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}") + self.assertEqual(output.strip(), "{'dataacl': {'IsMirror': False, 'AttachTo': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}}") def test_minigraph_interfaces(self): argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_interfaces' diff --git a/src/sonic-config-engine/translate_acl b/src/sonic-config-engine/translate_acl index 2c4410615d6e..6ee89cfd4612 100755 --- a/src/sonic-config-engine/translate_acl +++ b/src/sonic-config-engine/translate_acl @@ -13,7 +13,7 @@ def dump_json(filename, data): with open(filename, 'w') as outfile: json.dump(data, outfile, indent=4, sort_keys=True, separators=(',', ':')) -def generate_rule_json(table_name, rule, max_priority): +def generate_rule_json(table_name, rule, max_priority, mirror): rule_idx = rule.config.sequence_id rule_props = {} rule_data = {} @@ -22,7 +22,10 @@ def generate_rule_json(table_name, rule, max_priority): rule_props["priority"] = max_priority - rule_idx if rule.actions.config.forwarding_action == "ACCEPT": - rule_props["PACKET_ACTION"] = "FORWARD" + if mirror: + rule_props["MIRROR_ACTION"] = "everflow" + else: + rule_props["PACKET_ACTION"] = "FORWARD" elif rule.actions.config.forwarding_action == "DROP": rule_props["PACKET_ACTION"] = "DROP" elif rule.actions.config.forwarding_action == "REJECT": @@ -97,14 +100,14 @@ def generate_rule_json(table_name, rule, max_priority): rule_props["TCP_FLAGS"] = '0x{:02x}'.format(tcp_flags) return rule_data -def generate_table_json(aclset, aclname, port, max_priority, output_path='.'): +def generate_table_json(aclset, aclname, ports, mirror, max_priority, output_path='.'): table_name = aclname.replace(" ", "_").replace("-", "_") #table_name = generate_random_table_name() table_props = {} table_props["policy_desc"] = table_name - table_props["type"] = "L3" - table_props["ports"] = port + table_props["type"] = "mirror" if mirror else "L3" + table_props["ports"] = ports table_data = [{}] table_data[0]["ACL_TABLE:"+table_name] = table_props @@ -114,7 +117,7 @@ def generate_table_json(aclset, aclname, port, max_priority, output_path='.'): rule_data = [] for aclentryname in aclset.acl_entries.acl_entry: aclentry = aclset.acl_entries.acl_entry[aclentryname] - rule_props = generate_rule_json(table_name, aclentry, max_priority) + rule_props = generate_rule_json(table_name, aclentry, max_priority, mirror) if rule_props: rule_data.append(rule_props) @@ -127,29 +130,31 @@ def translate_acl_fixed_port(filename, output_path, port, max_priority): generate_table_json(aclset, aclsetname, port, max_priority, output_path) return -def translate_acl(filename, output_path, attach_to, max_priority): +def translate_acl(filename, output_path, mini_acl, max_priority): yang_acl = pybindJSON.load(filename, openconfig_acl, "openconfig_acl") for aclsetname in yang_acl.acl.acl_sets.acl_set: tablename = aclsetname.replace(" ", "_").replace("-", "_") - if attach_to.has_key(tablename): - port = ','.join(attach_to[tablename]) + if mini_acl.has_key(tablename): + is_mirror = mini_acl[tablename]['IsMirror'] + ports = ','.join(mini_acl[tablename]['AttachTo']) aclset = yang_acl.acl.acl_sets.acl_set[aclsetname] - generate_table_json(aclset, aclsetname, port, max_priority, output_path) + generate_table_json(aclset, aclsetname, ports, is_mirror, max_priority, output_path) return def main(): parser = argparse.ArgumentParser(description="Translate openconfig ACL json into SONiC ACL jsons") parser.add_argument('input', metavar='INPUT', help='input json file in openconfig format') group = parser.add_mutually_exclusive_group(required=True) - group.add_argument('-p', '--port', help='the port(s) that this ACL is attached to') + group.add_argument('-a', '--attach-to', help='the port(s) that this ACL is attached to') group.add_argument('-m', '--minigraph', help='read ACL attaching information from minigraph') + parser.add_argument("-p", "--port-config", help="port config file, used with -m") parser.add_argument('-n', '--max-priority', type=int, default=10000, help='the priority number of the first rule in ACL entries') parser.add_argument('-o', '--output-path', default='.', help='output directory where SONiC ACL jsons will be generated') args = parser.parse_args() - if args.port: + if args.attach_to: translate_acl_fixed_port(args.input, args.output_path, args.port, args.max_priority) elif args.minigraph: - mini_data = parse_xml(args.minigraph) + mini_data = parse_xml(args.minigraph, port_config_file=args.port_config) if mini_data['minigraph_acls']: translate_acl(args.input, args.output_path, mini_data['minigraph_acls'], args.max_priority) From b0901ecb8ee000f83ee457650fe4b5b05d3adb7e Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 7 Apr 2017 11:26:45 -0700 Subject: [PATCH 0431/1011] [broadcom]: Update Broadcom debian packages and add config.bcm files (#478) --- .../INGRASYS-S9100-C32/sai.profile | 2 +- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile index 1b6009956e90..a431427469e3 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/etc/bcm/th-ingrasys-s9100-32x100G.config.bcm +SAI_INIT_CONFIG_FILE=/etc/bcm/th-s9100-32x100G.config.bcm diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index ace7617f7ff4..4e8a740136e4 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-20170303234832.14_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-20170303234832.14_amd64.deb?sv=2015-04-05&sr=b&sig=gZKsefmpU6Xc6X0emxjlGKwf1aPsyxloulhXL0qGgFc%3D&se=2030-11-10T23%3A58%3A37Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-1-20170407044929.18_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-1-20170407044929.18_amd64.deb?sv=2015-04-05&sr=b&sig=lKKP8Ot01SW9NwbbnafZly5rTkIK2rpTdBuUwcWdr5U%3D&se=2030-12-15T04%3A51%3A54Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-20170303234832.14_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-1-20170407044929.18_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-20170303234832.14_amd64.deb?sv=2015-04-05&sr=b&sig=kEhXcoL0iOUpnuGJLduktluImi0eQVHAjGunGbipa28%3D&se=2030-11-10T23%3A59%3A08Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-1-20170407044929.18_amd64.deb?sv=2015-04-05&sr=b&sig=AsDdE0zR3aTxwdK76Iro0jGypl%2FSqVoYmwz0drr78Ho%3D&se=2030-12-15T04%3A52%3A31Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 57583bb178f7..760eee516600 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.2.2-20170303224751.24_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-20170303224751.24_amd64.deb?sv=2015-04-05&sr=b&sig=rFu55R4M6M9vJ%2FlJgv6wvp2fbZnKpiHNnhzCddEidgo%3D&se=2030-11-10T23%3A59%3A41Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.2.2-1-20170406004418.26_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-1-20170406004418.26_amd64.deb?sv=2015-04-05&sr=b&sig=aWbjpqH2A5JewLoVs8o%2BkriOCRvqDwuVTZygwy%2B1XMQ%3D&se=2030-12-14T19%3A41%3A16Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-20170303224751.24_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-20170303224751.24_amd64.deb?sv=2015-04-05&sr=b&sig=DMN91a5PwxG7ow15K1YyHudRF%2F2l0ipAXJ7c1dOW6QY%3D&se=2030-11-11T00%3A00%3A09Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-1-20170406004418.26_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-1-20170406004418.26_amd64.deb?sv=2015-04-05&sr=b&sig=fL88BnMJ9uMMozh6xDqYn7oDc%2FwhX53sd3WG1v%2BkqDA%3D&se=2030-12-14T19%3A40%3A23Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 263c1bf85281b6b509996720570971f4378fd020 Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Fri, 7 Apr 2017 11:28:07 -0700 Subject: [PATCH 0432/1011] [sonic-utilities]: Update submodule (#488) [portstat]: return N/A if no counter info exists (#29) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 52cff2aa4412..ea8ceba23f10 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 52cff2aa4412d3da78f4bb7cfe3018d427fb5d01 +Subproject commit ea8ceba23f104f27453db77bcffaebcfe2f3376f From 1458e9ea6bf9a20b847354703c884d75ca373395 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 7 Apr 2017 15:28:30 -0700 Subject: [PATCH 0433/1011] [aboot]: add varlog limit file in aboot image (#487) * [aboot]: add varlog limit file in aboot image --- files/Aboot/boot0.j2 | 3 ++- files/initramfs-tools/arista-convertfs.j2 | 30 ++++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 0905faad4c5d..6460ddbbecfc 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -47,7 +47,6 @@ extract_image() { rm -rf "$target_path/$f" fi done - ## Unzip the image unzip -oq "$swipath" -x boot0 -d "$target_path" @@ -102,6 +101,8 @@ platform_specific() { if [ "$platform" = "raven" ]; then aboot_machine=arista_7050_qx32 echo "modprobe.blacklist=radeon" >>/tmp/append + # set varlog size to 100MB + echo "varlog_size=100" >>/tmp/append fi if [ "$platform" = "crow" ]; then aboot_machine=arista_7050_qx32s diff --git a/files/initramfs-tools/arista-convertfs.j2 b/files/initramfs-tools/arista-convertfs.j2 index 8847bc69bdfa..6e3f2d633bff 100644 --- a/files/initramfs-tools/arista-convertfs.j2 +++ b/files/initramfs-tools/arista-convertfs.j2 @@ -82,6 +82,28 @@ run_cmd() { fi } +create_varlog_file() { + local err_msg="Error: create var-log ext4 file" + local cmd="[ -n $varlog_size ] && mkdir -p $root_mnt/disk-img && dd if=/dev/zero of=$root_mnt/disk-img/var-log.ext4 count=$((2048*$varlog_size)) && mke2fs -t ext4 -q -F $root_mnt/disk-img/var-log.ext4" + run_cmd "$cmd" "$err_msg" +} + +mount_and_create_varlog_file() { + [ -z "$varlog_size" ] && exit 0 + mkdir -p "$root_mnt" + mount -t ext4 "$root_dev" "$root_mnt" + # exit when the var_log.ext4 exists and the size matches + if [ -e "$root_mnt/disk-img/var-log.ext4" ]; then + cur_varlog_size=$(ls -l $root_mnt/disk-img/var-log.ext4 | awk '{print $5}') + if [ $cur_varlog_size == $((1024*1024*$varlog_size)) ]; then + exit 0 + fi + fi + create_varlog_file + umount "$root_mnt" + exit 0 +} + # Extract kernel parameters set -- $(cat /proc/cmdline) for x in "$@"; do @@ -91,6 +113,9 @@ for x in "$@"; do ;; Aboot=*) aboot_flag="${x#Aboot=}" + ;; + varlog_size=*) + varlog_size="${x#varlog_size=}" esac done root_dev="$ROOT" @@ -105,8 +130,9 @@ if ! wait_for_root_dev; then echo "Error: timeout in waiting for $root_dev" exit 1 fi -blkid | grep "$root_dev.*vfat" -q || exit 0 +# mount, create varlog file and exit when the root is ext4 +blkid | grep "$root_dev.*vfat" -q || mount_and_create_varlog_file # Get flash dev name if [ -z "$block_flash" ]; then @@ -171,3 +197,5 @@ run_cmd "$cmd" "$err_msg" err_msg="Error: copying files form $tmp_mnt to $root_mnt failed" cmd="cp -a $tmp_mnt/. $root_mnt/" run_cmd "$cmd" "$err_msg" + +create_varlog_file From fcc9c84aa6dc3c6ee2156af87206ffb4dc92e861 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 10 Apr 2017 01:11:26 -0700 Subject: [PATCH 0434/1011] [build]: use branch name instead of latest tag for dev build (#490) --- functions.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/functions.sh b/functions.sh index 8b2cdb7c50dd..8ca3d5422340 100644 --- a/functions.sh +++ b/functions.sh @@ -53,6 +53,7 @@ docker_try_rmi() { sonic_get_version() { local describe=$(git describe --tags) local latest_tag=$(git describe --tags --abbrev=0) + local branch_name=$(git rev-parse --abbrev-ref HEAD) if [ -n "$(git status --untracked-files=no -s --ignore-submodules)" ]; then local dirty="-dirty" fi @@ -61,6 +62,6 @@ sonic_get_version() { if [ "$describe" == "$latest_tag" ]; then echo "${latest_tag}${dirty}" else - echo "${latest_tag}.${BUILD_NUMBER}${dirty:--$(git rev-parse --short HEAD)}" + echo "${branch_name}.${BUILD_NUMBER}${dirty:--$(git rev-parse --short HEAD)}" fi } From 24bad71a6067ff56598a456dd12bd1860fbf34f8 Mon Sep 17 00:00:00 2001 From: kaiyu22 Date: Tue, 11 Apr 2017 02:14:08 +0800 Subject: [PATCH 0435/1011] [platform]: Add plugins for ingrasys (#486) * Adding two utilities: eeprom.py and sfputil.py --- .../plugins/eeprom.py | 22 +++++++ .../plugins/sfputil.py | 60 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/eeprom.py create mode 100644 device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/sfputil.py diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/eeprom.py b/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/eeprom.py new file mode 100644 index 000000000000..83bf65a389bd --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/eeprom.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +############################################################################# +# Ingrasys S9100 +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-9/9-0054/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/sfputil.py new file mode 100644 index 000000000000..f45502ab9ab4 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/sfputil.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 0: 11, + 1: 10, + 2: 13, + 3: 12, + 4: 15, + 5: 14, + 6: 17, + 7: 16, + 8: 19, + 9: 18, + 10: 21, + 11: 20, + 12: 23, + 13: 22, + 14: 25, + 15: 24, + 16: 27, + 17: 26, + 18: 29, + 19: 28, + 20: 31, + 21: 30, + 22: 33, + 23: 32, + 24: 35, + 25: 34, + 26: 37, + 27: 36, + 28: 39, + 29: 38, + 30: 41, + 31: 40 + } + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + for x in range(self.port_start, self.port_end + 1): + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + sfputilbase.__init__(self, port_num) From 884bd2d4673dcd812058769c09188e0f5a692e79 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 11 Apr 2017 00:36:36 +0300 Subject: [PATCH 0436/1011] [mellanox]: Add support for Mellanox MSN2410 (#491) * [device]: Add support for Mellanox MSN2410 MSN2410 runs on Spectrum silicon and has 56 ports: 48 25GbE and 8 100GbE * Avoid full path within bash -c Signed-off-by: marian-pritsak --- .../ACS-MSN2410/port_config.ini | 57 ++ .../ACS-MSN2410/sai.profile | 1 + .../x86_64-mlnx_msn2410-r0/hw-management | 1 + .../x86_64-mlnx_msn2410-r0/installer.conf | 1 + .../x86_64-mlnx_msn2410-r0/minigraph.xml | 520 ++++++++++++++++++ .../x86_64-mlnx_msn2410-r0/plugins/eeprom.py | 33 ++ .../x86_64-mlnx_msn2410-r0/plugins/sfputil.py | 28 + .../x86_64-mlnx_msn2410-r0/sensors.conf | 21 + .../x86_64-mlnx_msn2700-r0/hw-management | 1 + files/build_templates/swss.service.j2 | 5 +- 10 files changed, 666 insertions(+), 2 deletions(-) create mode 100644 device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/port_config.ini create mode 100644 device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/sai.profile create mode 120000 device/mellanox/x86_64-mlnx_msn2410-r0/hw-management create mode 100644 device/mellanox/x86_64-mlnx_msn2410-r0/installer.conf create mode 100644 device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml create mode 100644 device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py create mode 100644 device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py create mode 100644 device/mellanox/x86_64-mlnx_msn2410-r0/sensors.conf create mode 120000 device/mellanox/x86_64-mlnx_msn2700-r0/hw-management diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/port_config.ini b/device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/port_config.ini new file mode 100644 index 000000000000..c7db66b02274 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/port_config.ini @@ -0,0 +1,57 @@ +# name lanes +Ethernet0 0 +Ethernet4 4 +Ethernet8 8 +Ethernet12 12 +Ethernet16 16 +Ethernet20 20 +Ethernet24 24 +Ethernet28 28 +Ethernet32 32 +Ethernet36 36 +Ethernet40 40 +Ethernet44 44 +Ethernet48 48 +Ethernet52 52 +Ethernet56 56 +Ethernet60 60 +Ethernet64 64 +Ethernet68 68 +Ethernet72 72 +Ethernet76 76 +Ethernet80 80 +Ethernet84 84 +Ethernet88 88 +Ethernet92 92 +Ethernet96 96 +Ethernet100 100 +Ethernet104 104 +Ethernet108 108 +Ethernet112 112 +Ethernet116 116 +Ethernet120 120 +Ethernet124 124 +Ethernet128 128 +Ethernet132 132 +Ethernet136 136 +Ethernet140 140 +Ethernet144 144 +Ethernet148 148 +Ethernet152 152 +Ethernet156 156 +Ethernet160 160 +Ethernet164 164 +Ethernet168 168 +Ethernet172 172 +Ethernet176 176 +Ethernet180 180 +Ethernet184 184 +Ethernet188 188 +Ethernet192 192,193,194,195 +Ethernet196 196,197,198,199 +Ethernet200 200,201,202,203 +Ethernet204 204,205,206,207 +Ethernet208 208,209,210,211 +Ethernet212 212,213,214,215 +Ethernet216 216,217,218,219 +Ethernet220 220,221,222,223 diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/sai.profile b/device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/sai.profile new file mode 100644 index 000000000000..e5dff6bfa098 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/ACS-MSN2410/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sai_2410.xml diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/hw-management b/device/mellanox/x86_64-mlnx_msn2410-r0/hw-management new file mode 120000 index 000000000000..5b9a76d3d47b --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/hw-management @@ -0,0 +1 @@ +/etc/mlnx/msn2410 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/installer.conf b/device/mellanox/x86_64-mlnx_msn2410-r0/installer.conf new file mode 100644 index 000000000000..c9c9493a5404 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/installer.conf @@ -0,0 +1 @@ +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="acpi_enforce_resources=lax acpi=noirq" diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml b/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml new file mode 100644 index 000000000000..01cfdd03c635 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml @@ -0,0 +1,520 @@ + + + + + + + + 65100 + switch2 + + + + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + + + + + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch2 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet60 + 10.0.0.30/31 + + + + Ethernet64 + 10.0.0.32/31 + + + + Ethernet68 + 10.0.0.34/31 + + + + Ethernet72 + 10.0.0.36/31 + + + + Ethernet76 + 10.0.0.38/31 + + + + Ethernet80 + 10.0.0.40/31 + + + + Ethernet84 + 10.0.0.42/31 + + + + Ethernet88 + 10.0.0.44/31 + + + + Ethernet92 + 10.0.0.46/31 + + + + Ethernet96 + 10.0.0.48/31 + + + + Ethernet100 + 10.0.0.50/31 + + + + Ethernet104 + 10.0.0.52/31 + + + + Ethernet108 + 10.0.0.54/31 + + + + Ethernet112 + 10.0.0.56/31 + + + + Ethernet116 + 10.0.0.58/31 + + + + Ethernet120 + 10.0.0.60/31 + + + + Ethernet124 + 10.0.0.62/31 + + + + Ethernet128 + 10.0.0.64/31 + + + + Ethernet132 + 10.0.0.66/31 + + + + Ethernet136 + 10.0.0.68/31 + + + + Ethernet140 + 10.0.0.70/31 + + + + Ethernet144 + 10.0.0.72/31 + + + + Ethernet148 + 10.0.0.74/31 + + + + Ethernet152 + 10.0.0.76/31 + + + + Ethernet156 + 10.0.0.78/31 + + + + Ethernet160 + 10.0.0.80/31 + + + + Ethernet164 + 10.0.0.82/31 + + + + Ethernet168 + 10.0.0.84/31 + + + + Ethernet172 + 10.0.0.86/31 + + + + Ethernet176 + 10.0.0.88/31 + + + + Ethernet180 + 10.0.0.90/31 + + + + Ethernet184 + 10.0.0.92/31 + + + + Ethernet188 + 10.0.0.94/31 + + + + Ethernet192 + 10.0.0.96/31 + + + + Ethernet196 + 10.0.0.98/31 + + + + Ethernet200 + 10.0.0.100/31 + + + + Ethernet204 + 10.0.0.102/31 + + + + Ethernet208 + 10.0.0.104/31 + + + + Ethernet212 + 10.0.0.106/31 + + + + Ethernet216 + 10.0.0.108/31 + + + + Ethernet220 + 10.0.0.110/31 + + + + + + + + + + + + + + switch2 + ACS-MSN2410 + + ` + + + + + switch2 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + + switch2 + ACS-MSN2410 + diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py new file mode 100644 index 000000000000..a9e22e3e698c --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + import eeprom_base + import eeprom_tlvinfo + import subprocess +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + _TLV_INFO_MAX_LEN = 256 + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/bsp/eeprom/sys_eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py new file mode 100644 index 000000000000..9d4474ac1ec9 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py @@ -0,0 +1,28 @@ +#! /usr/bin/python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 55 + ports_in_block = 56 + + eeprom_offset = 1 + + port_to_eeprom_mapping = {} + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/bsp/qsfp/qsfp{0}' + for x in range(0, self.port_end + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) + sfputilbase.__init__(self, port_num) + diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2410-r0/sensors.conf new file mode 100644 index 000000000000..a3e30391863e --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/sensors.conf @@ -0,0 +1,21 @@ +bus "i2c-7" "i2c-1-mux (chan_id 5)" +chip "lm75-i2c-7-4a" + label temp1 "Ambient Port Temp" + +bus "i2c-5" "i2c-1-mux (chan_id 3)" +chip "ucd9200-i2c-5-27" + label in1 "UCD1 vin" + label in2 "ASIC 3.3 vout" + label in3 "ASIC 1.2 vout" + label temp1 "UCD1 Temp" + label temp2 "UCD1 Temp2" + +chip "ucd9200-i2c-5-41" + label in1 "UCD2 vin" + label in2 "ASIC Vcore vout" + label temp1 "UCD2 Temp1" + label temp2 "UCD2 Temp2" + +bus "i2c-17" "i2c-1-mux (chan_id 7)" +chip "lm75-i2c-17-49" + label temp1 "Ambient Board Temp" diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/hw-management b/device/mellanox/x86_64-mlnx_msn2700-r0/hw-management new file mode 120000 index 000000000000..eb5e941daad7 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/hw-management @@ -0,0 +1 @@ +/etc/mlnx/msn2700 \ No newline at end of file diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index 6e5152223616..1fc9127f260e 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -20,7 +20,8 @@ ExecStartPre=/usr/bin/docker exec database redis-cli -n 2 FLUSHDB {% if sonic_asic_platform == 'mellanox' %} ExecStartPre=/etc/init.d/sxdkernel start ExecStartPre=/usr/bin/mst start -ExecStartPre=/etc/mlnx/msn2700 start +ExecStartPre=/sbin/modprobe i2c-dev +ExecStartPre=/bin/bash -c "/usr/share/sonic/device/$(sonic-cfggen -v platform)/hw-management start" {% elif sonic_asic_platform == 'cavium' %} ExecStartPre=/etc/init.d/xpnet.sh start {% endif %} @@ -33,7 +34,7 @@ ExecStop=/usr/bin/{{docker_container_name}}.sh stop ExecStopPost=/usr/bin/syncd.sh stop {% if sonic_asic_platform == 'mellanox' %} -ExecStopPost=/etc/mlnx/msn2700 stop +ExecStopPost=/bin/bash -c "/usr/share/sonic/device/$(sonic-cfggen -v platform)/hw-management stop" ExecStopPost=/etc/init.d/sxdkernel stop ExecStopPost=/usr/bin/mst stop {% elif sonic_asic_platform == 'cavium' %} From 3bd3549818edf6e61480b04f100111f0dfe8d6c8 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 10 Apr 2017 22:08:54 -0700 Subject: [PATCH 0437/1011] [cfggen] Fix a bug when portchannel has >2 members (#493) --- src/sonic-config-engine/minigraph.py | 2 +- .../tests/pc-test-graph.xml | 202 ++++++++++++++++++ src/sonic-config-engine/tests/test_cfggen.py | 8 +- 3 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 src/sonic-config-engine/tests/pc-test-graph.xml diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 709a7a2846ff..eae87a37e0df 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -197,7 +197,7 @@ def parse_dpg(dpg, hname): for pcintf in pcintfs.findall(str(QName(ns, "PortChannel"))): pcintfname = pcintf.find(str(QName(ns, "Name"))).text pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text - pcmbr_list = pcintfmbr.split(';', 1) + pcmbr_list = pcintfmbr.split(';') for i, member in enumerate(pcmbr_list): pcmbr_list[i] = port_alias_map[member] pcs[pcintfname] = {'name': pcintfname, 'members': pcmbr_list} diff --git a/src/sonic-config-engine/tests/pc-test-graph.xml b/src/sonic-config-engine/tests/pc-test-graph.xml new file mode 100644 index 000000000000..7d7ec74a8631 --- /dev/null +++ b/src/sonic-config-engine/tests/pc-test-graph.xml @@ -0,0 +1,202 @@ + + + + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + + + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/112;fortyGigE0/116;fortyGigE0/120;fortyGigE0/124 + + + + + + Vlan1000 + fortyGigE0/4;fortyGigE0/8;fortyGigE0/12;fortyGigE0/16;fortyGigE0/20;fortyGigE0/24;fortyGigE0/28;fortyGigE0/32;fortyGigE0/36;fortyGigE0/40;fortyGigE0/44;fortyGigE0/48;fortyGigE0/52;fortyGigE0/56;fortyGigE0/60;fortyGigE0/64;fortyGigE0/68;fortyGigE0/72;fortyGigE0/76;fortyGigE0/80;fortyGigE0/84;fortyGigE0/88;fortyGigE0/92;fortyGigE0/96 + False + 0.0.0.0/0 + + 1000 + 1000 + 192.168.0.0/27 + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + Vlan1000 + 192.168.0.1/27 + + + + + + + PortChannel01;PortChannel02;PortChannel03;PortChannel04 + + DataAcl + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1/1 + switch-t0 + fortyGigE0/112 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1/1 + switch-t0 + fortyGigE0/116 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1/1 + switch-t0 + fortyGigE0/120 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1/1 + switch-t0 + fortyGigE0/124 + + + + + switch-t0 + Force10-S6000 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 83c678fff7b9..a4ad6cb806fc 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -10,6 +10,7 @@ def setUp(self): self.sample_graph = os.path.join(self.test_dir, 'sample_graph.xml') self.sample_graph_t0 = os.path.join(self.test_dir, 't0-sample-graph.xml') self.sample_graph_simple = os.path.join(self.test_dir, 'simple-sample-graph.xml') + self.sample_graph_pc_test = os.path.join(self.test_dir, 'pc-test-graph.xml') self.port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') def run_script(self, argument): @@ -82,7 +83,12 @@ def test_minigraph_portchannels(self): output = self.run_script(argument) self.assertEqual(output.strip(), "{'PortChannel01': {'name': 'PortChannel01', 'members': ['Ethernet4']}}") - def test_minigraph_portchannels(self): + def test_minigraph_portchannels_more_member(self): + argument = '-m "' + self.sample_graph_pc_test + '" -p "' + self.port_config + '" -v minigraph_portchannels' + output = self.run_script(argument) + self.assertEqual(output.strip(), "{'PortChannel01': {'name': 'PortChannel01', 'members': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}}") + + def test_minigraph_portchannel_interfaces(self): argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_portchannel_interfaces' output = self.run_script(argument) self.assertEqual(output.strip(), "[{'subnet': IPv4Network('10.0.0.56/31'), 'peer_addr': IPv4Address('10.0.0.57'), 'addr': IPv4Address('10.0.0.56'), 'mask': IPv4Address('255.255.255.254'), 'attachto': 'PortChannel01', 'prefixlen': 31}, {'subnet': IPv6Network('fc00::70/126'), 'peer_addr': IPv6Address('fc00::72'), 'addr': IPv6Address('fc00::71'), 'mask': '126', 'attachto': 'PortChannel01', 'prefixlen': 126}]") From 4c81204eaf686bcf49c6cff9f80a595ca1ad4233 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 11 Apr 2017 12:53:21 -0700 Subject: [PATCH 0438/1011] [sonic-slave]: add aspell in Dockerfile for SAI meta data build (#494) --- sonic-slave/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 6ca6e93c5f45..ff038e90aa9d 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -23,7 +23,7 @@ RUN apt-get update && apt-get install -y libreadline-dev texlive-latex-base texl RUN apt-get install -y cdbs # For SAI meta build -RUN apt-get update && apt-get install -y libxml-simple-perl graphviz +RUN apt-get update && apt-get install -y libxml-simple-perl graphviz aspell # For linux build RUN apt-get update && apt-get install -y bc fakeroot build-essential devscripts quilt stgit From ec73735d21f5f123bdaa89a73fca495dc5098369 Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Tue, 11 Apr 2017 13:04:21 -0700 Subject: [PATCH 0439/1011] [sonic-cfggen]: Move get_machine_info function to sonic_platform.py (#489) * Move get_machine_info to lib * Add get platform info API * Create sonic_platform.py Signed-off-by: Sihui Han --- src/sonic-config-engine/minigraph.py | 1 - src/sonic-config-engine/setup.py | 2 +- src/sonic-config-engine/sonic-cfggen | 25 +++++------------- src/sonic-config-engine/sonic_platform.py | 32 +++++++++++++++++++++++ 4 files changed, 39 insertions(+), 21 deletions(-) create mode 100644 src/sonic-config-engine/sonic_platform.py diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index eae87a37e0df..42086625bb90 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -47,7 +47,6 @@ def default(self, obj): return str(obj) return json.JSONEncoder.default(self, obj) - def parse_png(png, hname): neighbors = {} devices = {} diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py index b9e6ace7cccf..ac4eb16b30e1 100755 --- a/src/sonic-config-engine/setup.py +++ b/src/sonic-config-engine/setup.py @@ -15,7 +15,7 @@ def get_test_suite(): author='Taoyu Li', author_email='taoyl@microsoft.com', url='https://github.com/Azure/sonic-buildimage', - py_modules=['minigraph', 'openconfig_acl'], + py_modules=['minigraph', 'openconfig_acl', 'sonic_platform'], scripts=['sonic-cfggen', 'translate_acl'], install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'pyyaml', 'pyangbind'], test_suite='setup.get_test_suite', diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index e47985cf17fc..822f02d7fcc2 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -7,9 +7,10 @@ import yaml import jinja2 import netaddr import json -from minigraph import parse_xml from minigraph import minigraph_encoder - +from minigraph import parse_xml +from sonic_platform import get_machine_info +from sonic_platform import get_platform_info def is_ipv4(value): if not value: @@ -44,19 +45,6 @@ def unique_name(l): new_list.append(item) return new_list -def get_machine_info(): - if not os.path.isfile('/host/machine.conf'): - return None - machine_vars = {} - with open('/host/machine.conf') as machine_file: - for line in machine_file: - tokens = line.split('=') - if len(tokens) < 2: - continue - machine_vars[tokens[0]] = tokens[1].strip() - return machine_vars - - def main(): parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") parser.add_argument("-m", "--minigraph", help="minigraph xml file") @@ -74,10 +62,9 @@ def main(): machine_info = get_machine_info() if machine_info != None: data.update(machine_info) - if machine_info.has_key('onie_platform'): - data['platform'] = machine_info['onie_platform'] - elif machine_info.has_key('aboot_platform'): - data['platform'] = machine_info['aboot_platform'] + platform_info = get_platform_info(machine_info) + if platform_info != None: + data['platform'] = platform_info if args.minigraph != None: minigraph = args.minigraph diff --git a/src/sonic-config-engine/sonic_platform.py b/src/sonic-config-engine/sonic_platform.py new file mode 100644 index 000000000000..fdc192d09d0a --- /dev/null +++ b/src/sonic-config-engine/sonic_platform.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python +import os + +DOCUMENTATION = ''' +--- +module: sonic_platform +version_added: "1.9" +short_description: Retrive platform related facts for a device. +description: + - Retrieve platform related facts from config files. +''' + +def get_machine_info(): + if not os.path.isfile('/host/machine.conf'): + return None + machine_vars = {} + with open('/host/machine.conf') as machine_file: + for line in machine_file: + tokens = line.split('=') + if len(tokens) < 2: + continue + machine_vars[tokens[0]] = tokens[1].strip() + return machine_vars + +def get_platform_info(machine_info): + if machine_info != None: + if machine_info.has_key('onie_platform'): + return machine_info['onie_platform'] + elif machine_info.has_key('aboot_platform'): + return machine_info['aboot_platform'] + return None + From 5585221890f28f226609fc8d8094ad763daf59ef Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Tue, 11 Apr 2017 17:23:04 -0700 Subject: [PATCH 0440/1011] [sonic-utilities]: Update submodule (#495) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index ea8ceba23f10..bd6cf5d16cc4 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit ea8ceba23f104f27453db77bcffaebcfe2f3376f +Subproject commit bd6cf5d16cc44128318c0ca8ec94ceba8fe48624 From 2e9b92e1c176b9f2d51c5d650b2a52c0abdb433b Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 12 Apr 2017 11:23:48 -0700 Subject: [PATCH 0441/1011] [build]: allow to customize USERNAME and PASSWORD in command line (#492) * [build]: allow to customize USERNAME and PASSWORD in command line * use default password and username if not specified in the command line --- Makefile | 2 ++ rules/config | 8 ++++---- slave.mk | 8 ++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 38e90f2bfae0..3e2480891b34 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,8 @@ DOCKER_BUILD = docker build --no-cache \ PLATFORM=$(PLATFORM) \ BUILD_NUMBER=$(BUILD_NUMBER) \ ENABLE_DHCP_GRAPH_SERVICE=$(ENABLE_DHCP_GRAPH_SERVICE) \ + PASSWORD=$(PASSWORD) \ + USERNAME=$(USERNAME) \ $@ sonic-slave-build : diff --git a/rules/config b/rules/config index dcfa40c7459e..ca0de68e7319 100644 --- a/rules/config +++ b/rules/config @@ -26,11 +26,11 @@ SONIC_CONFIG_LOG_TO_FILES = y # Comment next line to disable: # SONIC_CONFIG_ENABLE_COLORS = y -# USERNAME - username for installer build -USERNAME = admin +# DEFAULT_USERNAME - default username for installer build +DEFAULT_USERNAME = admin -# PASSWORD - password for installer build -PASSWORD = YourPaSsWoRd +# DEFAULT_PASSWORD - default password for installer build +DEFAULT_PASSWORD = YourPaSsWoRd # ENABLE_DHCP_GRAPH_SERVICE - specify the source of minigraph to generate configuration file. # If set to y SONiC will get the minigraph from graph service. Graph service URL need to be diff --git a/slave.mk b/slave.mk index 4f3761aa2263..fbfa9f28fa35 100644 --- a/slave.mk +++ b/slave.mk @@ -59,6 +59,14 @@ ifneq ($(CONFIGURED_PLATFORM), undefined) include $(PLATFORM_PATH)/rules.mk endif +ifeq ($(USERNAME),) +override USERNAME := $(DEFAULT_USERNAME) +endif + +ifeq ($(PASSWORD),) +override PASSWORD := $(DEFAULT_PASSWORD) +endif + MAKEFLAGS += -j $(SONIC_CONFIG_BUILD_JOBS) ############################################################################### From f76e700062d8e6a4af7205898b2d9fa753b33d96 Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Wed, 12 Apr 2017 15:45:50 -0700 Subject: [PATCH 0442/1011] [sonic-utilities]: Update the submodule (#498) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index bd6cf5d16cc4..fcfefdb0b96e 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit bd6cf5d16cc44128318c0ca8ec94ceba8fe48624 +Subproject commit fcfefdb0b96ef36a18cb13669a964b196a036436 From e47b8cc0b2cba47c6e1e700da4e9cd060159011b Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 13 Apr 2017 14:07:44 +0300 Subject: [PATCH 0443/1011] [device]: Fix mellanox eeprom plugins. (#500) Signed-off-by: marian-pritsak --- device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py | 4 ++-- device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py index a9e22e3e698c..d792d1770367 100644 --- a/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py @@ -17,8 +17,8 @@ import warnings import os import sys - import eeprom_base - import eeprom_tlvinfo + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo import subprocess except ImportError, e: raise ImportError (str(e) + "- required module not found") diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py index a9e22e3e698c..d792d1770367 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py @@ -17,8 +17,8 @@ import warnings import os import sys - import eeprom_base - import eeprom_tlvinfo + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo import subprocess except ImportError, e: raise ImportError (str(e) + "- required module not found") From b3e10d2093d398a0e2f78d5f68cc5fb0ad281c46 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 13 Apr 2017 06:08:28 -0700 Subject: [PATCH 0444/1011] [vas]: remove docker-vas (#499) --- dockers/docker-vas/Dockerfile | 42 -------------------------------- dockers/docker-vas/user-override | 2 -- 2 files changed, 44 deletions(-) delete mode 100755 dockers/docker-vas/Dockerfile delete mode 100644 dockers/docker-vas/user-override diff --git a/dockers/docker-vas/Dockerfile b/dockers/docker-vas/Dockerfile deleted file mode 100755 index 245bbd6baeb7..000000000000 --- a/dockers/docker-vas/Dockerfile +++ /dev/null @@ -1,42 +0,0 @@ -FROM docker-base - -COPY deps/vasclnt_*.deb deps/vasgp_*.deb /deps/ -COPY user-override /etc/opt/quest/vas/user-override - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -## Pre-install the fundamental packages -## Clean up -RUN apt-get update && \ - dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ - apt-get -y install \ - sudo \ - && \ - dpkg_apt /deps/vasclnt_*.deb && \ - dpkg_apt /deps/vasgp_*.deb && \ - apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ - rm -rf /deps - -## Expose to host, ie. image content will copy to host when container started -## For .so -VOLUME /host/lib/x86_64-linux-gnu -## For config -VOLUME /etc/pam.d/ -VOLUME /host/etc -## For domain socket and local caches -VOLUME /var/opt/quest/vas/vasd/ -## For home directory -VOLUME /home/ - -## Delete the symlinks and create full copies to host folder -ENTRYPOINT rm -f /var/run/rsyslogd.pid \ - && service rsyslog start \ - && cp --remove-destination /opt/quest/lib64/nss/libnss_vas4.so.2 \ - /host/lib/x86_64-linux-gnu/ \ - && cp --remove-destination /opt/quest/lib64/security/pam_vas3.so \ - /host/lib/x86_64-linux-gnu/security/ \ - && cp --remove-destination /etc/nsswitch.conf \ - /host/etc/ \ - && service vasd start \ - && /bin/bash diff --git a/dockers/docker-vas/user-override b/dockers/docker-vas/user-override deleted file mode 100644 index cb16ea6ded0f..000000000000 --- a/dockers/docker-vas/user-override +++ /dev/null @@ -1,2 +0,0 @@ -# Overrides every member to have the bash shell -::::::/bin/bash From ebc343120d77a83b5ac0b676afbbd5181726548a Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Thu, 13 Apr 2017 18:29:14 +0300 Subject: [PATCH 0445/1011] Update MLNX SAI revision reference (#501) --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index b9396e2f3421..163e298553f8 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = 161120 -MLNX_SAI_REVISION = b2137c6d66f7f1bcdec4a0d0d17264ec5695d31b +MLNX_SAI_REVISION = 1a4307f0ac40b28cd8ed8f48569458212d90366e export MLNX_SAI_VERSION MLNX_SAI_REVISION From 31e8b1ec678dfbe9b968f23b7512375778c87777 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 13 Apr 2017 22:09:00 +0300 Subject: [PATCH 0446/1011] [sonic-slave]: Refactor Dockerfile. (#502) Put all packages installation into single apt-get command. This will allow us to do apt-get update only once. Eliminate unnecessary intermediate layers where they are not required. Signed-off-by: marian-pritsak --- sonic-slave/Dockerfile | 254 +++++++++++++++++++++++++++++------------ 1 file changed, 184 insertions(+), 70 deletions(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index ff038e90aa9d..c2b5f8a11c73 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -2,102 +2,216 @@ FROM debian:jessie MAINTAINER johnar@microsoft.com -RUN echo "deb http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free" >> /etc/apt/sources.list -RUN echo "deb-src http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free" >> /etc/apt/sources.list -RUN echo "deb http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list -RUN echo "deb-src http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list -RUN echo 'deb http://debian-archive.trafficmanager.net/debian jessie-backports main' >> /etc/apt/sources.list +RUN echo "deb http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb-src http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list && \ + echo "deb-src http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free" >> /etc/apt/sources.list && \ + echo 'deb http://debian-archive.trafficmanager.net/debian jessie-backports main' >> /etc/apt/sources.list ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get clean && apt-get update && apt-get install -y apt-utils default-jre-headless openssh-server curl wget unzip git build-essential libtool lintian - -RUN apt-get update && apt-get install -y sudo dh-make dh-exec kmod libtinyxml2-2 libboost-program-options1.55-dev libtinyxml2-dev python python-pip libncurses5-dev texinfo dh-autoreconf python3-pip -RUN apt-get update && apt-get install -y doxygen devscripts git-buildpackage perl-modules libswitch-perl dh-systemd - +RUN apt-get clean && apt-get update && apt-get install -y \ + apt-utils \ + default-jre-headless \ + openssh-server \ + curl \ + wget \ + unzip \ + git \ + build-essential \ + libtool \ + lintian \ + sudo \ + dh-make \ + dh-exec \ + kmod \ + libtinyxml2-2 \ + libboost-program-options1.55-dev \ + libtinyxml2-dev \ + python \ + python-pip \ + libncurses5-dev \ + texinfo \ + dh-autoreconf \ + python3-pip \ + doxygen \ + devscripts \ + git-buildpackage \ + perl-modules \ + libswitch-perl \ + dh-systemd \ # For quagga build -RUN apt-get update && apt-get install -y libreadline-dev texlive-latex-base texlive-generic-recommended texlive-fonts-recommended libpam0g-dev libpam-dev libcap-dev imagemagick ghostscript groff libpcre3-dev gawk chrpath - + libreadline-dev \ + texlive-latex-base \ + texlive-generic-recommended \ + texlive-fonts-recommended \ + libpam0g-dev \ + libpam-dev \ + libcap-dev \ + imagemagick \ + ghostscript \ + groff \ + libpcre3-dev \ + gawk \ + chrpath \ # For libnl3 (local) build -RUN apt-get install -y cdbs - + cdbs \ # For SAI meta build -RUN apt-get update && apt-get install -y libxml-simple-perl graphviz aspell - + libxml-simple-perl \ + graphviz \ + aspell \ # For linux build -RUN apt-get update && apt-get install -y bc fakeroot build-essential devscripts quilt stgit -RUN apt-get update && apt-get -y build-dep linux - + bc \ + fakeroot \ + build-essential \ + devscripts \ + quilt \ + stgit \ # For platform-modules build -RUN apt-get update && apt-get install -y module-assistant - -# For thrift build -RUN apt-get update && apt-get install -y gem2deb libboost-all-dev libevent-dev libglib2.0-dev libqt4-dev python-all-dev python-twisted php5-dev phpunit libbit-vector-perl openjdk-7-jdk javahelper maven-debian-helper ant libmaven-ant-tasks-java libhttpclient-java libslf4j-java libservlet3.1-java qt5-default - + module-assistant \ +# For thrift build\ + gem2deb \ + libboost-all-dev \ + libevent-dev \ + libglib2.0-dev \ + libqt4-dev \ + python-all-dev \ + python-twisted \ + php5-dev \ + phpunit \ + libbit-vector-perl \ + openjdk-7-jdk \ + javahelper \ + maven-debian-helper \ + ant \ + libmaven-ant-tasks-java \ + libhttpclient-java \ + libslf4j-java \ + libservlet3.1-java \ + qt5-default \ # For mellanox sdk build -RUN apt-get update && apt-get install -y libpcre3 libpcre3-dev byacc flex libglib2.0-dev bison expat libexpat1-dev dpatch libdb-dev iptables-dev swig - + libpcre3 \ + libpcre3-dev \ + byacc \ + flex \ + libglib2.0-dev \ + bison \ + expat \ + libexpat1-dev \ + dpatch \ + libdb-dev \ + iptables-dev \ + swig \ # For mellanox sai build -RUN apt-get update && apt-get install -y libtool-bin libxml2-dev - + libtool-bin \ + libxml2-dev \ # For build image -RUN apt-get update && apt-get install -y cpio squashfs-tools zip - + cpio \ + squashfs-tools \ + zip \ # For broadcom sdk build -RUN apt-get update && apt-get install -y linux-compiler-gcc-4.8-x86 linux-kbuild-3.16 - + linux-compiler-gcc-4.8-x86 \ + linux-kbuild-3.16 \ # teamd build -RUN apt-get update && apt-get install -y libdaemon-dev libdbus-1-dev libjansson-dev - + libdaemon-dev \ + libdbus-1-dev \ + libjansson-dev \ # For cavium sdk build -RUN apt-get update && apt-get install -y libpcap-dev dnsutils libusb-dev - + libpcap-dev \ + dnsutils \ + libusb-dev \ # For debian image reconfiguration -RUN apt-get update && apt-get install -y augeas-tools - + augeas-tools \ # For p4 build -RUN apt-get update && apt-get install -y libyaml-dev libevent-dev libjudy-dev libedit-dev libpcap-dev libnanomsg-dev -RUN apt-get update && apt-get install -y python-stdeb -RUN pip install ctypesgen -RUN pip install crc16 - + libyaml-dev \ + libevent-dev \ + libjudy-dev \ + libedit-dev \ + libnanomsg-dev \ + python-stdeb \ # For redis build -RUN apt-get update && apt-get install -y libjemalloc-dev - + libjemalloc-dev \ # For mft kernel module build -RUN apt-get update && apt-get install -y dkms - + dkms \ # For python3.5 build -RUN apt-get update && apt-get install -y sharutils libncursesw5-dev libbz2-dev liblzma-dev libgdbm-dev tk-dev blt-dev libmpdec-dev libbluetooth-dev locales libsqlite3-dev libgpm2 time net-tools xvfb python-sphinx python3-sphinx - -# For gobgp build -RUN apt-get -yt jessie-backports install golang-go golang-github-golang-mock-dev - -RUN mkdir /var/run/sshd -EXPOSE 22 - -# For gtest -RUN apt-get update && apt-get install -y libgtest-dev cmake && cd /usr/src/gtest && cmake . && make -C /usr/src/gtest - + sharutils \ + libncursesw5-dev \ + libbz2-dev \ + liblzma-dev \ + libgdbm-dev \ + tk-dev \ + blt-dev \ + libmpdec-dev \ + libbluetooth-dev \ + locales \ + libsqlite3-dev \ + libgpm2 \ + time \ + net-tools \ + xvfb \ + python-sphinx \ + python3-sphinx \ # For Jenkins static analysis, unit testing and code coverage -RUN apt-get update && apt-get install -y cppcheck clang pylint python-pytest gcovr python-pytest=2.6.3* python-pytest-cov python-parse - + cppcheck \ + clang \ + pylint \ + python-pytest \ + gcovr \ + python-pytest=2.6.3* \ + python-pytest-cov \ + python-parse \ # For snmpd -RUN apt-get update && apt-get install -y libmysqlclient-dev libmysqld-dev libperl-dev libpci-dev libpci3 libsensors4 libsensors4-dev libwrap0-dev - + libmysqlclient-dev \ + libmysqld-dev \ + libperl-dev \ + libpci-dev \ + libpci3 \ + libsensors4 \ + libsensors4-dev \ + libwrap0-dev \ # For mpdecimal -RUN apt-get update && apt-get install -y docutils-common libjs-sphinxdoc libjs-underscore python-docutils python-jinja2 python-markupsafe python-pygments python-roman python-sphinx sphinx-common python3-sphinx - + docutils-common \ + libjs-sphinxdoc \ + libjs-underscore \ + python-docutils \ + python-jinja2 \ + python-markupsafe \ + python-pygments \ + python-roman \ + python-sphinx \ + sphinx-common \ + python3-sphinx \ # For sonic config engine testing -RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml -RUN pip install pyangbind - + python-lxml \ + python-jinja2 \ + python-netaddr \ + python-ipaddr \ + python-yaml \ +# For lockfile + procmail \ +# For gtest + libgtest-dev \ + cmake \ +# For linux build + && apt-get -y build-dep linux \ +# For gobgp build + && apt-get -yt jessie-backports install \ + golang-go \ + golang-github-golang-mock-dev \ +# For p4 build + && pip install \ + ctypesgen \ + crc16 \ # For templating -RUN pip install j2cli + j2cli \ +# For sonic config engine testing + pyangbind -# For lockfile -RUN apt-get update && apt-get install -y procmail +RUN cd /usr/src/gtest && cmake . && make -C /usr/src/gtest + +RUN mkdir /var/run/sshd +EXPOSE 22 # Install depot-tools (for git-retry) RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /usr/share/depot_tools From abf54c22c4cc0cf561015b4b5318e99e1c6adf32 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 13 Apr 2017 15:40:05 -0700 Subject: [PATCH 0447/1011] [Broadcom]: Update debian package versions (#504) - OpenNSL 3.2.2.2-2 Signed-off-by: Shuotian Cheng --- platform/broadcom/sdk.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 760eee516600..0feff914f6bb 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.2.2-1-20170406004418.26_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-1-20170406004418.26_amd64.deb?sv=2015-04-05&sr=b&sig=aWbjpqH2A5JewLoVs8o%2BkriOCRvqDwuVTZygwy%2B1XMQ%3D&se=2030-12-14T19%3A41%3A16Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.2.2-2-20170413185612.27_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-2-20170413185612.27_amd64.deb?sv=2015-04-05&sr=b&sig=xEbASK6Jiug8I%2BaJFphRnuH4cOEgxIyAkhj6rGKfsOE%3D&se=2030-12-21T22%3A05%3A31Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-1-20170406004418.26_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-1-20170406004418.26_amd64.deb?sv=2015-04-05&sr=b&sig=fL88BnMJ9uMMozh6xDqYn7oDc%2FwhX53sd3WG1v%2BkqDA%3D&se=2030-12-14T19%3A40%3A23Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-2-20170413185612.27_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-2-20170413185612.27_amd64.deb?sv=2015-04-05&sr=b&sig=i%2F4NXu0wzMSAQjDcQTg%2FtpULn5%2Fn%2FVgLu3Lg24QMQM0%3D&se=2030-12-21T22%3A06%3A49Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From b305a50a78fac4f1ec3229b6d8b190ca33dc5261 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 13 Apr 2017 23:54:44 -0700 Subject: [PATCH 0448/1011] [interfaces]: Bring up LAG members before they are enslaved (#505) Signed-off-by: Shuotian Cheng --- files/image_config/interfaces/interfaces.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 40e127e54ce8..c2728e5e032d 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -69,6 +69,7 @@ iface {{ member }} inet manual {% endfor %} {% if minigraph_portchannels.keys() | length %} # "|| true" is added to suppress the error when interface is already a member of LAG +# "ip link show | grep -q master" is added to ensure interface is enslaved {% endif %} {% for pc in minigraph_portchannels.keys()|sort %} {% for member in minigraph_portchannels[pc]['members'] %} @@ -76,7 +77,7 @@ auto {{ member }} allow-hotplug {{ member }} iface {{ member }} inet manual pre-up teamdctl {{ pc }} port add {{ member }} || true - post-up ip link show {{ pc }} && ifconfig {{ member }} up + post-up ip link show {{ member }} | grep -q master && ifconfig {{ member }} up post-down ifconfig {{ member }} down # {% endfor %} From fed900fdc292bb23b9e4fbbad72862d66501e143 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Fri, 14 Apr 2017 19:43:54 +0300 Subject: [PATCH 0449/1011] [sonic-swss]: Update submodule pointer (#503) * [sonic-swss]: Update submodule pointer * [sonic-swss-common]: Update submodule pointer --- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-swss b/src/sonic-swss index 3e713cc33b78..c5cbc69f20de 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 3e713cc33b78f0a21d51573ebb604fe3ffddc874 +Subproject commit c5cbc69f20dee3f857b00e587c0b1eb1c0856e83 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 68e6c409b4a9..46c455bd2c88 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 68e6c409b4a96a677ea90a831172df7ae68acbef +Subproject commit 46c455bd2c887f04cdbc1b3adb7263bad97afa51 From 701c1eb9b1f359ddb620034e2bbfbda0db67f6f0 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 14 Apr 2017 15:47:33 -0700 Subject: [PATCH 0450/1011] [build]: add swss dbg package into deb (#506) --- rules/swss.mk | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rules/swss.mk b/rules/swss.mk index 6b2620f81309..f5a4ffec0251 100644 --- a/rules/swss.mk +++ b/rules/swss.mk @@ -6,3 +6,8 @@ $(SWSS)_DEPENDS += $(LIBSAIREDIS_DEV) $(LIBSAIMETADATA_DEV) $(LIBTEAM_DEV) \ $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(SWSS)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(LIBTEAM) SONIC_DPKG_DEBS += $(SWSS) + +SWSS_DBG = swss-dbg_1.0.0_amd64.deb +$(SWSS_DBG)_DEPENDS += $(SWSS) +$(SWSS_DBG)_RDEPENDS += $(SWSS) +$(eval $(call add_derived_package,$(SWSS),$(SWSS_DBG))) From fae53f7ea24651a63b8f27227b3551a5605169bc Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 16 Apr 2017 01:17:22 -0700 Subject: [PATCH 0451/1011] [build]: add commit id and build number in sonic_version (#508) --- build_debian.sh | 2 ++ src/sonic-utilities | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index a796a243363d..9840280fc849 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -264,7 +264,9 @@ build_version: $(sonic_get_version) debian_version: $(cat $FILESYSTEM_ROOT/etc/debian_version) kernel_version: $kversion asic_type: $sonic_asic_platform +commit_id: $(git rev-parse --short HEAD) build_date: $(date -u) +build_number: ${BUILD_NUMBER:-0} built_by: $USER@$BUILD_HOSTNAME EOF diff --git a/src/sonic-utilities b/src/sonic-utilities index fcfefdb0b96e..5df8acb5ef48 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit fcfefdb0b96ef36a18cb13669a964b196a036436 +Subproject commit 5df8acb5ef48eb34e67b0b5a693fa9f923a79da1 From ebd9af97c40010ba118cd5c7c112fe256970e3a2 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 17 Apr 2017 15:49:47 -0700 Subject: [PATCH 0452/1011] Update SAI version (#512) --- src/SAI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SAI b/src/SAI index 20f7dffba5dc..0bbb902ec226 160000 --- a/src/SAI +++ b/src/SAI @@ -1 +1 @@ -Subproject commit 20f7dffba5dcb0922a4af6e945804b821a3772c1 +Subproject commit 0bbb902ec226a5097a8dfcc6e80b547cf2831187 From c0e292ecd208f19a7f4604bfa5e6930091b9a717 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 17 Apr 2017 17:27:42 -0700 Subject: [PATCH 0453/1011] [docker-syncd-rpc]: Fix Dockerfile (#513) * Use dpkg_apt properly * Remove unused dpkg_apt * Purge not remove previous version of syncd --- platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 | 6 ++---- platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 index 912f52cf73a7..40c573f09c79 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 @@ -9,12 +9,11 @@ debs/{{ deb }}{{' '}} {%- endfor -%} debs/ -RUN dpkg -r syncd +RUN dpkg -P syncd RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ -dpkg_apt \ {% for deb in docker_syncd_brcm_rpc_debs.split(' ') -%} -debs/{{ deb }}{{' '}} +dpkg_apt debs/{{ deb }}{{'; '}} {%- endfor %} ## Pre-install the fundamental packages @@ -45,7 +44,6 @@ RUN apt-get update \ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ - && dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ && rm -rf /deps diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 index 15c998385abc..64e208112783 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 @@ -9,12 +9,11 @@ debs/{{ deb }}{{' '}} {%- endfor -%} debs/ -RUN dpkg -r syncd +RUN dpkg -P syncd RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ -dpkg_apt \ {% for deb in docker_syncd_mlnx_rpc_debs.split(' ') -%} -debs/{{ deb }}{{' '}} +dpkg_apt debs/{{ deb }}{{'; '}} {%- endfor %} ## Pre-install the fundamental packages @@ -45,7 +44,6 @@ RUN apt-get update \ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ - && dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ && rm -rf /deps From 68fcc3654986ccf82bd288d3ce030faf5c3e7a2d Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Tue, 18 Apr 2017 17:50:31 -0700 Subject: [PATCH 0454/1011] [platform]: update to latest arista drivers (#515) --- platform/broadcom/sonic-platform-modules-arista | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 76dddcf648ce..a1ca8013e952 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 76dddcf648cec1305eeb0ff4ba00ff234e986fd5 +Subproject commit a1ca8013e952d1cc0d555c24fe6eb2bf016ab694 From 9a4b0adcc7bd2f2b95ed7ecd123d2d81777809b5 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 19 Apr 2017 00:55:22 -0700 Subject: [PATCH 0455/1011] [build]: use short disk label (#516) --- installer/x86_64/install.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 94cf0e29881c..94c3fcc1c3a8 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -199,14 +199,14 @@ create_demo_gpt_partition() fi sgdisk --new=${demo_part}::+${demo_part_size}MB \ --attributes=${demo_part}:=:$attr_bitmask \ - --change-name=${demo_part}:$demo_volume_revision_label $blk_dev \ + --change-name=${demo_part}:$demo_volume_label $blk_dev \ || { echo "Warning: The first trial of creating partition failed, trying the largest aligned available block of sectors on the disk" begin=$(sgdisk -F $blk_dev) end=$(sgdisk -E $blk_dev) sgdisk --new=${demo_part}:$begin:$end \ --attributes=${demo_part}:=:$attr_bitmask \ - --change-name=${demo_part}:$demo_volume_revision_label $blk_dev + --change-name=${demo_part}:$demo_volume_label $blk_dev } || { echo "Error: Unable to create partition $demo_part on $blk_dev" exit 1 @@ -385,7 +385,7 @@ eval $create_demo_partition $blk_dev demo_dev=$(echo $blk_dev | sed -e 's/\(mmcblk[0-9]\)/\1p/')$demo_part # Make filesystem -mkfs.ext4 -L $demo_volume_revision_label $demo_dev +mkfs.ext4 -L $demo_volume_label $demo_dev # Mount demo filesystem demo_mnt=$(${onie_bin} mktemp -d) || { @@ -488,7 +488,7 @@ fi demo_grub_entry="$demo_volume_revision_label" cat <> $grub_cfg menuentry '$demo_grub_entry' { - search --no-floppy --label --set=root $demo_volume_revision_label + search --no-floppy --label --set=root $demo_volume_label echo 'Loading $demo_volume_revision_label $demo_type kernel ...' insmod gzio if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi From fb01755d484804d0734362872721b0ee0ac36c74 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 19 Apr 2017 19:34:27 -0700 Subject: [PATCH 0456/1011] [swss]: Update sonic-swss to enable SAI_NUM_ECMP_MEMBERS option in sai.profile (#518) - Update Broadcom libsaibcm debian package to 2.1.5.1-2 - Add SAI_NUM_ECMP_MEMBERS=32 to two Trident II platforms - Update sonic-swss submodule version to support such changes Signed-off-by: Shuotian Cheng --- .../x86_64-arista_7050_qx32/Arista-7050-QX32/sai.profile | 1 + .../x86_64-dell_s6000_s1220-r0/Force10-S6000/sai.profile | 1 + platform/broadcom/sai.mk | 8 ++++---- src/sonic-swss | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/sai.profile b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/sai.profile index 76ffdfc028ed..938d37180676 100644 --- a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/sai.profile +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/etc/bcm/td2-a7050-qx32-32x40G.config.bcm +SAI_NUM_ECMP_MEMBERS=32 diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/sai.profile b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/sai.profile index b64d997fb451..7ee11c46566e 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/sai.profile +++ b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/sai.profile @@ -1 +1,2 @@ SAI_INIT_CONFIG_FILE=/etc/bcm/td2-s6000-32x40G.config.bcm +SAI_NUM_ECMP_MEMBERS=32 diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 4e8a740136e4..c273db78a58e 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-1-20170407044929.18_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-1-20170407044929.18_amd64.deb?sv=2015-04-05&sr=b&sig=lKKP8Ot01SW9NwbbnafZly5rTkIK2rpTdBuUwcWdr5U%3D&se=2030-12-15T04%3A51%3A54Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-2-20170419194756.21_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-2-20170419194756.21_amd64.deb?sv=2015-04-05&sr=b&sig=On9N1tlOSbYj%2Fb0JudmUjYRTbvS5cvqcGJUEIDX8wzk%3D&se=2030-12-27T20%3A56%3A24Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-1-20170407044929.18_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-2-20170419194756.21_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-1-20170407044929.18_amd64.deb?sv=2015-04-05&sr=b&sig=AsDdE0zR3aTxwdK76Iro0jGypl%2FSqVoYmwz0drr78Ho%3D&se=2030-12-15T04%3A52%3A31Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-2-20170419194756.21_amd64.deb?sv=2015-04-05&sr=b&sig=iVQRbQUTmeKqd01pMMR%2FIwlEUsAeiGIxCrqfr24lQ8k%3D&se=2030-12-27T20%3A57%3A08Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/src/sonic-swss b/src/sonic-swss index c5cbc69f20de..5ae03edfca8c 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit c5cbc69f20dee3f857b00e587c0b1eb1c0856e83 +Subproject commit 5ae03edfca8c0baac3d2a78e4cf494c306bbc506 From ea51e1c241465a90a4ad86f73f1c76247c28008e Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 19 Apr 2017 21:01:26 -0700 Subject: [PATCH 0457/1011] Add explicit dependency for swss (#519) --- rules/swss.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/swss.mk b/rules/swss.mk index f5a4ffec0251..c3f50e617e92 100644 --- a/rules/swss.mk +++ b/rules/swss.mk @@ -3,8 +3,8 @@ SWSS = swss_1.0.0_amd64.deb $(SWSS)_SRC_PATH = $(SRC_PATH)/sonic-swss $(SWSS)_DEPENDS += $(LIBSAIREDIS_DEV) $(LIBSAIMETADATA_DEV) $(LIBTEAM_DEV) \ - $(LIBTEAMDCT) $(LIBTEAM_UTILS) -$(SWSS)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(LIBTEAM) + $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(LIBSWSSCOMMON_DEV) +$(SWSS)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(LIBTEAM) $(LIBSWSSCOMMON) SONIC_DPKG_DEBS += $(SWSS) SWSS_DBG = swss-dbg_1.0.0_amd64.deb From d30fbf1d720ae73801bc6f8a20a1c029244c5bf4 Mon Sep 17 00:00:00 2001 From: Rodny Molina Date: Thu, 20 Apr 2017 09:12:27 -0700 Subject: [PATCH 0458/1011] [build]: Adding support for Free-Range-Routing stack. (#510) - Extending SONiC building infrastructure to provide users with greater flexibility, by allowing them to elect a routing-stack different than the default one (quagga). The desired routing-stack will be defined in rules/config file. - As part of these changes I'm adding support for Free-Range-Routing (FRR) stack. Quagga will continue to be the default routing-stack. Signed-off-by: Rodny Molina --- dockers/docker-fpm-frr/Dockerfile.j2 | 32 ++++++ .../base_image_files/vtysh | 0 dockers/docker-fpm-frr/bgpd.conf.j2 | 64 ++++++++++++ dockers/docker-fpm-frr/config.sh | 17 ++++ .../{docker-fpm => docker-fpm-frr}/daemons | 0 dockers/docker-fpm-frr/debian.conf | 20 ++++ .../{docker-fpm => docker-fpm-frr}/isolate.j2 | 0 dockers/docker-fpm-frr/start.sh | 6 ++ .../unisolate.j2 | 0 dockers/docker-fpm-frr/zebra.conf.j2 | 66 +++++++++++++ dockers/docker-fpm-gobgp/Dockerfile.j2 | 2 +- .../Dockerfile.j2 | 4 +- .../docker-fpm-quagga/base_image_files/vtysh | 2 + .../bgpd.conf.j2 | 0 .../config.sh | 0 dockers/docker-fpm-quagga/daemons | 31 ++++++ dockers/docker-fpm-quagga/isolate.j2 | 20 ++++ .../start.sh | 0 dockers/docker-fpm-quagga/unisolate.j2 | 20 ++++ .../zebra.conf.j2 | 0 platform/broadcom/rules.mk | 2 +- platform/cavium/rules.mk | 2 +- platform/mellanox/rules.mk | 2 +- platform/p4/docker-sonic-p4.mk | 11 ++- platform/p4/docker-sonic-p4/Dockerfile.j2 | 2 +- rules/config | 5 + rules/docker-fpm-frr.mk | 14 +++ rules/docker-fpm-gobgp.mk | 2 +- rules/docker-fpm-quagga.mk | 13 +++ rules/docker-fpm.mk | 21 ++-- rules/frr.mk | 9 ++ slave.mk | 12 +++ sonic-slave/Dockerfile | 8 ++ src/sonic-frr/Makefile | 24 +++++ src/sonic-frr/sonic_frr.install | 23 +++++ src/sonic-frr/sonic_frr.rules | 99 +++++++++++++++++++ 36 files changed, 511 insertions(+), 22 deletions(-) create mode 100644 dockers/docker-fpm-frr/Dockerfile.j2 rename dockers/{docker-fpm => docker-fpm-frr}/base_image_files/vtysh (100%) create mode 100644 dockers/docker-fpm-frr/bgpd.conf.j2 create mode 100755 dockers/docker-fpm-frr/config.sh rename dockers/{docker-fpm => docker-fpm-frr}/daemons (100%) create mode 100644 dockers/docker-fpm-frr/debian.conf rename dockers/{docker-fpm => docker-fpm-frr}/isolate.j2 (100%) create mode 100755 dockers/docker-fpm-frr/start.sh rename dockers/{docker-fpm => docker-fpm-frr}/unisolate.j2 (100%) create mode 100644 dockers/docker-fpm-frr/zebra.conf.j2 rename dockers/{docker-fpm => docker-fpm-quagga}/Dockerfile.j2 (84%) create mode 100755 dockers/docker-fpm-quagga/base_image_files/vtysh rename dockers/{docker-fpm => docker-fpm-quagga}/bgpd.conf.j2 (100%) rename dockers/{docker-fpm => docker-fpm-quagga}/config.sh (100%) create mode 100644 dockers/docker-fpm-quagga/daemons create mode 100755 dockers/docker-fpm-quagga/isolate.j2 rename dockers/{docker-fpm => docker-fpm-quagga}/start.sh (100%) create mode 100755 dockers/docker-fpm-quagga/unisolate.j2 rename dockers/{docker-fpm => docker-fpm-quagga}/zebra.conf.j2 (100%) create mode 100644 rules/docker-fpm-frr.mk create mode 100644 rules/docker-fpm-quagga.mk create mode 100644 rules/frr.mk create mode 100644 src/sonic-frr/Makefile create mode 100644 src/sonic-frr/sonic_frr.install create mode 100755 src/sonic-frr/sonic_frr.rules diff --git a/dockers/docker-fpm-frr/Dockerfile.j2 b/dockers/docker-fpm-frr/Dockerfile.j2 new file mode 100644 index 000000000000..332a0cdd508d --- /dev/null +++ b/dockers/docker-fpm-frr/Dockerfile.j2 @@ -0,0 +1,32 @@ +FROM docker-config-engine + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update + +RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4 libc-ares2 iproute + +COPY \ +{% for deb in docker_fpm_frr_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -i \ +{% for deb in docker_fpm_frr_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +COPY ["*.j2", "/usr/share/sonic/templates/"] +COPY ["start.sh", "config.sh", "/usr/bin/"] +COPY ["daemons", "/etc/frr/"] +COPY ["debian.conf", "/etc/frr/"] + +ENTRYPOINT /usr/bin/config.sh \ + && /usr/bin/start.sh \ + && /bin/bash diff --git a/dockers/docker-fpm/base_image_files/vtysh b/dockers/docker-fpm-frr/base_image_files/vtysh similarity index 100% rename from dockers/docker-fpm/base_image_files/vtysh rename to dockers/docker-fpm-frr/base_image_files/vtysh diff --git a/dockers/docker-fpm-frr/bgpd.conf.j2 b/dockers/docker-fpm-frr/bgpd.conf.j2 new file mode 100644 index 000000000000..ed9afe0c3388 --- /dev/null +++ b/dockers/docker-fpm-frr/bgpd.conf.j2 @@ -0,0 +1,64 @@ +! +{% block banner %} +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/bgpd.conf.j2 using minigraph_facts.py +! file: bgpd.conf +! +{% endblock banner %} +! +{% block system_init %} +hostname {{ inventory_hostname }} +password zebra +log syslog informational +log facility local4 +! enable password {# {{ en_passwd }} TODO: param needed #} +{% endblock system_init %} +! +{% block bgp_init %} +! +! bgp multiple-instance +! +router bgp {{ minigraph_bgp_asn }} + bgp log-neighbor-changes + bgp bestpath as-path multipath-relax +{# TODO: use lo[0] for backward compatibility, will revisit the case with multiple lo interfaces #} + bgp router-id {{ minigraph_lo_interfaces[0]['addr'] }} +{# advertise loopback #} +{% for lo in minigraph_lo_interfaces %} +{% if lo['addr'] | ipv4 %} + network {{ lo['addr'] }}/32 +{% elif lo['addr'] | ipv6 %} + address-family ipv6 + network {{ lo['addr'] }}/128 + exit-address-family +{% endif %} +{% endfor %} +{% endblock bgp_init %} +{% block vlan_advertisement %} +{% for vlan_interface in minigraph_vlan_interfaces %} + network {{ vlan_interface['subnet'] }} +{% endfor %} +{% endblock vlan_advertisement %} +{% block bgp_sessions %} +{% for bgp_session in minigraph_bgp %} +{% if bgp_session['asn'] != 0 %} + neighbor {{ bgp_session['addr'] }} remote-as {{ bgp_session['asn'] }} + neighbor {{ bgp_session['addr'] }} description {{ bgp_session['name'] }} +{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} + neighbor {{ bgp_session['addr'] }} allowas-in 1 +{% endif %} +{% if bgp_session['addr'] | ipv6 %} + address-family ipv6 + neighbor {{ bgp_session['addr'] }} activate + maximum-paths 64 + exit-address-family +{% endif %} +{% endif %} +{% endfor %} +{% endblock bgp_sessions %} +! +maximum-paths 64 +! +route-map ISOLATE permit 10 +set as-path prepend {{ minigraph_bgp_asn }} +! diff --git a/dockers/docker-fpm-frr/config.sh b/dockers/docker-fpm-frr/config.sh new file mode 100755 index 000000000000..a57cba3cb46a --- /dev/null +++ b/dockers/docker-fpm-frr/config.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +mkdir -p /etc/frr +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/bgpd.conf.j2 >/etc/frr/bgpd.conf +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/zebra.conf.j2 >/etc/frr/zebra.conf + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/isolate.j2 >/usr/sbin/bgp-isolate +chown root:root /usr/sbin/bgp-isolate +chmod 0755 /usr/sbin/bgp-isolate + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/unisolate.j2 >/usr/sbin/bgp-unisolate +chown root:root /usr/sbin/bgp-unisolate +chmod 0755 /usr/sbin/bgp-unisolate + +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status + diff --git a/dockers/docker-fpm/daemons b/dockers/docker-fpm-frr/daemons similarity index 100% rename from dockers/docker-fpm/daemons rename to dockers/docker-fpm-frr/daemons diff --git a/dockers/docker-fpm-frr/debian.conf b/dockers/docker-fpm-frr/debian.conf new file mode 100644 index 000000000000..4724fc87422f --- /dev/null +++ b/dockers/docker-fpm-frr/debian.conf @@ -0,0 +1,20 @@ +# +# If this option is set the /etc/init.d/frr script automatically loads +# the config via "vtysh -b" when the servers are started. +# Check /etc/pam.d/frr if you intend to use "vtysh"! +# +vtysh_enable=yes +zebra_options=" -s 90000000 --daemon -A 127.0.0.1 -M fpm" +bgpd_options=" --daemon -A 127.0.0.1" +ospfd_options=" --daemon -A 127.0.0.1" +ospf6d_options=" --daemon -A ::1" +ripd_options=" --daemon -A 127.0.0.1" +ripngd_options=" --daemon -A ::1" +isisd_options=" --daemon -A 127.0.0.1" +pimd_options=" --daemon -A 127.0.0.1" +ldpd_options=" --daemon -A 127.0.0.1" +nhrpd_options=" --daemon -A 127.0.0.1" + +# The list of daemons to watch is automatically generated by the init script. +watchfrr_enable=yes +watchfrr_options=(-adz -r /usr/sbin/servicebBfrrbBrestartbB%s -s /usr/sbin/servicebBfrrbBstartbB%s -k /usr/sbin/servicebBfrrbBstopbB%s -b bB -t 30) diff --git a/dockers/docker-fpm/isolate.j2 b/dockers/docker-fpm-frr/isolate.j2 similarity index 100% rename from dockers/docker-fpm/isolate.j2 rename to dockers/docker-fpm-frr/isolate.j2 diff --git a/dockers/docker-fpm-frr/start.sh b/dockers/docker-fpm-frr/start.sh new file mode 100755 index 000000000000..f46a42b4c34c --- /dev/null +++ b/dockers/docker-fpm-frr/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +rm -f /var/run/rsyslogd.pid +service rsyslog start +service frr start +fpmsyncd & diff --git a/dockers/docker-fpm/unisolate.j2 b/dockers/docker-fpm-frr/unisolate.j2 similarity index 100% rename from dockers/docker-fpm/unisolate.j2 rename to dockers/docker-fpm-frr/unisolate.j2 diff --git a/dockers/docker-fpm-frr/zebra.conf.j2 b/dockers/docker-fpm-frr/zebra.conf.j2 new file mode 100644 index 000000000000..dc2061f8a02a --- /dev/null +++ b/dockers/docker-fpm-frr/zebra.conf.j2 @@ -0,0 +1,66 @@ +! +{% block banner %} +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/quagga/zebra.conf.j2 using minigraph_facts.py +! file: zebra.conf +! +{% endblock banner %} +! +{% block sys_init %} +hostname {{ inventory_hostname }} +password zebra +enable password zebra +{% endblock sys_init %} +! +{% block interfaces %} +! Enable link-detect (default disabled) +{% for interface in minigraph_interfaces %} +interface {{ interface['alias'] }} +link-detect +! +{% endfor %} +{% for interface in minigraph_portchannel_interfaces %} +interface {{ interface['name'] }} +link-detect +! +{% endfor %} +{% endblock interfaces %} +! +{% block default_route %} +! set static default route to mgmt gateway as a backup to learned default +ip route 0.0.0.0/0 {{ minigraph_mgmt_interface['gwaddr'] }} 200 +{% endblock default_route %} +! +{% block source_loopback %} +! Set ip source to loopback for bgp learned routes +route-map RM_SET_SRC permit 10 + set src {{ minigraph_lo_interfaces[0]['addr'] }} +! +{% set lo_ipv6_addrs = [] %} +{% if minigraph_lo_interfaces is defined %} +{% for interface in minigraph_lo_interfaces %} +{% if interface['addr'] is defined and interface['addr']|ipv6 %} +{% if lo_ipv6_addrs.append(interface['addr']) %} +{% endif %} +{% endif %} +{% endfor %} +{% endif %} +{% if lo_ipv6_addrs|length > 0 %} +route-map RM_SET_SRC6 permit 10 + set src {{ lo_ipv6_addrs[0] }} +! +{% endif %} +ip protocol bgp route-map RM_SET_SRC +! +{% if lo_ipv6_addrs|length > 0 %} +ipv6 protocol bgp route-map RM_SET_SRC6 +! +{% endif %} +{% endblock source_loopback %} +! +{% block logging %} +log syslog informational +log facility local4 +{% endblock logging %} +! + diff --git a/dockers/docker-fpm-gobgp/Dockerfile.j2 b/dockers/docker-fpm-gobgp/Dockerfile.j2 index 3d89999d9758..19b6caad9d99 100644 --- a/dockers/docker-fpm-gobgp/Dockerfile.j2 +++ b/dockers/docker-fpm-gobgp/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-fpm +FROM docker-fpm-quagga ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-fpm/Dockerfile.j2 b/dockers/docker-fpm-quagga/Dockerfile.j2 similarity index 84% rename from dockers/docker-fpm/Dockerfile.j2 rename to dockers/docker-fpm-quagga/Dockerfile.j2 index 65b9cfa3121a..211275a2eb16 100644 --- a/dockers/docker-fpm/Dockerfile.j2 +++ b/dockers/docker-fpm-quagga/Dockerfile.j2 @@ -8,13 +8,13 @@ RUN apt-get update RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4 COPY \ -{% for deb in docker_fpm_debs.split(' ') -%} +{% for deb in docker_fpm_quagga_debs.split(' ') -%} debs/{{ deb }}{{' '}} {%- endfor -%} debs/ RUN dpkg -i \ -{% for deb in docker_fpm_debs.split(' ') -%} +{% for deb in docker_fpm_quagga_debs.split(' ') -%} debs/{{ deb }}{{' '}} {%- endfor %} diff --git a/dockers/docker-fpm-quagga/base_image_files/vtysh b/dockers/docker-fpm-quagga/base_image_files/vtysh new file mode 100755 index 000000000000..359101c06c61 --- /dev/null +++ b/dockers/docker-fpm-quagga/base_image_files/vtysh @@ -0,0 +1,2 @@ +#!/bin/bash +docker exec -i bgp vtysh "$@" diff --git a/dockers/docker-fpm/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 similarity index 100% rename from dockers/docker-fpm/bgpd.conf.j2 rename to dockers/docker-fpm-quagga/bgpd.conf.j2 diff --git a/dockers/docker-fpm/config.sh b/dockers/docker-fpm-quagga/config.sh similarity index 100% rename from dockers/docker-fpm/config.sh rename to dockers/docker-fpm-quagga/config.sh diff --git a/dockers/docker-fpm-quagga/daemons b/dockers/docker-fpm-quagga/daemons new file mode 100644 index 000000000000..cb7c2322c9fb --- /dev/null +++ b/dockers/docker-fpm-quagga/daemons @@ -0,0 +1,31 @@ +# This file tells the quagga package which daemons to start. +# +# Entries are in the format: =(yes|no|priority) +# 0, "no" = disabled +# 1, "yes" = highest priority +# 2 .. 10 = lower priorities +# Read /usr/share/doc/quagga/README.Debian for details. +# +# Sample configurations for these daemons can be found in +# /usr/share/doc/quagga/examples/. +# +# ATTENTION: +# +# When activation a daemon at the first time, a config file, even if it is +# empty, has to be present *and* be owned by the user and group "quagga", else +# the daemon will not be started by /etc/init.d/quagga. The permissions should +# be u=rw,g=r,o=. +# When using "vtysh" such a config file is also needed. It should be owned by +# group "quaggavty" and set to ug=rw,o= though. Check /etc/pam.d/quagga, too. +# +# The watchquagga daemon is always started. Per default in monitoring-only but +# that can be changed via /etc/quagga/debian.conf. +# +zebra=yes +bgpd=yes +ospfd=no +ospf6d=no +ripd=no +ripngd=no +isisd=no +babeld=no diff --git a/dockers/docker-fpm-quagga/isolate.j2 b/dockers/docker-fpm-quagga/isolate.j2 new file mode 100755 index 000000000000..35ef5bbc0209 --- /dev/null +++ b/dockers/docker-fpm-quagga/isolate.j2 @@ -0,0 +1,20 @@ +#!/bin/bash +## vtysh only accepts script in stdin, so cannot be directly used in shebang +## Cut the tail of this script and feed vtysh stdin +sed -n -e '9,$p' < "$0" | vtysh "$@" +## Exit with vtysh return code +exit $? + +## vtysh script start from next line, which line number MUST eqaul in 'sed' command above + +configure terminal + router bgp {{ minigraph_bgp_asn }} +{% for bgp_session in minigraph_bgp %} + neighbor {{ bgp_session['addr'] }} route-map ISOLATE out +{% endfor %} + exit +exit + +{% for bgp_session in minigraph_bgp %} +clear ip bgp {{ bgp_session['addr'] }} soft out +{% endfor %} diff --git a/dockers/docker-fpm/start.sh b/dockers/docker-fpm-quagga/start.sh similarity index 100% rename from dockers/docker-fpm/start.sh rename to dockers/docker-fpm-quagga/start.sh diff --git a/dockers/docker-fpm-quagga/unisolate.j2 b/dockers/docker-fpm-quagga/unisolate.j2 new file mode 100755 index 000000000000..c113a74fab45 --- /dev/null +++ b/dockers/docker-fpm-quagga/unisolate.j2 @@ -0,0 +1,20 @@ +#!/bin/bash +## vtysh only accepts script in stdin, so cannot be directly used in shebang +## Cut the tail of this script and feed vtysh stdin +sed -n -e '9,$p' < "$0" | vtysh "$@" +## Exit with vtysh return code +exit $? + +## vtysh script start from next line, which line number MUST eqaul in 'sed' command above + +configure terminal + router bgp {{ minigraph_bgp_asn }} +{% for bgp_session in minigraph_bgp %} + no neighbor {{ bgp_session['addr'] }} route-map ISOLATE out +{% endfor %} + exit +exit + +{% for bgp_session in minigraph_bgp %} +clear ip bgp {{ bgp_session['addr'] }} soft out +{% endfor %} diff --git a/dockers/docker-fpm/zebra.conf.j2 b/dockers/docker-fpm-quagga/zebra.conf.j2 similarity index 100% rename from dockers/docker-fpm/zebra.conf.j2 rename to dockers/docker-fpm-quagga/zebra.conf.j2 diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index aaf5f5dc5fbc..bf375575edad 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -21,7 +21,7 @@ $(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/dsserve?sv SONIC_ONLINE_FILES += $(BCMCMD) $(DSSERVE) SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT_IMAGE) \ - $(DOCKER_FPM_GOBGP) \ + $(DOCKER_FPM) \ $(DOCKER_SYNCD_BRCM_RPC) # Inject brcm sai into sairedis diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index 0c112860192e..0d20b1c43993 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -8,7 +8,7 @@ include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk SONIC_ALL += $(SONIC_ONE_IMAGE) \ - $(DOCKER_FPM_GOBGP) + $(DOCKER_FPM) # Inject cavium sai into sairedis $(LIBSAIREDIS)_DEPENDS += $(CAVM_SAI) $(CAVM_LIBSAI) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index f0e8d4fcdb07..967643167da9 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -11,7 +11,7 @@ include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk SONIC_ALL += $(SONIC_ONE_IMAGE) \ - $(DOCKER_FPM_GOBGP) \ + $(DOCKER_FPM) \ $(DOCKER_SYNCD_MLNX_RPC) # Inject mlnx sai into sairedis diff --git a/platform/p4/docker-sonic-p4.mk b/platform/p4/docker-sonic-p4.mk index df944be4c363..a23284e50374 100644 --- a/platform/p4/docker-sonic-p4.mk +++ b/platform/p4/docker-sonic-p4.mk @@ -2,6 +2,15 @@ DOCKER_SONIC_P4 = docker-sonic-p4.gz $(DOCKER_SONIC_P4)_PATH = $(PLATFORM_PATH)/docker-sonic-p4 -$(DOCKER_SONIC_P4)_DEPENDS += $(SWSS) $(SYNCD) $(P4_SWITCH) $(REDIS_SERVER) $(REDIS_TOOLS) $(QUAGGA) $(LIBTEAMDCT) $(LIBTEAM_UTILS) +$(DOCKER_SONIC_P4)_DEPENDS += $(SWSS) $(SYNCD) $(P4_SWITCH) $(REDIS_SERVER) $(REDIS_TOOLS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) + +ifeq ($(ROUTING_STACK), quagga) +$(DOCKER_SONIC_P4)_DEPENDS += $(QUAGGA) +else ifeq ($(ROUTING_STACK), frr) +$(DOCKER_SONIC_P4)_DEPENDS += $(FRR) +else +$(DOCKER_SONIC_P4)_DEPENDS += $(GOBGP) +endif + $(DOCKER_SONIC_P4)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SONIC_P4) diff --git a/platform/p4/docker-sonic-p4/Dockerfile.j2 b/platform/p4/docker-sonic-p4/Dockerfile.j2 index a0944cb84a70..1b8d1746b2bb 100644 --- a/platform/p4/docker-sonic-p4/Dockerfile.j2 +++ b/platform/p4/docker-sonic-p4/Dockerfile.j2 @@ -5,7 +5,7 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils python-ply libqt5core5a libqt5network5 libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0 libgmp10 libjudydebian1 libnanomsg0 libdaemon0 libjansson4 libjemalloc1 openssh-client openssh-server +RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils python-ply libqt5core5a libqt5network5 libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0 libgmp10 libjudydebian1 libnanomsg0 libdaemon0 libjansson4 libjemalloc1 openssh-client openssh-server libc-ares2 iproute COPY \ {% for deb in docker_sonic_p4_debs.split(' ') -%} diff --git a/rules/config b/rules/config index ca0de68e7319..e360c7a434c7 100644 --- a/rules/config +++ b/rules/config @@ -41,3 +41,8 @@ DEFAULT_PASSWORD = YourPaSsWoRd # SONIC_CONFIG_DEBUG - install debug packages # Uncomment next line to enable: # SONIC_CONFIG_DEBUG = y + +# SONIC_ROUTING_STACK - specify the routing-stack being elected to drive SONiC's control-plane. +# Quagga will be the default routing-stack for all the SONiC platforms. Other supported +# routing-stacks: frr, gobgp. +SONIC_ROUTING_STACK = quagga diff --git a/rules/docker-fpm-frr.mk b/rules/docker-fpm-frr.mk new file mode 100644 index 000000000000..d246d093dced --- /dev/null +++ b/rules/docker-fpm-frr.mk @@ -0,0 +1,14 @@ +# docker image for fpm-frr + +DOCKER_FPM_FRR = docker-fpm-frr.gz +$(DOCKER_FPM_FRR)_PATH = $(DOCKERS_PATH)/docker-fpm-frr +$(DOCKER_FPM_FRR)_DEPENDS += $(FRR) $(SWSS) +$(DOCKER_FPM_FRR)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) +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)_BASE_IMAGE_FILES += vtysh:/usr/bin/vtysh + diff --git a/rules/docker-fpm-gobgp.mk b/rules/docker-fpm-gobgp.mk index ca993833f79a..12fa37dc1d97 100644 --- a/rules/docker-fpm-gobgp.mk +++ b/rules/docker-fpm-gobgp.mk @@ -3,7 +3,7 @@ DOCKER_FPM_GOBGP = docker-fpm-gobgp.gz $(DOCKER_FPM_GOBGP)_PATH = $(DOCKERS_PATH)/docker-fpm-gobgp $(DOCKER_FPM_GOBGP)_DEPENDS += $(GOBGP) -$(DOCKER_FPM_GOBGP)_LOAD_DOCKERS += $(DOCKER_FPM) +$(DOCKER_FPM_GOBGP)_LOAD_DOCKERS += $(DOCKER_FPM_QUAGGA) SONIC_DOCKER_IMAGES += $(DOCKER_FPM_GOBGP) $(DOCKER_FPM_GOBGP)_CONTAINER_NAME = bgp diff --git a/rules/docker-fpm-quagga.mk b/rules/docker-fpm-quagga.mk new file mode 100644 index 000000000000..a9c0511ba173 --- /dev/null +++ b/rules/docker-fpm-quagga.mk @@ -0,0 +1,13 @@ +# docker image for fpm-quagga + +DOCKER_FPM_QUAGGA = docker-fpm-quagga.gz +$(DOCKER_FPM_QUAGGA)_PATH = $(DOCKERS_PATH)/docker-fpm-quagga +$(DOCKER_FPM_QUAGGA)_DEPENDS += $(QUAGGA) $(SWSS) +$(DOCKER_FPM_QUAGGA)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) +SONIC_DOCKER_IMAGES += $(DOCKER_FPM_QUAGGA) + +$(DOCKER_FPM_QUAGGA)_CONTAINER_NAME = bgp +$(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 diff --git a/rules/docker-fpm.mk b/rules/docker-fpm.mk index 0fc289b37b08..b38ad99356f5 100644 --- a/rules/docker-fpm.mk +++ b/rules/docker-fpm.mk @@ -1,14 +1,9 @@ -# docker image for fpm +# Docker-fpm rule-file is simply a wrapper containing routing-stack selection logic. -DOCKER_FPM = docker-fpm.gz -$(DOCKER_FPM)_PATH = $(DOCKERS_PATH)/docker-fpm -$(DOCKER_FPM)_DEPENDS += $(QUAGGA) $(SWSS) -$(DOCKER_FPM)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) -SONIC_DOCKER_IMAGES += $(DOCKER_FPM) -SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_FPM) - -$(DOCKER_FPM)_CONTAINER_NAME = bgp -$(DOCKER_FPM)_RUN_OPT += --net=host --privileged -t -$(DOCKER_FPM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro - -$(DOCKER_FPM)_BASE_IMAGE_FILES += vtysh:/usr/bin/vtysh +ifeq ($(SONIC_ROUTING_STACK), quagga) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_FPM_QUAGGA) +else ifeq ($(SONIC_ROUTING_STACK), frr) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_FPM_FRR) +else +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_FPM_GOBGP) +endif diff --git a/rules/frr.mk b/rules/frr.mk new file mode 100644 index 000000000000..7fb1837585aa --- /dev/null +++ b/rules/frr.mk @@ -0,0 +1,9 @@ +# FRRouting (frr) package + +FRR_VERSION = 3.0 +export FRR_VERSION + +FRR = frr_$(FRR_VERSION)_amd64.deb +$(FRR)_DEPENDS += $(LIBSNMP_DEV) +$(FRR)_SRC_PATH = $(SRC_PATH)/sonic-frr +SONIC_MAKE_DEBS += $(FRR) diff --git a/slave.mk b/slave.mk index fbfa9f28fa35..d7afd6d9e5dc 100644 --- a/slave.mk +++ b/slave.mk @@ -69,6 +69,18 @@ endif MAKEFLAGS += -j $(SONIC_CONFIG_BUILD_JOBS) +############################################################################### +## Dumping key config attributes associated to current building exercise +############################################################################### + +ifndef $(CONFIGURED_PLATFORM) +$(info CONFIGURED_PLATFORM is $(CONFIGURED_PLATFORM)) +endif + +ifndef $(SONIC_ROUTING_STACK) +$(info ROUTING_STACK is $(SONIC_ROUTING_STACK)) +endif + ############################################################################### ## Generic rules section ## All rules must go after includes for propper targets expansion diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index c2b5f8a11c73..76b01ea2f608 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -55,6 +55,14 @@ RUN apt-get clean && apt-get update && apt-get install -y \ libpcre3-dev \ gawk \ chrpath \ +# For frr build + libc-ares-dev \ + hardening-wrapper \ + libsnmp-dev \ + libjson0 \ + libjson0-dev \ + libsystemd-dev \ + python-ipaddr \ # For libnl3 (local) build cdbs \ # For SAI meta build diff --git a/src/sonic-frr/Makefile b/src/sonic-frr/Makefile new file mode 100644 index 000000000000..80d5a9ad0900 --- /dev/null +++ b/src/sonic-frr/Makefile @@ -0,0 +1,24 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = frr_$(FRR_VERSION)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Cloning FRR repo if not already done + if [ ! -d "frr" ]; then \ + git clone -b stable/$(FRR_VERSION) https://github.com/FRRouting/frr.git; \ + fi + + # Replacing frr's rules/install files with SONiC's own versions to activate + # specific knobs and adjust install process to address SONiC's needs. + cp sonic_frr.rules frr/debian/rules + cp sonic_frr.install frr/debian/frr.install + + # Build the package + pushd ./frr + rm -f debian/*.debhelper.log + dpkg-buildpackage -rfakeroot -b -us -uc + popd + + mv $* $(DEST)/ diff --git a/src/sonic-frr/sonic_frr.install b/src/sonic-frr/sonic_frr.install new file mode 100644 index 000000000000..b0bf8d6909a7 --- /dev/null +++ b/src/sonic-frr/sonic_frr.install @@ -0,0 +1,23 @@ +etc/frr/ +etc/init.d/ +usr/bin/vtysh +usr/include/frr/ +usr/lib/ +tools/frr-reload.py usr/lib/frr/ +tools/frr usr/lib/frr +usr/share/doc/frr/ +usr/share/man/man1/vtysh.1 +usr/share/man/man1/frr.1 +usr/share/man/man8 +usr/share/man/man8/bgpd.8 +usr/share/man/man8/ospf6d.8 +usr/share/man/man8/ospfd.8 +usr/share/man/man8/ripd.8 +usr/share/man/man8/ripngd.8 +usr/share/man/man8/zebra.8 +usr/share/man/man8/isisd.8 +usr/share/man/man8/watchfrr.8 +usr/share/snmp/mibs/ +cumulus/etc/* etc/ +tools/*.service lib/systemd/system +debian/frr.conf usr/lib/tmpfiles.d diff --git a/src/sonic-frr/sonic_frr.rules b/src/sonic-frr/sonic_frr.rules new file mode 100755 index 000000000000..f4e0706b5c33 --- /dev/null +++ b/src/sonic-frr/sonic_frr.rules @@ -0,0 +1,99 @@ +#!/usr/bin/make -f + +export DH_VERBOSE=1 +export DEB_BUILD_HARDENING=1 +export DH_OPTIONS=-v + +ifeq ($(WANT_SNMP), 1) + USE_SNMP=--enable-snmp + $(warning "DEBIAN: SNMP enabled, sorry for your inconvenience") +else + $(warning "DEBIAN: SNMP disabled, see README.Debian") +endif + +ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) + DEBIAN_JOBS := $(subst parallel=,,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) +endif + +ifdef DEBIAN_JOBS +MAKEFLAGS += -j$(DEBIAN_JOBS) +endif + +%: + dh $@ --with=systemd,autoreconf --parallel --dbg-package=frr-dbg --list-missing + +override_dh_auto_configure: + # Frr needs /proc to check some BSD vs Linux specific stuff. + # Else it fails with an obscure error message pointing out that + # IPCTL_FORWARDING is an undefined symbol which is not very helpful. + @if ! [ -d /proc/1 ]; then \ + echo "./configure needs a mounted /proc"; \ + exit 1; \ + fi + + if ! [ -e config.status ]; then \ + dh_auto_configure -- \ + --enable-exampledir=/usr/share/doc/frr/examples/ \ + --localstatedir=/var/run/frr \ + --sbindir=/usr/lib/frr \ + --sysconfdir=/etc/frr \ + $(USE_SNMP) \ + --enable-vtysh=yes \ + --enable-isisd=yes \ + --enable-multipath=256 \ + --enable-user=frr \ + --enable-group=frr \ + --enable-vty-group=frrvty \ + --enable-configfile-mask=0640 \ + --enable-logfile-mask=0640 \ + --enable-werror \ + --enable-gcc-rdynamic \ + --with-libpam \ + --enable-systemd=yes \ + --enable-poll=yes \ + --enable-dependency-tracking \ + --enable-bgp-vnc=no \ + --enable-tcp-zebra \ + --enable-fpm; \ + fi + +override_dh_auto_build: + #dh_auto_build + $(MAKE) + dh_auto_build -- -C doc draft-zebra-00.txt + + + # doc/ is a bit crazy +ifeq ($(GENERATE_PDF), 1) + dh_auto_build -- -C doc frr.pdf || true # pdfetex fails with exit code 1 but still produces a good looking .pdf +endif + rm -vf doc/frr.info + dh_auto_build -- -C doc frr.info + rm -vf doc/frr.info.html* + +override_dh_auto_test: + +override_dh_auto_install: + dh_auto_install + + # cleaning up the info dir + rm -f debian/tmp/usr/share/info/dir* + + # install config files + mkdir -p debian/tmp/etc/frr/ + perl -pi -e 's#^!log file #!log file /var/log/frr/#' debian/tmp/usr/share/doc/frr/examples/*sample* + + # installing frr initialization script + mkdir -p debian/tmp/etc/init.d/ + cp debian/tmp/usr/lib/frr/frr debian/tmp/etc/init.d/ + + # installing the Frr specific SNMP MIB +ifeq ($(WANT_SNMP), 1) + install -D -m 644 ./zebra/GNOME-PRODUCT-ZEBRA-MIB debian/tmp/usr/share/snmp/mibs/GNOME-PRODUCT-ZEBRA-MIB +else + mkdir -p debian/tmp/usr/share/snmp/mibs/ +endif + + # cleaning .la files + sed -i "/dependency_libs/ s/'.*'/''/" debian/tmp/usr/lib/*.la + From 2c4c6e9cebd60bd6ee3223f6c32579a33c0de8ef Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 20 Apr 2017 14:37:09 -0700 Subject: [PATCH 0459/1011] Use syncd-rpc for docker-syncd-rpc (#522) * Use syncd rpc for docker-syncd-rpc. Create docker-syncd-rpc for cavium and centec --- platform/broadcom/docker-syncd-brcm-rpc.mk | 2 +- .../docker-syncd-brcm-rpc/Dockerfile.j2 | 2 +- platform/broadcom/rules.mk | 2 +- platform/cavium/docker-syncd-cavm-rpc.mk | 7 +++ .../docker-syncd-cavm-rpc/Dockerfile.j2 | 56 +++++++++++++++++++ .../docker-syncd-cavm-rpc/ptf_nn_agent.conf | 10 ++++ .../docker-syncd-cavm-rpc/supervisord.conf | 2 + platform/cavium/rules.mk | 6 +- platform/centec/docker-syncd-centec-rpc.mk | 7 +++ .../docker-syncd-centec-rpc/Dockerfile.j2 | 56 +++++++++++++++++++ .../docker-syncd-centec-rpc/ptf_nn_agent.conf | 10 ++++ .../docker-syncd-centec-rpc/supervisord.conf | 2 + platform/centec/rules.mk | 6 +- platform/mellanox/docker-syncd-mlnx-rpc.mk | 2 +- .../docker-syncd-mlnx-rpc/Dockerfile.j2 | 2 +- platform/mellanox/rules.mk | 2 +- rules/sairedis.mk | 6 +- src/sonic-sairedis | 2 +- 18 files changed, 170 insertions(+), 12 deletions(-) create mode 100644 platform/cavium/docker-syncd-cavm-rpc.mk create mode 100644 platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 create mode 100644 platform/cavium/docker-syncd-cavm-rpc/ptf_nn_agent.conf create mode 100644 platform/cavium/docker-syncd-cavm-rpc/supervisord.conf create mode 100644 platform/centec/docker-syncd-centec-rpc.mk create mode 100644 platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 create mode 100644 platform/centec/docker-syncd-centec-rpc/ptf_nn_agent.conf create mode 100644 platform/centec/docker-syncd-centec-rpc/supervisord.conf diff --git a/platform/broadcom/docker-syncd-brcm-rpc.mk b/platform/broadcom/docker-syncd-brcm-rpc.mk index 2fbca8f30978..8efd25eb9b49 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc.mk +++ b/platform/broadcom/docker-syncd-brcm-rpc.mk @@ -2,7 +2,7 @@ DOCKER_SYNCD_BRCM_RPC = docker-syncd-brcm-rpc.gz $(DOCKER_SYNCD_BRCM_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-brcm-rpc -$(DOCKER_SYNCD_BRCM_RPC)_DEPENDS += $(SYNCD) $(LIBTHRIFT) +$(DOCKER_SYNCD_BRCM_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) $(DOCKER_SYNCD_BRCM_RPC)_FILES += $(DSSERVE) $(BCMCMD) $(DOCKER_SYNCD_BRCM_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_BRCM) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM_RPC) diff --git a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 index 40c573f09c79..c70920274709 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 @@ -45,7 +45,7 @@ RUN apt-get update \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ - && rm -rf /deps + && rm -rf /root/deps COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index bf375575edad..d2eb4482e96d 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -25,7 +25,7 @@ SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT_IMAGE) \ $(DOCKER_SYNCD_BRCM_RPC) # Inject brcm sai into sairedis -$(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) +$(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) $(LIBSAITHRIFT_DEV_BRCM) # Runtime dependency on brcm sai is set only for syncd $(SYNCD)_RDEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) diff --git a/platform/cavium/docker-syncd-cavm-rpc.mk b/platform/cavium/docker-syncd-cavm-rpc.mk new file mode 100644 index 000000000000..ac725a1bbdeb --- /dev/null +++ b/platform/cavium/docker-syncd-cavm-rpc.mk @@ -0,0 +1,7 @@ +# docker image for cavium syncd with rpc + +DOCKER_SYNCD_CAVM_RPC = docker-syncd-cavm-rpc.gz +$(DOCKER_SYNCD_CAVM_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-cavm-rpc +$(DOCKER_SYNCD_CAVM_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) $(CAVM_LIBSAI) $(XP_TOOLS) $(REDIS_TOOLS) +$(DOCKER_SYNCD_CAVM_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_CAVM) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CAVM_RPC) diff --git a/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 b/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 new file mode 100644 index 000000000000..1df6dc7802dd --- /dev/null +++ b/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 @@ -0,0 +1,56 @@ +FROM docker-syncd-cavm + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +COPY \ +{% for deb in docker_syncd_cavm_rpc_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -P syncd + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ +{% for deb in docker_syncd_cavm_rpc_debs.split(' ') -%} +dpkg_apt debs/{{ deb }}{{'; '}} +{%- endfor %} + +## Pre-install the fundamental packages +RUN apt-get update \ + && apt-get -y install \ + net-tools \ + python-pip \ + build-essential \ + libssl-dev \ + libffi-dev \ + python-dev \ + wget \ + cmake \ + supervisor \ + && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ + && tar xvfz 1.0.0.tar.gz \ + && cd nanomsg-1.0.0 \ + && mkdir -p build \ + && cmake . \ + && make install \ + && ldconfig \ + && cd .. \ + && rm -fr nanomsg-1.0.0 \ + && rm -f 1.0.0.tar.gz \ + && pip install cffi==1.7.0 \ + && pip install --upgrade cffi==1.7.0 \ + && pip install nnpy \ + && mkdir -p /opt \ + && cd /opt \ + && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ + && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ + && rm -rf /root/deps + +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf + +RUN sed -i 's/read/sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord/' /usr/bin/start.sh + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/platform/cavium/docker-syncd-cavm-rpc/ptf_nn_agent.conf b/platform/cavium/docker-syncd-cavm-rpc/ptf_nn_agent.conf new file mode 100644 index 000000000000..fa1ed0eb1622 --- /dev/null +++ b/platform/cavium/docker-syncd-cavm-rpc/ptf_nn_agent.conf @@ -0,0 +1,10 @@ +[program:ptf_nn_agent] +command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-iface-rcv-buffer=109430400 +process_name=ptf_nn_agent +stdout_logfile=/tmp/ptf_nn_agent.out.log +stderr_logfile=/tmp/ptf_nn_agent.err.log +redirect_stderr=false +autostart=true +autorestart=true +startsecs=1 +numprocs=1 diff --git a/platform/cavium/docker-syncd-cavm-rpc/supervisord.conf b/platform/cavium/docker-syncd-cavm-rpc/supervisord.conf new file mode 100644 index 000000000000..54296b8b254e --- /dev/null +++ b/platform/cavium/docker-syncd-cavm-rpc/supervisord.conf @@ -0,0 +1,2 @@ +[supervisord] +nodaemon=true diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index 0d20b1c43993..6eeffbc7f9b2 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -1,5 +1,6 @@ include $(PLATFORM_PATH)/cavm-sai.mk include $(PLATFORM_PATH)/docker-syncd-cavm.mk +include $(PLATFORM_PATH)/docker-syncd-cavm-rpc.mk include $(PLATFORM_PATH)/docker-orchagent-cavm.mk include $(PLATFORM_PATH)/cavm-platform-modules.mk include $(PLATFORM_PATH)/cavm-xpnet.mk @@ -8,10 +9,11 @@ include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk SONIC_ALL += $(SONIC_ONE_IMAGE) \ - $(DOCKER_FPM) + $(DOCKER_FPM) \ + $(DOCKER_SYNCD_CAVM_RPC) # Inject cavium sai into sairedis -$(LIBSAIREDIS)_DEPENDS += $(CAVM_SAI) $(CAVM_LIBSAI) +$(LIBSAIREDIS)_DEPENDS += $(CAVM_SAI) $(CAVM_LIBSAI) $(LIBSAITHRIFT_DEV_CAVM) # Runtime dependency on cavium sai is set only for syncd $(SYNCD)_RDEPENDS += $(CAVM_SAI) diff --git a/platform/centec/docker-syncd-centec-rpc.mk b/platform/centec/docker-syncd-centec-rpc.mk new file mode 100644 index 000000000000..68b940f8d2b6 --- /dev/null +++ b/platform/centec/docker-syncd-centec-rpc.mk @@ -0,0 +1,7 @@ +# docker image for centec syncd with rpc + +DOCKER_SYNCD_CENTEC_RPC = docker-syncd-centec-rpc.gz +$(DOCKER_SYNCD_CENTEC_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-centec-rpc +$(DOCKER_SYNCD_CENTEC_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) +$(DOCKER_SYNCD_CENTEC_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_CENTEC) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CENTEC_RPC) diff --git a/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 new file mode 100644 index 000000000000..a0384c14f571 --- /dev/null +++ b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 @@ -0,0 +1,56 @@ +FROM docker-syncd-centec + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +COPY \ +{% for deb in docker_syncd_centec_rpc_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -P syncd + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ +{% for deb in docker_syncd_centec_rpc_debs.split(' ') -%} +dpkg_apt debs/{{ deb }}{{'; '}} +{%- endfor %} + +## Pre-install the fundamental packages +RUN apt-get update \ + && apt-get -y install \ + net-tools \ + python-pip \ + build-essential \ + libssl-dev \ + libffi-dev \ + python-dev \ + wget \ + cmake \ + supervisor \ + && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ + && tar xvfz 1.0.0.tar.gz \ + && cd nanomsg-1.0.0 \ + && mkdir -p build \ + && cmake . \ + && make install \ + && ldconfig \ + && cd .. \ + && rm -fr nanomsg-1.0.0 \ + && rm -f 1.0.0.tar.gz \ + && pip install cffi==1.7.0 \ + && pip install --upgrade cffi==1.7.0 \ + && pip install nnpy \ + && mkdir -p /opt \ + && cd /opt \ + && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ + && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ + && rm -rf /root/deps + +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf + +RUN sed -i 's/read/sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord/' /usr/bin/start.sh + +ENTRYPOINT ["/bin/bash"] +CMD ["/usr/bin/start.sh"] diff --git a/platform/centec/docker-syncd-centec-rpc/ptf_nn_agent.conf b/platform/centec/docker-syncd-centec-rpc/ptf_nn_agent.conf new file mode 100644 index 000000000000..fa1ed0eb1622 --- /dev/null +++ b/platform/centec/docker-syncd-centec-rpc/ptf_nn_agent.conf @@ -0,0 +1,10 @@ +[program:ptf_nn_agent] +command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-iface-rcv-buffer=109430400 +process_name=ptf_nn_agent +stdout_logfile=/tmp/ptf_nn_agent.out.log +stderr_logfile=/tmp/ptf_nn_agent.err.log +redirect_stderr=false +autostart=true +autorestart=true +startsecs=1 +numprocs=1 diff --git a/platform/centec/docker-syncd-centec-rpc/supervisord.conf b/platform/centec/docker-syncd-centec-rpc/supervisord.conf new file mode 100644 index 000000000000..54296b8b254e --- /dev/null +++ b/platform/centec/docker-syncd-centec-rpc/supervisord.conf @@ -0,0 +1,2 @@ +[supervisord] +nodaemon=true diff --git a/platform/centec/rules.mk b/platform/centec/rules.mk index 9e53996c0a36..0dcf050fe417 100644 --- a/platform/centec/rules.mk +++ b/platform/centec/rules.mk @@ -2,14 +2,16 @@ include $(PLATFORM_PATH)/sdk.mk include $(PLATFORM_PATH)/sai.mk include $(PLATFORM_PATH)/docker-orchagent-centec.mk include $(PLATFORM_PATH)/docker-syncd-centec.mk +include $(PLATFORM_PATH)/docker-syncd-centec-rpc.mk include $(PLATFORM_PATH)/one-image.mk include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk -SONIC_ALL += $(SONIC_ONE_IMAGE) +SONIC_ALL += $(SONIC_ONE_IMAGE) \ + $(DOCKER_SYNCD_CENTEC_RPC) # Inject centec sai into sairedis -$(LIBSAIREDIS)_DEPENDS += $(CENTEC_SAI) +$(LIBSAIREDIS)_DEPENDS += $(CENTEC_SAI) $(LIBSAITHRIFT_DEV_CENTEC) # Runtime dependency on centec sai is set only for syncd $(SYNCD)_RDEPENDS += $(CENTEC_SAI) diff --git a/platform/mellanox/docker-syncd-mlnx-rpc.mk b/platform/mellanox/docker-syncd-mlnx-rpc.mk index 7aab3c802327..8c5411454086 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc.mk +++ b/platform/mellanox/docker-syncd-mlnx-rpc.mk @@ -2,7 +2,7 @@ DOCKER_SYNCD_MLNX_RPC = docker-syncd-mlnx-rpc.gz $(DOCKER_SYNCD_MLNX_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-mlnx-rpc -$(DOCKER_SYNCD_MLNX_RPC)_DEPENDS += $(SYNCD) $(LIBTHRIFT) +$(DOCKER_SYNCD_MLNX_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) $(DOCKER_SYNCD_MLNX_RPC)_FILES += $(MLNX_FW) $(DOCKER_SYNCD_MLNX_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_MLNX) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX_RPC) diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 index 64e208112783..c8b312b1c677 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 @@ -45,7 +45,7 @@ RUN apt-get update \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ - && rm -rf /deps + && rm -rf /root/deps COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index 967643167da9..a56d9b0d5748 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -15,7 +15,7 @@ SONIC_ALL += $(SONIC_ONE_IMAGE) \ $(DOCKER_SYNCD_MLNX_RPC) # Inject mlnx sai into sairedis -$(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) +$(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) $(LIBSAITHRIFT_DEV_MLNX) # Runtime dependency on mlnx sai is set only for syncd $(SYNCD)_RDEPENDS += $(MLNX_SAI) diff --git a/rules/sairedis.mk b/rules/sairedis.mk index 02c20ef54588..87838a3aeebe 100644 --- a/rules/sairedis.mk +++ b/rules/sairedis.mk @@ -2,7 +2,7 @@ LIBSAIREDIS = libsairedis_1.0.0_amd64.deb $(LIBSAIREDIS)_SRC_PATH = $(SRC_PATH)/sonic-sairedis -$(LIBSAIREDIS)_DEPENDS += $(LIBSWSSCOMMON_DEV) +$(LIBSAIREDIS)_DEPENDS += $(LIBSWSSCOMMON_DEV) $(LIBTHRIFT_DEV) $(LIBSAIREDIS)_RDEPENDS += $(LIBSWSSCOMMON) SONIC_DPKG_DEBS += $(LIBSAIREDIS) @@ -13,6 +13,10 @@ SYNCD = syncd_1.0.0_amd64.deb $(SYNCD)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD))) +SYNCD_RPC = syncd-rpc_1.0.0_amd64.deb +$(SYNCD_RPC)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_RPC))) + LIBSAIMETADATA = libsaimetadata_1.0.0_amd64.deb $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA))) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index e28e4c038572..230f322b66f4 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit e28e4c038572aeea65491424a86fcb4f1ac229de +Subproject commit 230f322b66f4da67b5dba7dbedf39e70219a21f7 From 7dc1045c2606faeb88fbc70a9f8293926922a0d3 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 21 Apr 2017 08:21:41 -0700 Subject: [PATCH 0460/1011] [swss]: Export platform as env variable in docker-swss (#524) Signed-off-by: Shuotian Cheng --- dockers/docker-orchagent/start.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 088d0fe1bcf0..47fa198e0b08 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -1,5 +1,7 @@ #!/bin/bash +export platform=`sonic-cfggen -m /etc/sonic/minigraph.xml -v platform` + function start_app { orchagent $ORCHAGENT_ARGS & portsyncd $PORTSYNCD_ARGS & From 6c202919b30a04930f794e2a2ee4c4d8a19c2b10 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 21 Apr 2017 08:22:44 -0700 Subject: [PATCH 0461/1011] [System logs]: Eliminate duplicate log messages and attempt rotation more frequently (#520) * Rename 'ACSFileFormat' -> 'SONiCFileFormat' * Rename '00-acs.conf' -> '00-sonic.conf' * Add logrotate.d and systemd-journald config files to image * Log all SONiC process messages to /var/log/syslog; prevent duplicate logging to /var/log/messages * Do not redirect cron and daemon logs to their own files, let them log to /var/log/syslog * Log all teamd messages to /var/log/teamd.log; Add more SONiC program names to SONiC rules clause * Remove duplicate code by condensing quagga programs into a list; Fix teamd log rule * Kernel and LPR messages no longer getting duplicated to their own log files * Now calling logrotate every minute via cron job * Need full path to logrotate in cron job * Add '.log' suffix to wildcards, otherwise logrotate will rotate already-rotated logs (e.g., bgpd.log.1.1.1.1.1...) * Add microsecond granularity to syslog messages * Don't overwrite system crontab, instead, install additional logrotate crontab file into /etc/cron.d * Removed incomplete concept of per-process SONiC logs. We can revisit again later --- dockers/docker-base/rsyslog.conf | 4 +- .../build_templates/sonic_debian_extension.j2 | 9 ++++ files/image_config/cron.d/logrotate | 3 ++ files/image_config/logrotate.d/rsyslog | 43 +++++++++++++++++ files/image_config/rsyslog/rsyslog.conf.j2 | 4 +- .../rsyslog/rsyslog.d/00-acs.conf | 46 ------------------- .../rsyslog/rsyslog.d/00-sonic.conf | 22 +++++++++ .../rsyslog/rsyslog.d/99-default.conf | 23 ++++++---- files/image_config/systemd/journald.conf | 36 +++++++++++++++ platform/p4/docker-sonic-p4/rsyslog.conf | 4 +- 10 files changed, 133 insertions(+), 61 deletions(-) create mode 100644 files/image_config/cron.d/logrotate create mode 100644 files/image_config/logrotate.d/rsyslog delete mode 100644 files/image_config/rsyslog/rsyslog.d/00-acs.conf create mode 100644 files/image_config/rsyslog/rsyslog.d/00-sonic.conf create mode 100644 files/image_config/systemd/journald.conf diff --git a/dockers/docker-base/rsyslog.conf b/dockers/docker-base/rsyslog.conf index e03df1f741c2..1132ad55ec3c 100644 --- a/dockers/docker-base/rsyslog.conf +++ b/dockers/docker-base/rsyslog.conf @@ -39,8 +39,8 @@ $ModLoad imuxsock # provides support for local system logging #$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # Define a custom template -$template ACSFileFormat,"%TIMESTAMP% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" -$ActionFileDefaultTemplate ACSFileFormat +$template SONiCFileFormat,"%TIMESTAMP%.%timestamp:::date-subseconds% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" +$ActionFileDefaultTemplate SONiCFileFormat # # Set the default permissions for all log files. diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 77fcd1f38655..16a25d2c3efc 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -88,6 +88,9 @@ sudo cp -f $IMAGE_CONFIGS/bash/bash.bashrc $FILESYSTEM_ROOT/etc/ sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/sonic-device-data_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f +# Copy crontabs +sudo cp -f $IMAGE_CONFIGS/cron.d/* $FILESYSTEM_ROOT/etc/cron.d/ + # Copy NTP configuration files and templates sudo cp $IMAGE_CONFIGS/ntp/ntp-config.service $FILESYSTEM_ROOT/etc/systemd/system/ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable ntp-config.service @@ -101,6 +104,12 @@ sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog-config.sh $FILESYSTEM_ROOT/usr/bin/ sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.conf.j2 $FILESYSTEM_ROOT/usr/share/sonic/templates/ sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.d/* $FILESYSTEM_ROOT/etc/rsyslog.d/ +# Copy logrotate.d configuration files +sudo cp -f $IMAGE_CONFIGS/logrotate.d/rsyslog $FILESYSTEM_ROOT/etc/logrotate.d/ + +# Copy systemd-journald configuration files +sudo cp -f $IMAGE_CONFIGS/systemd/journald.conf $FILESYSTEM_ROOT/etc/systemd/ + # Copy interfaces configuration files and templates sudo cp $IMAGE_CONFIGS/interfaces/interfaces-config.service $FILESYSTEM_ROOT/etc/systemd/system/ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable interfaces-config.service diff --git a/files/image_config/cron.d/logrotate b/files/image_config/cron.d/logrotate new file mode 100644 index 000000000000..e7813aa1f57b --- /dev/null +++ b/files/image_config/cron.d/logrotate @@ -0,0 +1,3 @@ +# Attempt to rotate system logs once per minute +* * * * * root /usr/sbin/logrotate -f /etc/logrotate.d/rsyslog + diff --git a/files/image_config/logrotate.d/rsyslog b/files/image_config/logrotate.d/rsyslog new file mode 100644 index 000000000000..c09604187f7f --- /dev/null +++ b/files/image_config/logrotate.d/rsyslog @@ -0,0 +1,43 @@ +/var/log/syslog +/var/log/quagga/*.log +/var/log/teamd.log +{ + rotate 7 +# Removed 'daily' interval, as we now call logrotate more frequently via cron +# and we want to check these logs every time +# daily + size 100M + missingok + notifempty + compress + delaycompress + postrotate + invoke-rc.d rsyslog rotate > /dev/null + endscript +} +/var/log/mail.info +/var/log/mail.warn +/var/log/mail.err +/var/log/mail.log +/var/log/daemon.log +/var/log/kern.log +/var/log/auth.log +/var/log/user.log +/var/log/lpr.log +/var/log/cron.log +/var/log/debug +/var/log/messages +{ + rotate 4 + weekly + size 100M + missingok + notifempty + compress + delaycompress + sharedscripts + postrotate + invoke-rc.d rsyslog rotate > /dev/null + endscript +} + diff --git a/files/image_config/rsyslog/rsyslog.conf.j2 b/files/image_config/rsyslog/rsyslog.conf.j2 index e00565f056eb..008f9f10e6f0 100644 --- a/files/image_config/rsyslog/rsyslog.conf.j2 +++ b/files/image_config/rsyslog/rsyslog.conf.j2 @@ -42,8 +42,8 @@ $UDPServerRun 514 #$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # Define a custom template -$template ACSFileFormat,"%TIMESTAMP% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" -$ActionFileDefaultTemplate ACSFileFormat +$template SONiCFileFormat,"%TIMESTAMP%.%timestamp:::date-subseconds% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" +$ActionFileDefaultTemplate SONiCFileFormat # # Set the default permissions for all log files. diff --git a/files/image_config/rsyslog/rsyslog.d/00-acs.conf b/files/image_config/rsyslog/rsyslog.d/00-acs.conf deleted file mode 100644 index ec8ce919f402..000000000000 --- a/files/image_config/rsyslog/rsyslog.d/00-acs.conf +++ /dev/null @@ -1,46 +0,0 @@ -## Quagga rules - -if $programname == "zebra" then { - /var/log/quagga/zebra.log - stop -} - -if $programname == "bgpd" then { - /var/log/quagga/bgpd.log - stop -} - -if $programname == "quagga" then { - /var/log/quagga/zebra.log - stop -} - -if $programname == "watchquagga" then { - /var/log/quagga/zebra.log - stop -} - -## Platform modules rules -if $programname == "platform-modules" then { - /var/log/syslog - stop -} - -## Sensord rules -if $programname == "sensord" then { - /var/log/syslog - stop -} - -## Sswsyncd rules -if $programname == "sswsyncd" then { - /var/log/syslog - stop -} - -## Ansible rules -if $programname startswith "ansible" then { - /var/log/messages - stop -} - diff --git a/files/image_config/rsyslog/rsyslog.d/00-sonic.conf b/files/image_config/rsyslog/rsyslog.d/00-sonic.conf new file mode 100644 index 000000000000..20d18e5d226d --- /dev/null +++ b/files/image_config/rsyslog/rsyslog.d/00-sonic.conf @@ -0,0 +1,22 @@ +## Quagga rules + +if $programname == ["quagga", + "watchquagga", + "zebra"] + then { + /var/log/quagga/zebra.log + stop +} + +if $programname == "bgpd" then { + /var/log/quagga/bgpd.log + stop +} + +## Teamd rules + +if $programname contains "teamd_" then { + /var/log/teamd.log + stop +} + diff --git a/files/image_config/rsyslog/rsyslog.d/99-default.conf b/files/image_config/rsyslog/rsyslog.d/99-default.conf index a26ba7baf8e6..9b129199b385 100644 --- a/files/image_config/rsyslog/rsyslog.d/99-default.conf +++ b/files/image_config/rsyslog/rsyslog.d/99-default.conf @@ -3,11 +3,13 @@ # auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog -cron.* /var/log/cron.log -daemon.* -/var/log/daemon.log -kern.* -/var/log/kern.log -kern.* -/var/persist/log/kern.log -lpr.* -/var/log/lpr.log +# Do not redirect cron, daemon, kernel or lpr logs to +# their own files. Let them log to /var/log/syslog +#cron.* /var/log/cron.log +#daemon.* -/var/log/daemon.log +#kern.* -/var/log/kern.log +#kern.* -/var/persist/log/kern.log +#lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log user.* -/var/log/user.log @@ -32,10 +34,13 @@ news.notice -/var/log/news/news.notice *.=debug;\ auth,authpriv.none;\ news.none;mail.none -/var/log/debug -*.=info;*.=notice;*.=warn;\ - auth,authpriv.none;\ - cron,daemon.none;\ - mail,news.none -/var/log/messages +# +# Removed as duplicates: +#*.=info;*.=notice;*.=warn;\ +# auth,authpriv.none;\ +# cron,daemon.none;\ +# mail,news.none -/var/log/messages +# *.=crit;*.=alert;*.=emerg -/var/persist/log/alarms # # Emergencies are sent to everybody logged in. diff --git a/files/image_config/systemd/journald.conf b/files/image_config/systemd/journald.conf new file mode 100644 index 000000000000..fc6c4a4e7a1a --- /dev/null +++ b/files/image_config/systemd/journald.conf @@ -0,0 +1,36 @@ +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# See journald.conf(5) for details + +[Journal] +#Storage=auto +#Compress=yes +#Seal=yes +#SplitMode=uid +#SyncIntervalSec=5m +#RateLimitInterval=30s +#RateLimitBurst=1000 +SystemMaxUse=50MB +#SystemKeepFree= +#SystemMaxFileSize= +RuntimeMaxUse=50MB +#RuntimeKeepFree= +#RuntimeMaxFileSize= +#MaxRetentionSec= +#MaxFileSec=1month +#ForwardToSyslog=yes +#ForwardToKMsg=no +#ForwardToConsole=no +#ForwardToWall=yes +#TTYPath=/dev/console +#MaxLevelStore=debug +#MaxLevelSyslog=debug +#MaxLevelKMsg=notice +#MaxLevelConsole=info +#MaxLevelWall=emerg + diff --git a/platform/p4/docker-sonic-p4/rsyslog.conf b/platform/p4/docker-sonic-p4/rsyslog.conf index d82ea610d6a7..e8f42bdabe50 100644 --- a/platform/p4/docker-sonic-p4/rsyslog.conf +++ b/platform/p4/docker-sonic-p4/rsyslog.conf @@ -39,8 +39,8 @@ $ModLoad imuxsock # provides support for local system logging #$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # Define a custom template -$template ACSFileFormat,"%TIMESTAMP% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" -$ActionFileDefaultTemplate ACSFileFormat +$template SONiCFileFormat,"%TIMESTAMP%.%timestamp:::date-subseconds% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" +$ActionFileDefaultTemplate SONiCFileFormat # # Set the default permissions for all log files. From 4fe9416a1435e5e0078a2cd1ff938c32fc01a5ba Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 21 Apr 2017 14:04:06 -0700 Subject: [PATCH 0462/1011] Update sairedis submodule (#526) --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 230f322b66f4..f041648f874f 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 230f322b66f4da67b5dba7dbedf39e70219a21f7 +Subproject commit f041648f874f21d2cd4a7255c9b3bb8870557e36 From c7ea3470ed3262b3f4f1e7531ab777e1c1b82063 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Sat, 22 Apr 2017 00:28:30 +0300 Subject: [PATCH 0463/1011] [swss]: Generate config files for Everflow and IPinIP from minigraph (#507) [swss]: Generate config files for Everflow and IPinIP from minigraph - Add Everflow DST IP to minigraph file - Extend minigraph.py to support Everflow - Add templates file for Everflow and IPinIP configuration - Add config.sh for swss docker to generate config files --- .../x86_64-accton_as7512_32x-r0/minigraph.xml | 5 +++++ .../x86_64-arista_7050_qx32/minigraph.xml | 5 +++++ .../x86_64-arista_7060_cx32s/minigraph.xml | 5 +++++ .../x86_64-dell_s6000_s1220-r0/minigraph.xml | 5 +++++ .../x86_64-dell_s6100_c2538-r0/minigraph.xml | 5 +++++ .../x86_64-dell_z9100_c2538-r0/minigraph.xml | 5 +++++ .../x86_64-ingrasys_s9100-r0/minigraph.xml | 5 +++++ .../x86_64-mlnx_msn2410-r0/minigraph.xml | 5 +++++ .../x86_64-mlnx_msn2700-r0/minigraph.xml | 5 +++++ dockers/docker-orchagent/Dockerfile.j2 | 3 +++ dockers/docker-orchagent/config.sh | 6 ++++++ dockers/docker-orchagent/ipinip.json.j2 | 19 +++++++++++++++++ dockers/docker-orchagent/mirror.json.j2 | 21 +++++++++++++++++++ dockers/docker-orchagent/start.sh | 4 +++- src/sonic-config-engine/minigraph.py | 9 ++++++-- .../tests/sample_output/ipinip.json | 14 +++++++++++++ .../tests/sample_output/mirror.json | 14 +++++++++++++ .../tests/t0-sample-graph.xml | 15 +++++++++++++ src/sonic-config-engine/tests/test_j2files.py | 19 +++++++++++++++++ 19 files changed, 166 insertions(+), 3 deletions(-) create mode 100755 dockers/docker-orchagent/config.sh create mode 100644 dockers/docker-orchagent/ipinip.json.j2 create mode 100644 dockers/docker-orchagent/mirror.json.j2 create mode 100644 src/sonic-config-engine/tests/sample_output/ipinip.json create mode 100644 src/sonic-config-engine/tests/sample_output/mirror.json diff --git a/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml b/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml index f2326c44aae3..758aca3551d6 100644 --- a/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml +++ b/device/accton/x86_64-accton_as7512_32x-r0/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/arista/x86_64-arista_7050_qx32/minigraph.xml b/device/arista/x86_64-arista_7050_qx32/minigraph.xml index f2ef7b0b8bc2..bbf2508ce4cc 100644 --- a/device/arista/x86_64-arista_7050_qx32/minigraph.xml +++ b/device/arista/x86_64-arista_7050_qx32/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/arista/x86_64-arista_7060_cx32s/minigraph.xml b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml index 5d7dcea980ff..513a60254818 100644 --- a/device/arista/x86_64-arista_7060_cx32s/minigraph.xml +++ b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml b/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml index 0fd1f49ab868..871a91c7fd02 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml +++ b/device/dell/x86_64-dell_s6000_s1220-r0/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml b/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml index 3ae8e77f8024..37fba6c291b1 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml +++ b/device/dell/x86_64-dell_s6100_c2538-r0/minigraph.xml @@ -759,6 +759,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml b/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml index ab1ce20a69a8..b45892801ed3 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml +++ b/device/dell/x86_64-dell_z9100_c2538-r0/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml index d56428187aa8..0c4dec50942a 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/minigraph.xml @@ -136,6 +136,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml b/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml index 01cfdd03c635..ed21b8d6eeb9 100644 --- a/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml @@ -510,6 +510,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml b/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml index 4942e64be5e9..ecbabba18da2 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml @@ -1064,6 +1064,11 @@ + + ErspanDestinationIpv4 + + 2.2.2.2 + diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 507b0bf03355..55f3b504f820 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -23,6 +23,9 @@ debs/{{ deb }}{{' '}} {%- endfor %} COPY start.sh /usr/bin/start.sh +COPY config.sh /usr/bin/config.sh +COPY ipinip.json.j2 /usr/share/sonic/templates/ipinip.json.j2 +COPY mirror.json.j2 /usr/share/sonic/templates/mirror.json.j2 ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y diff --git a/dockers/docker-orchagent/config.sh b/dockers/docker-orchagent/config.sh new file mode 100755 index 000000000000..813dad9533c5 --- /dev/null +++ b/dockers/docker-orchagent/config.sh @@ -0,0 +1,6 @@ +#!/bin/bash -e + +mkdir -p /etc/swss/config.d/ + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/mirror.json.j2 > /etc/swss/config.d/mirror.json diff --git a/dockers/docker-orchagent/ipinip.json.j2 b/dockers/docker-orchagent/ipinip.json.j2 new file mode 100644 index 000000000000..19e98a41295c --- /dev/null +++ b/dockers/docker-orchagent/ipinip.json.j2 @@ -0,0 +1,19 @@ +[ + { + "TUNNEL_DECAP_TABLE:IPINIP_TUNNEL" : { + "tunnel_type":"IPINIP", + "src_ip":"{{ minigraph_lo_interfaces[0]['addr'] }}", + "dst_ip":"{{ minigraph_lo_interfaces[0]['addr'] }}", +{% if minigraph_hwsku in [ 'ACS-MSN2700', 'ACS-MSN2410', 'ACS-MSN2100' ] %} + "dscp_mode":"uniform", + "ecn_mode":"standard", +{% else %} + "dscp_mode":"pipe", + "ecn_mode":"copy_from_outer", +{% endif %} + "ttl_mode":"pipe" + }, + "OP": "SET" + } +] + diff --git a/dockers/docker-orchagent/mirror.json.j2 b/dockers/docker-orchagent/mirror.json.j2 new file mode 100644 index 000000000000..7a3a9250d7dc --- /dev/null +++ b/dockers/docker-orchagent/mirror.json.j2 @@ -0,0 +1,21 @@ +[ +{% if erspan_dst %} + { + "MIRROR_SESSION_TABLE:everflow": { + "src_ip": "{{ minigraph_lo_interfaces[0]['addr'] }}", + "dst_ip": "{{ erspan_dst[0] }}", +{% if minigraph_hwsku in [ 'ACS-MSN2700', 'ACS-MSN2410', 'ACS-MSN2100' ] %} + "gre_type": "0x6558", + "queue": "1", +{% else %} + "gre_type": "0x88be", + "queue": "0", +{% endif %} + "dscp": "8", + "ttl": "255" + }, + "OP": "SET" + } +{% endif %} +] + diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 47fa198e0b08..7a653c442ef8 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -1,5 +1,7 @@ #!/bin/bash +. config.sh + export platform=`sonic-cfggen -m /etc/sonic/minigraph.xml -v platform` function start_app { @@ -45,7 +47,7 @@ ORCHAGENT_ARGS="" PORTSYNCD_ARGS="-p /usr/share/sonic/hwsku/port_config.ini" -SWSSCONFIG_ARGS="00-copp.config.json " +SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json " if [ "$HWSKU" == "Force10-S6000" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 42086625bb90..49e8b104a46e 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -282,6 +282,7 @@ def parse_meta(meta, hname): dhcp_servers = [] ntp_servers = [] mgmt_routes = [] + erspan_dst = [] 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: @@ -298,7 +299,9 @@ def parse_meta(meta, hname): syslog_servers = value_group elif name == "ForcedMgmtRoutes": mgmt_routes = value_group - return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes + elif name == "ErspanDestinationIpv4": + erspan_dst = value_group + return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst def get_console_info(devices, dev, port): @@ -391,6 +394,7 @@ def parse_xml(filename, platform=None, port_config_file=None): dhcp_servers = [] ntp_servers = [] mgmt_routes = [] + erspan_dst = [] hwsku_qn = QName(ns, "HwSku") hostname_qn = QName(ns, "Hostname") @@ -412,7 +416,7 @@ def parse_xml(filename, platform=None, port_config_file=None): 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) = parse_meta(child, hostname) + (syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst) = parse_meta(child, hostname) Tree = lambda: defaultdict(Tree) @@ -460,6 +464,7 @@ def parse_xml(filename, platform=None, port_config_file=None): results['dhcp_servers'] = dhcp_servers results['ntp_servers'] = ntp_servers results['forced_mgmt_routes'] = mgmt_routes + results['erspan_dst'] = erspan_dst return results diff --git a/src/sonic-config-engine/tests/sample_output/ipinip.json b/src/sonic-config-engine/tests/sample_output/ipinip.json new file mode 100644 index 000000000000..00862a379281 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/ipinip.json @@ -0,0 +1,14 @@ +[ + { + "TUNNEL_DECAP_TABLE:IPINIP_TUNNEL" : { + "tunnel_type":"IPINIP", + "src_ip":"10.1.0.32", + "dst_ip":"10.1.0.32", + "dscp_mode":"pipe", + "ecn_mode":"copy_from_outer", + "ttl_mode":"pipe" + }, + "OP": "SET" + } +] + diff --git a/src/sonic-config-engine/tests/sample_output/mirror.json b/src/sonic-config-engine/tests/sample_output/mirror.json new file mode 100644 index 000000000000..54065700a282 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/mirror.json @@ -0,0 +1,14 @@ +[ + { + "MIRROR_SESSION_TABLE:everflow": { + "src_ip": "10.1.0.32", + "dst_ip": "2.2.2.2", + "gre_type": "0x88be", + "queue": "0", + "dscp": "8", + "ttl": "255" + }, + "OP": "SET" + } +] + diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml index 41e62dca29c2..e359b4fa629f 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph.xml @@ -317,6 +317,21 @@ + + + + switch-t0 + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + switch-t0 Force10-S6000 diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index cf1e32aea519..6ea49efc75f2 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -46,6 +46,25 @@ def test_render_teamd(self, pc): assert pc_name in pc_list test_render_teamd(self, pc_name) + def test_ipinip(self): + ipinip_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ipinip.json.j2') + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + ipinip_file + ' > ' + self.output_file + self.run_script(argument) + + sample_output_file = os.path.join(self.test_dir, 'sample_output', 'ipinip.json') + + assert filecmp.cmp(sample_output_file, self.output_file) + + def test_everflow(self): + everflow_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'mirror.json.j2') + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + everflow_file + ' > ' + self.output_file + self.run_script(argument) + + sample_output_file = os.path.join(self.test_dir, 'sample_output', 'mirror.json') + + assert filecmp.cmp(sample_output_file, self.output_file) + + def tearDown(self): try: os.remove(self.output_file) From 07bc0092a949e7a1b6896c4d3487e2a44c359d4f Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Fri, 21 Apr 2017 17:22:10 -0700 Subject: [PATCH 0464/1011] [sonic-utilities]:update submodules (#525) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 5df8acb5ef48..45a8d387ab55 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 5df8acb5ef48eb34e67b0b5a693fa9f923a79da1 +Subproject commit 45a8d387ab550153d90bd5964ffe534b0dbd65a2 From b549adc36c127130b22f3c2e8c1fefb5f7b073a9 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Sat, 22 Apr 2017 03:23:36 +0300 Subject: [PATCH 0465/1011] [image]: SONiC-to-SONiC update (#464) --- build_debian.sh | 6 +- build_image.sh | 1 + files/Aboot/boot0.j2 | 30 ++-- files/image_config/platform/rc.local | 12 +- files/initramfs-tools/arista-convertfs.j2 | 6 +- files/initramfs-tools/union-mount.j2 | 9 +- installer/x86_64/install.sh | 203 +++++++++++++--------- onie-mk-demo.sh | 6 +- 8 files changed, 166 insertions(+), 107 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 9840280fc849..7d763a46f2e5 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -116,8 +116,11 @@ sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/linux-image-3.16.0-4-amd64_*.de ## Update initramfs for booting with squashfs+aufs cat files/initramfs-tools/modules | sudo tee -a $FILESYSTEM_ROOT/etc/initramfs-tools/modules > /dev/null +IMAGE_VERSION=$(. functions.sh && sonic_get_version) + ## Hook into initramfs: change fs type from vfat to ext4 on arista switches sudo mkdir -p $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/ +sed -i -e "s/%%IMAGE_VERSION%%/$IMAGE_VERSION/g" files/initramfs-tools/arista-convertfs sudo cp files/initramfs-tools/arista-convertfs $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-convertfs sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-convertfs sudo cp files/initramfs-tools/mke2fs $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/mke2fs @@ -195,7 +198,8 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in iptables-persistent \ logrotate \ curl \ - kexec-tools + kexec-tools \ + unzip ## Disable kexec supported reboot which was installed by default sudo sed -i 's/LOAD_KEXEC=true/LOAD_KEXEC=false/' $FILESYSTEM_ROOT/etc/default/kexec diff --git a/build_image.sh b/build_image.sh index 7ac3085463dd..a275c383c45d 100755 --- a/build_image.sh +++ b/build_image.sh @@ -45,6 +45,7 @@ elif [ "$IMAGE_TYPE" = "aboot" ]; then cp $ONIE_INSTALLER_PAYLOAD $OUTPUT_ABOOT_IMAGE ## Add Aboot boot0 file j2 -f env files/Aboot/boot0.j2 ./onie-image.conf > files/Aboot/boot0 + sed -i -e "s/%%IMAGE_VERSION%%/$IMAGE_VERSION/g" files/Aboot/boot0 pushd files/Aboot && zip -g $OLDPWD/$OUTPUT_ABOOT_IMAGE boot0; popd pushd files/Aboot && zip -g $OLDPWD/$ABOOT_BOOT_IMAGE boot0; popd echo "$IMAGE_VERSION" >> .imagehash diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 6460ddbbecfc..42bf0719bff9 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -25,6 +25,7 @@ kernel_params=kernel-params aboot_machine="arista_unknown" target_path=/mnt/flash +image_path="$target_path/image-%%IMAGE_VERSION%%" # expect the swi to be a non empty file [ -s "$swipath" ] || exit 1 @@ -48,8 +49,10 @@ extract_image() { fi done + mkdir "$image_path" + ## Unzip the image - unzip -oq "$swipath" -x boot0 -d "$target_path" + unzip -oq "$swipath" -x boot0 -d "$image_path" ## Remove installer swi as it has lots of redundunt contents rm -f $swipath @@ -59,19 +62,22 @@ extract_image() { ## vfat does not support symbol link if [ $rootfs_type != "vfat" ]; then - mkdir -p "$target_path/{{ DOCKERFS_DIR }}" + mkdir -p "$image_path/{{ DOCKERFS_DIR }}" ## extract docker archive - tar xf "$target_path/{{ FILESYSTEM_DOCKERFS }}" -C "$target_path/{{ DOCKERFS_DIR }}" + tar xf "$image_path/{{ FILESYSTEM_DOCKERFS }}" -C "$image_path/{{ DOCKERFS_DIR }}" ## clean up docker archive - rm -f "$target_path/{{ FILESYSTEM_DOCKERFS }}" + rm -f "$image_path/{{ FILESYSTEM_DOCKERFS }}" else echo "/mnt/flash is $rootfs_type, extract {{ FILESYSTEM_DOCKERFS }} in later stage" fi - ## replace with boot swi - mv "$target_path/{{ ABOOT_BOOT_IMAGE }}" "$swipath" + ## use new reduced-size boot swi + echo "SWI=flash:image-%%IMAGE_VERSION%%/{{ ABOOT_BOOT_IMAGE }}" > "$target_path/boot-config" + + ## remove original boot swi + rm -f "$swipath" ## sync disk operations sync @@ -118,14 +124,14 @@ echo "$append" >/tmp/append parse_environment_config >>/tmp/append cat /etc/cmdline | sed "/^\(${bootconfigvars// /\|}\|crashkernel\|loglevel\|ignore_loglevel\)\(\$\|=\)/d;/^\$/d" >>/tmp/append -echo "rw loop=fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor quiet" >>/tmp/append +echo "rw loop=image-%%IMAGE_VERSION%%/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor quiet" >>/tmp/append # process platform specific operations platform_specific # use extra parameters from kernel-params hook if the file exists -if [ -f "$target_path/$kernel_params" ]; then - cat "$target_path/$kernel_params" >>/tmp/append +if [ -f "$image_path/$kernel_params" ]; then + cat "$image_path/$kernel_params" >>/tmp/append fi # setting root partition if not overridden by kernel-params @@ -137,15 +143,15 @@ fi # check the hash file in the image, and determine to install or just skip GIT_REVISION=$(unzip -p "$swipath" .imagehash) -LOCAL_IMAGEHASH=$(cat $target_path/.imagehash 2>/dev/null || true) +LOCAL_IMAGEHASH=$(cat $image_path/.imagehash 2>/dev/null || true) if [ "$GIT_REVISION" != "$LOCAL_IMAGEHASH" ]; then extract_image write_machine_config fi # chainloading using kexec -initrd_path="$target_path/$initrd" -kernel_path="$target_path/$kernel" +initrd_path="$image_path/$initrd" +kernel_path="$image_path/$kernel" cmdline="$(tr '\n' ' ' > $grub_cfg menuentry '$demo_grub_entry' { search --no-floppy --label --set=root $demo_volume_label - echo 'Loading $demo_volume_revision_label $demo_type kernel ...' + echo 'Loading $demo_volume_label $demo_type kernel ...' insmod gzio if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi insmod part_msdos insmod ext2 - linux /boot/vmlinuz-3.16.0-4-amd64 root=$demo_dev rw $GRUB_CMDLINE_LINUX \ - loop=$FILESYSTEM_SQUASHFS loopfstype=squashfs \ + linux /$image_dir/boot/vmlinuz-3.16.0-4-amd64 root=$demo_dev rw $GRUB_CMDLINE_LINUX \ + loop=$image_dir/$FILESYSTEM_SQUASHFS loopfstype=squashfs \ apparmor=1 security=apparmor $ONIE_PLATFORM_EXTRA_CMDLINE_LINUX - echo 'Loading $demo_volume_revision_label $demo_type initial ramdisk ...' - initrd /boot/initrd.img-3.16.0-4-amd64 + echo 'Loading $demo_volume_label $demo_type initial ramdisk ...' + initrd /$image_dir/boot/initrd.img-3.16.0-4-amd64 } EOF -# Add menu entries for ONIE -- use the grub fragment provided by the -# ONIE distribution. -$onie_root_dir/grub.d/50_onie_grub >> $grub_cfg +if [ "$install_env" != "sonic" ]; then + # Add menu entries for ONIE -- use the grub fragment provided by the + # ONIE distribution. + $onie_root_dir/grub.d/50_onie_grub >> $grub_cfg + mkdir -p $onie_initrd_tmp/$demo_mnt/grub +else +cat <> $grub_cfg +$old_sonic_menuentry +$onie_menuentry +EOF +fi -mkdir -p $onie_initrd_tmp/$demo_mnt/grub cp $grub_cfg $onie_initrd_tmp/$demo_mnt/grub/grub.cfg cd / -echo "Installed SONiC base image $demo_volume_revision_label successfully" +echo "Installed SONiC base image $demo_volume_label successfully" diff --git a/onie-mk-demo.sh b/onie-mk-demo.sh index 8997fa8c8317..91d6d1b3ceb2 100755 --- a/onie-mk-demo.sh +++ b/onie-mk-demo.sh @@ -12,7 +12,7 @@ installer_dir=$4 platform_conf=$5 output_file=$6 demo_type=$7 -git_revision=$8 +image_version=$8 onie_image_part_size=$9 shift 9 @@ -29,7 +29,7 @@ if [ ! -d $installer_dir/$arch ] || \ exit 1 fi -[ -n "$git_revision" ] || { +[ -n "$image_version" ] || { echo "Error: Invalid git revisions" exit 1 } @@ -85,7 +85,7 @@ EXTRA_CMDLINE_LINUX=`echo $EXTRA_CMDLINE_LINUX | sed -e 's/[\/&]/\\\&/g'` # Tailor the demo installer for OS mode or DIAG mode sed -i -e "s/%%DEMO_TYPE%%/$demo_type/g" \ - -e "s/%%GIT_REVISION%%/$git_revision/g" \ + -e "s/%%IMAGE_VERSION%%/$image_version/g" \ -e "s/%%ONIE_IMAGE_PART_SIZE%%/$onie_image_part_size/" \ -e "s/%%EXTRA_CMDLINE_LINUX%%/$EXTRA_CMDLINE_LINUX/" \ $tmp_installdir/install.sh || clean_up 1 From ced39ccb4cfa5db3e5a5f73c13d9bb9730345157 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Sat, 22 Apr 2017 21:04:07 -0700 Subject: [PATCH 0466/1011] [swss]: Update submodule (#529) - [portsortch]: Convert the oper_status to string and remove oper_status in portsyncd - [routeorch]: Remove the logic of deciding if to add temp route or not Signed-off-by: stcheng --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 5ae03edfca8c..93dd3e938024 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 5ae03edfca8c0baac3d2a78e4cf494c306bbc506 +Subproject commit 93dd3e938024619ab1b35aacba343ba4a54bd423 From 34adb715df75b279ea597a6c1d8d5a120bcd9726 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 24 Apr 2017 13:39:29 -0700 Subject: [PATCH 0467/1011] [oneimage]: use loop variable to get image dir in /proc/cmdline for aboot image (#534) --- files/initramfs-tools/arista-convertfs.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/initramfs-tools/arista-convertfs.j2 b/files/initramfs-tools/arista-convertfs.j2 index 8a1adda583a1..7f873e7771f3 100644 --- a/files/initramfs-tools/arista-convertfs.j2 +++ b/files/initramfs-tools/arista-convertfs.j2 @@ -117,7 +117,7 @@ for x in "$@"; do varlog_size=*) varlog_size="${x#varlog_size=}" ;; - image_dir=*) + loop=*) x1="${x#loop=}" image_dir="${x1%/*}" esac From f28790ce9a1d9416df21c38bd07f3512e674c046 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 24 Apr 2017 17:55:05 -0700 Subject: [PATCH 0468/1011] [System logs]: Fix logrotate bugs (#535) - rsyslog logs were being rotated regardless of whether they exceeded their maixmum size. This was due to "-f" flag passed to logrotate in cron job. - After rotation, /var/log/syslog was never written to again. Instead, logs were written to /var/log/syslog.1. This was due to rsyslog not properly closing the file descriptor to the pre-rotated log. - Also brought back time-related rotation via the new(er) maxsize option, which performs a boolean OR operation. If the log exceeds the maxsize OR the log hasn't been rotated in the specified, it will be rotated. Using the older size option, the time-based rotation was ignored. - Also addresses issue #528 --- files/image_config/cron.d/logrotate | 2 +- files/image_config/logrotate.d/rsyslog | 20 +++++++++++++------- files/image_config/systemd/journald.conf | 4 ++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/files/image_config/cron.d/logrotate b/files/image_config/cron.d/logrotate index e7813aa1f57b..877e0cb6d5d7 100644 --- a/files/image_config/cron.d/logrotate +++ b/files/image_config/cron.d/logrotate @@ -1,3 +1,3 @@ # Attempt to rotate system logs once per minute -* * * * * root /usr/sbin/logrotate -f /etc/logrotate.d/rsyslog +* * * * * root /usr/sbin/logrotate /etc/logrotate.d/rsyslog diff --git a/files/image_config/logrotate.d/rsyslog b/files/image_config/logrotate.d/rsyslog index c09604187f7f..0d03e906c9b8 100644 --- a/files/image_config/logrotate.d/rsyslog +++ b/files/image_config/logrotate.d/rsyslog @@ -3,16 +3,18 @@ /var/log/teamd.log { rotate 7 -# Removed 'daily' interval, as we now call logrotate more frequently via cron -# and we want to check these logs every time -# daily - size 100M + daily + maxsize 100M missingok notifempty compress delaycompress postrotate - invoke-rc.d rsyslog rotate > /dev/null + # Calling kill directly instead of 'service rsyslog rotate >/dev/null' due + # to bug in init-system-helpers. Bug has apparently been fixed in v1.47. + # However, Debian Jessie is still using v1.22. + # See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=672218 + kill -HUP $(cat /var/run/rsyslogd.pid) endscript } /var/log/mail.info @@ -30,14 +32,18 @@ { rotate 4 weekly - size 100M + maxsize 100M missingok notifempty compress delaycompress sharedscripts postrotate - invoke-rc.d rsyslog rotate > /dev/null + # Calling kill directly instead of 'service rsyslog rotate >/dev/null' due + # to bug in init-system-helpers. Bug has apparently been fixed in v1.47. + # However, Debian Jessie is still using v1.22. + # See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=672218 + kill -HUP $(cat /var/run/rsyslogd.pid) endscript } diff --git a/files/image_config/systemd/journald.conf b/files/image_config/systemd/journald.conf index fc6c4a4e7a1a..c32fbae57051 100644 --- a/files/image_config/systemd/journald.conf +++ b/files/image_config/systemd/journald.conf @@ -15,10 +15,10 @@ #SyncIntervalSec=5m #RateLimitInterval=30s #RateLimitBurst=1000 -SystemMaxUse=50MB +SystemMaxUse=50M #SystemKeepFree= #SystemMaxFileSize= -RuntimeMaxUse=50MB +RuntimeMaxUse=50M #RuntimeKeepFree= #RuntimeMaxFileSize= #MaxRetentionSec= From 035b08b9c4588f62662a14f7e3081a72dd461325 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 25 Apr 2017 16:53:17 +0300 Subject: [PATCH 0469/1011] [installer]: Add support for grub-set-default. (#532) Its needed for Azure/sonic-utilities#40 for user to set default image for boot. grub-set-default utility writes to value of saved_entry variable to grubenv. https://www.gnu.org/software/grub/manual/legacy/Invoking-grub_002dset_002ddefault.html This patch provides support for grub-set-default to allow user choose a default image to boot from. Signed-off-by: marian-pritsak --- installer/x86_64/install.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index e08895524625..451edbe3f379 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -489,11 +489,14 @@ set timeout=5 EOF -# Add the logic to support grub-reboot +# Add the logic to support grub-reboot and grub-set-default cat <> $grub_cfg if [ -s \$prefix/grubenv ]; then load_env fi +if [ "\${saved_entry}" ] ; then + set default="\${saved_entry}" +fi if [ "\${next_entry}" ] ; then set default="\${next_entry}" set next_entry= From 147b89fa43feeb4c4765a54b6b02032fe25db9ca Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 25 Apr 2017 11:07:54 -0700 Subject: [PATCH 0470/1011] [sonic-utilities]: update sonic-utilities to use redis-load-dump to dump redis db data (#530) --- files/build_templates/sonic_debian_extension.j2 | 1 + src/sonic-utilities | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 16a25d2c3efc..94f8292fb955 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -69,6 +69,7 @@ sudo rm -rf $FILESYSTEM_ROOT/$CONFIG_ENGINE_WHEEL_NAME # Install Python client for Redis sudo LANG=C chroot $FILESYSTEM_ROOT pip install redis +sudo LANG=C chroot $FILESYSTEM_ROOT pip install redis-dump-load # Install SwSS SDK Python 2 package SWSSSDK_PY2_WHEEL_NAME=$(basename {{swsssdk_py2_wheel_path}}) diff --git a/src/sonic-utilities b/src/sonic-utilities index 45a8d387ab55..11db86112b51 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 45a8d387ab550153d90bd5964ffe534b0dbd65a2 +Subproject commit 11db86112b512bf116dea293dedafe08be318505 From d597418b6c1a13c632f65fc34335a6a663e80c4d Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 26 Apr 2017 11:41:18 +0300 Subject: [PATCH 0471/1011] [rc.local]: Copy saved minigraph if available. (#533) * [rc.local]: Copy saved minigraph if available. In case of sonic-to-sonic update old image stores minigraph under /host directory. Upon first boot this minigraph will be used by new image to save configuration. Signed-off-by: marian-pritsak --- files/image_config/platform/rc.local | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index ee593aab88ae..26f59bf94aad 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -29,7 +29,12 @@ if [ -f /host/image-$sonic_version/platform/firsttime ]; then exit 0 fi - cp /usr/share/sonic/device/$platform/minigraph.xml /etc/sonic/ + # Try to take minigraph saved during installation + if [ -f /host/minigraph.xml ]; then + mv /host/minigraph.xml /etc/sonic/ + else + cp /usr/share/sonic/device/$platform/minigraph.xml /etc/sonic/ + fi if [ -d /host/image-$sonic_version/platform/$platform ]; then dpkg -i /host/image-$sonic_version/platform/$platform/*.deb From 0bb66ddf0c05c3e1558ef45207759bfa0c5f3b27 Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Wed, 26 Apr 2017 06:12:07 -0700 Subject: [PATCH 0472/1011] [sonic-utilities]:update submodules (#537) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 11db86112b51..9ea7ae4e2e76 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 11db86112b512bf116dea293dedafe08be318505 +Subproject commit 9ea7ae4e2e76b3273a2bcf12b7434a190bba85fb From 3223996404c33c9e5587106090b423a2e9092a0e Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 26 Apr 2017 06:12:23 -0700 Subject: [PATCH 0473/1011] [Broadcom]: Update debian package versions (#538) - libsaibcm 2.1.5.1-3 Signed-off-by: Shuotian Cheng --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index c273db78a58e..7b409f381433 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-2-20170419194756.21_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-2-20170419194756.21_amd64.deb?sv=2015-04-05&sr=b&sig=On9N1tlOSbYj%2Fb0JudmUjYRTbvS5cvqcGJUEIDX8wzk%3D&se=2030-12-27T20%3A56%3A24Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-3-20170426013947.22_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-3-20170426013947.22_amd64.deb?sv=2015-04-05&sr=b&sig=nhMTShwA1OeKoLNWcIY0wMyuiDSdKYWTH%2BJGlr%2BpgU4%3D&se=2031-01-03T01%3A43%3A35Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-2-20170419194756.21_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-3-20170426013947.22_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-2-20170419194756.21_amd64.deb?sv=2015-04-05&sr=b&sig=iVQRbQUTmeKqd01pMMR%2FIwlEUsAeiGIxCrqfr24lQ8k%3D&se=2030-12-27T20%3A57%3A08Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-3-20170426013947.22_amd64.deb?sv=2015-04-05&sr=b&sig=c4%2B6zRDuA%2BTeLr3MPkAqsuvG%2BAg9cd7ffgpp2mhl9bM%3D&se=2031-01-03T01%3A43%3A08Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From ce663baa1090f0bdbdbada72d2520213ff69b183 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Wed, 26 Apr 2017 18:32:23 +0300 Subject: [PATCH 0474/1011] Update MLNX SAI revision reference (#540) This fixes https://github.com/Azure/sonic-swss/issues/191 --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 163e298553f8..461f3d904a82 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = 161120 -MLNX_SAI_REVISION = 1a4307f0ac40b28cd8ed8f48569458212d90366e +MLNX_SAI_REVISION = d84b9fd043039a8107151750299e6e510e648ed6 export MLNX_SAI_VERSION MLNX_SAI_REVISION From d083d7e79cd9614a8874a0301ff7466ee244de34 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 26 Apr 2017 11:09:58 -0700 Subject: [PATCH 0475/1011] [database]: Remove hard/soft limits for client-output-buffer in redis (#539) * Remove hard/soft limits for client-output-buffer in redis Otherwise when we have a lot of updates from orchagent to syncd latter one can't process queues fast enough and redic-database disconnect both orchagent and syncd. orchagent and syncd doesn't have logic to deal with it and just crash --- dockers/docker-database/Dockerfile.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index a213dd079062..17a416dae69d 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -28,7 +28,8 @@ RUN sed -ri 's/^(save .*$)/# \1/g; s/^daemonize yes$/daemonize no/; \ s/^logfile .*$/logfile ""/; \ s/^# syslog-enabled no$/syslog-enabled no/; \ - s/^# unixsocket/unixsocket/ \ + s/^# unixsocket/unixsocket/; \ + s/^client-output-buffer-limit pubsub [0-9]+mb [0-9]+mb [0-9]+/client-output-buffer-limit pubsub 0 0 0/ \ ' /etc/redis/redis.conf ENTRYPOINT ["/usr/bin/redis-server", "/etc/redis/redis.conf"] From eed3be9b34827cc8104053de3c9525f65fd245dc Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 27 Apr 2017 05:31:33 +0300 Subject: [PATCH 0476/1011] [mellanox]: Update hw-management to V1.0.0070 (#541) Fixed temp_max attribute in ASIC driver Fixed PSU driver load for SN2100 and SN2700 platforms Signed-off-by: marian-pritsak --- platform/mellanox/hw-management.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk index 47863d180dbf..83c7632376f0 100644 --- a/platform/mellanox/hw-management.mk +++ b/platform/mellanox/hw-management.mk @@ -1,6 +1,6 @@ # Mellanox HW Management -MLNX_HW_MANAGEMENT_VERSION = V1.0.0030 +MLNX_HW_MANAGEMENT_VERSION = V1.0.0070 export MLNX_HW_MANAGEMENT_VERSION From f9b88e19e6bced39561e9c2755d84f7beba4c689 Mon Sep 17 00:00:00 2001 From: Roy Lee Date: Thu, 27 Apr 2017 10:32:01 +0800 Subject: [PATCH 0477/1011] [Accton]as7512-32x: change console speed to be 115200 as BIOS's & ONIE's in default. (#536) --- device/accton/x86_64-accton_as7512_32x-r0/installer.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/accton/x86_64-accton_as7512_32x-r0/installer.conf b/device/accton/x86_64-accton_as7512_32x-r0/installer.conf index 9b49af780817..14404194ef53 100644 --- a/device/accton/x86_64-accton_as7512_32x-r0/installer.conf +++ b/device/accton/x86_64-accton_as7512_32x-r0/installer.conf @@ -1,3 +1,3 @@ CONSOLE_PORT=0x2f8 CONSOLE_DEV=1 -CONSOLE_SPEED=9600 +CONSOLE_SPEED=115200 From 03cd2cef78205950ec916400f706d84057b32eef Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 26 Apr 2017 22:19:31 -0700 Subject: [PATCH 0478/1011] [Broadcom]: Update broacom SAI to 2.1.5.1-4 and opennsl to 3.2.2.2-3 (#543) --- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 7b409f381433..40e2e383408e 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-3-20170426013947.22_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-3-20170426013947.22_amd64.deb?sv=2015-04-05&sr=b&sig=nhMTShwA1OeKoLNWcIY0wMyuiDSdKYWTH%2BJGlr%2BpgU4%3D&se=2031-01-03T01%3A43%3A35Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-4~20170427032904.25_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-4~20170427032904.25_amd64.deb?sv=2015-04-05&sr=b&sig=NqmcwFHarhYwoV6WTou8wGbEMCoXZUdPXuegPUDpwU0%3D&se=2154-03-20T05%3A16%3A44Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-3-20170426013947.22_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-4~20170427032904.25_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-3-20170426013947.22_amd64.deb?sv=2015-04-05&sr=b&sig=c4%2B6zRDuA%2BTeLr3MPkAqsuvG%2BAg9cd7ffgpp2mhl9bM%3D&se=2031-01-03T01%3A43%3A08Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-4~20170427032904.25_amd64.deb?sv=2015-04-05&sr=b&sig=8RErjP5TGdXqENcTbVrgQbvVAexMt4b%2BjU2BXFb4%2B0M%3D&se=2154-03-20T05%3A16%3A07Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 0feff914f6bb..81da4554d16e 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.2.2-2-20170413185612.27_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-2-20170413185612.27_amd64.deb?sv=2015-04-05&sr=b&sig=xEbASK6Jiug8I%2BaJFphRnuH4cOEgxIyAkhj6rGKfsOE%3D&se=2030-12-21T22%3A05%3A31Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.2.2-3~20170427022824.31_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-3~20170427022824.31_amd64.deb?sv=2015-04-05&sr=b&sig=z7AoBMtlWjYNEv0q3lTN47mb9OIur4HuUTClUVJWawU%3D&se=2154-03-20T05%3A14%3A41Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-2-20170413185612.27_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-2-20170413185612.27_amd64.deb?sv=2015-04-05&sr=b&sig=i%2F4NXu0wzMSAQjDcQTg%2FtpULn5%2Fn%2FVgLu3Lg24QMQM0%3D&se=2030-12-21T22%3A06%3A49Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-3~20170427022824.31_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-3~20170427022824.31_amd64.deb?sv=2015-04-05&sr=b&sig=j3TJGtIudpIFDe6ethxEHdW8j4KALG2GTAaRSMN37CM%3D&se=2154-03-20T05%3A15%3A21Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From cc9a7982edfb9c8c80271d82d1aa0b7c3e0da446 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 27 Apr 2017 13:03:06 -0700 Subject: [PATCH 0479/1011] Update SAI submodule version (#547) --- src/SAI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SAI b/src/SAI index 0bbb902ec226..499ad7272264 160000 --- a/src/SAI +++ b/src/SAI @@ -1 +1 @@ -Subproject commit 0bbb902ec226a5097a8dfcc6e80b547cf2831187 +Subproject commit 499ad727226405b425473d6ed170c3bee1112cca From dfa72077c9f6ee0e27fd50f8bf306d03cb2c1254 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 27 Apr 2017 15:59:46 -0700 Subject: [PATCH 0480/1011] [swss]: Update submodule (#546) - [aclorch]: Fix ACL range attribute enabling (#197) - [aclorch]: Fix the space and change the log level to INFO Signed-off-by: Shuotian Cheng --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 93dd3e938024..32cd0ea58fb5 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 93dd3e938024619ab1b35aacba343ba4a54bd423 +Subproject commit 32cd0ea58fb5f9c7fa2a4ea24370dbc80af3bf71 From b097492b8fd15c4b9eb67b1046a1d31f8d687a34 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 27 Apr 2017 16:07:04 -0700 Subject: [PATCH 0481/1011] [thrift]: Disable auto test in the package build (#545) --- src/thrift/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/thrift/Makefile b/src/thrift/Makefile index 2b450e52d4c1..2a4f67b9175b 100644 --- a/src/thrift/Makefile +++ b/src/thrift/Makefile @@ -20,7 +20,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : dpkg-source -x thrift_$(THRIFT_VERSION_FULL).dsc pushd thrift-$(THRIFT_VERSION) patch -p1 < ../patch/THRIFT-3577-assertion-failed.patch - dpkg-buildpackage -d -rfakeroot -b -us -uc + DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -d -rfakeroot -b -us -uc popd mv $(DERIVED_TARGETS) $* $(DEST)/ From f98e2f50821e715b97ff5095b57fb66132ae9c91 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Fri, 28 Apr 2017 19:03:21 +0300 Subject: [PATCH 0482/1011] [sonic-utilities]: Update submodule (#549) New revision includes sonic_installer utility. Signed-off-by: marian-pritsak --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 9ea7ae4e2e76..790aa8380d2f 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 9ea7ae4e2e76b3273a2bcf12b7434a190bba85fb +Subproject commit 790aa8380d2fb8fce0097a27556a415e69441f14 From 9dd996b3e9aea8ea04d35a51e97c796b839442a1 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 28 Apr 2017 11:20:40 -0700 Subject: [PATCH 0483/1011] Update py-swsssdk (#552) --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index ebb5ec6870ac..4cf7a59a5ffa 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit ebb5ec6870acccfde267e513d68d107873b0960e +Subproject commit 4cf7a59a5ffa74784f8067484b0dbee51433c184 From 8255c9d8ede6401968addbb3f708f56b50b4a210 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Fri, 28 Apr 2017 23:15:08 +0300 Subject: [PATCH 0484/1011] Temporary Revert "Update MLNX SAI revision reference (#540)" (#551) This reverts commit ce663baa1090f0bdbdbada72d2520213ff69b183. Revert due to issue in MLNX SAI: https://github.com/Azure/sonic-swss/issues/199 --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 461f3d904a82..163e298553f8 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = 161120 -MLNX_SAI_REVISION = d84b9fd043039a8107151750299e6e510e648ed6 +MLNX_SAI_REVISION = 1a4307f0ac40b28cd8ed8f48569458212d90366e export MLNX_SAI_VERSION MLNX_SAI_REVISION From e2a22407b0ab65f5727615b8453303fdd723577d Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Sat, 29 Apr 2017 00:40:19 +0300 Subject: [PATCH 0485/1011] [device]: Add support for Mellanox MSN2100 (#544) * [device]: Add support for Mellanox MSN2100 MSN2100 runs on Spectrum silicon and has 16 100GbE ports. Signed-off-by: marian-pritsak --- .../ACS-MSN2100/port_config.ini | 17 + .../ACS-MSN2100/sai.profile | 1 + .../x86_64-mlnx_msn2100-r0/hw-management | 1 + .../x86_64-mlnx_msn2100-r0/installer.conf | 1 + .../x86_64-mlnx_msn2100-r0/minigraph.xml | 578 ++++++++++++++++++ .../x86_64-mlnx_msn2100-r0/plugins/eeprom.py | 33 + .../x86_64-mlnx_msn2100-r0/plugins/sfputil.py | 28 + .../x86_64-mlnx_msn2100-r0/sensors.conf | 21 + 8 files changed, 680 insertions(+) create mode 100644 device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/port_config.ini create mode 100644 device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/sai.profile create mode 120000 device/mellanox/x86_64-mlnx_msn2100-r0/hw-management create mode 100644 device/mellanox/x86_64-mlnx_msn2100-r0/installer.conf create mode 100644 device/mellanox/x86_64-mlnx_msn2100-r0/minigraph.xml create mode 100644 device/mellanox/x86_64-mlnx_msn2100-r0/plugins/eeprom.py create mode 100644 device/mellanox/x86_64-mlnx_msn2100-r0/plugins/sfputil.py create mode 100644 device/mellanox/x86_64-mlnx_msn2100-r0/sensors.conf diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/port_config.ini b/device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/port_config.ini new file mode 100644 index 000000000000..c792a4114b9c --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/port_config.ini @@ -0,0 +1,17 @@ +# name lanes +Ethernet0 0,1,2,3 +Ethernet4 4,5,6,7 +Ethernet8 8,9,10,11 +Ethernet12 12,13,14,15 +Ethernet16 16,17,18,19 +Ethernet20 20,21,22,23 +Ethernet24 24,25,26,27 +Ethernet28 28,29,30,31 +Ethernet32 32,33,34,35 +Ethernet36 36,37,38,39 +Ethernet40 40,41,42,43 +Ethernet44 44,45,46,47 +Ethernet48 48,49,50,51 +Ethernet52 52,53,54,55 +Ethernet56 56,57,58,59 +Ethernet60 60,61,62,63 diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/sai.profile b/device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/sai.profile new file mode 100644 index 000000000000..d2a9fac29a5e --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/ACS-MSN2100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sai_2100.xml diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/hw-management b/device/mellanox/x86_64-mlnx_msn2100-r0/hw-management new file mode 120000 index 000000000000..daef0037ddae --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/hw-management @@ -0,0 +1 @@ +/etc/mlnx/msn2100 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/installer.conf b/device/mellanox/x86_64-mlnx_msn2100-r0/installer.conf new file mode 100644 index 000000000000..c9c9493a5404 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/installer.conf @@ -0,0 +1 @@ +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="acpi_enforce_resources=lax acpi=noirq" diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/minigraph.xml b/device/mellanox/x86_64-mlnx_msn2100-r0/minigraph.xml new file mode 100644 index 000000000000..859c22a7dac3 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/minigraph.xml @@ -0,0 +1,578 @@ + + + + + + switch2 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + switch2 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + switch2 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + switch2 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + switch2 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + switch2 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + switch2 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + switch2 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + switch2 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + switch2 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + switch2 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + switch2 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + switch2 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + switch2 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + switch2 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + switch2 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch2 + + +
10.0.0.1
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 65200 + ARISTA01T2 + + + + 65200 + ARISTA02T2 + + + + 65200 + ARISTA03T2 + + + + 65200 + ARISTA04T2 + + + + 65200 + ARISTA05T2 + + + + 65200 + ARISTA06T2 + + + + 65200 + ARISTA07T2 + + + + 65200 + ARISTA08T2 + + + + 65200 + ARISTA09T2 + + + + 65200 + ARISTA10T2 + + + + 65200 + ARISTA11T2 + + + + 65200 + ARISTA12T2 + + + + 65200 + ARISTA13T2 + + + + 65200 + ARISTA14T2 + + + + 65200 + ARISTA15T2 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch2 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet60 + 10.0.0.30/31 + + + + + + + + + + + + DeviceInterfaceLink + switch2 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet60 + ARISTA16T2 + Ethernet1 + + + + + switch2 + ACS-MSN2700 + + ` + + + + + switch2 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + + switch2 + ACS-MSN2100 +
diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/eeprom.py new file mode 100644 index 000000000000..d792d1770367 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/eeprom.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + _TLV_INFO_MAX_LEN = 256 + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/bsp/eeprom/sys_eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/sfputil.py new file mode 100644 index 000000000000..c6628e66e419 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/sfputil.py @@ -0,0 +1,28 @@ +#! /usr/bin/python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 15 + ports_in_block = 16 + + eeprom_offset = 1 + + port_to_eeprom_mapping = {} + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/bsp/qsfp/qsfp{0}' + for x in range(0, self.port_end + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) + sfputilbase.__init__(self, port_num) + diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/sensors.conf b/device/mellanox/x86_64-mlnx_msn2100-r0/sensors.conf new file mode 100644 index 000000000000..a3e30391863e --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/sensors.conf @@ -0,0 +1,21 @@ +bus "i2c-7" "i2c-1-mux (chan_id 5)" +chip "lm75-i2c-7-4a" + label temp1 "Ambient Port Temp" + +bus "i2c-5" "i2c-1-mux (chan_id 3)" +chip "ucd9200-i2c-5-27" + label in1 "UCD1 vin" + label in2 "ASIC 3.3 vout" + label in3 "ASIC 1.2 vout" + label temp1 "UCD1 Temp" + label temp2 "UCD1 Temp2" + +chip "ucd9200-i2c-5-41" + label in1 "UCD2 vin" + label in2 "ASIC Vcore vout" + label temp1 "UCD2 Temp1" + label temp2 "UCD2 Temp2" + +bus "i2c-17" "i2c-1-mux (chan_id 7)" +chip "lm75-i2c-17-49" + label temp1 "Ambient Board Temp" From 14578d50e24f742a86a99a89c1070c0ec83a3cc7 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 28 Apr 2017 22:48:50 -0700 Subject: [PATCH 0486/1011] [docker-syncd-rpc]: Fix the issue which prevented supervisord to start (#555) service syncd start blocks docker-syncd-rpc start.sh script and supervisord doesn't start. so start supervisor in daemon mode --- platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 | 2 +- platform/broadcom/docker-syncd-brcm-rpc/supervisord.conf | 2 +- platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 | 2 +- platform/cavium/docker-syncd-cavm-rpc/supervisord.conf | 2 +- platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 | 2 +- platform/centec/docker-syncd-centec-rpc/supervisord.conf | 2 +- platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 | 2 +- platform/mellanox/docker-syncd-mlnx-rpc/supervisord.conf | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 index c70920274709..cc7c756f801c 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 @@ -50,7 +50,7 @@ RUN apt-get update \ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf -RUN sed -i 's/read/sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord/' /usr/bin/start.sh +RUN sed -i "/service rsyslog start/a sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord" /usr/bin/start.sh ENTRYPOINT ["/bin/bash"] CMD ["/usr/bin/start.sh"] diff --git a/platform/broadcom/docker-syncd-brcm-rpc/supervisord.conf b/platform/broadcom/docker-syncd-brcm-rpc/supervisord.conf index 54296b8b254e..daf9de259d77 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc/supervisord.conf +++ b/platform/broadcom/docker-syncd-brcm-rpc/supervisord.conf @@ -1,2 +1,2 @@ [supervisord] -nodaemon=true +nodaemon=false diff --git a/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 b/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 index 1df6dc7802dd..2688e37833e1 100644 --- a/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 +++ b/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 @@ -50,7 +50,7 @@ RUN apt-get update \ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf -RUN sed -i 's/read/sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord/' /usr/bin/start.sh +RUN sed -i "/service rsyslog start/a sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord" /usr/bin/start.sh ENTRYPOINT ["/bin/bash"] CMD ["/usr/bin/start.sh"] diff --git a/platform/cavium/docker-syncd-cavm-rpc/supervisord.conf b/platform/cavium/docker-syncd-cavm-rpc/supervisord.conf index 54296b8b254e..daf9de259d77 100644 --- a/platform/cavium/docker-syncd-cavm-rpc/supervisord.conf +++ b/platform/cavium/docker-syncd-cavm-rpc/supervisord.conf @@ -1,2 +1,2 @@ [supervisord] -nodaemon=true +nodaemon=false diff --git a/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 index a0384c14f571..2199e85d85d1 100644 --- a/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 +++ b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 @@ -50,7 +50,7 @@ RUN apt-get update \ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf -RUN sed -i 's/read/sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord/' /usr/bin/start.sh +RUN sed -i "/service rsyslog start/a sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord" /usr/bin/start.sh ENTRYPOINT ["/bin/bash"] CMD ["/usr/bin/start.sh"] diff --git a/platform/centec/docker-syncd-centec-rpc/supervisord.conf b/platform/centec/docker-syncd-centec-rpc/supervisord.conf index 54296b8b254e..daf9de259d77 100644 --- a/platform/centec/docker-syncd-centec-rpc/supervisord.conf +++ b/platform/centec/docker-syncd-centec-rpc/supervisord.conf @@ -1,2 +1,2 @@ [supervisord] -nodaemon=true +nodaemon=false diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 index c8b312b1c677..3a4b4784babd 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 @@ -50,7 +50,7 @@ RUN apt-get update \ COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf -RUN sed -i 's/read/sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord/' /usr/bin/start.sh +RUN sed -i "/service rsyslog start/a sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord" /usr/bin/start.sh ENTRYPOINT ["/bin/bash"] CMD ["/usr/bin/start.sh"] diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/supervisord.conf b/platform/mellanox/docker-syncd-mlnx-rpc/supervisord.conf index 54296b8b254e..daf9de259d77 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/supervisord.conf +++ b/platform/mellanox/docker-syncd-mlnx-rpc/supervisord.conf @@ -1,2 +1,2 @@ [supervisord] -nodaemon=true +nodaemon=false From b488c0874d40fbe5bfc67c0cb729ab4dc0ca1684 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Sat, 29 Apr 2017 00:14:53 -0700 Subject: [PATCH 0487/1011] [submodule]: Update submodule sonic-swss-common (#556) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 46c455bd2c88..7ae13ca7a973 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 46c455bd2c887f04cdbc1b3adb7263bad97afa51 +Subproject commit 7ae13ca7a973db9e6caf0dbd9e2028f77dd95fd7 From c7d540cb2fba555f4370a50641a2c99c578d510e Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Sat, 29 Apr 2017 00:15:12 -0700 Subject: [PATCH 0488/1011] [ptf]: Add pip install pysubnettree (#554) >> import SubnetTree This module is used for PTF FIB test to build LPM --- dockers/docker-ptf/Dockerfile.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 3f2f1cad8276..5ae6847c265c 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -67,6 +67,7 @@ RUN rm -rf /debs \ && pip install nnpy \ && pip install dpkt \ && pip install ipaddress \ + && pip install pysubnettree \ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py From 611de29ef71680326fd022ade83351dadaaf4578 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 1 May 2017 15:12:11 -0700 Subject: [PATCH 0489/1011] Relocate syncd.conf from hwsku directory to platform directory (#559) --- .../{INGRASYS-S9100-C32 => }/syncd.conf | 0 src/sonic-sairedis | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename device/ingrasys/x86_64-ingrasys_s9100-r0/{INGRASYS-S9100-C32 => }/syncd.conf (100%) diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/syncd.conf b/device/ingrasys/x86_64-ingrasys_s9100-r0/syncd.conf similarity index 100% rename from device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/syncd.conf rename to device/ingrasys/x86_64-ingrasys_s9100-r0/syncd.conf diff --git a/src/sonic-sairedis b/src/sonic-sairedis index f041648f874f..9fe1e696c6a9 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit f041648f874f21d2cd4a7255c9b3bb8870557e36 +Subproject commit 9fe1e696c6a9b5e99406ff2548c6f52db4e0b604 From 72a039b1deb68e0c8617b296b55b5bcf0f042937 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 1 May 2017 15:16:33 -0700 Subject: [PATCH 0490/1011] [aboot]: refactor boot0.j2 to support one image SONiC-to-SONiC upgrade (#557) * [aboot]: refactor boot0.j2 to support one image upgrade * support sonic_installer in aboot --- files/Aboot/boot0.j2 | 39 ++++++++++++++++++++++----------------- src/sonic-utilities | 2 +- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 42bf0719bff9..eca3db743131 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -24,7 +24,7 @@ kernel_params=kernel-params aboot_machine="arista_unknown" -target_path=/mnt/flash +[ -z "$target_path" ] && target_path=/mnt/flash image_path="$target_path/image-%%IMAGE_VERSION%%" # expect the swi to be a non empty file @@ -41,15 +41,18 @@ parse_environment_config() { done } -extract_image() { +clean_flash() { ## Remove all the other unnecssary files except swi file, boot-config for f in $(ls -A $target_path); do if [ $f != "${swipath##*/}" ] && [ $f != "boot-config" ]; then rm -rf "$target_path/$f" fi done +} + +extract_image() { - mkdir "$image_path" + mkdir -p "$image_path" ## Unzip the image unzip -oq "$swipath" -x boot0 -d "$image_path" @@ -58,10 +61,10 @@ extract_image() { rm -f $swipath ## detect rootfs type - rootfs_type=`grep /mnt/flash /proc/mounts | cut -d' ' -f3` + rootfs_type=`grep " $target_path " /proc/mounts | cut -d' ' -f3` ## vfat does not support symbol link - if [ $rootfs_type != "vfat" ]; then + if [ -n "$sonic_upgrade" ] || [ "$rootfs_type" != "vfat" ]; then mkdir -p "$image_path/{{ DOCKERFS_DIR }}" ## extract docker archive @@ -70,15 +73,12 @@ extract_image() { ## clean up docker archive rm -f "$image_path/{{ FILESYSTEM_DOCKERFS }}" else - echo "/mnt/flash is $rootfs_type, extract {{ FILESYSTEM_DOCKERFS }} in later stage" + echo "$target_path is $rootfs_type, extract {{ FILESYSTEM_DOCKERFS }} in later stage" fi ## use new reduced-size boot swi echo "SWI=flash:image-%%IMAGE_VERSION%%/{{ ABOOT_BOOT_IMAGE }}" > "$target_path/boot-config" - ## remove original boot swi - rm -f "$swipath" - ## sync disk operations sync } @@ -120,6 +120,17 @@ platform_specific() { fi } +# check the hash file in the image, and determine to install or just skip +GIT_REVISION=$(unzip -p "$swipath" .imagehash) +LOCAL_IMAGEHASH=$(cat $image_path/.imagehash 2>/dev/null || true) +if [ "$GIT_REVISION" != "$LOCAL_IMAGEHASH" ]; then + [ -z "$sonic_upgrade" ] && clean_flash + extract_image +fi + +[ -z "$sonic_upgrade" ] || exit 0 + +# build the new cmdline echo "$append" >/tmp/append parse_environment_config >>/tmp/append cat /etc/cmdline | sed "/^\(${bootconfigvars// /\|}\|crashkernel\|loglevel\|ignore_loglevel\)\(\$\|=\)/d;/^\$/d" >>/tmp/append @@ -129,6 +140,8 @@ echo "rw loop=image-%%IMAGE_VERSION%%/fs.squashfs loopfstype=squashfs apparmor=1 # process platform specific operations platform_specific +[ -e ${taget_path}/machine.conf ] || write_machine_config + # use extra parameters from kernel-params hook if the file exists if [ -f "$image_path/$kernel_params" ]; then cat "$image_path/$kernel_params" >>/tmp/append @@ -141,14 +154,6 @@ if ! grep -q "root=" /tmp/append; then echo "root=$rootdev" >>/tmp/append fi -# check the hash file in the image, and determine to install or just skip -GIT_REVISION=$(unzip -p "$swipath" .imagehash) -LOCAL_IMAGEHASH=$(cat $image_path/.imagehash 2>/dev/null || true) -if [ "$GIT_REVISION" != "$LOCAL_IMAGEHASH" ]; then - extract_image - write_machine_config -fi - # chainloading using kexec initrd_path="$image_path/$initrd" kernel_path="$image_path/$kernel" diff --git a/src/sonic-utilities b/src/sonic-utilities index 790aa8380d2f..452df11df5a4 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 790aa8380d2fb8fce0097a27556a415e69441f14 +Subproject commit 452df11df5a47e1d646e5ce846757112b526694f From 052532544c36b9a9b158ba9ac224edc153aadf95 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 1 May 2017 17:36:30 -0700 Subject: [PATCH 0491/1011] [Broadcom]: Update broacom SDK to 3.2.2.2-4 (#561) Signed-off-by: Shuotian Cheng --- platform/broadcom/sdk.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 81da4554d16e..3f87fb350b2f 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.2.2-3~20170427022824.31_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-3~20170427022824.31_amd64.deb?sv=2015-04-05&sr=b&sig=z7AoBMtlWjYNEv0q3lTN47mb9OIur4HuUTClUVJWawU%3D&se=2154-03-20T05%3A14%3A41Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.2.2-4-20170428181434.34_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-4-20170428181434.34_amd64.deb?sv=2015-04-05&sr=b&sig=Izxx7%2ByNMXB11E3rdBuEQNOohGMoDKMCZIsVqfdCjSI%3D&se=2031-01-08T20%3A49%3A30Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-3~20170427022824.31_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-3~20170427022824.31_amd64.deb?sv=2015-04-05&sr=b&sig=j3TJGtIudpIFDe6ethxEHdW8j4KALG2GTAaRSMN37CM%3D&se=2154-03-20T05%3A15%3A21Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-4-20170428181434.34_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-4-20170428181434.34_amd64.deb?sv=2015-04-05&sr=b&sig=18MkouZ0zMum2CzLz7ut8nXmjn36nqCNg2go9ISCwKU%3D&se=2031-01-08T20%3A52%3A39Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 4dfe2a26f3cab17e00e2f3859f83ab58575d63f1 Mon Sep 17 00:00:00 2001 From: maggiemsft Date: Mon, 1 May 2017 18:47:29 -0700 Subject: [PATCH 0492/1011] [docker-ptf]replace ping utility from inetutils-ping to iputils-ping (#523) * replace ping utility from inetutil-ping to iputils-ping * fix dup typo * change from package installing to using apt install * remove unnecessary package handling line --- dockers/docker-ptf/Dockerfile.j2 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 5ae6847c265c..08dd7ede16fb 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -40,7 +40,9 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / wget \ cmake \ libqt5core5a \ - libqt5network5 + libqt5network5 \ + iputils-ping + RUN dpkg -i \ {% for deb in docker_ptf_debs.split(' ') -%} From 54dda14af3fbcfaa6e3260bfb801bf78c8c5459e Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 2 May 2017 06:21:41 -0700 Subject: [PATCH 0493/1011] [swss]: Update swss submodule (#565) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 32cd0ea58fb5..2f594c75036d 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 32cd0ea58fb5f9c7fa2a4ea24370dbc80af3bf71 +Subproject commit 2f594c75036dfd41b6b40dd5b92f4fda7ebb7a68 From d6aef59ee83d5c1f38cae31527ab3d16d7aa4c94 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 2 May 2017 10:34:50 -0700 Subject: [PATCH 0494/1011] [swss-common]: Update swss-common submodule (#564) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 7ae13ca7a973..b3e6f6095962 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 7ae13ca7a973db9e6caf0dbd9e2028f77dd95fd7 +Subproject commit b3e6f60959626a1f915435cd314cba57528d1204 From e90d78a143f157c0bab46621dc8b34d6ba58488f Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 3 May 2017 09:47:40 -0700 Subject: [PATCH 0495/1011] [quagga]: update quagga submodule (#567) --- src/sonic-quagga | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-quagga b/src/sonic-quagga index 77a98c2de5f8..5da3e26ecddf 160000 --- a/src/sonic-quagga +++ b/src/sonic-quagga @@ -1 +1 @@ -Subproject commit 77a98c2de5f80421f1c671d82d3207154eca4ee9 +Subproject commit 5da3e26ecddfec6f5983f34b27056b64f67e09d3 From 1da68f98819932477b21a6a60c32cb1a44a7f395 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 3 May 2017 09:49:45 -0700 Subject: [PATCH 0496/1011] [swss]: update submodule (#568) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 2f594c75036d..cbdc13de86c5 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 2f594c75036dfd41b6b40dd5b92f4fda7ebb7a68 +Subproject commit cbdc13de86c5b7787f29d7cbba6fe2c0b6756f5c From dfe85a0039de39fa2b9cfd099cec19778fdb0087 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 3 May 2017 17:01:27 -0700 Subject: [PATCH 0497/1011] [image]: build debug symbol packages for swss-common, libsairedis, libsaimetadata, syncd, syncd-rpc (#560) --- rules/sairedis.mk | 20 ++++++++++++++++++++ rules/swss-common.mk | 5 +++++ 2 files changed, 25 insertions(+) diff --git a/rules/sairedis.mk b/rules/sairedis.mk index 87838a3aeebe..4a62954f4d1c 100644 --- a/rules/sairedis.mk +++ b/rules/sairedis.mk @@ -23,3 +23,23 @@ $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA))) LIBSAIMETADATA_DEV = libsaimetadata-dev_1.0.0_amd64.deb $(LIBSAIMETADATA_DEV)_DEPENDS += $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DEV))) + +LIBSAIREDIS_DBG = libsairedis-dbg_1.0.0_amd64.deb +$(LIBSAIREDIS_DBG)_DEPENDS += $(LIBSAIREDIS) +$(LIBSAIREDIS_DBG)_RDEPENDS += $(LIBSAIREDIS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DBG))) + +SYNCD_DBG = syncd-dbg_1.0.0_amd64.deb +$(SYNCD_DBG)_DEPENDS += $(SYNCD) +$(SYNCD_DBG)_RDEPENDS += $(SYNCD) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_DBG))) + +SYNCD_RPC_DBG = syncd-rpc-dbg_1.0.0_amd64.deb +$(SYNCD_RPC_DBG)_DEPENDS += $(SYNCD_RPC) +$(SYNCD_RPC_DBG)_RDEPENDS += $(SYNCD_RPC) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_RPC_DBG))) + +LIBSAIMETADATA_DBG = libsaimetadata-dbg_1.0.0_amd64.deb +$(LIBSAIMETADATA_DBG)_DEPENDS += $(LIBSAIMETADATA) +$(LIBSAIMETADATA_DBG)_RDEPENDS += $(LIBSAIMETADATA) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA_DBG))) diff --git a/rules/swss-common.mk b/rules/swss-common.mk index d066714ae3a9..a4ccdafc2376 100644 --- a/rules/swss-common.mk +++ b/rules/swss-common.mk @@ -11,3 +11,8 @@ SONIC_DPKG_DEBS += $(LIBSWSSCOMMON) LIBSWSSCOMMON_DEV = libswsscommon-dev_1.0.0_amd64.deb $(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(LIBSWSSCOMMON_DEV))) + +LIBSWSSCOMMON_DBG = libswsscommon-dbg_1.0.0_amd64.deb +$(LIBSWSSCOMMON_DBG)_DEPENDS += $(LIBSWSSCOMMON) +$(LIBSWSSCOMMON_DBG)_RDEPENDS += $(LIBSWSSCOMMON) +$(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(LIBSWSSCOMMON_DBG))) From 2810f256351e107812a2900b992bfe2cdae09b18 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 5 May 2017 17:19:19 -0700 Subject: [PATCH 0498/1011] [swss]: Update swss/common submodules (#571) Signed-off-by: Shuotian Cheng --- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-swss b/src/sonic-swss index cbdc13de86c5..49c556ce7cdd 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit cbdc13de86c5b7787f29d7cbba6fe2c0b6756f5c +Subproject commit 49c556ce7cdd9a00952cf093191c8c7871b7913e diff --git a/src/sonic-swss-common b/src/sonic-swss-common index b3e6f6095962..bf2dde2b30cb 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit b3e6f60959626a1f915435cd314cba57528d1204 +Subproject commit bf2dde2b30cb33e35c6b55305fa00b99c3b4bac1 From 6cab3bc852654421f7ce0ef18574a3966d1ae9fa Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 5 May 2017 17:44:36 -0700 Subject: [PATCH 0499/1011] Add rotation feature to docker logs (#563) * Add rotation feature to docker logs * Fix: only apply log rotation for json-file log driver --- files/build_templates/docker_image_ctl.j2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 3df04b698ccb..9a1f79c4ed5a 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -11,6 +11,9 @@ start() { else docker run -d {{docker_image_run_opt}} \ +{%- if '--log-driver=json-file' in docker_image_run_opt or '--log-driver' not in docker_image_run_opt %} + --log-opt max-size=2M --log-opt max-file=5 \ +{%- endif %} -v /var/run/redis:/var/run/redis:rw \ -v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \ -v /usr/share/sonic/device/$PLATFORM/$HWSKU:/usr/share/sonic/hwsku:ro \ From 97b4924476543800a449962486e72be260e368e6 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 8 May 2017 11:31:00 -0700 Subject: [PATCH 0500/1011] [Broadcom]: Update broacom SDK to 3.2.2.2-5 and SAI to 2.1.5.1-5 (#570) Signed-off-by: Shuotian Cheng --- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 40e2e383408e..ce9f0a64f4bc 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-4~20170427032904.25_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-4~20170427032904.25_amd64.deb?sv=2015-04-05&sr=b&sig=NqmcwFHarhYwoV6WTou8wGbEMCoXZUdPXuegPUDpwU0%3D&se=2154-03-20T05%3A16%3A44Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-5-20170505222214.31_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-5-20170505222214.31_amd64.deb?sv=2015-04-05&sr=b&sig=jxKRlFJ%2BjDmq6Xi2p1SXc35IVdhsfRoR0umcOnM5Cj8%3D&se=2031-01-12T22%3A43%3A54Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-4~20170427032904.25_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-5-20170505222214.31_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-4~20170427032904.25_amd64.deb?sv=2015-04-05&sr=b&sig=8RErjP5TGdXqENcTbVrgQbvVAexMt4b%2BjU2BXFb4%2B0M%3D&se=2154-03-20T05%3A16%3A07Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-5-20170505222214.31_amd64.deb?sv=2015-04-05&sr=b&sig=HZN4itbQuJXfZCPZx1A%2BSxN3hBxZ05%2FmCE8Lp1zTgXM%3D&se=2031-01-12T22%3A44%3A20Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 3f87fb350b2f..cee7939c730c 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.2.2-4-20170428181434.34_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-4-20170428181434.34_amd64.deb?sv=2015-04-05&sr=b&sig=Izxx7%2ByNMXB11E3rdBuEQNOohGMoDKMCZIsVqfdCjSI%3D&se=2031-01-08T20%3A49%3A30Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.2.2-5-20170505212020.37_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-5-20170505212020.37_amd64.deb?sv=2015-04-05&sr=b&sig=wTWOEP8zJE1Jba3M5n8we4x%2Fcpq39%2B00ORByVHhBOuQ%3D&se=2031-01-12T22%3A42%3A51Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-4-20170428181434.34_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-4-20170428181434.34_amd64.deb?sv=2015-04-05&sr=b&sig=18MkouZ0zMum2CzLz7ut8nXmjn36nqCNg2go9ISCwKU%3D&se=2031-01-08T20%3A52%3A39Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-5-20170505212020.37_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-5-20170505212020.37_amd64.deb?sv=2015-04-05&sr=b&sig=QovFF5suqpKxHqZ01r0BiooKw7ik5Kpk6GU0pxf8xmg%3D&se=2031-01-12T22%3A43%3A24Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 8f348399f591a2e94db08dbb8a459d428e68218f Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 8 May 2017 15:43:31 -0700 Subject: [PATCH 0501/1011] [Dockers]: Manage all Docker containers with Supervisord (#573) - Consolidate config.sh and start.sh scripts into one script (start.sh) - Solve issue #435 - All dockers now run supervisord as their ENTRYPOINT - All stdout/stderr output from processes managed by supervisord is now sent to syslog instead of their own files - Supervisord log messages are now also sent to syslog - Removed unused smartmontools package from docker-platform-monitor --- .gitignore | 9 +- dockers/docker-base/Dockerfile.j2 | 49 ++++++----- dockers/docker-base/{ => etc}/rsyslog.conf | 0 .../docker-base/etc/rsyslog.d/supervisor.conf | 8 ++ dockers/docker-basic_router/Dockerfile | 15 ++-- dockers/docker-basic_router/start.sh | 6 ++ dockers/docker-basic_router/supervisord.conf | 20 +++++ dockers/docker-database/Dockerfile.j2 | 5 +- dockers/docker-database/supervisord.conf | 12 +++ dockers/docker-dhcp-relay/Dockerfile | 17 ++-- dockers/docker-dhcp-relay/config.sh | 4 - dockers/docker-dhcp-relay/isc-dhcp-relay.sh | 19 +++++ dockers/docker-dhcp-relay/start.sh | 9 +- dockers/docker-dhcp-relay/supervisord.conf | 27 ++++++ dockers/docker-fpm-gobgp/Dockerfile.j2 | 12 ++- dockers/docker-fpm-gobgp/config.sh | 17 ---- dockers/docker-fpm-gobgp/start.sh | 26 +++++- dockers/docker-fpm-gobgp/supervisord.conf | 30 ++++++- dockers/docker-fpm-quagga/Dockerfile.j2 | 8 +- dockers/docker-fpm-quagga/config.sh | 17 ---- dockers/docker-fpm-quagga/start.sh | 26 +++++- dockers/docker-fpm-quagga/supervisord.conf | 27 ++++++ dockers/docker-lldp-sv2/Dockerfile.j2 | 11 +-- dockers/docker-lldp-sv2/config.sh | 8 -- dockers/docker-lldp-sv2/start.sh | 14 +++ dockers/docker-lldp-sv2/supervisord.conf | 30 ++++++- dockers/docker-orchagent/Dockerfile.j2 | 14 +-- dockers/docker-orchagent/config.sh | 6 -- dockers/docker-orchagent/orchagent.sh | 80 +++++++++++++++++ dockers/docker-orchagent/start.sh | 85 ++----------------- dockers/docker-orchagent/supervisord.conf | 27 ++++++ dockers/docker-platform-monitor/Dockerfile | 13 ++- dockers/docker-platform-monitor/config.sh | 12 --- dockers/docker-platform-monitor/lm-sensors.sh | 12 +++ dockers/docker-platform-monitor/start.sh | 15 ++++ .../docker-platform-monitor/supervisord.conf | 28 ++++++ dockers/docker-ptf/Dockerfile.j2 | 4 +- dockers/docker-saiserver-brcm/Dockerfile | 6 +- dockers/docker-saiserver-brcm/start.sh | 13 ++- .../docker-saiserver-brcm/supervisord.conf | 27 ++++++ dockers/docker-saiserver-cavm/Dockerfile | 19 +++-- dockers/docker-saiserver-cavm/start.sh | 12 +-- .../docker-saiserver-cavm/supervisord.conf | 27 ++++++ dockers/docker-saiserver-mlnx/Dockerfile | 32 +++---- dockers/docker-saiserver-mlnx/start.sh | 13 ++- .../docker-saiserver-mlnx/supervisord.conf | 27 ++++++ dockers/docker-snmp-sv2/Dockerfile.j2 | 13 ++- dockers/docker-snmp-sv2/config.sh | 16 ---- dockers/docker-snmp-sv2/start.sh | 18 ++++ dockers/docker-snmp-sv2/supervisord.conf | 30 +++++-- dockers/docker-teamd/Dockerfile.j2 | 17 ++-- dockers/docker-teamd/config.sh | 12 --- dockers/docker-teamd/start.sh | 55 ++++-------- dockers/docker-teamd/supervisord.conf | 27 ++++++ dockers/docker-teamd/teamd.sh | 42 +++++++++ .../docker-syncd-brcm-rpc/99-syncd.conf | 2 + .../docker-syncd-brcm-rpc/Dockerfile.j2 | 9 +- .../docker-syncd-brcm-rpc/supervisord.conf | 2 - .../broadcom/docker-syncd-brcm/Dockerfile.j2 | 8 +- platform/broadcom/docker-syncd-brcm/start.sh | 15 +--- .../docker-syncd-brcm/supervisord.conf | 27 ++++++ platform/broadcom/docker-syncd-brcm/syncd.sh | 12 +++ .../docker-syncd-cavm-rpc/99-syncd.conf | 2 + .../docker-syncd-cavm-rpc/Dockerfile.j2 | 10 +-- .../docker-syncd-cavm-rpc/supervisord.conf | 2 - .../cavium/docker-syncd-cavm/Dockerfile.j2 | 6 +- platform/cavium/docker-syncd-cavm/start.sh | 22 +---- .../cavium/docker-syncd-cavm/supervisord.conf | 27 ++++++ platform/cavium/docker-syncd-cavm/syncd.sh | 22 +++++ .../docker-syncd-centec-rpc/99-syncd.conf | 2 + .../docker-syncd-centec-rpc/Dockerfile.j2 | 11 +-- .../docker-syncd-centec-rpc/supervisord.conf | 2 - .../centec/docker-syncd-centec/Dockerfile.j2 | 7 +- platform/centec/docker-syncd-centec/start.sh | 15 +--- .../docker-syncd-centec/supervisord.conf | 27 ++++++ platform/centec/docker-syncd-centec/syncd.sh | 12 +++ .../docker-syncd-mlnx-rpc/99-syncd.conf | 2 + .../docker-syncd-mlnx-rpc/Dockerfile.j2 | 11 +-- .../docker-syncd-mlnx-rpc/supervisord.conf | 2 - .../mellanox/docker-syncd-mlnx/Dockerfile.j2 | 8 +- platform/mellanox/docker-syncd-mlnx/start.sh | 21 +---- .../docker-syncd-mlnx/supervisord.conf | 27 ++++++ platform/mellanox/docker-syncd-mlnx/syncd.sh | 19 +++++ 83 files changed, 985 insertions(+), 475 deletions(-) rename dockers/docker-base/{ => etc}/rsyslog.conf (100%) create mode 100644 dockers/docker-base/etc/rsyslog.d/supervisor.conf create mode 100755 dockers/docker-basic_router/start.sh create mode 100644 dockers/docker-basic_router/supervisord.conf create mode 100644 dockers/docker-database/supervisord.conf delete mode 100755 dockers/docker-dhcp-relay/config.sh create mode 100755 dockers/docker-dhcp-relay/isc-dhcp-relay.sh create mode 100644 dockers/docker-dhcp-relay/supervisord.conf delete mode 100755 dockers/docker-fpm-gobgp/config.sh delete mode 100755 dockers/docker-fpm-quagga/config.sh create mode 100644 dockers/docker-fpm-quagga/supervisord.conf delete mode 100755 dockers/docker-lldp-sv2/config.sh create mode 100755 dockers/docker-lldp-sv2/start.sh delete mode 100755 dockers/docker-orchagent/config.sh create mode 100755 dockers/docker-orchagent/orchagent.sh create mode 100644 dockers/docker-orchagent/supervisord.conf delete mode 100755 dockers/docker-platform-monitor/config.sh create mode 100755 dockers/docker-platform-monitor/lm-sensors.sh create mode 100755 dockers/docker-platform-monitor/start.sh create mode 100644 dockers/docker-platform-monitor/supervisord.conf create mode 100644 dockers/docker-saiserver-brcm/supervisord.conf create mode 100644 dockers/docker-saiserver-cavm/supervisord.conf create mode 100644 dockers/docker-saiserver-mlnx/supervisord.conf delete mode 100755 dockers/docker-snmp-sv2/config.sh create mode 100755 dockers/docker-snmp-sv2/start.sh delete mode 100755 dockers/docker-teamd/config.sh create mode 100644 dockers/docker-teamd/supervisord.conf create mode 100755 dockers/docker-teamd/teamd.sh create mode 100644 platform/broadcom/docker-syncd-brcm-rpc/99-syncd.conf delete mode 100644 platform/broadcom/docker-syncd-brcm-rpc/supervisord.conf create mode 100644 platform/broadcom/docker-syncd-brcm/supervisord.conf create mode 100755 platform/broadcom/docker-syncd-brcm/syncd.sh create mode 100644 platform/cavium/docker-syncd-cavm-rpc/99-syncd.conf delete mode 100644 platform/cavium/docker-syncd-cavm-rpc/supervisord.conf create mode 100644 platform/cavium/docker-syncd-cavm/supervisord.conf create mode 100755 platform/cavium/docker-syncd-cavm/syncd.sh create mode 100644 platform/centec/docker-syncd-centec-rpc/99-syncd.conf delete mode 100644 platform/centec/docker-syncd-centec-rpc/supervisord.conf create mode 100644 platform/centec/docker-syncd-centec/supervisord.conf create mode 100755 platform/centec/docker-syncd-centec/syncd.sh create mode 100644 platform/mellanox/docker-syncd-mlnx-rpc/99-syncd.conf delete mode 100644 platform/mellanox/docker-syncd-mlnx-rpc/supervisord.conf create mode 100644 platform/mellanox/docker-syncd-mlnx/supervisord.conf create mode 100755 platform/mellanox/docker-syncd-mlnx/syncd.sh diff --git a/.gitignore b/.gitignore index 00f97edcec97..481363b1e00a 100644 --- a/.gitignore +++ b/.gitignore @@ -26,15 +26,16 @@ src/thrift/* src/sonic-device-data/src/device/ # Autogenerated Dockerfiles +dockers/docker-base/Dockerfile +dockers/docker-config-engine/Dockerfile dockers/docker-database/Dockerfile -dockers/docker-fpm/Dockerfile +dockers/docker-fpm-frr/Dockerfile +dockers/docker-fpm-gobgp/Dockerfile +dockers/docker-fpm-quagga/Dockerfile dockers/docker-lldp-sv2/Dockerfile dockers/docker-orchagent/Dockerfile dockers/docker-snmp-sv2/Dockerfile -dockers/docker-team/Dockerfile dockers/docker-teamd/Dockerfile -dockers/docker-config-engine/Dockerfile -dockers/docker-base/Dockerfile platform/*/docker-syncd-*/Dockerfile platform/*/docker-syncd-*-rpc/Dockerfile diff --git a/dockers/docker-base/Dockerfile.j2 b/dockers/docker-base/Dockerfile.j2 index 5bdbf8b3d5ae..b014c20a6401 100644 --- a/dockers/docker-base/Dockerfile.j2 +++ b/dockers/docker-base/Dockerfile.j2 @@ -4,36 +4,38 @@ FROM debian:jessie RUN find /usr/share/doc -depth \( -type f -o -type l \) ! -name copyright | xargs rm || true ## Clean doc directories that are empty or only contain empty directories RUN while [ -n "$(find /usr/share/doc -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done -RUN rm -rf \ - /usr/share/man/* \ - /usr/share/groff/* \ - /usr/share/info/* \ - /usr/share/lintian/* \ - /usr/share/linda/* \ - /var/cache/man/* \ - /usr/share/locale/* +RUN rm -rf \ + /usr/share/man/* \ + /usr/share/groff/* \ + /usr/share/info/* \ + /usr/share/lintian/* \ + /usr/share/linda/* \ + /var/cache/man/* \ + /usr/share/locale/* ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -## Set the apt source -COPY sources.list /etc/apt/sources.list -COPY dpkg_01_drop /etc/dpkg/dpkg.cfg.d/01_drop +## Configure data sources for apt/dpkg +COPY ["sources.list", "/etc/apt/sources.list"] +COPY ["dpkg_01_drop", "/etc/dpkg/dpkg.cfg.d/01_drop"] RUN apt-get clean && apt-get update -## Pre-install the fundamental packages -RUN apt-get -y install \ - rsyslog \ - vim-tiny \ - perl \ +## Pre-install fundamental packages +RUN apt-get -y install \ + rsyslog \ + supervisor \ + vim-tiny \ + perl \ python -COPY rsyslog.conf /etc/rsyslog.conf +COPY ["etc/rsyslog.conf", "/etc/rsyslog.conf"] +COPY ["etc/rsyslog.d/*", "/etc/rsyslog.d/"] -RUN apt-get -y purge \ - exim4 \ - exim4-base \ - exim4-config \ +RUN apt-get -y purge \ + exim4 \ + exim4-base \ + exim4-config \ exim4-daemon-light {% if docker_base_dbgs %} @@ -46,6 +48,7 @@ RUN apt-get -y install \ ## Clean up apt ## Remove /var/lib/apt/lists/*, could be obsoleted for derived images -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y; \ - rm -rf /var/lib/apt/lists/*; \ +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y; \ + rm -rf /var/lib/apt/lists/*; \ rm -rf /tmp/*; + diff --git a/dockers/docker-base/rsyslog.conf b/dockers/docker-base/etc/rsyslog.conf similarity index 100% rename from dockers/docker-base/rsyslog.conf rename to dockers/docker-base/etc/rsyslog.conf diff --git a/dockers/docker-base/etc/rsyslog.d/supervisor.conf b/dockers/docker-base/etc/rsyslog.d/supervisor.conf new file mode 100644 index 000000000000..e6fece313efc --- /dev/null +++ b/dockers/docker-base/etc/rsyslog.d/supervisor.conf @@ -0,0 +1,8 @@ +$ModLoad imfile + +$InputFileName /var/log/supervisor/supervisord.log +$InputFileTag supervisord +$InputFileStateFile state-supervisor +$InputFileSeverity info +$InputFileFacility local0 +$InputRunFileMonitor diff --git a/dockers/docker-basic_router/Dockerfile b/dockers/docker-basic_router/Dockerfile index 7176fac14b3b..fa8fbd496172 100644 --- a/dockers/docker-basic_router/Dockerfile +++ b/dockers/docker-basic_router/Dockerfile @@ -5,18 +5,19 @@ MAINTAINER Xudong Wu ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -## Set the apt source +## Update apt's cache of available packages RUN apt-get clean && apt-get update COPY deps /deps -RUN dpkg -i /deps/libopennsl_*.deb; \ - dpkg -i /deps/libsaibcm_*.deb; \ +RUN dpkg -i /deps/libopennsl_*.deb; \ + dpkg -i /deps/libsaibcm_*.deb; \ apt-get -y install -f - RUN mv /deps/basic_router /usr/sbin/basic_router -ENTRYPOINT rm -f /var/run/rsyslogd.pid \ - && service rsyslog start \ - && /bin/bash +COPY ["start.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-basic_router/start.sh b/dockers/docker-basic_router/start.sh new file mode 100755 index 000000000000..925076231ccf --- /dev/null +++ b/dockers/docker-basic_router/start.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd + diff --git a/dockers/docker-basic_router/supervisord.conf b/dockers/docker-basic_router/supervisord.conf new file mode 100644 index 000000000000..2ae8ec428b3e --- /dev/null +++ b/dockers/docker-basic_router/supervisord.conf @@ -0,0 +1,20 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index 17a416dae69d..1049f5bf1bfe 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -32,4 +32,7 @@ RUN sed -ri 's/^(save .*$)/# \1/g; s/^client-output-buffer-limit pubsub [0-9]+mb [0-9]+mb [0-9]+/client-output-buffer-limit pubsub 0 0 0/ \ ' /etc/redis/redis.conf -ENTRYPOINT ["/usr/bin/redis-server", "/etc/redis/redis.conf"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-database/supervisord.conf b/dockers/docker-database/supervisord.conf new file mode 100644 index 000000000000..12a6c0a8fb1b --- /dev/null +++ b/dockers/docker-database/supervisord.conf @@ -0,0 +1,12 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:redis-server] +command=/usr/bin/redis-server /etc/redis/redis.conf +priority=1 +autostart=true +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile index 315ea605f3ee..c3f9f298983e 100644 --- a/dockers/docker-dhcp-relay/Dockerfile +++ b/dockers/docker-dhcp-relay/Dockerfile @@ -1,22 +1,21 @@ FROM docker-config-engine -## Make apt-get non-interactive +# Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -## Update APT package lists +# Update apt's cache of available packages RUN apt-get update -## Install isc-dhcp-relay Debian package +# Install isc-dhcp-relay Debian package RUN apt-get -y install isc-dhcp-relay -## Clean up +# Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs +COPY ["start.sh", "isc-dhcp-relay.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["isc-dhcp-relay.j2", "/usr/share/sonic/templates/"] -COPY ["config.sh", "/usr/bin/"] -COPY ["start.sh", "/usr/bin/"] -ENTRYPOINT /usr/bin/config.sh \ - && /usr/bin/start.sh \ - && /bin/bash +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-dhcp-relay/config.sh b/dockers/docker-dhcp-relay/config.sh deleted file mode 100755 index 99df251572d5..000000000000 --- a/dockers/docker-dhcp-relay/config.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/isc-dhcp-relay.j2 > /etc/default/isc-dhcp-relay - diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.sh b/dockers/docker-dhcp-relay/isc-dhcp-relay.sh new file mode 100755 index 000000000000..07efa351578f --- /dev/null +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# +# Based off /etc/init.d/isc-dhcp-relay +# + +# Read init script configuration (interfaces the daemon should listen on +# and the DHCP server we should forward requests to.) +[ -f /etc/default/isc-dhcp-relay ] && . /etc/default/isc-dhcp-relay + +# Build command line for interfaces (will be passed to dhrelay below.) +IFCMD="" +if test "$INTERFACES" != ""; then + for I in $INTERFACES; do + IFCMD=${IFCMD}"-i "${I}" " + done +fi + +exec /usr/sbin/dhcrelay -d -q ${OPTIONS} ${IFCMD} ${SERVERS} + diff --git a/dockers/docker-dhcp-relay/start.sh b/dockers/docker-dhcp-relay/start.sh index f5bdf49396d3..6daff96d0129 100755 --- a/dockers/docker-dhcp-relay/start.sh +++ b/dockers/docker-dhcp-relay/start.sh @@ -1,7 +1,10 @@ -#!/bin/bash +#!/usr/bin/env bash + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/isc-dhcp-relay.j2 > /etc/default/isc-dhcp-relay rm -f /var/run/rsyslogd.pid -service rsyslog start + +supervisorctl start rsyslogd VLAN_IFACE_NAME=`sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_vlan_interfaces[0]['attachto']"` @@ -11,5 +14,5 @@ until ip link show $VLAN_IFACE_NAME > /dev/null 2>&1; do done # Start the DHCP relay -service isc-dhcp-relay start +supervisorctl start isc-dhcp-relay diff --git a/dockers/docker-dhcp-relay/supervisord.conf b/dockers/docker-dhcp-relay/supervisord.conf new file mode 100644 index 000000000000..8e23c5c260ce --- /dev/null +++ b/dockers/docker-dhcp-relay/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:isc-dhcp-relay] +command=/usr/bin/isc-dhcp-relay.sh +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-fpm-gobgp/Dockerfile.j2 b/dockers/docker-fpm-gobgp/Dockerfile.j2 index 19b6caad9d99..64877ee9286d 100644 --- a/dockers/docker-fpm-gobgp/Dockerfile.j2 +++ b/dockers/docker-fpm-gobgp/Dockerfile.j2 @@ -3,7 +3,7 @@ FROM docker-fpm-quagga ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update && apt-get install -y supervisor +RUN apt-get update COPY \ {% for deb in docker_fpm_gobgp_debs.split(' ') -%} @@ -20,12 +20,10 @@ debs/{{ deb }}{{' '}} RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs +COPY ["start.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["*.j2", "/usr/share/sonic/templates/"] -COPY ["start.sh", "config.sh", "/usr/bin/"] COPY ["daemons", "/etc/quagga/"] -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -ENTRYPOINT /usr/bin/config.sh \ - && /usr/bin/start.sh \ - && /usr/bin/supervisord \ - && /bin/bash +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-fpm-gobgp/config.sh b/dockers/docker-fpm-gobgp/config.sh deleted file mode 100755 index 07aa8c33eea1..000000000000 --- a/dockers/docker-fpm-gobgp/config.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -mkdir -p /etc/quagga -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/gobgpd.conf.j2 >/etc/gobgp/gobgpd.conf -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 -chown root:root /usr/sbin/bgp-isolate -chmod 0755 /usr/sbin/bgp-isolate - -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/unisolate.j2 >/usr/sbin/bgp-unisolate -chown root:root /usr/sbin/bgp-unisolate -chmod 0755 /usr/sbin/bgp-unisolate - -mkdir -p /var/sonic -echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status - diff --git a/dockers/docker-fpm-gobgp/start.sh b/dockers/docker-fpm-gobgp/start.sh index 0aa3f68091a1..25b26179bb58 100755 --- a/dockers/docker-fpm-gobgp/start.sh +++ b/dockers/docker-fpm-gobgp/start.sh @@ -1,6 +1,26 @@ -#!/bin/bash +#!/usr/bin/env bash + +mkdir -p /etc/quagga +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/gobgpd.conf.j2 > /etc/gobgp/gobgpd.conf +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 +chown root:root /usr/sbin/bgp-isolate +chmod 0755 /usr/sbin/bgp-isolate + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/unisolate.j2 > /usr/sbin/bgp-unisolate +chown root:root /usr/sbin/bgp-unisolate +chmod 0755 /usr/sbin/bgp-unisolate + +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status rm -f /var/run/rsyslogd.pid -service rsyslog start + +supervisorctl start rsyslogd + +# Quagga has its own monitor process, 'watchquagga' service quagga start -fpmsyncd & + +supervisorctl start fpmsyncd + diff --git a/dockers/docker-fpm-gobgp/supervisord.conf b/dockers/docker-fpm-gobgp/supervisord.conf index 793fc5434f80..18670a084703 100644 --- a/dockers/docker-fpm-gobgp/supervisord.conf +++ b/dockers/docker-fpm-gobgp/supervisord.conf @@ -1,6 +1,34 @@ [supervisord] +logfile_maxbytes=1MB +logfile_backups=2 nodaemon=true +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + [program:gobgpd] command=/usr/sbin/gobgpd -p -f /etc/gobgp/gobgpd.conf -r -priority=1 +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:fpmsyncd] +command=fpmsyncd +priority=5 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-fpm-quagga/Dockerfile.j2 b/dockers/docker-fpm-quagga/Dockerfile.j2 index 211275a2eb16..2a7268a0019e 100644 --- a/dockers/docker-fpm-quagga/Dockerfile.j2 +++ b/dockers/docker-fpm-quagga/Dockerfile.j2 @@ -22,10 +22,10 @@ debs/{{ deb }}{{' '}} RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs +COPY ["start.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["*.j2", "/usr/share/sonic/templates/"] -COPY ["start.sh", "config.sh", "/usr/bin/"] COPY ["daemons", "/etc/quagga/"] -ENTRYPOINT /usr/bin/config.sh \ - && /usr/bin/start.sh \ - && /bin/bash +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-fpm-quagga/config.sh b/dockers/docker-fpm-quagga/config.sh deleted file mode 100755 index b7fbb90344e9..000000000000 --- a/dockers/docker-fpm-quagga/config.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -mkdir -p /etc/quagga -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 -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 -chown root:root /usr/sbin/bgp-isolate -chmod 0755 /usr/sbin/bgp-isolate - -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/unisolate.j2 >/usr/sbin/bgp-unisolate -chown root:root /usr/sbin/bgp-unisolate -chmod 0755 /usr/sbin/bgp-unisolate - -mkdir -p /var/sonic -echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status - diff --git a/dockers/docker-fpm-quagga/start.sh b/dockers/docker-fpm-quagga/start.sh index 0aa3f68091a1..a02117dee5ef 100755 --- a/dockers/docker-fpm-quagga/start.sh +++ b/dockers/docker-fpm-quagga/start.sh @@ -1,6 +1,26 @@ -#!/bin/bash +#!/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 +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 +chown root:root /usr/sbin/bgp-isolate +chmod 0755 /usr/sbin/bgp-isolate + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/unisolate.j2 > /usr/sbin/bgp-unisolate +chown root:root /usr/sbin/bgp-unisolate +chmod 0755 /usr/sbin/bgp-unisolate + +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status rm -f /var/run/rsyslogd.pid -service rsyslog start + +supervisorctl start rsyslogd + +# Quagga has its own monitor process, 'watchquagga' service quagga start -fpmsyncd & + +supervisorctl start fpmsyncd + diff --git a/dockers/docker-fpm-quagga/supervisord.conf b/dockers/docker-fpm-quagga/supervisord.conf new file mode 100644 index 000000000000..2e9d4925b985 --- /dev/null +++ b/dockers/docker-fpm-quagga/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:fpmsyncd] +command=fpmsyncd +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-lldp-sv2/Dockerfile.j2 b/dockers/docker-lldp-sv2/Dockerfile.j2 index 1910e0d79fe3..84002f37e7ee 100644 --- a/dockers/docker-lldp-sv2/Dockerfile.j2 +++ b/dockers/docker-lldp-sv2/Dockerfile.j2 @@ -11,7 +11,7 @@ COPY python-wheels /python-wheels ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update && apt-get install -y python-pip supervisor libbsd0 libevent-2.0-5 libjansson4 libwrap0 libxml2 libpci3 libperl5.20 +RUN apt-get update && apt-get install -y python-pip libbsd0 libevent-2.0-5 libjansson4 libwrap0 libxml2 libpci3 libperl5.20 # Pre-install the fundamental packages # Install Python SwSS SDK @@ -28,10 +28,11 @@ RUN pip install /python-wheels/swsssdk-2.0.1-py2-none-any.whl && \ apt-get purge -y && apt-get autoclean -y && apt-get autoremove -y && \ rm -rf /debs /python-wheels ~/.cache -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY reconfigure.sh /opt/reconfigure.sh -COPY ["config.sh", "/usr/bin/"] +COPY ["start.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["reconfigure.sh", "/opt/"] COPY ["lldpd.conf.j2", "/usr/share/sonic/templates/"] COPY ["lldpd", "/etc/default/"] -ENTRYPOINT /usr/bin/config.sh && /usr/bin/supervisord +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-lldp-sv2/config.sh b/dockers/docker-lldp-sv2/config.sh deleted file mode 100755 index 1263cb7a5154..000000000000 --- a/dockers/docker-lldp-sv2/config.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/lldpd.conf.j2 >/etc/lldpd.conf - -mkdir -p /var/sonic -echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status - -rm -f /var/run/rsyslogd.pid diff --git a/dockers/docker-lldp-sv2/start.sh b/dockers/docker-lldp-sv2/start.sh new file mode 100755 index 000000000000..ea3b7f45175c --- /dev/null +++ b/dockers/docker-lldp-sv2/start.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/lldpd.conf.j2 > /etc/lldpd.conf + +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd +supervisorctl start lldpd +supervisorctl start lldpd-conf-reload +supervisorctl start lldp-syncd + diff --git a/dockers/docker-lldp-sv2/supervisord.conf b/dockers/docker-lldp-sv2/supervisord.conf index 844348b471b6..62b4daebd107 100644 --- a/dockers/docker-lldp-sv2/supervisord.conf +++ b/dockers/docker-lldp-sv2/supervisord.conf @@ -1,6 +1,23 @@ [supervisord] +logfile_maxbytes=1MB +logfile_backups=2 nodaemon=true +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + [program:lldpd] # https://github.com/vincentbernat/lldpd/commit/9856f2792c301116cc4a3fcfba91b9672ee5db1f # - `-d` means to stay in foreground, log to syslog @@ -9,15 +26,22 @@ nodaemon=true # - `-dddd` means to stay in foreground, log all to console command=/usr/sbin/lldpd -d -I Ethernet*,eth* priority=100 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog [program:lldpd-conf-reload] command=/opt/reconfigure.sh priority=150 +autostart=false +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog [program:lldp-syncd] command=/usr/bin/env python2 -m lldp_syncd priority=200 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n -priority=1 diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 55f3b504f820..c708f30e439b 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -22,14 +22,14 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} -COPY start.sh /usr/bin/start.sh -COPY config.sh /usr/bin/config.sh -COPY ipinip.json.j2 /usr/share/sonic/templates/ipinip.json.j2 -COPY mirror.json.j2 /usr/share/sonic/templates/mirror.json.j2 - ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] +COPY ["start.sh", "orchagent.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["ipinip.json.j2", "/usr/share/sonic/templates/"] +COPY ["mirror.json.j2", "/usr/share/sonic/templates/"] + +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-orchagent/config.sh b/dockers/docker-orchagent/config.sh deleted file mode 100755 index 813dad9533c5..000000000000 --- a/dockers/docker-orchagent/config.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -e - -mkdir -p /etc/swss/config.d/ - -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/mirror.json.j2 > /etc/swss/config.d/mirror.json diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh new file mode 100755 index 000000000000..8afd8fab314b --- /dev/null +++ b/dockers/docker-orchagent/orchagent.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash + +# Exit immediately upon error +set -e + +function start_app { + orchagent $ORCHAGENT_ARGS & + portsyncd $PORTSYNCD_ARGS & + intfsyncd & + neighsyncd & + for file in $SWSSCONFIG_ARGS + do + swssconfig /etc/swss/config.d/$file + sleep 1 + done +} + +function config_acl { + if [ -f "/etc/sonic/acl.json" ]; then + mkdir -p /etc/swss/config.d/acl + rm -rf /etc/swss/config.d/acl/* + translate_acl -m /etc/sonic/minigraph.xml -o /etc/swss/config.d/acl /etc/sonic/acl.json + for filename in /etc/swss/config.d/acl/*.json; do + [ -e "$filename" ] || break + swssconfig $filename + done + fi +} + +function clean_up { + pkill -9 orchagent + pkill -9 portsyncd + pkill -9 intfsyncd + pkill -9 neighsyncd + exit +} + +trap clean_up SIGTERM SIGKILL + +HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` + +MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` + +ORCHAGENT_ARGS="" + +PORTSYNCD_ARGS="-p /usr/share/sonic/hwsku/port_config.ini" + +SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json " + +if [ "$HWSKU" == "Force10-S6000" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" + SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " +elif [ "$HWSKU" == "Force10-S6100" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "Force10-Z9100" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "Arista-7050-QX32" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" + SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " +elif [ "$HWSKU" == "Arista-7060-CX32S" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "AS7512" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "INGRASYS-S9100-C32" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "ACS-MSN2700" ]; then + SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json " +fi + +while true; do + # Check if syncd starts + result=`echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p` + if [ "$result" != "0" ]; then + start_app + config_acl + read + fi + sleep 1 +done + diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 7a653c442ef8..b86a9aa1dc57 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -1,84 +1,15 @@ -#!/bin/bash +#!/usr/bin/env bash -. config.sh +mkdir -p /etc/swss/config.d/ -export platform=`sonic-cfggen -m /etc/sonic/minigraph.xml -v platform` - -function start_app { - orchagent $ORCHAGENT_ARGS & - portsyncd $PORTSYNCD_ARGS & - intfsyncd & - neighsyncd & - for file in $SWSSCONFIG_ARGS - do - swssconfig /etc/swss/config.d/$file - sleep 1 - done -} - -function config_acl { - if [ -f "/etc/sonic/acl.json" ]; then - mkdir -p /etc/swss/config.d/acl - rm -rf /etc/swss/config.d/acl/* - translate_acl -m /etc/sonic/minigraph.xml -o /etc/swss/config.d/acl /etc/sonic/acl.json - for filename in /etc/swss/config.d/acl/*.json; do - [ -e "$filename" ] || break - swssconfig $filename - done - fi -} - -function clean_up { - pkill -9 orchagent - pkill -9 portsyncd - pkill -9 intfsyncd - pkill -9 neighsyncd - service rsyslog stop - exit -} - -trap clean_up SIGTERM SIGKILL - -HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/mirror.json.j2 > /etc/swss/config.d/mirror.json -MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` - -ORCHAGENT_ARGS="" - -PORTSYNCD_ARGS="-p /usr/share/sonic/hwsku/port_config.ini" +export platform=`sonic-cfggen -m /etc/sonic/minigraph.xml -v platform` -SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json " +rm -f /var/run/rsyslogd.pid -if [ "$HWSKU" == "Force10-S6000" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " -elif [ "$HWSKU" == "Force10-S6100" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "Force10-Z9100" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "Arista-7050-QX32" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " -elif [ "$HWSKU" == "Arista-7060-CX32S" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "AS7512" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "INGRASYS-S9100-C32" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "ACS-MSN2700" ]; then - SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json " -fi +supervisorctl start rsyslogd -rm -f /var/run/rsyslogd.pid -service rsyslog start +supervisorctl start orchagent -while true; do - # Check if syncd starts - result=`echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p` - if [ "$result" != "0" ]; then - start_app - config_acl - read - fi - sleep 1 -done diff --git a/dockers/docker-orchagent/supervisord.conf b/dockers/docker-orchagent/supervisord.conf new file mode 100644 index 000000000000..ef3a30f64358 --- /dev/null +++ b/dockers/docker-orchagent/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:orchagent] +command=/usr/bin/orchagent.sh +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-platform-monitor/Dockerfile b/dockers/docker-platform-monitor/Dockerfile index ea73830f8e6c..22eb4144cec5 100755 --- a/dockers/docker-platform-monitor/Dockerfile +++ b/dockers/docker-platform-monitor/Dockerfile @@ -5,17 +5,14 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -RUN apt-get install -y smartmontools sensord +RUN apt-get install -y sensord ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -COPY ["config.sh", "/usr/bin/"] +COPY ["start.sh", "lm-sensors.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + +ENTRYPOINT ["/usr/bin/supervisord"] -ENTRYPOINT /usr/bin/config.sh \ - && service rsyslog start \ - && service lm-sensors start \ - && service smartmontools start \ - && service sensord start \ - && /bin/bash diff --git a/dockers/docker-platform-monitor/config.sh b/dockers/docker-platform-monitor/config.sh deleted file mode 100755 index a88bdf594f95..000000000000 --- a/dockers/docker-platform-monitor/config.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -mkdir -p /etc/sensors.d -if [ -e /usr/share/sonic/platform/sensors.conf ] -then - /bin/cp -rf /usr/share/sonic/platform/sensors.conf /etc/sensors.d/ -fi - -mkdir -p /var/sonic -echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status - -rm -f /var/run/rsyslogd.pid diff --git a/dockers/docker-platform-monitor/lm-sensors.sh b/dockers/docker-platform-monitor/lm-sensors.sh new file mode 100755 index 000000000000..1eafc81eeb63 --- /dev/null +++ b/dockers/docker-platform-monitor/lm-sensors.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# +# Based off /etc/init.d/lm-sensors +# + +/usr/bin/sensors -s > /dev/null 2>&1 +/usr/bin/sensors > /dev/null 2>&1 + +# Currently, there is no way to run sensord in the foreground, so we +# can't use supervisord. Instead, we just start the service for now. +service sensord start + diff --git a/dockers/docker-platform-monitor/start.sh b/dockers/docker-platform-monitor/start.sh new file mode 100755 index 000000000000..0e8a6dd32760 --- /dev/null +++ b/dockers/docker-platform-monitor/start.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +mkdir -p /etc/sensors.d +if [ -e /usr/share/sonic/platform/sensors.conf ]; then + /bin/cp -rf /usr/share/sonic/platform/sensors.conf /etc/sensors.d/ +fi + +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd +supervisorctl start lm-sensors + diff --git a/dockers/docker-platform-monitor/supervisord.conf b/dockers/docker-platform-monitor/supervisord.conf new file mode 100644 index 000000000000..b069c48141ac --- /dev/null +++ b/dockers/docker-platform-monitor/supervisord.conf @@ -0,0 +1,28 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:lm-sensors] +command=/usr/bin/lm-sensors.sh +priority=3 +autostart=false +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 08dd7ede16fb..a8459bb39781 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -82,9 +82,7 @@ RUN mkdir /var/run/sshd \ && sed -i '$aUseDNS no' /etc/ssh/sshd_config \ && mkdir /root/deps -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY sshd.conf /etc/supervisor/conf.d/sshd.conf -COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf +COPY ["supervisord.conf", "sshd.conf", "ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] EXPOSE 22 diff --git a/dockers/docker-saiserver-brcm/Dockerfile b/dockers/docker-saiserver-brcm/Dockerfile index 3482c2068bc5..3a839a7a6df0 100755 --- a/dockers/docker-saiserver-brcm/Dockerfile +++ b/dockers/docker-saiserver-brcm/Dockerfile @@ -17,10 +17,12 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return COPY ["deps/saiserver", "start.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + COPY ["profile.ini", "portmap.ini", "/etc/sai/"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y; rm -rf /deps -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-saiserver-brcm/start.sh b/dockers/docker-saiserver-brcm/start.sh index 1d65e4a069e7..f023775f0674 100755 --- a/dockers/docker-saiserver-brcm/start.sh +++ b/dockers/docker-saiserver-brcm/start.sh @@ -1,8 +1,4 @@ -#!/bin/bash - -function clean_up { - service rsyslog stop -} +#!/usr/bin/env bash start_bcm() { @@ -11,11 +7,12 @@ start_bcm() [ -e /dev/linux-kernel-bde ] || mknod /dev/linux-kernel-bde c 127 0 } -trap clean_up SIGTERM SIGKILL rm -f /var/run/rsyslogd.pid -service rsyslog start + +supervisorctl start rsyslogd start_bcm -/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini +supervisorctl start saiserver + diff --git a/dockers/docker-saiserver-brcm/supervisord.conf b/dockers/docker-saiserver-brcm/supervisord.conf new file mode 100644 index 000000000000..aa6899737e8d --- /dev/null +++ b/dockers/docker-saiserver-brcm/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:saiserver] +command=/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-saiserver-cavm/Dockerfile b/dockers/docker-saiserver-cavm/Dockerfile index 2ee6b8ff38cd..9203690ad02a 100644 --- a/dockers/docker-saiserver-cavm/Dockerfile +++ b/dockers/docker-saiserver-cavm/Dockerfile @@ -1,4 +1,3 @@ - FROM docker-base RUN apt-get update \ @@ -9,22 +8,24 @@ RUN apt-get update \ COPY deps /root/deps RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /root/deps/xp-tools.deb \ - && dpkg_apt /root/deps/libsai.deb \ - && dpkg_apt /root/deps/sai.deb \ - && dpkg_apt /root/deps/libthrift-0.9.3_*.deb \ + dpkg_apt /root/deps/xp-tools.deb \ + && dpkg_apt /root/deps/libsai.deb \ + && dpkg_apt /root/deps/sai.deb \ + && dpkg_apt /root/deps/libthrift-0.9.3_*.deb \ && dpkg_apt /root/deps/libnl-3-200_*.deb \ - && dpkg_apt /root/deps/libnl-genl-3-200_*.deb \ - && dpkg_apt /root/deps/libnl-route-3-200_*.deb + && dpkg_apt /root/deps/libnl-genl-3-200_*.deb \ + && dpkg_apt /root/deps/libnl-route-3-200_*.deb COPY ["deps/saiserver", "start.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + COPY ["portmap.ini", "profile.ini", "/etc/sai/"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf deps -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-saiserver-cavm/start.sh b/dockers/docker-saiserver-cavm/start.sh index 5c3185613184..16457d13e03a 100755 --- a/dockers/docker-saiserver-cavm/start.sh +++ b/dockers/docker-saiserver-cavm/start.sh @@ -1,12 +1,8 @@ -#!/bin/bash +#!/usr/bin/env bash -function clean_up { - service rsyslog stop -} +rm -f /var/run/rsyslogd.pid -trap clean_up SIGTERM SIGKILL +supervisorctl start rsyslogd -rm -f /var/run/rsyslogd.pid -service rsyslog start +supervisorctl start saiserver -/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini diff --git a/dockers/docker-saiserver-cavm/supervisord.conf b/dockers/docker-saiserver-cavm/supervisord.conf new file mode 100644 index 000000000000..aa6899737e8d --- /dev/null +++ b/dockers/docker-saiserver-cavm/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:saiserver] +command=/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-saiserver-mlnx/Dockerfile b/dockers/docker-saiserver-mlnx/Dockerfile index 5f51f5598b18..39d0fa176987 100755 --- a/dockers/docker-saiserver-mlnx/Dockerfile +++ b/dockers/docker-saiserver-mlnx/Dockerfile @@ -8,23 +8,25 @@ RUN apt-get update COPY ["deps/applibs_*.deb", "/deps/applibs-dev_*.deb", "/deps/sx-complib_*.deb", "/deps/sxd-libs_*.deb", "/deps/sx-scew_*.deb", "/deps/sx-examples_*.deb", "/deps/sx-gen-utils_*.deb", "/deps/python-sdk-api_*.deb", "/deps/iproute2_*.deb", "/deps/mlnx-sai_*.deb", "/deps/libthrift-0.9.3_*.deb", "/deps/libnl-3-200_*.deb", "/deps/libnl-genl-3-200_*.deb", "/deps/libnl-route-3-200_*.deb", "/deps/"] RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/applibs_*.deb \ - && dpkg_apt /deps/applibs-dev_*.deb \ - && dpkg_apt /deps/sx-complib_*.deb \ - && dpkg_apt /deps/sxd-libs_*.deb \ - && dpkg_apt /deps/sx-scew_*.deb \ - && dpkg_apt /deps/sx-examples_*.deb \ - && dpkg_apt /deps/sx-gen-utils_*.deb \ - && dpkg_apt /deps/python-sdk-api_*.deb \ - && dpkg_apt /deps/iproute2_*.deb \ - && dpkg_apt /deps/mlnx-sai_*.deb \ - && dpkg_apt /deps/libthrift-0.9.3_*.deb \ - && dpkg_apt /deps/libnl-3-200_*.deb \ - && dpkg_apt /deps/libnl-genl-3-200_*.deb \ + dpkg_apt /deps/applibs_*.deb \ + && dpkg_apt /deps/applibs-dev_*.deb \ + && dpkg_apt /deps/sx-complib_*.deb \ + && dpkg_apt /deps/sxd-libs_*.deb \ + && dpkg_apt /deps/sx-scew_*.deb \ + && dpkg_apt /deps/sx-examples_*.deb \ + && dpkg_apt /deps/sx-gen-utils_*.deb \ + && dpkg_apt /deps/python-sdk-api_*.deb \ + && dpkg_apt /deps/iproute2_*.deb \ + && dpkg_apt /deps/mlnx-sai_*.deb \ + && dpkg_apt /deps/libthrift-0.9.3_*.deb \ + && dpkg_apt /deps/libnl-3-200_*.deb \ + && dpkg_apt /deps/libnl-genl-3-200_*.deb \ && dpkg_apt /deps/libnl-route-3-200_*.deb COPY ["deps/saiserver", "start.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + COPY ["profile.ini", "portmap.ini", "/etc/sai/"] COPY ["sai_2700.xml", "/usr/share/"] @@ -33,5 +35,5 @@ COPY ["sai_2700.xml", "/usr/share/"] RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /deps -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-saiserver-mlnx/start.sh b/dockers/docker-saiserver-mlnx/start.sh index e3356be12025..57ee5036ded3 100755 --- a/dockers/docker-saiserver-mlnx/start.sh +++ b/dockers/docker-saiserver-mlnx/start.sh @@ -1,19 +1,16 @@ -#!/bin/bash - -function clean_up { - service rsyslog stop -} +#!/usr/bin/env bash start_mlnx() { [ -e /dev/sxdevs/sxcdev ] || ( mkdir -p /dev/sxdevs && mknod /dev/sxdevs/sxcdev c 231 193 ) } -trap clean_up SIGTERM SIGKILL rm -f /var/run/rsyslogd.pid -service rsyslog start + +supervisorctl start rsyslogd start_mlnx -/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini +supervisorctl start saiserver + diff --git a/dockers/docker-saiserver-mlnx/supervisord.conf b/dockers/docker-saiserver-mlnx/supervisord.conf new file mode 100644 index 000000000000..aa6899737e8d --- /dev/null +++ b/dockers/docker-saiserver-mlnx/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:saiserver] +command=/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index fed2d1b85d58..73f5c257a5c4 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -16,15 +16,13 @@ ENV PYTHONOPTIMIZE 1 ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -# install supervisor # install libsnmp30 dependencies # install libpython3.6-dev dependencies # install pip dependencies # TODO: remove libpython3.6-dev, its and pip's dependencies if we can get pip3 directly # install subagent # clean up -RUN apt-get update && apt-get install -y supervisor \ - libperl5.20 libpci3 libwrap0 \ +RUN apt-get update && apt-get install -y libperl5.20 libpci3 libwrap0 \ libexpat1-dev \ curl gcc && \ dpkg -i \ @@ -41,11 +39,12 @@ RUN apt-get update && apt-get install -y supervisor \ find / | grep -E "__pycache__" | xargs rm -rf && \ rm -rf ~/.cache -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY ["start.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["*.j2", "/usr/share/sonic/templates/"] -COPY ["config.sh", "/usr/bin/"] -## Although exposing ports is not need for host net mode, keep it for possible bridge mode +## Although exposing ports is not needed for host net mode, keep it for possible bridge mode EXPOSE 161/udp 162/udp -ENTRYPOINT /usr/bin/config.sh && /usr/bin/supervisord +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-snmp-sv2/config.sh b/dockers/docker-snmp-sv2/config.sh deleted file mode 100755 index 62e8278ae41b..000000000000 --- a/dockers/docker-snmp-sv2/config.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -mkdir -p /etc/ssw - -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/sonic_version.yml -t /usr/share/sonic/templates/sysDescription.j2 >/etc/ssw/sysDescription - -mkdir -p /etc/snmp - -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/snmp.yml -t /usr/share/sonic/templates/snmpd.conf.j2 >/etc/snmp/snmpd.conf - -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/alias_map.j2 >/etc/snmp/alias_map.json - -mkdir -p /var/sonic -echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status - -rm -f /var/run/rsyslogd.pid diff --git a/dockers/docker-snmp-sv2/start.sh b/dockers/docker-snmp-sv2/start.sh new file mode 100755 index 000000000000..7e178351b159 --- /dev/null +++ b/dockers/docker-snmp-sv2/start.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +mkdir -p /etc/ssw +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/sonic_version.yml -t /usr/share/sonic/templates/sysDescription.j2 > /etc/ssw/sysDescription + +mkdir -p /etc/snmp +sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/snmp.yml -t /usr/share/sonic/templates/snmpd.conf.j2 > /etc/snmp/snmpd.conf +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/alias_map.j2 > /etc/snmp/alias_map.json + +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd +supervisorctl start snmpd +supervisorctl start snmp-subagent + diff --git a/dockers/docker-snmp-sv2/supervisord.conf b/dockers/docker-snmp-sv2/supervisord.conf index cf5990ec31e8..c4e883b3f8f0 100644 --- a/dockers/docker-snmp-sv2/supervisord.conf +++ b/dockers/docker-snmp-sv2/supervisord.conf @@ -1,14 +1,34 @@ [supervisord] +logfile_maxbytes=1MB +logfile_backups=2 nodaemon=true +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + [program:snmpd] command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable,inetCidrRouteTable,ip -p /run/snmpd.pid -priority=100 +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog [program:snmp-subagent] command=/usr/bin/env python3.6 -m sonic_ax_impl -priority=200 +priority=4 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n -priority=1 diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index b3f35dd3c2e5..73de6bd47a78 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -1,6 +1,11 @@ FROM docker-config-engine -RUN apt-get update && apt-get install -f -y libdbus-1-3 libdaemon0 libjansson4 +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update + +RUN apt-get install -f -y libdbus-1-3 libdaemon0 libjansson4 ## Install redis-tools dependencies ## TODO: implicitly install dependencies @@ -17,14 +22,12 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} -COPY ["start.sh", "config.sh", "/usr/bin/"] +COPY ["start.sh", "teamd.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["teamd.j2", "/usr/share/sonic/templates/"] -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -ENTRYPOINT ["/bin/bash", "-c"] -CMD ["/usr/bin/config.sh && /usr/bin/start.sh"] +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-teamd/config.sh b/dockers/docker-teamd/config.sh deleted file mode 100755 index 9351966f233f..000000000000 --- a/dockers/docker-teamd/config.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -mkdir -p /etc/teamd -rm -f /etc/teamd/* - -for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_portchannels.keys() | join(' ')"`; do - sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'"}' -t /usr/share/sonic/templates/teamd.j2 >/etc/teamd/$pc.conf -done - -mkdir -p /var/sonic -echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status - diff --git a/dockers/docker-teamd/start.sh b/dockers/docker-teamd/start.sh index 5397475defb7..77a3ff43be85 100755 --- a/dockers/docker-teamd/start.sh +++ b/dockers/docker-teamd/start.sh @@ -1,45 +1,20 @@ -#!/bin/bash +#!/usr/bin/env bash TEAMD_CONF_PATH=/etc/teamd -# Before teamd could automatically add newly created host interfaces into the -# LAG, this workaround will be needed. It will remove the obsolete files and -# net devices that are failed to be removed in the previous run. -function start_app { - # Remove *.pid and *.sock files if there are any - rm -f /var/run/teamd/* - if [ -d $TEAMD_CONF_PATH ]; then - for f in $TEAMD_CONF_PATH/*; do - # Remove netdevs if there are any - intf=`echo $f | awk -F'[/.]' '{print $4}'` - ip link del $intf - teamd -f $f -d - done - fi - teamsyncd & -} - -function clean_up { - pkill -9 teamd - pkill -9 teamsyncd - service rsyslog stop - exit -} - -trap clean_up SIGTERM SIGKILL +rm -rf $TEAMD_CONF_PATH +mkdir -p $TEAMD_CONF_PATH -rm -f /var/run/rsyslogd.pid -service rsyslog start - -# Before teamd could automatically add newly created host interfaces into the -# LAG, this workaround will wait until the host interfaces are created and then -# the processes will be started. -while true; do - # Check if front-panel ports are configured - result=`echo -en "SELECT 0\nHGETALL PORT_TABLE:ConfigDone" | redis-cli | sed -n 3p` - if [ "$result" == "0" ]; then - start_app - read - fi - sleep 1 +for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_portchannels.keys() | join(' ')"`; do + sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'"}' -t /usr/share/sonic/templates/teamd.j2 > $TEAMD_CONF_PATH/$pc.conf done + +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd + +supervisorctl start teamd + diff --git a/dockers/docker-teamd/supervisord.conf b/dockers/docker-teamd/supervisord.conf new file mode 100644 index 000000000000..3d471bd3a222 --- /dev/null +++ b/dockers/docker-teamd/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:teamd] +command=/usr/bin/teamd.sh +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-teamd/teamd.sh b/dockers/docker-teamd/teamd.sh new file mode 100755 index 000000000000..71bc24512ebc --- /dev/null +++ b/dockers/docker-teamd/teamd.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +TEAMD_CONF_PATH=/etc/teamd + +# Before teamd could automatically add newly created host interfaces into the +# LAG, this workaround will be needed. It will remove the obsolete files and +# net devices that are failed to be removed in the previous run. +function start_app { + # Remove *.pid and *.sock files if there are any + rm -f /var/run/teamd/* + if [ -d $TEAMD_CONF_PATH ]; then + for f in $TEAMD_CONF_PATH/*; do + # Remove netdevs if there are any + intf=`echo $f | awk -F'[/.]' '{print $4}'` + ip link del $intf + teamd -f $f -d + done + fi + teamsyncd & +} + +function clean_up { + pkill -9 teamd + pkill -9 teamsyncd + exit +} + +trap clean_up SIGTERM SIGKILL + +# Before teamd could automatically add newly created host interfaces into the +# LAG, this workaround will wait until the host interfaces are created and then +# the processes will be started. +while true; do + # Check if front-panel ports are configured + result=`echo -en "SELECT 0\nHGETALL PORT_TABLE:ConfigDone" | redis-cli | sed -n 3p` + if [ "$result" == "0" ]; then + start_app + read + fi + sleep 1 +done + diff --git a/platform/broadcom/docker-syncd-brcm-rpc/99-syncd.conf b/platform/broadcom/docker-syncd-brcm-rpc/99-syncd.conf new file mode 100644 index 000000000000..f3b57e3b1964 --- /dev/null +++ b/platform/broadcom/docker-syncd-brcm-rpc/99-syncd.conf @@ -0,0 +1,2 @@ +sysctl -w net.core.rmem_max=509430500 + diff --git a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 index cc7c756f801c..4799d7a5ab31 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 @@ -27,7 +27,6 @@ RUN apt-get update \ python-dev \ wget \ cmake \ - supervisor \ && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ && tar xvfz 1.0.0.tar.gz \ && cd nanomsg-1.0.0 \ @@ -47,10 +46,8 @@ RUN apt-get update \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ && rm -rf /root/deps -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf +COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] +COPY ["99-syncd.conf", "/etc/sysctl.d/"] -RUN sed -i "/service rsyslog start/a sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord" /usr/bin/start.sh +ENTRYPOINT ["/usr/bin/supervisord"] -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] diff --git a/platform/broadcom/docker-syncd-brcm-rpc/supervisord.conf b/platform/broadcom/docker-syncd-brcm-rpc/supervisord.conf deleted file mode 100644 index daf9de259d77..000000000000 --- a/platform/broadcom/docker-syncd-brcm-rpc/supervisord.conf +++ /dev/null @@ -1,2 +0,0 @@ -[supervisord] -nodaemon=false diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index ffe7b6c57397..af6c96c585d0 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -19,12 +19,14 @@ debs/{{ deb }}{{' '}} ## TODO: add kmod into Depends RUN apt-get install -f kmod -COPY ["debs/dsserve", "debs/bcmcmd", "start.sh", "/usr/bin/"] +COPY ["debs/dsserve", "debs/bcmcmd", "start.sh", "syncd.sh", "/usr/bin/"] RUN chmod +x /usr/bin/dsserve /usr/bin/bcmcmd +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/platform/broadcom/docker-syncd-brcm/start.sh b/platform/broadcom/docker-syncd-brcm/start.sh index 6a08b7151432..96e2a9128081 100755 --- a/platform/broadcom/docker-syncd-brcm/start.sh +++ b/platform/broadcom/docker-syncd-brcm/start.sh @@ -1,15 +1,8 @@ -#!/bin/bash +#!/usr/bin/env bash -function clean_up { - service syncd stop - service rsyslog stop - exit -} +rm -f /var/run/rsyslogd.pid -trap clean_up SIGTERM SIGKILL +supervisorctl start rsyslogd -rm -f /var/run/rsyslogd.pid -service rsyslog start -service syncd start +supervisorctl start syncd -read diff --git a/platform/broadcom/docker-syncd-brcm/supervisord.conf b/platform/broadcom/docker-syncd-brcm/supervisord.conf new file mode 100644 index 000000000000..71ebffee3bf4 --- /dev/null +++ b/platform/broadcom/docker-syncd-brcm/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:syncd] +command=/usr/bin/syncd.sh +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/platform/broadcom/docker-syncd-brcm/syncd.sh b/platform/broadcom/docker-syncd-brcm/syncd.sh new file mode 100755 index 000000000000..993cf100f2f0 --- /dev/null +++ b/platform/broadcom/docker-syncd-brcm/syncd.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +function clean_up { + service syncd stop + exit +} + +trap clean_up SIGTERM SIGKILL + +service syncd start + +read diff --git a/platform/cavium/docker-syncd-cavm-rpc/99-syncd.conf b/platform/cavium/docker-syncd-cavm-rpc/99-syncd.conf new file mode 100644 index 000000000000..f3b57e3b1964 --- /dev/null +++ b/platform/cavium/docker-syncd-cavm-rpc/99-syncd.conf @@ -0,0 +1,2 @@ +sysctl -w net.core.rmem_max=509430500 + diff --git a/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 b/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 index 2688e37833e1..0de427c22a27 100644 --- a/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 +++ b/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 @@ -27,7 +27,6 @@ RUN apt-get update \ python-dev \ wget \ cmake \ - supervisor \ && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ && tar xvfz 1.0.0.tar.gz \ && cd nanomsg-1.0.0 \ @@ -47,10 +46,7 @@ RUN apt-get update \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ && rm -rf /root/deps -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf +COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] +COPY ["99-syncd.conf", "/etc/sysctl.d/"] -RUN sed -i "/service rsyslog start/a sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord" /usr/bin/start.sh - -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/cavium/docker-syncd-cavm-rpc/supervisord.conf b/platform/cavium/docker-syncd-cavm-rpc/supervisord.conf deleted file mode 100644 index daf9de259d77..000000000000 --- a/platform/cavium/docker-syncd-cavm-rpc/supervisord.conf +++ /dev/null @@ -1,2 +0,0 @@ -[supervisord] -nodaemon=false diff --git a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 index 45b71e85129c..dd37db2e04d2 100755 --- a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 +++ b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 @@ -18,7 +18,8 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} -COPY ["start.sh", "/usr/bin/"] +COPY ["start.sh", "syncd.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["profile.ini", "/etc/ssw/AS7512/"] @@ -26,5 +27,4 @@ COPY ["profile.ini", "/etc/ssw/AS7512/"] RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/cavium/docker-syncd-cavm/start.sh b/platform/cavium/docker-syncd-cavm/start.sh index b6c77ff235b5..96e2a9128081 100755 --- a/platform/cavium/docker-syncd-cavm/start.sh +++ b/platform/cavium/docker-syncd-cavm/start.sh @@ -1,24 +1,8 @@ -#!/bin/bash - -export XP_ROOT=/usr/bin/ +#!/usr/bin/env bash rm -f /var/run/rsyslogd.pid -service rsyslog start - -while true; do - - # Check if redis-server starts - - result=$(redis-cli ping) - - if [ "$result" == "PONG" ]; then - - redis-cli FLUSHALL - syncd -p /etc/ssw/AS7512/profile.ini -N - break - fi +supervisorctl start rsyslogd - sleep 1 +supervisorctl start syncd -done diff --git a/platform/cavium/docker-syncd-cavm/supervisord.conf b/platform/cavium/docker-syncd-cavm/supervisord.conf new file mode 100644 index 000000000000..71ebffee3bf4 --- /dev/null +++ b/platform/cavium/docker-syncd-cavm/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:syncd] +command=/usr/bin/syncd.sh +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/platform/cavium/docker-syncd-cavm/syncd.sh b/platform/cavium/docker-syncd-cavm/syncd.sh new file mode 100755 index 000000000000..24767dfc6e0a --- /dev/null +++ b/platform/cavium/docker-syncd-cavm/syncd.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +export XP_ROOT=/usr/bin/ + +while true; do + + # Check if redis-server starts + + result=$(redis-cli ping) + + if [ "$result" == "PONG" ]; then + + redis-cli FLUSHALL + syncd -p /etc/ssw/AS7512/profile.ini -N + break + + fi + + sleep 1 + +done + diff --git a/platform/centec/docker-syncd-centec-rpc/99-syncd.conf b/platform/centec/docker-syncd-centec-rpc/99-syncd.conf new file mode 100644 index 000000000000..f3b57e3b1964 --- /dev/null +++ b/platform/centec/docker-syncd-centec-rpc/99-syncd.conf @@ -0,0 +1,2 @@ +sysctl -w net.core.rmem_max=509430500 + diff --git a/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 index 2199e85d85d1..13a2c92cecee 100644 --- a/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 +++ b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 @@ -27,7 +27,6 @@ RUN apt-get update \ python-dev \ wget \ cmake \ - supervisor \ && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ && tar xvfz 1.0.0.tar.gz \ && cd nanomsg-1.0.0 \ @@ -47,10 +46,8 @@ RUN apt-get update \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ && rm -rf /root/deps -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf +COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] +COPY ["99-syncd.conf", "/etc/sysctl.d/"] + +ENTRYPOINT ["/usr/bin/supervisord"] -RUN sed -i "/service rsyslog start/a sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord" /usr/bin/start.sh - -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] diff --git a/platform/centec/docker-syncd-centec-rpc/supervisord.conf b/platform/centec/docker-syncd-centec-rpc/supervisord.conf deleted file mode 100644 index daf9de259d77..000000000000 --- a/platform/centec/docker-syncd-centec-rpc/supervisord.conf +++ /dev/null @@ -1,2 +0,0 @@ -[supervisord] -nodaemon=false diff --git a/platform/centec/docker-syncd-centec/Dockerfile.j2 b/platform/centec/docker-syncd-centec/Dockerfile.j2 index 617143215a4d..9e0fe52b174e 100755 --- a/platform/centec/docker-syncd-centec/Dockerfile.j2 +++ b/platform/centec/docker-syncd-centec/Dockerfile.j2 @@ -19,11 +19,12 @@ debs/{{ deb }}{{' '}} ## TODO: add kmod into Depends RUN apt-get install -f kmod -COPY ["start.sh", "/usr/bin/"] +COPY ["start.sh", "syncd.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/platform/centec/docker-syncd-centec/start.sh b/platform/centec/docker-syncd-centec/start.sh index 6a08b7151432..96e2a9128081 100755 --- a/platform/centec/docker-syncd-centec/start.sh +++ b/platform/centec/docker-syncd-centec/start.sh @@ -1,15 +1,8 @@ -#!/bin/bash +#!/usr/bin/env bash -function clean_up { - service syncd stop - service rsyslog stop - exit -} +rm -f /var/run/rsyslogd.pid -trap clean_up SIGTERM SIGKILL +supervisorctl start rsyslogd -rm -f /var/run/rsyslogd.pid -service rsyslog start -service syncd start +supervisorctl start syncd -read diff --git a/platform/centec/docker-syncd-centec/supervisord.conf b/platform/centec/docker-syncd-centec/supervisord.conf new file mode 100644 index 000000000000..71ebffee3bf4 --- /dev/null +++ b/platform/centec/docker-syncd-centec/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:syncd] +command=/usr/bin/syncd.sh +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/platform/centec/docker-syncd-centec/syncd.sh b/platform/centec/docker-syncd-centec/syncd.sh new file mode 100755 index 000000000000..993cf100f2f0 --- /dev/null +++ b/platform/centec/docker-syncd-centec/syncd.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +function clean_up { + service syncd stop + exit +} + +trap clean_up SIGTERM SIGKILL + +service syncd start + +read diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/99-syncd.conf b/platform/mellanox/docker-syncd-mlnx-rpc/99-syncd.conf new file mode 100644 index 000000000000..f3b57e3b1964 --- /dev/null +++ b/platform/mellanox/docker-syncd-mlnx-rpc/99-syncd.conf @@ -0,0 +1,2 @@ +sysctl -w net.core.rmem_max=509430500 + diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 index 3a4b4784babd..51fb26c00b11 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 @@ -27,7 +27,6 @@ RUN apt-get update \ python-dev \ wget \ cmake \ - supervisor \ && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ && tar xvfz 1.0.0.tar.gz \ && cd nanomsg-1.0.0 \ @@ -47,10 +46,8 @@ RUN apt-get update \ && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ && rm -rf /root/deps -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY ptf_nn_agent.conf /etc/supervisor/conf.d/ptf_nn_agent.conf +COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] +COPY ["99-syncd.conf", "/etc/sysctl.d/"] + +ENTRYPOINT ["/usr/bin/supervisord"] -RUN sed -i "/service rsyslog start/a sysctl -w net.core.rmem_max=509430500 ; \/usr\/bin\/supervisord" /usr/bin/start.sh - -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/supervisord.conf b/platform/mellanox/docker-syncd-mlnx-rpc/supervisord.conf deleted file mode 100644 index daf9de259d77..000000000000 --- a/platform/mellanox/docker-syncd-mlnx-rpc/supervisord.conf +++ /dev/null @@ -1,2 +0,0 @@ -[supervisord] -nodaemon=false diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index cd686802f907..03257ad33e2f 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -18,13 +18,13 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} -COPY ["start.sh", "/usr/bin/"] -COPY ["mlnx-fw-upgrade.sh", "/usr/bin/"] +COPY ["start.sh", "syncd.sh", "mlnx-fw-upgrade.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["/debs/fw-SPC.mfa", "/etc/mlnx/"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -ENTRYPOINT ["/bin/bash"] -CMD ["/usr/bin/start.sh"] +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/platform/mellanox/docker-syncd-mlnx/start.sh b/platform/mellanox/docker-syncd-mlnx/start.sh index 3c07069ba26e..96e2a9128081 100755 --- a/platform/mellanox/docker-syncd-mlnx/start.sh +++ b/platform/mellanox/docker-syncd-mlnx/start.sh @@ -1,21 +1,8 @@ -#!/bin/bash +#!/usr/bin/env bash -function clean_up { - service syncd stop - service rsyslog stop - exit -} +rm -f /var/run/rsyslogd.pid -trap clean_up SIGTERM SIGKILL +supervisorctl start rsyslogd -# fw-upgrade will exit if firmware was actually upgraded or if some error -# occures -. mlnx-fw-upgrade.sh +supervisorctl start syncd -# FIXME: the script cannot trap SIGTERM signal and it exits without clean_up -# Remove rsyslogd.pid file manually so that to start the rsyslog instantly -[ -e /var/run/rsyslogd.pid ] && rm /var/run/rsyslogd.pid -service rsyslog start -service syncd start - -read diff --git a/platform/mellanox/docker-syncd-mlnx/supervisord.conf b/platform/mellanox/docker-syncd-mlnx/supervisord.conf new file mode 100644 index 000000000000..71ebffee3bf4 --- /dev/null +++ b/platform/mellanox/docker-syncd-mlnx/supervisord.conf @@ -0,0 +1,27 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false ; One-shot +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:syncd] +command=/usr/bin/syncd.sh +priority=3 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/platform/mellanox/docker-syncd-mlnx/syncd.sh b/platform/mellanox/docker-syncd-mlnx/syncd.sh new file mode 100755 index 000000000000..ad0e0e47be87 --- /dev/null +++ b/platform/mellanox/docker-syncd-mlnx/syncd.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +function clean_up { + service syncd stop + exit +} + +trap clean_up SIGTERM SIGKILL + +# fw-upgrade will exit if firmware was actually upgraded or if some error +# occures +. mlnx-fw-upgrade.sh + +# FIXME: the script cannot trap SIGTERM signal and it exits without clean_up +# Remove rsyslogd.pid file manually so that to start the rsyslog instantly +service syncd start + +read + From 37fc56908211d058326187b83477cf08555131b7 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 8 May 2017 21:33:59 -0700 Subject: [PATCH 0502/1011] [snmpagent]: update sonic-snmpagent submodule (#578) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index d39b66b354af..74e57b8381a9 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit d39b66b354af4db07313af82341fdc20762e89fc +Subproject commit 74e57b8381a92c64eaa0455dcd7b222af337a0f9 From d5c13c0a83141d7e108fce802e2bc57f5ef823c5 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 9 May 2017 17:37:08 -0700 Subject: [PATCH 0503/1011] [dockers]: Disable autorestart on all supervisor processes inside containers (#580) --- dockers/docker-basic_router/supervisord.conf | 3 ++- dockers/docker-database/supervisord.conf | 1 + dockers/docker-dhcp-relay/supervisord.conf | 4 +++- dockers/docker-fpm-gobgp/supervisord.conf | 5 ++++- dockers/docker-fpm-quagga/supervisord.conf | 4 +++- dockers/docker-lldp-sv2/supervisord.conf | 7 +++++-- dockers/docker-orchagent/supervisord.conf | 4 +++- dockers/docker-platform-monitor/supervisord.conf | 5 +++-- dockers/docker-saiserver-brcm/supervisord.conf | 4 +++- dockers/docker-saiserver-cavm/supervisord.conf | 4 +++- dockers/docker-saiserver-mlnx/supervisord.conf | 4 +++- dockers/docker-snmp-sv2/supervisord.conf | 5 ++++- dockers/docker-teamd/supervisord.conf | 4 +++- platform/broadcom/docker-syncd-brcm/supervisord.conf | 4 +++- platform/cavium/docker-syncd-cavm/supervisord.conf | 4 +++- platform/centec/docker-syncd-centec/supervisord.conf | 4 +++- platform/mellanox/docker-syncd-mlnx/supervisord.conf | 4 +++- 17 files changed, 52 insertions(+), 18 deletions(-) diff --git a/dockers/docker-basic_router/supervisord.conf b/dockers/docker-basic_router/supervisord.conf index 2ae8ec428b3e..76f9a1968786 100644 --- a/dockers/docker-basic_router/supervisord.conf +++ b/dockers/docker-basic_router/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-database/supervisord.conf b/dockers/docker-database/supervisord.conf index 12a6c0a8fb1b..2c78d9c39311 100644 --- a/dockers/docker-database/supervisord.conf +++ b/dockers/docker-database/supervisord.conf @@ -7,6 +7,7 @@ nodaemon=true command=/usr/bin/redis-server /etc/redis/redis.conf priority=1 autostart=true +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-dhcp-relay/supervisord.conf b/dockers/docker-dhcp-relay/supervisord.conf index 8e23c5c260ce..512762f2a5b4 100644 --- a/dockers/docker-dhcp-relay/supervisord.conf +++ b/dockers/docker-dhcp-relay/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/bin/isc-dhcp-relay.sh priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-fpm-gobgp/supervisord.conf b/dockers/docker-fpm-gobgp/supervisord.conf index 18670a084703..34fca6756821 100644 --- a/dockers/docker-fpm-gobgp/supervisord.conf +++ b/dockers/docker-fpm-gobgp/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/sbin/gobgpd -p -f /etc/gobgp/gobgpd.conf -r priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -29,6 +31,7 @@ stderr_logfile=syslog command=fpmsyncd priority=5 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-fpm-quagga/supervisord.conf b/dockers/docker-fpm-quagga/supervisord.conf index 2e9d4925b985..db069bd93787 100644 --- a/dockers/docker-fpm-quagga/supervisord.conf +++ b/dockers/docker-fpm-quagga/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=fpmsyncd priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-lldp-sv2/supervisord.conf b/dockers/docker-lldp-sv2/supervisord.conf index 62b4daebd107..dcac7a8645f5 100644 --- a/dockers/docker-lldp-sv2/supervisord.conf +++ b/dockers/docker-lldp-sv2/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -27,6 +28,7 @@ stderr_logfile=syslog command=/usr/sbin/lldpd -d -I Ethernet*,eth* priority=100 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -34,7 +36,7 @@ stderr_logfile=syslog command=/opt/reconfigure.sh priority=150 autostart=false -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -42,6 +44,7 @@ stderr_logfile=syslog command=/usr/bin/env python2 -m lldp_syncd priority=200 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-orchagent/supervisord.conf b/dockers/docker-orchagent/supervisord.conf index ef3a30f64358..943233d2d421 100644 --- a/dockers/docker-orchagent/supervisord.conf +++ b/dockers/docker-orchagent/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/bin/orchagent.sh priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-platform-monitor/supervisord.conf b/dockers/docker-platform-monitor/supervisord.conf index b069c48141ac..d4f21cf609fa 100644 --- a/dockers/docker-platform-monitor/supervisord.conf +++ b/dockers/docker-platform-monitor/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,7 +23,7 @@ stderr_logfile=syslog command=/usr/bin/lm-sensors.sh priority=3 autostart=false -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-saiserver-brcm/supervisord.conf b/dockers/docker-saiserver-brcm/supervisord.conf index aa6899737e8d..e09ac3cbb449 100644 --- a/dockers/docker-saiserver-brcm/supervisord.conf +++ b/dockers/docker-saiserver-brcm/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-saiserver-cavm/supervisord.conf b/dockers/docker-saiserver-cavm/supervisord.conf index aa6899737e8d..e09ac3cbb449 100644 --- a/dockers/docker-saiserver-cavm/supervisord.conf +++ b/dockers/docker-saiserver-cavm/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-saiserver-mlnx/supervisord.conf b/dockers/docker-saiserver-mlnx/supervisord.conf index aa6899737e8d..e09ac3cbb449 100644 --- a/dockers/docker-saiserver-mlnx/supervisord.conf +++ b/dockers/docker-saiserver-mlnx/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/bin/saiserver -p /etc/sai/profile.ini -f /etc/sai/portmap.ini priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-snmp-sv2/supervisord.conf b/dockers/docker-snmp-sv2/supervisord.conf index c4e883b3f8f0..624b61f96225 100644 --- a/dockers/docker-snmp-sv2/supervisord.conf +++ b/dockers/docker-snmp-sv2/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable,inetCidrRouteTable,ip -p /run/snmpd.pid priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -29,6 +31,7 @@ stderr_logfile=syslog command=/usr/bin/env python3.6 -m sonic_ax_impl priority=4 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-teamd/supervisord.conf b/dockers/docker-teamd/supervisord.conf index 3d471bd3a222..2db52ebd073f 100644 --- a/dockers/docker-teamd/supervisord.conf +++ b/dockers/docker-teamd/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/bin/teamd.sh priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/platform/broadcom/docker-syncd-brcm/supervisord.conf b/platform/broadcom/docker-syncd-brcm/supervisord.conf index 71ebffee3bf4..80d04a225ffd 100644 --- a/platform/broadcom/docker-syncd-brcm/supervisord.conf +++ b/platform/broadcom/docker-syncd-brcm/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/bin/syncd.sh priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/platform/cavium/docker-syncd-cavm/supervisord.conf b/platform/cavium/docker-syncd-cavm/supervisord.conf index 71ebffee3bf4..80d04a225ffd 100644 --- a/platform/cavium/docker-syncd-cavm/supervisord.conf +++ b/platform/cavium/docker-syncd-cavm/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/bin/syncd.sh priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/platform/centec/docker-syncd-centec/supervisord.conf b/platform/centec/docker-syncd-centec/supervisord.conf index 71ebffee3bf4..80d04a225ffd 100644 --- a/platform/centec/docker-syncd-centec/supervisord.conf +++ b/platform/centec/docker-syncd-centec/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/bin/syncd.sh priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog diff --git a/platform/mellanox/docker-syncd-mlnx/supervisord.conf b/platform/mellanox/docker-syncd-mlnx/supervisord.conf index 71ebffee3bf4..80d04a225ffd 100644 --- a/platform/mellanox/docker-syncd-mlnx/supervisord.conf +++ b/platform/mellanox/docker-syncd-mlnx/supervisord.conf @@ -7,7 +7,7 @@ nodaemon=true command=/usr/bin/start.sh priority=1 autostart=true -autorestart=false ; One-shot +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -15,6 +15,7 @@ stderr_logfile=syslog command=/usr/sbin/rsyslogd -n priority=2 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog @@ -22,6 +23,7 @@ stderr_logfile=syslog command=/usr/bin/syncd.sh priority=3 autostart=false +autorestart=false stdout_logfile=syslog stderr_logfile=syslog From 8993614d6bf85babbf8de83d33a6a6716a8dc7b7 Mon Sep 17 00:00:00 2001 From: Xin Liu Date: Wed, 10 May 2017 11:21:56 -0700 Subject: [PATCH 0504/1011] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 9b9ed723e1f7..0c2d30cf6bae 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,9 @@ P4: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buil Following is the instruction on how to build an [(ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also how to build docker images running inside the NOS. Note that SONiC image are build per ASIC platform. Switches using the same ASIC platform share a common image. For a list of supported switches and ASIC, please refer to this [document](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all). +# Hardware +Any server can be a build image server. We are using a server with 1T hard disk. The OS is Ubuntu 16.04. + # Prerequisites ## SAI Version From 6393afdb0bf30a298a771578ad922c662696fc13 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 10 May 2017 12:39:00 -0700 Subject: [PATCH 0505/1011] [sonic-utilities]: Update submodule (#581) --- files/image_config/sudoers/sudoers | 6 ++++-- src/sonic-utilities | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/files/image_config/sudoers/sudoers b/files/image_config/sudoers/sudoers index 57248ee8c1c4..1b1979a2e9bb 100644 --- a/files/image_config/sudoers/sudoers +++ b/files/image_config/sudoers/sudoers @@ -17,8 +17,10 @@ Defaults env_keep += "VTYSH_PAGER" # Cmnd alias specification # Note: bcmcmd is dangerous for users in read only netgroups because it may operate ASIC -Cmnd_Alias READ_ONLY_CMDS = /usr/bin/portstat,\ - /usr/bin/vtysh -c "show.*" +Cmnd_Alias READ_ONLY_CMDS = /usr/bin/decode-syseeprom, \ + /usr/bin/vtysh -c show *, \ + /bin/cat /var/log/syslog, \ + /usr/bin/tail -f /var/log/syslog # User privilege specification root ALL=(ALL:ALL) ALL diff --git a/src/sonic-utilities b/src/sonic-utilities index 452df11df5a4..3378ef8387f6 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 452df11df5a47e1d646e5ce846757112b526694f +Subproject commit 3378ef8387f643f3ef81cbc15a6b4bda95570e21 From 68545416dc7a54ea66794e31d682652860f16ecf Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 10 May 2017 12:49:52 -0700 Subject: [PATCH 0506/1011] [Broadcom]: Update Broadcom SDK to 3.2.2.2-6 and SAI to 2.1.5.1-6 (#583) Signed-off-by: Shuotian Cheng --- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index ce9f0a64f4bc..1aa232c97607 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-5-20170505222214.31_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-5-20170505222214.31_amd64.deb?sv=2015-04-05&sr=b&sig=jxKRlFJ%2BjDmq6Xi2p1SXc35IVdhsfRoR0umcOnM5Cj8%3D&se=2031-01-12T22%3A43%3A54Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-6-20170510001051.32_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-6-20170510001051.32_amd64.deb?sv=2015-04-05&sr=b&sig=PS9GQvhA2n%2BLXtu93KYKybvmmLyeIX%2BcrRZspIBvm5o%3D&se=2031-01-17T07%3A02%3A06Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-5-20170505222214.31_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-6-20170510001051.32_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-5-20170505222214.31_amd64.deb?sv=2015-04-05&sr=b&sig=HZN4itbQuJXfZCPZx1A%2BSxN3hBxZ05%2FmCE8Lp1zTgXM%3D&se=2031-01-12T22%3A44%3A20Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-6-20170510001051.32_amd64.deb?sv=2015-04-05&sr=b&sig=d2%2BYxTvzjR92hDXx5Wx7gWDQU52wpLzw4ECxNiAwExM%3D&se=2031-01-17T07%3A01%3A37Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index cee7939c730c..a41ad6662d46 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.2.2-5-20170505212020.37_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-5-20170505212020.37_amd64.deb?sv=2015-04-05&sr=b&sig=wTWOEP8zJE1Jba3M5n8we4x%2Fcpq39%2B00ORByVHhBOuQ%3D&se=2031-01-12T22%3A42%3A51Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.2.2-6-20170509231001.38_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-6-20170509231001.38_amd64.deb?sv=2015-04-05&sr=b&sig=xawExeGCWMMToo%2Fsk%2BNFRHIXK1eJiqOir4lZ5FUvIdo%3D&se=2031-01-17T07%3A00%3A10Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-5-20170505212020.37_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-5-20170505212020.37_amd64.deb?sv=2015-04-05&sr=b&sig=QovFF5suqpKxHqZ01r0BiooKw7ik5Kpk6GU0pxf8xmg%3D&se=2031-01-12T22%3A43%3A24Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-6-20170509231001.38_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-6-20170509231001.38_amd64.deb?sv=2015-04-05&sr=b&sig=PPo0AKc%2FwnaAwNsA2O6e5erAZ4vso6KRXxgrNN%2FlJ3A%3D&se=2031-01-17T07%3A00%3A56Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 3af7c3a13274aa40348caaf341abb0c6b74ac233 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 10 May 2017 17:39:51 -0700 Subject: [PATCH 0507/1011] [debian]: Disable receiving default routes for ipv6 on mgmt interface (#588) * Disable net.ipv6.conf.eth0.accept_ra_defrtr. It will remain IPv6 working on mgmt interface, but it will disable receiving default routes --- build_debian.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build_debian.sh b/build_debian.sh index 7d763a46f2e5..009cf3bf4b88 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -237,6 +237,8 @@ set /files/etc/sysctl.conf/net.ipv6.conf.eth0.forwarding 0 set /files/etc/sysctl.conf/net.ipv6.conf.default.accept_dad 0 set /files/etc/sysctl.conf/net.ipv6.conf.all.accept_dad 0 + +set /files/etc/sysctl.conf/net.ipv6.conf.eth0.accept_ra_defrtr 0 " -r $FILESYSTEM_ROOT ## docker-py is needed by Ansible docker module From 0b8c06b9e26a3085e3851e8b7b04b0ef790cdcff Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 10 May 2017 22:48:04 -0700 Subject: [PATCH 0508/1011] [image]: re-patch the support for Broadcom 54616 phy for intel igb driver. (#574) Previous patch is not correct. --- src/igb/Makefile | 2 +- ...1-add-PHY-support-for-Broadcom-54616.patch | 61 +++++++++++++++++++ ...or-BCM54616-phy-for-intel-igb-driver.patch | 37 ----------- 3 files changed, 62 insertions(+), 38 deletions(-) create mode 100644 src/igb/patch/0001-add-PHY-support-for-Broadcom-54616.patch delete mode 100644 src/igb/patch/0001-add-support-for-BCM54616-phy-for-intel-igb-driver.patch diff --git a/src/igb/Makefile b/src/igb/Makefile index ab8c68cef32d..afa7a676748b 100644 --- a/src/igb/Makefile +++ b/src/igb/Makefile @@ -11,7 +11,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Patch pushd ./igb-$(IGB_DRIVER_VERSION) - patch -p1 < ../patch/0001-add-support-for-BCM54616-phy-for-intel-igb-driver.patch + patch -p1 < ../patch/0001-add-PHY-support-for-Broadcom-54616.patch # Build the package pushd src diff --git a/src/igb/patch/0001-add-PHY-support-for-Broadcom-54616.patch b/src/igb/patch/0001-add-PHY-support-for-Broadcom-54616.patch new file mode 100644 index 000000000000..fc468f337356 --- /dev/null +++ b/src/igb/patch/0001-add-PHY-support-for-Broadcom-54616.patch @@ -0,0 +1,61 @@ +From 10ed7b7e0fd06c312f497e4647c4140b1cc8eef8 Mon Sep 17 00:00:00 2001 +From: Guohan Lu +Date: Mon, 8 May 2017 05:53:38 +0000 +Subject: [PATCH] add PHY support for Broadcom 54616 + +--- + src/e1000_82575.c | 5 +++++ + src/e1000_defines.h | 1 + + src/e1000_hw.h | 1 + + 3 files changed, 7 insertions(+) + +diff --git a/src/e1000_82575.c b/src/e1000_82575.c +index b4b973e..afaa7e5 100644 +--- a/src/e1000_82575.c ++++ b/src/e1000_82575.c +@@ -302,6 +302,9 @@ static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) + phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_82580; + phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88; + break; ++ case BCM54616_E_PHY_ID: ++ phy->type = e1000_phy_bcm54616; ++ break; + default: + ret_val = -E1000_ERR_PHY; + goto out; +@@ -1602,6 +1605,8 @@ static s32 e1000_setup_copper_link_82575(struct e1000_hw *hw) + case e1000_phy_82580: + ret_val = e1000_copper_link_setup_82577(hw); + break; ++ case e1000_phy_bcm54616: ++ break; + default: + ret_val = -E1000_ERR_PHY; + break; +diff --git a/src/e1000_defines.h b/src/e1000_defines.h +index 6de3988..773c464 100644 +--- a/src/e1000_defines.h ++++ b/src/e1000_defines.h +@@ -1185,6 +1185,7 @@ + #define I210_I_PHY_ID 0x01410C00 + #define IGP04E1000_E_PHY_ID 0x02A80391 + #define M88_VENDOR 0x0141 ++#define BCM54616_E_PHY_ID 0x03625D10 + + /* M88E1000 Specific Registers */ + #define M88E1000_PHY_SPEC_CTRL 0x10 /* PHY Specific Control Reg */ +diff --git a/src/e1000_hw.h b/src/e1000_hw.h +index 3bcecf1..cca5d77 100644 +--- a/src/e1000_hw.h ++++ b/src/e1000_hw.h +@@ -133,6 +133,7 @@ enum e1000_phy_type { + e1000_phy_82580, + e1000_phy_vf, + e1000_phy_i210, ++ e1000_phy_bcm54616, + }; + + enum e1000_bus_type { +-- +2.7.4 + diff --git a/src/igb/patch/0001-add-support-for-BCM54616-phy-for-intel-igb-driver.patch b/src/igb/patch/0001-add-support-for-BCM54616-phy-for-intel-igb-driver.patch deleted file mode 100644 index 3059c5f6f951..000000000000 --- a/src/igb/patch/0001-add-support-for-BCM54616-phy-for-intel-igb-driver.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 548db654a498a017ce121292f12820176544e6ed Mon Sep 17 00:00:00 2001 -From: Guohan Lu -Date: Tue, 27 Dec 2016 23:21:22 +0000 -Subject: [PATCH] add support for BCM54616 phy for intel igb driver - ---- - src/e1000_82575.c | 1 + - src/e1000_defines.h | 1 + - 2 files changed, 2 insertions(+) - -diff --git a/src/e1000_82575.c b/src/e1000_82575.c -index b4b973e..248c670 100644 ---- a/src/e1000_82575.c -+++ b/src/e1000_82575.c -@@ -223,6 +223,7 @@ static s32 e1000_init_phy_params_82575(struct e1000_hw *hw) - case M88E1112_E_PHY_ID: - case M88E1340M_E_PHY_ID: - case M88E1111_I_PHY_ID: -+ case BCM54616_E_PHY_ID: - phy->type = e1000_phy_m88; - phy->ops.check_polarity = e1000_check_polarity_m88; - phy->ops.get_info = e1000_get_phy_info_m88; -diff --git a/src/e1000_defines.h b/src/e1000_defines.h -index 6de3988..d5da148 100644 ---- a/src/e1000_defines.h -+++ b/src/e1000_defines.h -@@ -1185,6 +1185,7 @@ - #define I210_I_PHY_ID 0x01410C00 - #define IGP04E1000_E_PHY_ID 0x02A80391 - #define M88_VENDOR 0x0141 -+#define BCM54616_E_PHY_ID 0x03625D10 - - /* M88E1000 Specific Registers */ - #define M88E1000_PHY_SPEC_CTRL 0x10 /* PHY Specific Control Reg */ --- -1.9.1 - From 1c767356c52dd890910b41aebce21108468ff5ae Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 11 May 2017 10:28:38 -0700 Subject: [PATCH 0509/1011] swss submodule update (#590) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 49c556ce7cdd..eed4a2d28b2b 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 49c556ce7cdd9a00952cf093191c8c7871b7913e +Subproject commit eed4a2d28b2b0d1eb1655eb74c875929ac6dbf9b From 6e45307a491f687980252496cddf7ec40fb1f9a2 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 11 May 2017 11:18:10 -0700 Subject: [PATCH 0510/1011] [docker-orchagent]: Properly manage with supervisord (#589) --- dockers/docker-orchagent/Dockerfile.j2 | 2 +- dockers/docker-orchagent/orchagent.sh | 56 +---------------------- dockers/docker-orchagent/start.sh | 19 ++++++++ dockers/docker-orchagent/supervisord.conf | 32 +++++++++++++ dockers/docker-orchagent/swssconfig.sh | 33 +++++++++++++ 5 files changed, 86 insertions(+), 56 deletions(-) create mode 100755 dockers/docker-orchagent/swssconfig.sh diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index c708f30e439b..ae67807d6eb9 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -26,7 +26,7 @@ debs/{{ deb }}{{' '}} RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -COPY ["start.sh", "orchagent.sh", "/usr/bin/"] +COPY ["start.sh", "orchagent.sh", "swssconfig.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["ipinip.json.j2", "/usr/share/sonic/templates/"] COPY ["mirror.json.j2", "/usr/share/sonic/templates/"] diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index 8afd8fab314b..cdf9ea16627a 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -1,80 +1,26 @@ #!/usr/bin/env bash -# Exit immediately upon error -set -e - -function start_app { - orchagent $ORCHAGENT_ARGS & - portsyncd $PORTSYNCD_ARGS & - intfsyncd & - neighsyncd & - for file in $SWSSCONFIG_ARGS - do - swssconfig /etc/swss/config.d/$file - sleep 1 - done -} - -function config_acl { - if [ -f "/etc/sonic/acl.json" ]; then - mkdir -p /etc/swss/config.d/acl - rm -rf /etc/swss/config.d/acl/* - translate_acl -m /etc/sonic/minigraph.xml -o /etc/swss/config.d/acl /etc/sonic/acl.json - for filename in /etc/swss/config.d/acl/*.json; do - [ -e "$filename" ] || break - swssconfig $filename - done - fi -} - -function clean_up { - pkill -9 orchagent - pkill -9 portsyncd - pkill -9 intfsyncd - pkill -9 neighsyncd - exit -} - -trap clean_up SIGTERM SIGKILL - HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` ORCHAGENT_ARGS="" -PORTSYNCD_ARGS="-p /usr/share/sonic/hwsku/port_config.ini" - -SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json " - if [ "$HWSKU" == "Force10-S6000" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [ "$HWSKU" == "Force10-S6100" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "Force10-Z9100" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "Arista-7050-QX32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" - SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [ "$HWSKU" == "Arista-7060-CX32S" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "AS7512" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "INGRASYS-S9100-C32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "ACS-MSN2700" ]; then - SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json " fi -while true; do - # Check if syncd starts - result=`echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p` - if [ "$result" != "0" ]; then - start_app - config_acl - read - fi - sleep 1 -done +exec /usr/bin/orchagent ${ORCHAGENT_ARGS} diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index b86a9aa1dc57..823e6ce4c5e4 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -11,5 +11,24 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd +# Wait for syncd to start +while true; do + RESULT=$(echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p) + + if [ "$RESULT" != "0" ]; then + break + fi + + sleep 1 +done + supervisorctl start orchagent +supervisorctl start portsyncd + +supervisorctl start intfsyncd + +supervisorctl start neighsyncd + +supervisorctl start swssconfig + diff --git a/dockers/docker-orchagent/supervisord.conf b/dockers/docker-orchagent/supervisord.conf index 943233d2d421..02c07188c61d 100644 --- a/dockers/docker-orchagent/supervisord.conf +++ b/dockers/docker-orchagent/supervisord.conf @@ -27,3 +27,35 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog +[program:portsyncd] +command=/usr/bin/portsyncd -p /usr/share/sonic/hwsku/port_config.ini +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:intfsyncd] +command=/usr/bin/intfsyncd +priority=5 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:neighsyncd] +command=/usr/bin/neighsyncd +priority=6 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:swssconfig] +command=/usr/bin/swssconfig.sh +priority=7 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh new file mode 100755 index 000000000000..f0f1e100f3d4 --- /dev/null +++ b/dockers/docker-orchagent/swssconfig.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +function config_acl { + if [ -f "/etc/sonic/acl.json" ]; then + mkdir -p /etc/swss/config.d/acl + rm -rf /etc/swss/config.d/acl/* + translate_acl -m /etc/sonic/minigraph.xml -o /etc/swss/config.d/acl /etc/sonic/acl.json + for filename in /etc/swss/config.d/acl/*.json; do + [ -e "$filename" ] || break + swssconfig $filename + done + fi +} + +HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` + +SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json " + +if [ "$HWSKU" == "Force10-S6000" ]; then + SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " +elif [ "$HWSKU" == "Arista-7050-QX32" ]; then + SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " +elif [ "$HWSKU" == "ACS-MSN2700" ]; then + SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json " +fi + +for file in $SWSSCONFIG_ARGS; do + swssconfig /etc/swss/config.d/$file + sleep 1 +done + +config_acl + From 7663da9510b645e745dd47c45d5062bfd0a40ea8 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 11 May 2017 12:37:14 -0700 Subject: [PATCH 0511/1011] Disable updategraph after first time (#592) --- files/image_config/updategraph/updategraph | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index 0d3b248bc436..a46a5f73a0cf 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -68,6 +68,10 @@ while true; do sleep 5 done +# Mark as disabled after graph is successfully downloaded +sed -i "/enabled=/d" /etc/sonic/updategraph.conf +echo "enabled=false" >> /etc/sonic/updategraph.conf + if [ -n "$ACL_URL" ]; then if [ -f /etc/sonic/acl.json ]; then echo "Renaming acl.json to acl.json.old" From b26ec863e84f758fa82e0548ef1cfa78e8aa886a Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 11 May 2017 18:46:11 -0700 Subject: [PATCH 0512/1011] [docker-base]: Add less, strace, and configuration for vim (#591) * Add less in docker-base. Add strace in docker_base_dbg. * Make link vim to vim.tiny and have vim config file --- build_debian.sh | 1 + dockers/docker-base/Dockerfile.j2 | 6 +++++- dockers/docker-base/root/.vimrc | 2 ++ rules/docker-base.mk | 3 ++- 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 dockers/docker-base/root/.vimrc diff --git a/build_debian.sh b/build_debian.sh index 009cf3bf4b88..d713ca0e52a1 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -199,6 +199,7 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in logrotate \ curl \ kexec-tools \ + less \ unzip ## Disable kexec supported reboot which was installed by default diff --git a/dockers/docker-base/Dockerfile.j2 b/dockers/docker-base/Dockerfile.j2 index b014c20a6401..d02d3c545027 100644 --- a/dockers/docker-base/Dockerfile.j2 +++ b/dockers/docker-base/Dockerfile.j2 @@ -27,10 +27,12 @@ RUN apt-get -y install \ supervisor \ vim-tiny \ perl \ - python + python \ + less COPY ["etc/rsyslog.conf", "/etc/rsyslog.conf"] COPY ["etc/rsyslog.d/*", "/etc/rsyslog.d/"] +COPY ["root/.vimrc", "/root/.vimrc"] RUN apt-get -y purge \ exim4 \ @@ -44,6 +46,8 @@ RUN apt-get -y install \ {% for dbg_pkg in docker_base_dbgs.split(' ') -%} {{ dbg_pkg }}{{' '}} {%- endfor %} +{% else %} +RUN ln /usr/bin/vim.tiny /usr/bin/vim {% endif %} ## Clean up apt diff --git a/dockers/docker-base/root/.vimrc b/dockers/docker-base/root/.vimrc new file mode 100644 index 000000000000..5c1ba8a04f47 --- /dev/null +++ b/dockers/docker-base/root/.vimrc @@ -0,0 +1,2 @@ +" enable vim features +set nocompatible diff --git a/rules/docker-base.mk b/rules/docker-base.mk index f041f7d05cdd..1580c357cddf 100644 --- a/rules/docker-base.mk +++ b/rules/docker-base.mk @@ -8,7 +8,8 @@ GDB = gdb VIM = vim OPENSSH = openssh-client SSHPASS = sshpass -$(DOCKER_BASE)_DBG_PACKAGES += $(GDB) $(VIM) $(OPENSSH) $(SSHPASS) +STRACE = strace +$(DOCKER_BASE)_DBG_PACKAGES += $(GDB) $(VIM) $(OPENSSH) $(SSHPASS) $(STRACE) endif SONIC_DOCKER_IMAGES += $(DOCKER_BASE) From a5088ae9ec96cc0fac31764cab5130473992e5c7 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 11 May 2017 18:57:00 -0700 Subject: [PATCH 0513/1011] [debian]: Add kernel configuration to reboot on kernel soft lockup (#594) --- build_debian.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build_debian.sh b/build_debian.sh index d713ca0e52a1..5b58358e017c 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -217,6 +217,9 @@ sudo mkdir -p $FILESYSTEM_ROOT/var/core sudo augtool --autosave " set /files/etc/sysctl.conf/kernel.core_pattern '|/usr/bin/coredump-compress %e %p' +set /files/etc/sysctl.conf/kernel.softlockup_panic 1 +set /files/etc/sysctl.conf/kernel.panic 10 + set /files/etc/sysctl.conf/net.ipv4.conf.default.forwarding 1 set /files/etc/sysctl.conf/net.ipv4.conf.all.forwarding 1 set /files/etc/sysctl.conf/net.ipv4.conf.eth0.forwarding 0 From f4343ac60009d90ecfb4da052a3c2e7ab7ada58a Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Fri, 12 May 2017 10:13:51 +0300 Subject: [PATCH 0514/1011] [mellanox]: Update SAI revision. (#593) New revision contains fixes to LAG and WRED configuration. Signed-off-by: marian-pritsak --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 163e298553f8..8ad62aae2f52 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = 161120 -MLNX_SAI_REVISION = 1a4307f0ac40b28cd8ed8f48569458212d90366e +MLNX_SAI_REVISION = dd6b7cf8fcdc87a40cb694799daf8c081e859a14 export MLNX_SAI_VERSION MLNX_SAI_REVISION From 34449c162e2ecaa58b4eed6de3bdbdb033fcf718 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Fri, 12 May 2017 17:22:37 +0300 Subject: [PATCH 0515/1011] [mellanox][hw-management]: Update to 1.0.0100. (#599) New revision contains support for sys_eeprom in MSN2410 and MSN2100. Changes in mlnx2100 script for loading drivers. Signed-off-by: marian-pritsak --- platform/mellanox/hw-management.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk index 83c7632376f0..762bb6e53fe3 100644 --- a/platform/mellanox/hw-management.mk +++ b/platform/mellanox/hw-management.mk @@ -1,6 +1,6 @@ # Mellanox HW Management -MLNX_HW_MANAGEMENT_VERSION = V1.0.0070 +MLNX_HW_MANAGEMENT_VERSION = V1.0.0100 export MLNX_HW_MANAGEMENT_VERSION From 2cfa289d3e70376b67d8911219f4292d3a6836f1 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 12 May 2017 10:56:50 -0700 Subject: [PATCH 0516/1011] Image version safely treats slash in branch name (#596) --- build_debian.sh | 3 --- functions.sh | 5 +++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 5b58358e017c..d2eaa43b3c46 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -116,11 +116,8 @@ sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/linux-image-3.16.0-4-amd64_*.de ## Update initramfs for booting with squashfs+aufs cat files/initramfs-tools/modules | sudo tee -a $FILESYSTEM_ROOT/etc/initramfs-tools/modules > /dev/null -IMAGE_VERSION=$(. functions.sh && sonic_get_version) - ## Hook into initramfs: change fs type from vfat to ext4 on arista switches sudo mkdir -p $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/ -sed -i -e "s/%%IMAGE_VERSION%%/$IMAGE_VERSION/g" files/initramfs-tools/arista-convertfs sudo cp files/initramfs-tools/arista-convertfs $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-convertfs sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-convertfs sudo cp files/initramfs-tools/mke2fs $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/mke2fs diff --git a/functions.sh b/functions.sh index 8ca3d5422340..c73aeb45d649 100644 --- a/functions.sh +++ b/functions.sh @@ -59,9 +59,10 @@ sonic_get_version() { fi BUILD_NUMBER=${BUILD_NUMBER:-0} ## Check if we are on tagged commit + ## Note: escape the version string by sed: / -> _ if [ "$describe" == "$latest_tag" ]; then - echo "${latest_tag}${dirty}" + echo "${latest_tag}${dirty}" | sed 's/\//_/g' else - echo "${branch_name}.${BUILD_NUMBER}${dirty:--$(git rev-parse --short HEAD)}" + echo "${branch_name}.${BUILD_NUMBER}${dirty:--$(git rev-parse --short HEAD)}" | sed 's/\//_/g' fi } From 973ee89b27cefae334c44bf93620e4030de70b3d Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 12 May 2017 12:08:09 -0700 Subject: [PATCH 0517/1011] [Broadcom]: Update Broadcom SDK to 3.2.2.2-7 (#595) --- platform/broadcom/sdk.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index a41ad6662d46..070613d64dc0 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.2.2-6-20170509231001.38_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-6-20170509231001.38_amd64.deb?sv=2015-04-05&sr=b&sig=xawExeGCWMMToo%2Fsk%2BNFRHIXK1eJiqOir4lZ5FUvIdo%3D&se=2031-01-17T07%3A00%3A10Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.2.2-7-20170512003351.39_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-7-20170512003351.39_amd64.deb?sv=2015-04-05&sr=b&sig=YHETYSIxpB6LyTh2vhQ1TrGXommA2NiUdolk5QBJ0PE%3D&se=2031-01-19T01%3A40%3A27Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-6-20170509231001.38_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-6-20170509231001.38_amd64.deb?sv=2015-04-05&sr=b&sig=PPo0AKc%2FwnaAwNsA2O6e5erAZ4vso6KRXxgrNN%2FlJ3A%3D&se=2031-01-17T07%3A00%3A56Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-7-20170512003351.39_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-7-20170512003351.39_amd64.deb?sv=2015-04-05&sr=b&sig=33kv%2F2UogAuvHu3gPQ1rB7TVp9I%2Bjq%2FbmObzEZgfKD4%3D&se=2031-01-19T01%3A39%3A56Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From d296ceadd51dd9342ad205d990ea7b833d8d38d8 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 15 May 2017 11:45:41 -0700 Subject: [PATCH 0518/1011] [swss] submodule update (#604) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index eed4a2d28b2b..75e559a5063d 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit eed4a2d28b2b0d1eb1655eb74c875929ac6dbf9b +Subproject commit 75e559a5063d9513b1fafd96d62c020e3c0a5eee From 910e66679887b3f5d557ea007ef759a64c6b6044 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 15 May 2017 14:32:39 -0700 Subject: [PATCH 0519/1011] Add /usr/bin/generate_dump to sudoers file; Update sonic-utilities submodule (#603) --- files/image_config/sudoers/sudoers | 1 + src/sonic-utilities | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/files/image_config/sudoers/sudoers b/files/image_config/sudoers/sudoers index 1b1979a2e9bb..df2f59803176 100644 --- a/files/image_config/sudoers/sudoers +++ b/files/image_config/sudoers/sudoers @@ -18,6 +18,7 @@ Defaults env_keep += "VTYSH_PAGER" # Cmnd alias specification # Note: bcmcmd is dangerous for users in read only netgroups because it may operate ASIC Cmnd_Alias READ_ONLY_CMDS = /usr/bin/decode-syseeprom, \ + /usr/bin/generate_dump, \ /usr/bin/vtysh -c show *, \ /bin/cat /var/log/syslog, \ /usr/bin/tail -f /var/log/syslog diff --git a/src/sonic-utilities b/src/sonic-utilities index 3378ef8387f6..f31087a030e6 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 3378ef8387f643f3ef81cbc15a6b4bda95570e21 +Subproject commit f31087a030e685c6e1bcbdfa49d7a322c7f3d66a From 8af03fd0f9c563fecdfcf5bcab6bfa470e3d840c Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 15 May 2017 17:06:19 -0700 Subject: [PATCH 0520/1011] [orchagent]: Add ARP update script to maintain VLAN neighbors (#401) - Extend ARP reachable time to 30min - Add arping to docker-swss - Add arp_update script to routinely probe neighbors Signed-off-by: Shuotian Cheng --- build_debian.sh | 2 ++ dockers/docker-orchagent/Dockerfile.j2 | 4 ++-- dockers/docker-orchagent/arp_update | 17 +++++++++++++++++ dockers/docker-orchagent/start.sh | 5 +++++ dockers/docker-orchagent/supervisord.conf | 7 +++++++ 5 files changed, 33 insertions(+), 2 deletions(-) create mode 100755 dockers/docker-orchagent/arp_update diff --git a/build_debian.sh b/build_debian.sh index d2eaa43b3c46..014deec23dbf 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -232,6 +232,8 @@ set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_filter 0 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_notify 1 set /files/etc/sysctl.conf/net.ipv4.conf.all.arp_ignore 2 +set /files/etc/sysctl.conf/net.ipv4.neigh.default.base_reachable_time_ms 1800000 + set /files/etc/sysctl.conf/net.ipv6.conf.default.forwarding 1 set /files/etc/sysctl.conf/net.ipv6.conf.all.forwarding 1 set /files/etc/sysctl.conf/net.ipv6.conf.eth0.forwarding 0 diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index ae67807d6eb9..e4e155163076 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -5,7 +5,7 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update -RUN apt-get install -f -y ifupdown libdbus-1-3 libdaemon0 libjansson4 +RUN apt-get install -f -y ifupdown arping libdbus-1-3 libdaemon0 libjansson4 ## Install redis-tools dependencies ## TODO: implicitly install dependencies @@ -26,7 +26,7 @@ debs/{{ deb }}{{' '}} RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -COPY ["start.sh", "orchagent.sh", "swssconfig.sh", "/usr/bin/"] +COPY ["arp_update", "start.sh", "orchagent.sh", "swssconfig.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["ipinip.json.j2", "/usr/share/sonic/templates/"] COPY ["mirror.json.j2", "/usr/share/sonic/templates/"] diff --git a/dockers/docker-orchagent/arp_update b/dockers/docker-orchagent/arp_update new file mode 100755 index 000000000000..8291818e50fb --- /dev/null +++ b/dockers/docker-orchagent/arp_update @@ -0,0 +1,17 @@ +#!/bin/bash +# +# usage: +# arp_update: Send gratuitous ARP requests to VLAN member neighbors to refresh +# the neighbors state. + +VLAN=`sonic-cfggen -m /etc/sonic/minigraph.xml -v 'minigraph_vlans.keys() | join(" ")'` +for vlan in $VLAN; do + # generate a list of arping commands: + # arping -q -w 0 -c 1 -i ; + # arping -q -w 0 -c 1 -i ; + # ... + arpingcmd="sed -e 's/ / -i /' -e 's/^/arping -q -w 0 -c 1 /' -e 's/$/;/'" + ipcmd="ip -4 neigh show | grep $vlan | cut -d ' ' -f 1,3 | $arpingcmd" + + eval `eval $ipcmd` +done diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 823e6ce4c5e4..40ef66441c02 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -32,3 +32,8 @@ supervisorctl start neighsyncd supervisorctl start swssconfig +# Start arp_update when VLAN exists +VLAN=`sonic-cfggen -m /etc/sonic/minigraph.xml -v 'minigraph_vlans.keys() | join(" ")'` +if [ "$VLAN" != "" ]; then + supervisorctl start arp_update +fi diff --git a/dockers/docker-orchagent/supervisord.conf b/dockers/docker-orchagent/supervisord.conf index 02c07188c61d..770fda701029 100644 --- a/dockers/docker-orchagent/supervisord.conf +++ b/dockers/docker-orchagent/supervisord.conf @@ -59,3 +59,10 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog +[program:arp_update] +command=bash -c "/usr/bin/arp_update && sleep 300" +priority=8 +autostart=false +autorestart=true +stdout_logfile=syslog +stderr_logfile=syslog From cb969fc843b7a2aab5516c0090d241122e2053e5 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Tue, 16 May 2017 08:07:47 -0700 Subject: [PATCH 0521/1011] [platform] Add Arista DCS-7050QX-32S and missing plugins (#597) * Update sonic-platform-modules-arista submodule * Add sensors.conf for Arista DCS-7050QX-32S * Add plugin/eeprom.py for Arista DCS-7050QX-32S * Add plugin/sfputil.py for Arista DCS-7050QX-32S * Add port_config.ini for Arista DCS-7050QX-32S * Add plugin/sfputil.py for Arista DCS-7060CX-32S * Add plugin/eeprom.py for Arista DCS-7060CX-32S * Update plugin/eeprom.py for Arista DCS-7050QX-32 --- .../x86_64-arista_7050_qx32/plugins/eeprom.py | 219 +----------------- .../Arista-7050-QX32S/port_config.ini | 33 +++ .../Arista-7050-QX32S/sai.profile | 1 + .../plugins/eeprom.py | 13 ++ .../plugins/sfputil.py | 30 +++ .../x86_64-arista_7050_qx32s/sensors.conf | 49 ++++ .../plugins/eeprom.py | 13 ++ .../plugins/sfputil.py | 28 +++ dockers/docker-orchagent/orchagent.sh | 2 + .../broadcom/sonic-platform-modules-arista | 2 +- 10 files changed, 176 insertions(+), 214 deletions(-) create mode 100644 device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/port_config.ini create mode 100644 device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/sai.profile create mode 100644 device/arista/x86_64-arista_7050_qx32s/plugins/eeprom.py create mode 100644 device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py create mode 100644 device/arista/x86_64-arista_7050_qx32s/sensors.conf create mode 100644 device/arista/x86_64-arista_7060_cx32s/plugins/eeprom.py create mode 100644 device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py diff --git a/device/arista/x86_64-arista_7050_qx32/plugins/eeprom.py b/device/arista/x86_64-arista_7050_qx32/plugins/eeprom.py index f8a3515d924f..9da54dbf1b90 100644 --- a/device/arista/x86_64-arista_7050_qx32/plugins/eeprom.py +++ b/device/arista/x86_64-arista_7050_qx32/plugins/eeprom.py @@ -1,220 +1,13 @@ #!/usr/bin/env python -############################################################################# -# Arista 7050-QX32 -# -# Platform and model specific eeprom subclass, inherits from the base class, -# and provides the followings: -# - the eeprom format definition -# - specific encoder/decoder if there is special need -############################################################################# +""" +Arista 7050QX-32 eeprom plugin +Uses the arista driver library to obtain the TlvInfoDecoder +""" try: - import exceptions - import binascii - import time - import optparse - import warnings - import os - import sys - import subprocess - import re - import struct - import zlib - import StringIO - from sonic_eeprom import eeprom_base - from sonic_eeprom import eeprom_tlvinfo + import arista.utils.sonic_eeprom as arista_eeprom except ImportError, e: raise ImportError (str(e) + "- required module not found") -def showMac( m ): - return ":".join([m[0:2], m[2:4], m[4:6], m[6:8], m[8:10], m[10:12]]) - -typeMap = { - "END" : ( "00", None, None, None, False ), - "SKU" : ( "03", None, None, None, False ), - "MAC" : ( "05", None, showMac, None, False ), - "SerialNumber" : ( "0E", None, None, None, False ), - } - -idToNameMap = {} -for k, v in typeMap.iteritems(): - idToNameMap[ v[0] ] = k - -class board(eeprom_tlvinfo.TlvInfoDecoder): - _TLV_INFO_MAX_LEN = 256 - _TLV_HDR_ENABLED = 0 - - pFdl = None - - def __init__(self, name, path, cpld_root, ro): - self.eeprom_path = "/sys/bus/i2c/drivers/eeprom/1-0052/eeprom" - super(board, self).__init__(self.eeprom_path, 0, '', True) - - def _decode_eeprom(self, e): - # For format 0002 and more recent fdls use the new Prefdl class - data = e[0:4] - if data in ("0002", "0003"): - fp = StringIO.StringIO(e[4:]) - self.pFdl = PreFdl( fp, data, data ) - - def decode_eeprom(self, e): - self._decode_eeprom(e) - return self.pFdl.show() - - def is_checksum_valid(self, e): - self._decode_eeprom(e) - return (True, self.pFdl.get_crc()) - - def serial_number_str(self, e): - self._decode_eeprom(e) - return self.pFdl.get_field('SerialNumber') - - def mgmtaddrstr(self,e): - self._decode_eeprom(e) - return self.pFdl.get_field('MAC') - -def crc32( data ): - return struct.unpack("I",struct.pack("i",zlib.crc32( data )))[0] - -def validSerial( x ): - x = x.replace( " ", "" ) - x = x.replace( "-", "" ) - # All serial numbers are upper case - x = x.upper() - if re.compile( "[A-Z]{3}\d{4}[A-Z0-9]{4}$" ).match( x ): - return x - return None - -class PreFdlField( ): - def __init__( self, name, valid, show, optionName, data=None, append=False ): - self.name = name - if valid: - self.valid = valid - else: - self.valid = lambda x: x - self.show = show - self.optionName = optionName - self.data = [] - self.append = append - if data: - self.dataIs( data ) - - def dataIs( self, data ): - vd = self.valid( data ) - if not vd: - raise InvalidPrefdlData( "Invalid %s: %s" % ( self.name, data ) ) - if self.append: - self.data.append( vd ) - else: - self.data = [ vd ] - -class TlvField( PreFdlField ): - def __init__( self, name ): - args = typeMap.get( name ) - valid = None - show = None - optionName = None - append = False - if args: - self.id, valid, show, optionName, append = args - PreFdlField.__init__( self, name, valid, show, optionName, append=append ) - - -class PreFdl(): - def __init__( self, fp=None, preFdlStr=None, version="0002" ): - # populate the required fields - self.requiredFields = [] - self.mac = None - self.serial = None - - if version == "0002": - preFdlStr, offset = self.initPreFdl2( fp, preFdlStr ) - elif version == "0003": - preFdlStr, offset = self.initPreFdl3( fp, preFdlStr ) - else: - raise NotImplementedError( - "Only Prefdl data format version 0002 or 0003 are supported" ) - - # populate the tlv fileds - self.tlvFields = {} - for k in typeMap.keys(): - self.tlvFields[ k ] = TlvField( k ) - - # create the map option to field - self.optionMap = {} - for f in self.requiredFields + self.tlvFields.values(): - # Do not add the option from TLV if already added by required fields - if f.optionName and f.optionName not in self.optionMap: - self.optionMap[ f.optionName ] = f - - # save the current tlv fields - if fp: - while True: - tlv = fp.read( 6 ) - ( id, lengthStr ) = ( tlv[0:2], tlv[2:6] ) - length = int( lengthStr, base=16 ) - bytes = fp.read( length ) - what = None if id not in idToNameMap.keys() else idToNameMap[ id ] - if what and what != "END": - self.tlvFields[ what ].dataIs( bytes ) - preFdlStr += tlv + bytes - offset += 6 + length - if what == "END": - # End of the tlv list - break - self.crc = fp.read( 8 ) - # Check the CRC - computed = crc32( preFdlStr ) - if int( self.crc, 16 ) != computed: - raise Exception( "Invalid CRC -- saw %s expected %8X" % - ( self.crc, computed ) ) - - # Initialize and parse fixed section for prefdl version 2. Return the offset - # to where the TLV section starts. - def initPreFdl2( self, fp, preFdlStr ): - # if we start with an existing file - if fp: - # if no preFdlStr is specified, read the fixed section, 30 bytes. - # Otherwise, only the 4 byte data version section was written and - # read the remaining 26 bytes from the fixed section. - if not preFdlStr: - preFdlStr = fp.read( 30 ).strip() - elif preFdlStr == "0002": - preFdlStr += fp.read( 26 ).strip() - else: - raise ValueError( "preFdlStr arg has invalid data format" ) - if len( preFdlStr ) < 12: - fatal( "prefdl is too short exiting" ) - data = None if not preFdlStr else preFdlStr[ 16:16 + 11 ] - self.requiredFields.append( - PreFdlField( "SerialNumber", validSerial, None, None, data ) ) - return preFdlStr, 30 - - # Initialize and parse fixed section for prefdl version 3. Return the offset - # to where the TLV section starts. - def initPreFdl3( self, fp, preFdlStr ): - # if we start with an existing file - currPtr = 0 - if fp and not preFdlStr: - preFdlStr = fp.read( 4 ).strip() - if len( preFdlStr ) < 4: - fatal( "prefdl is too short exiting" ) - return preFdlStr, 4 - - def show( self ): - for f in self.requiredFields + self.tlvFields.values(): - for d in f.data: - dStr = d if f.show is None else f.show( d ) - print "%s: %s" % ( f.name, dStr ) - - def get_field( self, name ): - for f in self.requiredFields + self.tlvFields.values(): - for d in f.data: - if f.name == name: - dStr = d if f.show is None else f.show( d ) - return dStr - - def get_crc( self ): - return self.crc - +board = arista_eeprom.getTlvInfoDecoder() diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/port_config.ini b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/port_config.ini new file mode 100644 index 000000000000..b56d958499d4 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 9,10,11,12 Ethernet5/1 +Ethernet4 13,14,15,16 Ethernet6/1 +Ethernet8 17,18,19,20 Ethernet7/1 +Ethernet12 21,22,23,24 Ethernet8/1 +Ethernet16 29,30,31,32 Ethernet9/1 +Ethernet20 25,26,27,28 Ethernet10/1 +Ethernet24 33,34,35,36 Ethernet11/1 +Ethernet28 37,38,39,40 Ethernet12/1 +Ethernet32 45,46,47,48 Ethernet13/1 +Ethernet36 41,42,43,44 Ethernet14/1 +Ethernet40 49,50,51,52 Ethernet15/1 +Ethernet44 53,54,55,56 Ethernet16/1 +Ethernet48 69,70,71,72 Ethernet17/1 +Ethernet52 65,66,67,68 Ethernet18/1 +Ethernet56 73,74,75,76 Ethernet19/1 +Ethernet60 77,78,79,80 Ethernet20/1 +Ethernet64 93,94,95,96 Ethernet21/1 +Ethernet68 89,90,91,92 Ethernet22/1 +Ethernet72 97,98,99,100 Ethernet23/1 +Ethernet76 101,102,103,104 Ethernet24/1 +Ethernet80 109,110,111,112 Ethernet25/1 +Ethernet84 105,106,107,108 Ethernet26/1 +Ethernet88 121,122,123,124 Ethernet27/1 +Ethernet92 125,126,127,128 Ethernet28/1 +Ethernet96 61,62,63,64 Ethernet29 +Ethernet100 57,58,59,60 Ethernet30 +Ethernet104 81,82,83,84 Ethernet31 +Ethernet108 85,86,87,88 Ethernet32 +Ethernet112 117,118,119,120 Ethernet33 +Ethernet116 113,114,115,116 Ethernet34 +Ethernet120 1,2,3,4 Ethernet35 +Ethernet124 5,6,7,8 Ethernet36 diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/sai.profile b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/sai.profile new file mode 100644 index 000000000000..e06f3ba3a4b1 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/td2-a7050-qx32s-32x40G.config.bcm diff --git a/device/arista/x86_64-arista_7050_qx32s/plugins/eeprom.py b/device/arista/x86_64-arista_7050_qx32s/plugins/eeprom.py new file mode 100644 index 000000000000..d1c6212219d4 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/plugins/eeprom.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +""" +Arista 7050QX-32S eeprom plugin +Uses the arista driver library to obtain the TlvInfoDecoder +""" + +try: + import arista.utils.sonic_eeprom as arista_eeprom +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +board = arista_eeprom.getTlvInfoDecoder() diff --git a/device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py b/device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py new file mode 100644 index 000000000000..18472c44c55b --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + eeprom_offset = 10 + + port_to_eeprom_mapping = {} + + _qsfp_ports = range(0, ports_in_block + 1) + + # also has sfp[1-4] ports handled by a mux to choose against qsfp5 + # i2c-40 to i2c-43 + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + for x in range(0, self.port_end + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) + sfputilbase.__init__(self, port_num) diff --git a/device/arista/x86_64-arista_7050_qx32s/sensors.conf b/device/arista/x86_64-arista_7050_qx32s/sensors.conf new file mode 100644 index 000000000000..fc5f5c8c3e8e --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/sensors.conf @@ -0,0 +1,49 @@ +# libsensors configuration file for DCS-7050QX-32S +# ------------------------------------------------ +# + +bus "i2c-2" "SCD SMBus master 0 bus 0" +bus "i2c-3" "SCD SMBus master 0 bus 1" +bus "i2c-5" "SCD SMBus master 0 bus 3" +bus "i2c-6" "SCD SMBus master 0 bus 4" +bus "i2c-7" "SCD SMBus master 0 bus 5" + +chip "k10temp-pci-00c3" + label temp1 "Cpu temp sensor" + +chip "max6658-i2c-2-4c" + label temp1 "Board temp sensor" + set temp1_max 55 + set temp1_crit 70 + + label temp2 "Front panel temp sensor" + set temp2_max 65 + set temp2_crit 75 + +chip "max6658-i2c-3-4c" + label temp1 "Cpu board temp sensor" + set temp1_max 75 + set temp1_crit 80 + + label temp2 "Back panel temp sensor" + set temp2_max 75 + set temp2_crit 80 + +chip "pmbus-i2c-3-4e" + label temp1 "Power controller 1 sensor 1" + label temp2 "Power controller 1 sensor 2" + +chip "pmbus-i2c-7-4e" + label temp1 "Power controller 2 sensor 1" + label temp2 "Power controller 2 sensor 2" + +chip "pmbus-i2c-6-58" + label temp1 "Power supply 1 hotspot sensor" + label temp2 "Power supply 1 inlet temp sensor" + label temp3 "Power supply 1 sensor" + +chip "pmbus-i2c-5-58" + label temp1 "Power supply 2 hotspot sensor" + label temp2 "Power supply 2 inlet temp sensor" + label temp3 "Power supply 2 sensor" + diff --git a/device/arista/x86_64-arista_7060_cx32s/plugins/eeprom.py b/device/arista/x86_64-arista_7060_cx32s/plugins/eeprom.py new file mode 100644 index 000000000000..0cfe5109a300 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/plugins/eeprom.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +""" +Arista 7060CX-32S eeprom plugin +Uses the arista driver library to obtain the TlvInfoDecoder +""" + +try: + import arista.utils.sonic_eeprom as arista_eeprom +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +board = arista_eeprom.getTlvInfoDecoder() diff --git a/device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py b/device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py new file mode 100644 index 000000000000..0f7f0d2cac85 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 33 + ports_in_block = 34 + + eeprom_offset = 18 + + port_to_eeprom_mapping = {} + + _qsfp_ports = range(0, 32 + 1) + _sfp_ports = range(33, 34 + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + for x in range(0, self.port_end + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) + sfputilbase.__init__(self, port_num) diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index cdf9ea16627a..15eb2c7e17ac 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -14,6 +14,8 @@ elif [ "$HWSKU" == "Force10-Z9100" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "Arista-7050-QX32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "Arista-7050-QX32S" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "Arista-7060-CX32S" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "AS7512" ]; then diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index a1ca8013e952..43ed7b2330f2 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit a1ca8013e952d1cc0d555c24fe6eb2bf016ab694 +Subproject commit 43ed7b2330f2c7928f8098ca6c78bd9533b918c5 From d70e9734966e542e0a0ed0f29eb5d128931f7b8f Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 16 May 2017 16:46:30 -0700 Subject: [PATCH 0522/1011] snmpd ignores unavailable disks (#607) --- dockers/docker-snmp-sv2/snmpd.conf.j2 | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dockers/docker-snmp-sv2/snmpd.conf.j2 b/dockers/docker-snmp-sv2/snmpd.conf.j2 index fe3c5cadbb47..c5d299af05ef 100644 --- a/dockers/docker-snmp-sv2/snmpd.conf.j2 +++ b/dockers/docker-snmp-sv2/snmpd.conf.j2 @@ -57,7 +57,7 @@ sysServices 72 # # Process Monitoring # -# todo: should we enable snmp based monitoring of sswsyncd and other processes? +# TODO: should we enable snmp based monitoring of sswsyncd and other processes? # At least one 'sendmail' process, but no more than 10 #proc sendmail 10 1 @@ -72,7 +72,12 @@ sysServices 72 # 10MBs required on root disk, 5% free on /var, 10% free on all other disks disk / 10000 disk /var 5% -includeAllDisks 10% + +# Note: includeAllDisks will conflict with ignoredisk +# TODO: /root/* are introduced by aufs union mount, happening in initramfs stage. Clean them in the mount list. +ignoredisk /root/host +ignoredisk /root/dev +ignoredisk /root/dev/pts # Walk the UCD-SNMP-MIB::dskTable to see the resulting output # Note that this table will be empty if there are no "disk" entries in the snmpd.conf file @@ -110,7 +115,7 @@ load 12 10 5 # Event MIB - automatically generate alerts # # Remember to activate the 'createUser' lines above -#iquerySecName internalUser +#iquerySecName internalUser #rouser internalUser # generate traps on UCD error conditions #defaultMonitors yes From 72b8284e579c0f20434440045b26760a57b4b72e Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 17 May 2017 13:02:17 -0700 Subject: [PATCH 0523/1011] Update sonic-utilities submodule; Add commands to sudoers as necessary (#608) --- files/image_config/sudoers/sudoers | 7 +++++++ src/sonic-utilities | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/files/image_config/sudoers/sudoers b/files/image_config/sudoers/sudoers index df2f59803176..de62c7dd446b 100644 --- a/files/image_config/sudoers/sudoers +++ b/files/image_config/sudoers/sudoers @@ -18,7 +18,14 @@ Defaults env_keep += "VTYSH_PAGER" # Cmnd alias specification # Note: bcmcmd is dangerous for users in read only netgroups because it may operate ASIC Cmnd_Alias READ_ONLY_CMDS = /usr/bin/decode-syseeprom, \ + /usr/bin/docker images *, \ + /usr/bin/docker exec -it snmp cat /etc/snmp/snmpd.conf, \ + /usr/bin/docker exec -it bgp cat /etc/quagga/bgpd.conf, \ /usr/bin/generate_dump, \ + /usr/bin/lldpctl, \ + /usr/bin/lldpshow, \ + /usr/bin/sensors, \ + /usr/bin/sfputil, \ /usr/bin/vtysh -c show *, \ /bin/cat /var/log/syslog, \ /usr/bin/tail -f /var/log/syslog diff --git a/src/sonic-utilities b/src/sonic-utilities index f31087a030e6..70fd4fab6a47 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit f31087a030e685c6e1bcbdfa49d7a322c7f3d66a +Subproject commit 70fd4fab6a4745052f3b19b04de0588031b29b22 From 72412962926b8ad5c0cf6bb5e600bd0eb6722b80 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 17 May 2017 13:26:51 -0700 Subject: [PATCH 0524/1011] [Broadcom]: Update Broadcom SDK to 3.2.2.2-8 (#605) --- platform/broadcom/sdk.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 070613d64dc0..143d4e5e27c7 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.2.2-7-20170512003351.39_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-7-20170512003351.39_amd64.deb?sv=2015-04-05&sr=b&sig=YHETYSIxpB6LyTh2vhQ1TrGXommA2NiUdolk5QBJ0PE%3D&se=2031-01-19T01%3A40%3A27Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.2.2-8-20170515203732.42_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-8-20170515203732.42_amd64.deb?sv=2015-04-05&sr=b&sig=70Ae7gJ9tCEwOiOX4N%2BxJ65uc9W55KmatvW7Yyx2mr8%3D&se=2031-01-23T00%3A01%3A52Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-7-20170512003351.39_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-7-20170512003351.39_amd64.deb?sv=2015-04-05&sr=b&sig=33kv%2F2UogAuvHu3gPQ1rB7TVp9I%2Bjq%2FbmObzEZgfKD4%3D&se=2031-01-19T01%3A39%3A56Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-8-20170515203732.42_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-8-20170515203732.42_amd64.deb?sv=2015-04-05&sr=b&sig=K4emi7bcH6UGBukvJJFHo8lgCbK6omuBM16DK4yhRbo%3D&se=2031-01-23T00%3A02%3A19Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From 71e3ee8bf2a3965be7b104adc97dc40249dad0e2 Mon Sep 17 00:00:00 2001 From: Nadiya Date: Thu, 18 May 2017 10:58:21 +0300 Subject: [PATCH 0525/1011] Fancontrol for AS7512 (#575) Signed-off-by: Nadiya.Stetskovych --- device/accton/x86_64-accton_as7512_32x-r0/fancontrol | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 device/accton/x86_64-accton_as7512_32x-r0/fancontrol diff --git a/device/accton/x86_64-accton_as7512_32x-r0/fancontrol b/device/accton/x86_64-accton_as7512_32x-r0/fancontrol new file mode 100644 index 000000000000..899d2db79228 --- /dev/null +++ b/device/accton/x86_64-accton_as7512_32x-r0/fancontrol @@ -0,0 +1,7 @@ +INTERVAL=10 +FCTEMPS=/sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/3-0048/hwmon/hwmon[[:print:]]*/temp1_input /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/3-0049/hwmon/hwmon[[:print:]]*/temp1_input /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/3-004a/hwmon/hwmon[[:print:]]*/temp1_input +FCFANS=/sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan1_front_speed_rpm /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan2_front_speed_rpm /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan3_front_speed_rpm /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan4_front_speed_rpm /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan5_front_speed_rpm /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan6_front_speed_rpm +MINTEMP=/sys/bus/i2c/devices/2-0066/fan_pwm=20 +MAXTEMP=/sys/bus/i2c/devices/2-0066/fan_pwm=60 +MINSTART=/sys/bus/i2c/devices/2-0066/fan_pwm=150 +MINSTOP=/sys/bus/i2c/devices/2-0066/fan_pwm=7 From a7fbd775c6aee4466668279267d20822723e2970 Mon Sep 17 00:00:00 2001 From: Nadiya Date: Thu, 18 May 2017 10:59:54 +0300 Subject: [PATCH 0526/1011] [platform] Add as7512 sfp/eeprom utils (#531) * Cavm platfrom modules insmod on start Signed-off-by: Nadiya.Stetskovych * Add as77512 platform utils Signed-off-by: Nadiya.Stetskovych * Move platform related init to platform modules Signed-off-by: Nadiya.Stetskovych --- .../plugins/eeprom.py | 33 +++++++++++++++++++ .../plugins/sfputil.py | 25 ++++++++++++++ .../cavium/cavm_platform_modules/Makefile | 5 +++ .../as7512-platform-init.service | 13 ++++++++ 4 files changed, 76 insertions(+) create mode 100644 device/accton/x86_64-accton_as7512_32x-r0/plugins/eeprom.py create mode 100644 device/accton/x86_64-accton_as7512_32x-r0/plugins/sfputil.py create mode 100644 platform/cavium/cavm_platform_modules/as7512-platform-init.service diff --git a/device/accton/x86_64-accton_as7512_32x-r0/plugins/eeprom.py b/device/accton/x86_64-accton_as7512_32x-r0/plugins/eeprom.py new file mode 100644 index 000000000000..26990541231f --- /dev/null +++ b/device/accton/x86_64-accton_as7512_32x-r0/plugins/eeprom.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +############################################################################# +# Cavium +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + _TLV_INFO_MAX_LEN = 256 + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/1-0057/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/accton/x86_64-accton_as7512_32x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7512_32x-r0/plugins/sfputil.py new file mode 100644 index 000000000000..378a18c6b8bd --- /dev/null +++ b/device/accton/x86_64-accton_as7512_32x-r0/plugins/sfputil.py @@ -0,0 +1,25 @@ +#! /usr/bin/python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + + port_to_eeprom_mapping = {} + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/bus/i2c/devices/{0}-0050/sfp_eeprom' + for x in range(self.port_start, self.port_end + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + 18) + sfputilbase.__init__(self, port_num) diff --git a/platform/cavium/cavm_platform_modules/Makefile b/platform/cavium/cavm_platform_modules/Makefile index 515c1571abde..13ab41926e38 100644 --- a/platform/cavium/cavm_platform_modules/Makefile +++ b/platform/cavium/cavm_platform_modules/Makefile @@ -5,6 +5,7 @@ SHELL = /bin/bash MAIN_TARGET = cavm_platform_modules.deb DEB_BUILD_DIR = cavm-platform-modules-deb SCRIPT_SRC = $(DEB_BUILD_DIR)/ +SYSTEMD_DIR = /etc/systemd/system $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # get sources @@ -18,9 +19,13 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : popd mkdir -p $(DEB_BUILD_DIR)/lib/modules/$(KVERSION) mkdir -p $(DEB_BUILD_DIR)/usr/bin + mkdir -p $(DEB_BUILD_DIR)$(SYSTEMD_DIR)/multi-user.target.wants/ cp SONiC/AS7512-32X/module/*.ko $(DEB_BUILD_DIR)/lib/modules/$(KVERSION) cp SONiC/AS7512-32X/accton_as7512_util.py $(DEB_BUILD_DIR)/usr/bin + chmod +x $(DEB_BUILD_DIR)/usr/bin/accton_as7512_util.py + cp as7512-platform-init.service $(DEB_BUILD_DIR)$(SYSTEMD_DIR) + ln -s $(SYSTEMD_DIR)/as7512-platform-init.service $(DEB_BUILD_DIR)$(SYSTEMD_DIR)/multi-user.target.wants/as7512-platform-init.service cp -r DEBIAN $(DEB_BUILD_DIR) dpkg-deb -b $(DEB_BUILD_DIR) $(MAIN_TARGET) diff --git a/platform/cavium/cavm_platform_modules/as7512-platform-init.service b/platform/cavium/cavm_platform_modules/as7512-platform-init.service new file mode 100644 index 000000000000..69f03c0b2e45 --- /dev/null +++ b/platform/cavium/cavm_platform_modules/as7512-platform-init.service @@ -0,0 +1,13 @@ +[Unit] +Description=Accton AS7512-32X Platform initialization service +Before=pmon.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/bin/accton_as7512_util.py install +ExecStop=/usr/bin/accton_as7512_util.py clean +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target From 8ebf0b0832316748e88340357ecad51f280335d5 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 18 May 2017 10:57:19 -0700 Subject: [PATCH 0527/1011] Add monit for disk>85% into pmon docker (#582) * Add monit for disk>85% into pmon docker * Revert "Add monit for disk>85% into pmon docker" This reverts commit 9cbbf591c08bce4b52a0f68cbbddae102d7fc614. * Install monit in base image --- build_debian.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/build_debian.sh b/build_debian.sh index 014deec23dbf..eed63e6eb070 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -182,6 +182,7 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in python \ python-setuptools \ rsyslog \ + monit \ python-apt \ traceroute \ iputils-ping \ @@ -209,6 +210,27 @@ sudo cp -f files/sshd/sshd.service $FILESYSTEM_ROOT/lib/systemd/system/ssh.servi ## Config sshd sudo augtool --autosave "set /files/etc/ssh/sshd_config/UseDNS no" -r $FILESYSTEM_ROOT +## Config monit +sudo sed -i ' + s/^# set logfile syslog/set logfile syslog/; + s/^\s*set logfile \/var/# set logfile \/var/; + s/^# set httpd port/set httpd port/; + s/^# use address localhost/ use address localhost/; + s/^# allow localhost/ allow localhost/; + s/^# allow admin:monit/ allow admin:monit/; + s/^# allow @monit/ allow @monit/; + s/^# allow @users readonly/ allow @users readonly/ + ' $FILESYSTEM_ROOT/etc/monit/monitrc + +sudo tee -a $FILESYSTEM_ROOT/etc/monit/monitrc > /dev/null <<'EOF' +check filesystem root-aufs with path / + if space usage > 90% for 5 times within 10 cycles then alert +check system $HOST + if memory usage > 90% for 5 times within 10 cycles then alert + if cpu usage (user) > 90% for 5 times within 10 cycles then alert + if cpu usage (system) > 90% for 5 times within 10 cycles then alert +EOF + ## Config sysctl sudo mkdir -p $FILESYSTEM_ROOT/var/core sudo augtool --autosave " From fb4cd63ac580ec9cfef701d5d81ea53e5e9fb985 Mon Sep 17 00:00:00 2001 From: wadelnn Date: Fri, 19 May 2017 02:05:49 +0800 Subject: [PATCH 0528/1011] [Ingrasys] Add Ingrasys S8900 series platform (#569) * Add Ingrasys S8900 series platform * Add Ingrasys S8900-54XC platform driver * Add Ingrasys S8900-64XC platform driver * Reorganized Ingrasys debian package * Move fancontrol config to device-specific file directory * QSFP transceivers init on S9100-32X * Update Thermal Policy in sensors.conf * Add new Ingrasys S8900 series platform for docker-orchagent/orchagent.sh Signed-off-by: Wade He --- .gitmodules | 7 +- .../INGRASYS-S8900-54XC/port_config.ini | 55 +++ .../INGRASYS-S8900-54XC/sai.profile | 1 + .../x86_64-ingrasys_s8900_54xc-r0/fancontrol | 12 + .../installer.conf | 3 + .../minigraph.xml | 121 ++++++ .../plugins/eeprom.py | 23 ++ .../plugins/sfputil.py | 82 ++++ .../sensors.conf | 39 ++ .../INGRASYS-S8900-64XC/port_config.ini | 65 ++++ .../INGRASYS-S8900-64XC/sai.profile | 1 + .../x86_64-ingrasys_s8900_64xc-r0/fancontrol | 11 + .../installer.conf | 3 + .../minigraph.xml | 359 ++++++++++++++++++ .../plugins/eeprom.py | 23 ++ .../plugins/sfputil.py | 107 ++++++ .../sensors.conf | 56 +++ .../INGRASYS-S9100-C32/port_config.ini | 64 ++-- .../x86_64-ingrasys_s9100-r0/fancontrol | 12 + .../x86_64-ingrasys_s9100-r0/sensors.conf | 4 + dockers/docker-orchagent/orchagent.sh | 4 + platform/broadcom/one-image.mk | 2 + .../platform-modules-ingrasys-s9100.mk | 11 - .../broadcom/platform-modules-ingrasys.mk | 24 ++ platform/broadcom/rules.mk | 2 +- .../broadcom/sonic-platform-modules-ingrasys | 1 + .../sonic-platform-modules-ingrasys-s9100 | 1 - 27 files changed, 1044 insertions(+), 49 deletions(-) create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/sai.profile create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/installer.conf create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/minigraph.xml create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/eeprom.py create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/sensors.conf create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/sai.profile create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/installer.conf create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/minigraph.xml create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/eeprom.py create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/sensors.conf create mode 100644 device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol delete mode 100755 platform/broadcom/platform-modules-ingrasys-s9100.mk create mode 100644 platform/broadcom/platform-modules-ingrasys.mk create mode 160000 platform/broadcom/sonic-platform-modules-ingrasys delete mode 160000 platform/broadcom/sonic-platform-modules-ingrasys-s9100 diff --git a/.gitmodules b/.gitmodules index 131b4634b514..c35e478ae43f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -53,11 +53,10 @@ [submodule "platform/broadcom/sonic-platform-modules-dell"] path = platform/broadcom/sonic-platform-modules-dell url = https://github.com/Azure/sonic-platform-modules-dell -[submodule "platform/broadcom/sonic-platform-modules-ingrasys-s9100"] - path = platform/broadcom/sonic-platform-modules-ingrasys-s9100 - url = https://github.com/Ingrasys-sonic/sonic-platform-ingrasys-s9100 +[submodule "platform/broadcom/sonic-platform-modules-ingrasys"] + path = platform/broadcom/sonic-platform-modules-ingrasys + url = https://github.com/Ingrasys-sonic/sonic-platform-modules-ingrasys [submodule "src/SAI"] path = src/SAI url = https://github.com/opencomputeproject/SAI branch = v0.9.4 - diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini new file mode 100644 index 000000000000..24a2b8e29222 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini @@ -0,0 +1,55 @@ +# name lanes alias +Ethernet0 1 +Ethernet1 2 +Ethernet2 3 +Ethernet3 4 +Ethernet4 5 +Ethernet5 6 +Ethernet6 7 +Ethernet7 8 +Ethernet8 9 +Ethernet9 10 +Ethernet10 11 +Ethernet11 12 +Ethernet12 21 +Ethernet13 22 +Ethernet14 23 +Ethernet15 24 +Ethernet16 33 +Ethernet17 34 +Ethernet18 35 +Ethernet19 36 +Ethernet20 37 +Ethernet21 38 +Ethernet22 39 +Ethernet23 40 +Ethernet24 41 +Ethernet25 42 +Ethernet26 43 +Ethernet27 44 +Ethernet28 49 +Ethernet29 50 +Ethernet30 51 +Ethernet31 52 +Ethernet32 53 +Ethernet33 54 +Ethernet34 55 +Ethernet35 56 +Ethernet36 65 +Ethernet37 66 +Ethernet38 67 +Ethernet39 68 +Ethernet40 69 +Ethernet41 70 +Ethernet42 71 +Ethernet43 72 +Ethernet44 81 +Ethernet45 82 +Ethernet46 83 +Ethernet47 84 +Ethernet48 85,86,87,88 +Ethernet52 97,98,99,100 +Ethernet56 101,102,103,104 +Ethernet60 105,106,107,108 +Ethernet64 109,110,111,112 +Ethernet68 117,118,119,120 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/sai.profile b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/sai.profile new file mode 100644 index 000000000000..6f07b4605cbf --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-s8900-48x25G+6x100G.config.bcm diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol new file mode 100644 index 000000000000..05a71e8d999c --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol @@ -0,0 +1,12 @@ +# Configuration file generated by pwmconfig, changes will be lost +INTERVAL=10 +DEVPATH=hwmon2=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f +DEVNAME=hwmon2=w83795adg +FCTEMPS=hwmon2/device/pwm2=hwmon2/device/temp2_input hwmon2/device/pwm1=hwmon2/device/temp2_input +#FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input+hwmon2/device/fan7_input+hwmon2/device/fan6_input+hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input+hwmon2/device/fan3_input+hwmon2/device/fan2_input+hwmon2/device/fan1_input +FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input hwmon2/device/pwm2=hwmon2/device/fan7_input hwmon2/device/pwm2=hwmon2/device/fan6_input hwmon2/device/pwm2=hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input hwmon2/device/pwm1=hwmon2/device/fan3_input hwmon2/device/pwm1=hwmon2/device/fan2_input hwmon2/device/pwm1=hwmon2/device/fan1_input +MINTEMP=hwmon2/device/pwm2=20 hwmon2/device/pwm1=20 +MAXTEMP=hwmon2/device/pwm2=60 hwmon2/device/pwm1=60 +MINSTART=hwmon2/device/pwm2=75 hwmon2/device/pwm1=75 +MINSTOP=hwmon2/device/pwm2=22 hwmon2/device/pwm1=22 + diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/installer.conf b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/installer.conf new file mode 100644 index 000000000000..14404194ef53 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x2f8 +CONSOLE_DEV=1 +CONSOLE_SPEED=115200 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/minigraph.xml new file mode 100644 index 000000000000..470b07922b9d --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/minigraph.xml @@ -0,0 +1,121 @@ + + + + + + OCPSCH0104001MS + 10.10.1.30 + OCPSCH01040HHLF + 10.10.1.29 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.30 + OCPSCH01040HHLF + 10.10.2.29 + 1 + 10 + 3 + + + + + 64536 + OCPSCH01040HHLF + + +
10.10.1.30
+ + +
+ +
10.10.2.30
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.10/32 + + 100.0.0.10/32 + + + + + + + + OCPSCH01040HHLF + + + + + + Ethernet48 + 10.10.1.29/30 + + + + Ethernet52 + 10.10.2.29/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet48 + OCPSCH01040HHLF + Ethernet48 + + + 40000 + DeviceInterfaceLink + OCPSCH0104002MS + Ethernet0 + OCPSCH01040HHLF + Ethernet52 + + + + + OCPSCH01040HHLF + INGRASYS-S8900-54XC + + + + OCPSCH01040HHLF + INGRASYS-S8900-54XC +
diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/eeprom.py b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/eeprom.py new file mode 100644 index 000000000000..2013aeddddb4 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/eeprom.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +############################################################################# +# Dell Z9100 +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-17/17-0054/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py new file mode 100644 index 000000000000..96fa0fca86ce --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 53 + ports_in_block = 54 + + port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 0: 18, + 1: 19, + 2: 20, + 3: 21, + 4: 22, + 5: 23, + 6: 24, + 7: 25, + 8: 26, + 9: 27, + 10: 28, + 11: 29, + 12: 30, + 13: 31, + 14: 32, + 15: 33, + 16: 34, + 17: 35, + 18: 36, + 19: 37, + 20: 38, + 21: 39, + 22: 40, + 23: 41, + 24: 42, + 25: 43, + 26: 44, + 27: 45, + 28: 46, + 29: 47, + 30: 48, + 31: 49, + 32: 50, + 33: 51, + 34: 52, + 35: 53, + 36: 54, + 37: 55, + 38: 56, + 39: 57, + 40: 58, + 41: 59, + 42: 60, + 43: 61, + 44: 62, + 45: 63, + 46: 64, + 47: 65, + 48: 66, + 49: 67, + 50: 68, + 51: 69, + 52: 70, + 53: 71 + } + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + for x in range(self.port_start, self.port_end + 1): + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + sfputilbase.__init__(self, port_num) diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/sensors.conf new file mode 100644 index 000000000000..88a474a06742 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/sensors.conf @@ -0,0 +1,39 @@ +# libsensors configuration file +chip "i350bb-*" + ignore loc1 + +chip "jc42-*" + label temp1 "DIMM Temp" + set temp1_max 50 + set temp1_crit 85 + +chip "w83795adg-*" + label in0 "1.0V" + label in1 "1.0V_ROV" + label in2 "1.25V" + label in3 "1.8V" + ignore in4 + ignore in5 + ignore in6 + ignore in7 + label in12 "+3.3V" + ignore in14 + ignore in15 + ignore in16 + label fan1 "FANTRAY 1-A" + label fan2 "FANTRAY 1-B" + label fan3 "FANTRAY 2-A" + label fan4 "FANTRAY 2-B" + label fan5 "FANTRAY 3-A" + label fan6 "FANTRAY 3-B" + label fan7 "FANTRAY 4-A" + label fan8 "FANTRAY 4-B" + label temp1 "Front MAC Temp" + set temp1_max 70 + set temp1_crit 80 + label temp2 "Rear MAC Temp" + set temp1_max 70 + set temp1_crit 80 + ignore temp3 + ignore temp4 + ignore intrusion0 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini new file mode 100644 index 000000000000..3e5c7be570e1 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini @@ -0,0 +1,65 @@ +# name lanes alias +Ethernet0 17 +Ethernet1 18 +Ethernet2 19 +Ethernet3 20 +Ethernet4 24 +Ethernet5 23 +Ethernet6 22 +Ethernet7 21 +Ethernet8 28 +Ethernet9 27 +Ethernet10 26 +Ethernet11 25 +Ethernet12 32 +Ethernet13 31 +Ethernet14 30 +Ethernet15 29 +Ethernet16 1 +Ethernet17 2 +Ethernet18 3 +Ethernet19 4 +Ethernet20 8 +Ethernet21 7 +Ethernet22 6 +Ethernet23 5 +Ethernet24 12 +Ethernet25 11 +Ethernet26 10 +Ethernet27 9 +Ethernet28 13 +Ethernet29 14 +Ethernet30 15 +Ethernet31 16 +Ethernet32 33 +Ethernet33 34 +Ethernet34 35 +Ethernet35 36 +Ethernet36 38 +Ethernet37 39 +Ethernet38 40 +Ethernet39 37 +Ethernet40 41 +Ethernet41 42 +Ethernet42 43 +Ethernet43 44 +Ethernet44 48 +Ethernet45 45 +Ethernet46 46 +Ethernet47 47 +Ethernet48 49,50,51,52 +Ethernet52 53,54,55,56 +Ethernet56 57,58,59,60 +Ethernet60 61,62,63,64 +Ethernet64 65,66,67,68 +Ethernet68 69,70,71,72 +Ethernet72 73,74,75,76 +Ethernet76 77,78,79,80 +Ethernet80 81,82,83,84 +Ethernet84 85,86,87,88 +Ethernet88 89,90,91,92 +Ethernet92 93,94,95,96 +Ethernet96 97,98,99,100 +Ethernet100 101,102,103,104 +Ethernet104 105,106,107,108 +Ethernet108 109,110,111,112 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/sai.profile b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/sai.profile new file mode 100644 index 000000000000..f617b8f3c473 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-s8900-48x25G+16x100G.config.bcm diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol new file mode 100644 index 000000000000..938440304540 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol @@ -0,0 +1,11 @@ +# Configuration file generated by pwmconfig, changes will be lost +INTERVAL=10 +DEVPATH=hwmon1=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f +DEVNAME=hwmon1=w83795adg +FCTEMPS=hwmon1/device/pwm1=hwmon1/device/temp2_input hwmon1/device/pwm2=hwmon1/device/temp2_input +FCFANS=hwmon1/device/pwm2=hwmon1/device/fan10_input hwmon1/device/pwm2=hwmon1/device/fan9_input hwmon1/device/pwm2=hwmon1/device/fan8_input hwmon1/device/pwm2=hwmon1/device/fan7_input hwmon1/device/pwm2=hwmon1/device/fan6_input hwmon1/device/pwm2=hwmon1/device/fan5_input hwmon1/device/pwm1=hwmon1/device/fan4_input hwmon1/device/pwm1=hwmon1/device/fan3_input hwmon1/device/pwm1=hwmon1/device/fan2_input hwmon1/device/pwm1=hwmon1/device/fan1_input +MINTEMP=hwmon1/device/pwm1=20 hwmon1/device/pwm2=20 +MAXTEMP=hwmon1/device/pwm1=60 hwmon1/device/pwm2=60 +MINSTART=hwmon1/device/pwm1=150 hwmon1/device/pwm2=150 +MINSTOP=hwmon1/device/pwm1=0 hwmon1/device/pwm2=0 + diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/installer.conf b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/installer.conf new file mode 100644 index 000000000000..14404194ef53 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x2f8 +CONSOLE_DEV=1 +CONSOLE_SPEED=115200 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/minigraph.xml new file mode 100644 index 000000000000..fe96dc87acf6 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/minigraph.xml @@ -0,0 +1,359 @@ + + + + + + BGPSession + OCPSCH0104001MS + 10.10.1.2 + OCPSCH01040AALF + 10.10.1.1 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.6 + OCPSCH01040BBLF + 10.10.1.5 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.10 + OCPSCH01040CCLF + 10.10.1.9 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.14 + OCPSCH01040DDLF + 10.10.1.13 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.18 + OCPSCH01040EELF + 10.10.1.17 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.22 + OCPSCH01040FFLF + 10.10.1.21 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.26 + OCPSCH01040GGLF + 10.10.1.25 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.30 + OCPSCH01040HHLF + 10.10.1.29 + 1 + 10 + 3 + + + + + 64542 + OCPSCH0104001MS + + + BGPPeer +
10.10.1.2
+ + +
+ + BGPPeer +
10.10.1.6
+ + +
+ + BGPPeer +
10.10.1.10
+ + +
+ + BGPPeer +
10.10.1.14
+ + +
+ + BGPPeer +
10.10.1.18
+ + +
+ + BGPPeer +
10.10.1.22
+ + +
+ + BGPPeer +
10.10.1.26
+ + +
+ + BGPPeer +
10.10.1.30
+ + +
+
+ +
+ + 64536 + OCPSCH01040AALF + + + + 64536 + OCPSCH01040BBLF + + + + 64536 + OCPSCH01040CCLF + + + + 64536 + OCPSCH01040DDLF + + + + 64536 + OCPSCH01040EELF + + + + 64536 + OCPSCH01040FFLF + + + + 64536 + OCPSCH01040GGLF + + + + 64536 + OCPSCH01040HHLF + + +
+
+ + + + + + LoopbackInterface + HostIP + Loopback0 + + 100.0.0.1/32 + + 100.0.0.1/32 + + + + + + + + OCPSCH0104001MS + + + + VlanInterface + Vlan851 + Ethernet0;Ethernet1;Ethernet2;Ethernet3;Ethernet96;Ethernet100;Ethernet104;Ethernet108 + False + 0.0.0.0/0 + + 851 + 10.20.1.0/24 + + + + + IPInterface + + Vlan851 + 10.20.1.1/24 + + + IPInterface + + Ethernet48 + 10.10.1.2/30 + + + IPInterface + + Ethernet52 + 10.10.1.6/30 + + + IPInterface + + Ethernet56 + 10.10.1.10/30 + + + IPInterface + + Ethernet60 + 10.10.1.14/30 + + + IPInterface + + Ethernet64 + 10.10.1.18/30 + + + IPInterface + + Ethernet68 + 10.10.1.22/30 + + + IPInterface + + Ethernet72 + 10.10.1.26/30 + + + IPInterface + + Ethernet76 + 10.10.1.30/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet48 + OCPSCH01040AALF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet52 + OCPSCH01040BBLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet56 + OCPSCH01040CCLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet60 + OCPSCH01040DDLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet64 + OCPSCH01040EELF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet68 + OCPSCH01040FFLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet72 + OCPSCH01040GGLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet76 + OCPSCH01040HHLF + Ethernet48 + + + + + OCPSCH0104001MS + INGRASYS-S8900-64XC + + + + + + + + OCPSCH0104001MS + INGRASYS-S8900-64XC +
diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/eeprom.py b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/eeprom.py new file mode 100644 index 000000000000..c23edf5e772e --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/eeprom.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +############################################################################# +# Ingrasys S8900-64XC +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-7/7-0054/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py new file mode 100644 index 000000000000..d6573d20d72f --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python + +import subprocess + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +i2c_set = 'i2cset' +cpld_addr = '0x33' +mux_reg = '0x4A' + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 63 + ports_in_block = 64 + + port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 0: [2,1], + 1: [2,2], + 2: [2,3], + 3: [2,4], + 4: [2,5], + 5: [2,6], + 6: [2,7], + 7: [2,8], + 8: [2,9], + 9: [2,10], + 10: [2,11], + 11: [2,12], + 12: [2,13], + 13: [2,14], + 14: [2,15], + 15: [2,16], + 16: [2,17], + 17: [2,18], + 18: [2,19], + 19: [2,20], + 20: [2,21], + 21: [2,22], + 22: [2,23], + 23: [2,24], + 24: [3,1], + 25: [3,2], + 26: [3,3], + 27: [3,4], + 28: [3,5], + 29: [3,6], + 30: [3,7], + 31: [3,8], + 32: [3,9], + 33: [3,10], + 34: [3,11], + 35: [3,12], + 36: [3,13], + 37: [3,14], + 38: [3,15], + 39: [3,16], + 40: [3,17], + 41: [3,18], + 42: [3,19], + 43: [3,20], + 44: [3,21], + 45: [3,22], + 46: [3,23], + 47: [3,24], + 48: [4,1], + 49: [4,2], + 50: [4,3], + 51: [4,4], + 52: [4,5], + 53: [4,6], + 54: [4,7], + 55: [4,8], + 56: [4,9], + 57: [4,10], + 58: [4,11], + 59: [4,12], + 60: [4,13], + 61: [4,14], + 62: [4,15], + 63: [4,16] + } + + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + i2c_bus = self.port_to_i2c_mapping[port_num][0] + sfp_idx = self.port_to_i2c_mapping[port_num][1] + proc = subprocess.Popen([i2c_set, '-y', str(i2c_bus), cpld_addr, mux_reg, str(sfp_idx)], + stdout=subprocess.PIPE, + shell=False, + stderr=subprocess.STDOUT) + stdout = proc.communicate()[0] + proc.wait() + + eeprom_path = '/sys/class/i2c-adapter/i2c-{0[0]}/{0[0]}-0050/eeprom' + for x in range(self.port_start, self.port_end + 1): + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + sfputilbase.__init__(self, port_num) diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/sensors.conf new file mode 100644 index 000000000000..d4b5a7bd0c8a --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/sensors.conf @@ -0,0 +1,56 @@ +# libsensors configuration file +chip "i350bb-*" + ignore loc1 + +chip "jc42-*" + label temp1 "DIMM Temp" + set temp1_max 50 + set temp1_crit 85 + +chip "w83795adg-*" + label in0 "1.0V" + label in1 "1.0V_ROV" + label in2 "1.25V" + label in3 "1.8V" + ignore in4 + ignore in5 + ignore in6 + ignore in7 + label in12 "+3.3V" + ignore in14 + ignore in15 + ignore in16 + label fan1 "FANTRAY 1-A" + label fan2 "FANTRAY 1-B" + label fan3 "FANTRAY 2-A" + label fan4 "FANTRAY 2-B" + label fan5 "FANTRAY 3-A" + label fan6 "FANTRAY 3-B" + label fan7 "FANTRAY 4-A" + label fan8 "FANTRAY 4-B" + label fan9 "FANTRAY 5-A" + label fan10 "FANTRAY 5-B" + label temp1 "Front MAC Temp" + set temp1_max 60 + set temp1_crit 65 + label temp2 "Rear MAC Temp" + set temp2_max 60 + set temp2_crit 65 + label temp3 "Near Port 15" + set temp3_max 50 + set temp3_crit 70 + label temp4 "Near Port 56" + set temp4_max 50 + set temp4_crit 70 + ignore intrusion0 + +bus "i2c-5" "i2c-1-switch (chan_id 3)" +chip "tmp75-i2c-*-48" + label temp1 "FAN Temp1" + set temp1_max 50 + set temp1_crit 70 +chip "tmp75-i2c-*-49" + label temp1 "FAN Temp2" + set temp1_max 50 + set temp1_crit 70 + diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini index d2b36ebf5e2a..d70c717fe4e2 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini @@ -1,33 +1,33 @@ # name lanes alias -Ethernet0 5,6,7,8 Ethernet0 -Ethernet4 1,2,3,4 Ethernet4 -Ethernet8 13,14,15,16 Ethernet8 -Ethernet12 9,10,11,12 Ethernet12 -Ethernet16 21,22,23,24 Ethernet16 -Ethernet20 17,18,19,20 Ethernet20 -Ethernet24 29,30,31,32 Ethernet24 -Ethernet28 25,26,27,28 Ethernet28 -Ethernet32 37,38,39,40 Ethernet32 -Ethernet36 33,34,35,36 Ethernet36 -Ethernet40 45,46,47,48 Ethernet40 -Ethernet44 41,42,43,44 Ethernet44 -Ethernet48 53,54,55,56 Ethernet48 -Ethernet52 49,50,51,52 Ethernet52 -Ethernet56 61,62,63,64 Ethernet56 -Ethernet60 57,58,59,60 Ethernet60 -Ethernet64 69,70,71,72 Ethernet64 -Ethernet68 65,66,67,68 Ethernet68 -Ethernet72 77,78,79,80 Ethernet72 -Ethernet76 73,74,75,76 Ethernet76 -Ethernet80 85,86,87,88 Ethernet80 -Ethernet84 81,82,83,84 Ethernet84 -Ethernet88 93,94,95,96 Ethernet88 -Ethernet92 89,90,91,92 Ethernet92 -Ethernet96 101,102,103,104 Ethernet96 -Ethernet100 97,98,99,100 Ethernet100 -Ethernet104 109,110,111,112 Ethernet104 -Ethernet108 105,106,107,108 Ethernet108 -Ethernet112 117,118,119,120 Ethernet112 -Ethernet116 113,114,115,116 Ethernet116 -Ethernet120 125,126,127,128 Ethernet120 -Ethernet124 121,122,123,124 Ethernet124 +Ethernet0 5,6,7,8 +Ethernet4 1,2,3,4 +Ethernet8 13,14,15,16 +Ethernet12 9,10,11,12 +Ethernet16 21,22,23,24 +Ethernet20 17,18,19,20 +Ethernet24 29,30,31,32 +Ethernet28 25,26,27,28 +Ethernet32 37,38,39,40 +Ethernet36 33,34,35,36 +Ethernet40 45,46,47,48 +Ethernet44 41,42,43,44 +Ethernet48 53,54,55,56 +Ethernet52 49,50,51,52 +Ethernet56 61,62,63,64 +Ethernet60 57,58,59,60 +Ethernet64 69,70,71,72 +Ethernet68 65,66,67,68 +Ethernet72 77,78,79,80 +Ethernet76 73,74,75,76 +Ethernet80 85,86,87,88 +Ethernet84 81,82,83,84 +Ethernet88 93,94,95,96 +Ethernet92 89,90,91,92 +Ethernet96 101,102,103,104 +Ethernet100 97,98,99,100 +Ethernet104 109,110,111,112 +Ethernet108 105,106,107,108 +Ethernet112 117,118,119,120 +Ethernet116 113,114,115,116 +Ethernet120 125,126,127,128 +Ethernet124 121,122,123,124 diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol new file mode 100644 index 000000000000..05a71e8d999c --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol @@ -0,0 +1,12 @@ +# Configuration file generated by pwmconfig, changes will be lost +INTERVAL=10 +DEVPATH=hwmon2=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f +DEVNAME=hwmon2=w83795adg +FCTEMPS=hwmon2/device/pwm2=hwmon2/device/temp2_input hwmon2/device/pwm1=hwmon2/device/temp2_input +#FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input+hwmon2/device/fan7_input+hwmon2/device/fan6_input+hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input+hwmon2/device/fan3_input+hwmon2/device/fan2_input+hwmon2/device/fan1_input +FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input hwmon2/device/pwm2=hwmon2/device/fan7_input hwmon2/device/pwm2=hwmon2/device/fan6_input hwmon2/device/pwm2=hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input hwmon2/device/pwm1=hwmon2/device/fan3_input hwmon2/device/pwm1=hwmon2/device/fan2_input hwmon2/device/pwm1=hwmon2/device/fan1_input +MINTEMP=hwmon2/device/pwm2=20 hwmon2/device/pwm1=20 +MAXTEMP=hwmon2/device/pwm2=60 hwmon2/device/pwm1=60 +MINSTART=hwmon2/device/pwm2=75 hwmon2/device/pwm1=75 +MINSTOP=hwmon2/device/pwm2=22 hwmon2/device/pwm1=22 + diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf index 44eedb4b11b0..c55f5c764e65 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/sensors.conf @@ -29,7 +29,11 @@ chip "w83795adg-*" label fan7 "FANTRAY 4-A" label fan8 "FANTRAY 4-B" label temp1 "Front MAC Temp" + set temp1_max 70 + set temp1_crit 80 label temp2 "Rear MAC Temp" + set temp2_max 70 + set temp2_crit 80 ignore temp3 ignore temp4 ignore intrusion0 diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index 15eb2c7e17ac..a9330826d5e6 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -22,6 +22,10 @@ elif [ "$HWSKU" == "AS7512" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "INGRASYS-S9100-C32" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "INGRASYS-S8900-54XC" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "INGRASYS-S8900-64XC" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" fi exec /usr/bin/orchagent ${ORCHAGENT_ARGS} diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index e7e20a9eb7f3..3af81b325d77 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -7,6 +7,8 @@ $(SONIC_ONE_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) $(SONIC_ONE_IMAGE)_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(DELL_Z9100_PLATFORM_MODULE) \ $(DELL_S6100_PLATFORM_MODULE) \ + $(INGRASYS_S8900_54XC_PLATFORM_MODULE) \ + $(INGRASYS_S8900_64XC_PLATFORM_MODULE) \ $(INGRASYS_S9100_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/broadcom/platform-modules-ingrasys-s9100.mk b/platform/broadcom/platform-modules-ingrasys-s9100.mk deleted file mode 100755 index 7c7df7b1cf61..000000000000 --- a/platform/broadcom/platform-modules-ingrasys-s9100.mk +++ /dev/null @@ -1,11 +0,0 @@ -# Ingrasys S9100 Platform modules - -INGRASYS_S9100_PLATFORM_MODULE_VERSION = 1.0.0 - -export INGRASYS_S9100_PLATFORM_MODULE_VERSION - -INGRASYS_S9100_PLATFORM_MODULE = sonic-platform-ingrasys-s9100_$(INGRASYS_S9100_PLATFORM_MODULE_VERSION)_amd64.deb -$(INGRASYS_S9100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ingrasys-s9100 -$(INGRASYS_S9100_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) -$(INGRASYS_S9100_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s9100-r0 -SONIC_DPKG_DEBS += $(INGRASYS_S9100_PLATFORM_MODULE) diff --git a/platform/broadcom/platform-modules-ingrasys.mk b/platform/broadcom/platform-modules-ingrasys.mk new file mode 100644 index 000000000000..95009102dd76 --- /dev/null +++ b/platform/broadcom/platform-modules-ingrasys.mk @@ -0,0 +1,24 @@ +# Ingrasys S9100, S8900-64XC and S8900-54XC Platform modules + +INGRASYS_S9100_PLATFORM_MODULE_VERSION = 1.1.0 +INGRASYS_S8900_64XC_PLATFORM_MODULE_VERSION = 1.1.0 +INGRASYS_S8900_54XC_PLATFORM_MODULE_VERSION = 1.1.0 + +export INGRASYS_S9100_PLATFORM_MODULE_VERSION +export INGRASYS_S8900_64XC_PLATFORM_MODULE_VERSION +export INGRASYS_S8900_54XC_PLATFORM_MODULE_VERSION + +INGRASYS_S9100_PLATFORM_MODULE = sonic-platform-ingrasys-s9100_$(INGRASYS_S9100_PLATFORM_MODULE_VERSION)_amd64.deb +$(INGRASYS_S9100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ingrasys +$(INGRASYS_S9100_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(INGRASYS_S9100_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s9100-r0 +SONIC_DPKG_DEBS += $(INGRASYS_S9100_PLATFORM_MODULE) + +INGRASYS_S8900_64XC_PLATFORM_MODULE = sonic-platform-ingrasys-s8900-64xc_$(INGRASYS_S8900_64XC_PLATFORM_MODULE_VERSION)_amd64.deb +$(INGRASYS_S8900_64XC_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s8900_64xc-r0 + +INGRASYS_S8900_54XC_PLATFORM_MODULE = sonic-platform-ingrasys-s8900-54xc_$(INGRASYS_S8900_54XC_PLATFORM_MODULE_VERSION)_amd64.deb +$(INGRASYS_S8900_54XC_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s8900_54xc-r0 + +$(eval $(call add_extra_package,$(INGRASYS_S9100_PLATFORM_MODULE),$(INGRASYS_S8900_64XC_PLATFORM_MODULE))) +$(eval $(call add_extra_package,$(INGRASYS_S9100_PLATFORM_MODULE),$(INGRASYS_S8900_54XC_PLATFORM_MODULE))) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index d2eb4482e96d..7f55ccd034d3 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -3,7 +3,7 @@ include $(PLATFORM_PATH)/sai.mk include $(PLATFORM_PATH)/platform-modules-s6000.mk include $(PLATFORM_PATH)/platform-modules-dell.mk include $(PLATFORM_PATH)/platform-modules-arista.mk -include $(PLATFORM_PATH)/platform-modules-ingrasys-s9100.mk +include $(PLATFORM_PATH)/platform-modules-ingrasys.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm-rpc.mk diff --git a/platform/broadcom/sonic-platform-modules-ingrasys b/platform/broadcom/sonic-platform-modules-ingrasys new file mode 160000 index 000000000000..46f1b3303fec --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-ingrasys @@ -0,0 +1 @@ +Subproject commit 46f1b3303fecf728b66b88941fa162e91520cc32 diff --git a/platform/broadcom/sonic-platform-modules-ingrasys-s9100 b/platform/broadcom/sonic-platform-modules-ingrasys-s9100 deleted file mode 160000 index 83d62823d26a..000000000000 --- a/platform/broadcom/sonic-platform-modules-ingrasys-s9100 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 83d62823d26a6b572bbe11272d00775f8123c199 From 14fe4bf6f8405b996807637e0640ba29ed254b61 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 18 May 2017 14:45:04 -0700 Subject: [PATCH 0529/1011] Update sonic-snmpagent (#610) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 74e57b8381a9..e8e1e70e6c30 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 74e57b8381a92c64eaa0455dcd7b222af337a0f9 +Subproject commit e8e1e70e6c30eee72cade87273d3ceed59bd0c8d From aab87757d38ad2e7f2c86761f84f8f5c610ed4bd Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 18 May 2017 14:45:16 -0700 Subject: [PATCH 0530/1011] Remove sysctl setting which is not used anymore (#611) --- platform/broadcom/docker-syncd-brcm-rpc/99-syncd.conf | 2 -- platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 | 1 - platform/cavium/docker-syncd-cavm-rpc/99-syncd.conf | 2 -- platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 | 1 - platform/centec/docker-syncd-centec-rpc/99-syncd.conf | 2 -- platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 | 1 - platform/mellanox/docker-syncd-mlnx-rpc/99-syncd.conf | 2 -- platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 | 1 - 8 files changed, 12 deletions(-) delete mode 100644 platform/broadcom/docker-syncd-brcm-rpc/99-syncd.conf delete mode 100644 platform/cavium/docker-syncd-cavm-rpc/99-syncd.conf delete mode 100644 platform/centec/docker-syncd-centec-rpc/99-syncd.conf delete mode 100644 platform/mellanox/docker-syncd-mlnx-rpc/99-syncd.conf diff --git a/platform/broadcom/docker-syncd-brcm-rpc/99-syncd.conf b/platform/broadcom/docker-syncd-brcm-rpc/99-syncd.conf deleted file mode 100644 index f3b57e3b1964..000000000000 --- a/platform/broadcom/docker-syncd-brcm-rpc/99-syncd.conf +++ /dev/null @@ -1,2 +0,0 @@ -sysctl -w net.core.rmem_max=509430500 - diff --git a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 index 4799d7a5ab31..ebe3dda1c14d 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 @@ -47,7 +47,6 @@ RUN apt-get update \ && rm -rf /root/deps COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] -COPY ["99-syncd.conf", "/etc/sysctl.d/"] ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/cavium/docker-syncd-cavm-rpc/99-syncd.conf b/platform/cavium/docker-syncd-cavm-rpc/99-syncd.conf deleted file mode 100644 index f3b57e3b1964..000000000000 --- a/platform/cavium/docker-syncd-cavm-rpc/99-syncd.conf +++ /dev/null @@ -1,2 +0,0 @@ -sysctl -w net.core.rmem_max=509430500 - diff --git a/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 b/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 index 0de427c22a27..0c70dcd8e845 100644 --- a/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 +++ b/platform/cavium/docker-syncd-cavm-rpc/Dockerfile.j2 @@ -47,6 +47,5 @@ RUN apt-get update \ && rm -rf /root/deps COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] -COPY ["99-syncd.conf", "/etc/sysctl.d/"] ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/centec/docker-syncd-centec-rpc/99-syncd.conf b/platform/centec/docker-syncd-centec-rpc/99-syncd.conf deleted file mode 100644 index f3b57e3b1964..000000000000 --- a/platform/centec/docker-syncd-centec-rpc/99-syncd.conf +++ /dev/null @@ -1,2 +0,0 @@ -sysctl -w net.core.rmem_max=509430500 - diff --git a/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 index 13a2c92cecee..ac402d1f6eae 100644 --- a/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 +++ b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 @@ -47,7 +47,6 @@ RUN apt-get update \ && rm -rf /root/deps COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] -COPY ["99-syncd.conf", "/etc/sysctl.d/"] ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/99-syncd.conf b/platform/mellanox/docker-syncd-mlnx-rpc/99-syncd.conf deleted file mode 100644 index f3b57e3b1964..000000000000 --- a/platform/mellanox/docker-syncd-mlnx-rpc/99-syncd.conf +++ /dev/null @@ -1,2 +0,0 @@ -sysctl -w net.core.rmem_max=509430500 - diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 index 51fb26c00b11..66eab2013ba6 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 @@ -47,7 +47,6 @@ RUN apt-get update \ && rm -rf /root/deps COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] -COPY ["99-syncd.conf", "/etc/sysctl.d/"] ENTRYPOINT ["/usr/bin/supervisord"] From 6c24574e9f4fbf5b87d67660616894af7ef1c8aa Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 18 May 2017 16:54:48 -0700 Subject: [PATCH 0531/1011] [mgmt]: add sonic-mgmt docker for running test in sonic-mgmt repo (#606) * [mgmt]: add sonic-mgmt docker for running test in sonic-mgmt repo --- Makefile | 19 +++++++++- sonic-mgmt/Dockerfile | 70 ++++++++++++++++++++++++++++++++++++ sonic-mgmt/sonic-jenkins.pub | 1 + 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 sonic-mgmt/Dockerfile create mode 100644 sonic-mgmt/sonic-jenkins.pub diff --git a/Makefile b/Makefile index 3e2480891b34..116c751f228c 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,21 @@ DOCKER_BUILD = docker build --no-cache \ sonic-slave && \ docker tag $(SLAVE_IMAGE):latest $(SLAVE_IMAGE):$(SLAVE_TAG) -.PHONY: sonic-slave-build sonic-slave-bash + +MGMT_TAG = $(shell shasum sonic-mgmt/Dockerfile | awk '{print substr($$1,0,11);}') +MGMT_IMAGE = sonic-mgmt-$(USER) + +DOCKER_MGMT_BUILD = docker build --no-cache \ + --build-arg user=$(USER) \ + --build-arg uid=$(shell id -u) \ + --build-arg guid=$(shell id -g) \ + --build-arg hostname=$(shell echo $$HOSTNAME) \ + -t $(MGMT_IMAGE) \ + sonic-mgmt && \ + docker tag $(MGMT_IMAGE):latest $(MGMT_IMAGE):$(MGMT_TAG) + + +.PHONY: sonic-slave-build sonic-slave-bash sonic-mgmt-build .DEFAULT_GOAL := all @@ -51,3 +65,6 @@ sonic-slave-bash : { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ $(DOCKER_BUILD) ; } @$(DOCKER_RUN) -t $(SLAVE_IMAGE):$(SLAVE_TAG) bash + +sonic-mgmt-build : + @$(DOCKER_MGMT_BUILD) diff --git a/sonic-mgmt/Dockerfile b/sonic-mgmt/Dockerfile new file mode 100644 index 000000000000..5a64e1ec35b1 --- /dev/null +++ b/sonic-mgmt/Dockerfile @@ -0,0 +1,70 @@ +FROM ubuntu:16.04 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update +RUN apt-get install -y \ + openssh-server \ + gcc \ + vim \ + make \ + git \ + sudo \ + python \ + python-dev \ + python-cffi \ + libffi-dev \ + libssl-dev \ + sshpass \ + libxml2 \ + libxslt1-dev \ + python-setuptools + +# For JNLP launcher +RUN apt-get install -y default-jre + +# For syslog test +RUN apt-get install -y rsyslog psmisc + +RUN easy_install pip + +RUN pip install ipaddr \ + lxml \ + netaddr \ + natsort \ + six \ + pexpect \ + pyasn1==0.1.9 \ + pysnmp==4.2.5 + +RUN git clone https://github.com/ansible/ansible +RUN cd ansible && git checkout v2.0.0.2-1 -b v2.0.0.2-1 && git submodule update --init --recursive && make && make install + +RUN mkdir /var/run/sshd +EXPOSE 22 + +# Add user +ARG user +ARG uid +ARG guid +ARG hostname + +ENV BUILD_HOSTNAME $hostname +ENV USER $user + +RUN groupadd -f -r -g $guid g$user + +RUN useradd $user -l -u $uid -g $guid -d /var/$user -m -s /bin/bash + +COPY sonic-jenkins.pub /var/$user/.ssh/authorized_keys2 + +RUN echo "Host *\n\tStrictHostKeyChecking no\n" > /var/$user/.ssh/config +RUN chown $user /var/$user/.ssh -R +RUN chmod go= /var/$user/.ssh -R + +# Add user to sudoers +RUN echo "$user ALL=(ALL) NOPASSWD:ALL" >>/etc/sudoers + +USER $user + +RUN cd /var/$user && git clone https://github.com/Azure/sonic-mgmt diff --git a/sonic-mgmt/sonic-jenkins.pub b/sonic-mgmt/sonic-jenkins.pub new file mode 100644 index 000000000000..8cbd97ce8c57 --- /dev/null +++ b/sonic-mgmt/sonic-jenkins.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEJhhzQtlgNkBWxWXNm/qxZC26pFC16uOdGMx7BfMP9KxpKB46sFO5nkZXh8CiyjHitks2BYjbrK2IYubiyQhHaKh+4mnCnO58GLRRAiCUzeaC1jSrmqseBN8ZN7UV7gZUWQOxHErUHVhTbujUR0eZLymwPV0bNO9/bAWR5a+l5l/kf3VMREHF5Z6KyIuA9fT9XUJz8wLEUZCC8Id9RGwmKHS4FYuwtvcYm1MKb+ULXlri5o25G/X3I1pBpU/xUPBDUu+g3cIavrl7wVVGbIXYcYoH5qrTycMY0Y3rLBxu9SECUCqIxhnKQsiv+iXZSibnUXT4r6HcLMej5e+o1Jx3 lgh@jenkins-master-phx From e87fe90d91e22dc9471cea46c2667a9546dab930 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 18 May 2017 18:15:36 -0700 Subject: [PATCH 0532/1011] [Broadcom]: Update bcmcmd and dsserve binaries (#613) --- platform/broadcom/rules.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 7f55ccd034d3..fff132c1c508 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -13,10 +13,10 @@ include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk BCMCMD = bcmcmd -$(BCMCMD)_URL = "https://sonicstorage.blob.core.windows.net/packages/bcmcmd?sv=2015-04-05&sr=b&sig=X3bFApmsNFmcnWM9mSGRxBugPcg%2FgJCHh5hhSuV1M2c%3D&se=2030-08-23T14%3A41%3A56Z&sp=r" +$(BCMCMD)_URL = "https://sonicstorage.blob.core.windows.net/packages/20170518/bcmcmd?sv=2015-04-05&sr=b&sig=OCW4mfmbQ6D0BH8nllpAWrS8XL9uczrw32w3XgL4jws%3D&se=2030-03-31T23%3A06%3A15Z&sp=r" DSSERVE = dsserve -$(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/dsserve?sv=2015-04-05&sr=b&sig=aMlnRA%2FXZNmHPgmOj%2FNMJMYLWyvva1QrN4HcsVXvqKA%3D&se=2030-08-23T14%3A42%3A32Z&sp=r" +$(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/20170518/dsserve?sv=2015-04-05&sr=b&sig=gyNbgSL%2FvpMXDdpboVkIJcTKMRdGgEaOR9OukHhEsu8%3D&se=2030-03-31T23%3A06%3A35Z&sp=r" SONIC_ONLINE_FILES += $(BCMCMD) $(DSSERVE) From 3e5adf018041e7398f06d4cf0dd681ea6a746c0f Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 18 May 2017 20:07:31 -0700 Subject: [PATCH 0533/1011] [sonic-utilities]: Bump version to 1.1 (#612) --- rules/sonic-utilities.mk | 2 +- src/sonic-utilities | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/sonic-utilities.mk b/rules/sonic-utilities.mk index 7377ed50cbca..9349813f5c4e 100644 --- a/rules/sonic-utilities.mk +++ b/rules/sonic-utilities.mk @@ -1,5 +1,5 @@ # sonic utilities package -SONIC_UTILS = python-sonic-utilities_1.0-1_all.deb +SONIC_UTILS = python-sonic-utilities_1.1-1_all.deb $(SONIC_UTILS)_SRC_PATH = $(SRC_PATH)/sonic-utilities SONIC_PYTHON_STDEB_DEBS += $(SONIC_UTILS) diff --git a/src/sonic-utilities b/src/sonic-utilities index 70fd4fab6a47..6224416c670d 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 70fd4fab6a4745052f3b19b04de0588031b29b22 +Subproject commit 6224416c670da7f564aa17a71dd739e5ec4b165c From 8b9bc6a5a4a8592ca6425c0835f9bf6da062bff1 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 19 May 2017 11:27:46 -0700 Subject: [PATCH 0534/1011] [swss]: Update swss/common submodules (#614) --- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-swss b/src/sonic-swss index 75e559a5063d..722649bda951 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 75e559a5063d9513b1fafd96d62c020e3c0a5eee +Subproject commit 722649bda95148e1d812603155c2efd3df058795 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index bf2dde2b30cb..447c9a254be7 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit bf2dde2b30cb33e35c6b55305fa00b99c3b4bac1 +Subproject commit 447c9a254be7254b7f62987a1d2d5341f27b2ba0 From 86befe0cfd9f484b45920d659e74c086bf89efa3 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 19 May 2017 13:49:43 -0700 Subject: [PATCH 0535/1011] [docker]: remove docker images after docke push (#615) --- push_docker.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/push_docker.sh b/push_docker.sh index 156502ddfb7e..1e2bc467794e 100755 --- a/push_docker.sh +++ b/push_docker.sh @@ -39,3 +39,4 @@ echo "Image sha256: $image_sha" echo "Pushing $build_remote_image_name" docker push $build_remote_image_name docker rmi $build_remote_image_name || true +docker rmi $docker_image_name || true From faf33d80d33787cb830ee47f23cf905b45a9dbbd Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 19 May 2017 23:23:59 -0700 Subject: [PATCH 0536/1011] [Broadcom]: Update Broadcom SAI to 2.1.5.1-7 (#616) * 20170519 (0843e2a858c2e730b25e7106c83a472e43cd527d) Fixed unknown neighbor processing and neighbor update scenarios. --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 1aa232c97607..611f80d94583 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-6-20170510001051.32_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-6-20170510001051.32_amd64.deb?sv=2015-04-05&sr=b&sig=PS9GQvhA2n%2BLXtu93KYKybvmmLyeIX%2BcrRZspIBvm5o%3D&se=2031-01-17T07%3A02%3A06Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-7-20170519212441.39_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-7-20170519212441.39_amd64.deb?sv=2015-04-05&sr=b&sig=CVc9ldYoy6xdUY0mKg4Rqz4uNDgkTUrPOw1ULrxa8N4%3D&se=2031-01-26T21%3A38%3A42Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-6-20170510001051.32_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-7-20170519212441.39_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-6-20170510001051.32_amd64.deb?sv=2015-04-05&sr=b&sig=d2%2BYxTvzjR92hDXx5Wx7gWDQU52wpLzw4ECxNiAwExM%3D&se=2031-01-17T07%3A01%3A37Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-7-20170519212441.39_amd64.deb?sv=2015-04-05&sr=b&sig=xzCr9xLGF3IaNK8aQGVeU4jY7YkqNEdYAuq5IP2uQM4%3D&se=2031-01-26T21%3A38%3A16Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From 70b282aa8828d0dbc12f4632edfbe8e5270fa527 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 20 May 2017 10:37:59 -0700 Subject: [PATCH 0537/1011] [docker]: install jinja2 2.7.2 to be compatible with the tests (#618) --- sonic-mgmt/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sonic-mgmt/Dockerfile b/sonic-mgmt/Dockerfile index 5a64e1ec35b1..f657b18a1dc0 100644 --- a/sonic-mgmt/Dockerfile +++ b/sonic-mgmt/Dockerfile @@ -35,7 +35,8 @@ RUN pip install ipaddr \ six \ pexpect \ pyasn1==0.1.9 \ - pysnmp==4.2.5 + pysnmp==4.2.5 \ + jinja2==2.7.2 RUN git clone https://github.com/ansible/ansible RUN cd ansible && git checkout v2.0.0.2-1 -b v2.0.0.2-1 && git submodule update --init --recursive && make && make install From ef980151ae26cdc8c9a5a67d64314fc40c5080fe Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 22 May 2017 01:08:16 -0700 Subject: [PATCH 0538/1011] [build]: support submodule patching for SONIC_DPKG_DEBS (#619) --- slave.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/slave.mk b/slave.mk index d7afd6d9e5dc..9d9fc126f765 100644 --- a/slave.mk +++ b/slave.mk @@ -171,10 +171,14 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) : $(DEBS_PATH)/% : .platform $$(a $(HEADER) # Build project and take package rm -f $($*_SRC_PATH)/debian/*.debhelper.log + # apply series of patches if exist + if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi pushd $($*_SRC_PATH) $(LOG) [ ! -f ./autogen.sh ] || ./autogen.sh $(LOG) dpkg-buildpackage -rfakeroot -b -us -uc $(LOG) popd $(LOG) + # clean up + if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt pop -a -f; popd; fi mv $(addprefix $($*_SRC_PATH)/../, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) $(DEBS_PATH) $(LOG) $(FOOTER) From 714e45f0bb8ccf3674d4a821d0517d70a219f81a Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 23 May 2017 10:29:54 -0700 Subject: [PATCH 0539/1011] Cron jobs log to /var/log/cron.log once again (#620) - Now that logrotate is a cron job that runs every minute, it was polluting syslog - Also shrink max size of less-important logs to 50MB and rotate them daily by default --- files/image_config/logrotate.d/rsyslog | 4 ++-- files/image_config/rsyslog/rsyslog.d/99-default.conf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/files/image_config/logrotate.d/rsyslog b/files/image_config/logrotate.d/rsyslog index 0d03e906c9b8..d24bc32abe17 100644 --- a/files/image_config/logrotate.d/rsyslog +++ b/files/image_config/logrotate.d/rsyslog @@ -31,8 +31,8 @@ /var/log/messages { rotate 4 - weekly - maxsize 100M + daily + maxsize 50M missingok notifempty compress diff --git a/files/image_config/rsyslog/rsyslog.d/99-default.conf b/files/image_config/rsyslog/rsyslog.d/99-default.conf index 9b129199b385..cfb1e1d3b881 100644 --- a/files/image_config/rsyslog/rsyslog.d/99-default.conf +++ b/files/image_config/rsyslog/rsyslog.d/99-default.conf @@ -3,9 +3,9 @@ # auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog -# Do not redirect cron, daemon, kernel or lpr logs to +cron.* /var/log/cron.log +# Do not redirect daemon, kernel or lpr logs to # their own files. Let them log to /var/log/syslog -#cron.* /var/log/cron.log #daemon.* -/var/log/daemon.log #kern.* -/var/log/kern.log #kern.* -/var/persist/log/kern.log From 9669fa8e08dafb051377c32ae0f32dc888329b53 Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Tue, 23 May 2017 15:09:01 -0400 Subject: [PATCH 0540/1011] [utilities]: Update submodule (#623) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 6224416c670d..b158a565ba5f 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 6224416c670da7f564aa17a71dd739e5ec4b165c +Subproject commit b158a565ba5ff85665c225d12908a3b588552db5 From 867670665fe571d2d052033df61c174d413609d8 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 24 May 2017 01:34:37 -0700 Subject: [PATCH 0541/1011] [docker-ptf]: Add less, ipython, and python ssh libraries (#625) --- dockers/docker-ptf/Dockerfile.j2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index a8459bb39781..5b099176164b 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -41,6 +41,7 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / cmake \ libqt5core5a \ libqt5network5 \ + less \ iputils-ping @@ -70,6 +71,9 @@ RUN rm -rf /debs \ && pip install dpkt \ && pip install ipaddress \ && pip install pysubnettree \ + && pip install 'ipython<6.0' \ + && pip install paramiko \ + && pip install parallel-ssh \ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py From 5cc45a991d6eb288c26e04cba4dd553fc4997d1e Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Wed, 24 May 2017 19:02:46 +0300 Subject: [PATCH 0542/1011] [swss]: Update swss submodule (#627) [portsorch]: Add set port MTU function (#218) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 722649bda951..1210c45724f1 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 722649bda95148e1d812603155c2efd3df058795 +Subproject commit 1210c45724f184152525f3ff5bc983ad4c3c9939 From a2eda30a0304b868b084637d2f4a0e2452a07ed0 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 24 May 2017 11:53:38 -0700 Subject: [PATCH 0543/1011] [docker-syncd-*]: Properly manage syncd with supervisord (#617) - This PR allows supervisord to log syncd exit events to syslog - Syncd dockers now are built from docker-config-engine instead of docker-base - Supervisord in all syncd dockers now call syncd_start.s which is installed by sonic-sairedis repo --- .../broadcom/docker-syncd-brcm/Dockerfile.j2 | 4 ++-- .../docker-syncd-brcm/supervisord.conf | 2 +- platform/broadcom/docker-syncd-brcm/syncd.sh | 12 ---------- .../cavium/docker-syncd-cavm/Dockerfile.j2 | 4 ++-- .../cavium/docker-syncd-cavm/supervisord.conf | 2 +- platform/cavium/docker-syncd-cavm/syncd.sh | 22 ------------------- .../centec/docker-syncd-centec/Dockerfile.j2 | 4 ++-- .../docker-syncd-centec/supervisord.conf | 2 +- platform/centec/docker-syncd-centec/syncd.sh | 12 ---------- .../mellanox/docker-syncd-mlnx/Dockerfile.j2 | 4 ++-- platform/mellanox/docker-syncd-mlnx/start.sh | 5 ++++- .../docker-syncd-mlnx/supervisord.conf | 2 +- platform/mellanox/docker-syncd-mlnx/syncd.sh | 19 ---------------- src/sonic-sairedis | 2 +- 14 files changed, 17 insertions(+), 79 deletions(-) delete mode 100755 platform/broadcom/docker-syncd-brcm/syncd.sh delete mode 100755 platform/cavium/docker-syncd-cavm/syncd.sh delete mode 100755 platform/centec/docker-syncd-centec/syncd.sh delete mode 100755 platform/mellanox/docker-syncd-mlnx/syncd.sh diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index af6c96c585d0..2b5fc8c87d0b 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-base +FROM docker-config-engine ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -19,7 +19,7 @@ debs/{{ deb }}{{' '}} ## TODO: add kmod into Depends RUN apt-get install -f kmod -COPY ["debs/dsserve", "debs/bcmcmd", "start.sh", "syncd.sh", "/usr/bin/"] +COPY ["debs/dsserve", "debs/bcmcmd", "start.sh", "/usr/bin/"] RUN chmod +x /usr/bin/dsserve /usr/bin/bcmcmd COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] diff --git a/platform/broadcom/docker-syncd-brcm/supervisord.conf b/platform/broadcom/docker-syncd-brcm/supervisord.conf index 80d04a225ffd..1e015fef931f 100644 --- a/platform/broadcom/docker-syncd-brcm/supervisord.conf +++ b/platform/broadcom/docker-syncd-brcm/supervisord.conf @@ -20,7 +20,7 @@ stdout_logfile=syslog stderr_logfile=syslog [program:syncd] -command=/usr/bin/syncd.sh +command=/usr/bin/syncd_start.sh priority=3 autostart=false autorestart=false diff --git a/platform/broadcom/docker-syncd-brcm/syncd.sh b/platform/broadcom/docker-syncd-brcm/syncd.sh deleted file mode 100755 index 993cf100f2f0..000000000000 --- a/platform/broadcom/docker-syncd-brcm/syncd.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -function clean_up { - service syncd stop - exit -} - -trap clean_up SIGTERM SIGKILL - -service syncd start - -read diff --git a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 index dd37db2e04d2..a35abf576f6d 100755 --- a/platform/cavium/docker-syncd-cavm/Dockerfile.j2 +++ b/platform/cavium/docker-syncd-cavm/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-base +FROM docker-config-engine ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -18,7 +18,7 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} -COPY ["start.sh", "syncd.sh", "/usr/bin/"] +COPY ["start.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["profile.ini", "/etc/ssw/AS7512/"] diff --git a/platform/cavium/docker-syncd-cavm/supervisord.conf b/platform/cavium/docker-syncd-cavm/supervisord.conf index 80d04a225ffd..1e015fef931f 100644 --- a/platform/cavium/docker-syncd-cavm/supervisord.conf +++ b/platform/cavium/docker-syncd-cavm/supervisord.conf @@ -20,7 +20,7 @@ stdout_logfile=syslog stderr_logfile=syslog [program:syncd] -command=/usr/bin/syncd.sh +command=/usr/bin/syncd_start.sh priority=3 autostart=false autorestart=false diff --git a/platform/cavium/docker-syncd-cavm/syncd.sh b/platform/cavium/docker-syncd-cavm/syncd.sh deleted file mode 100755 index 24767dfc6e0a..000000000000 --- a/platform/cavium/docker-syncd-cavm/syncd.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -export XP_ROOT=/usr/bin/ - -while true; do - - # Check if redis-server starts - - result=$(redis-cli ping) - - if [ "$result" == "PONG" ]; then - - redis-cli FLUSHALL - syncd -p /etc/ssw/AS7512/profile.ini -N - break - - fi - - sleep 1 - -done - diff --git a/platform/centec/docker-syncd-centec/Dockerfile.j2 b/platform/centec/docker-syncd-centec/Dockerfile.j2 index 9e0fe52b174e..302afbc0cd4e 100755 --- a/platform/centec/docker-syncd-centec/Dockerfile.j2 +++ b/platform/centec/docker-syncd-centec/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-base +FROM docker-config-engine ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -19,7 +19,7 @@ debs/{{ deb }}{{' '}} ## TODO: add kmod into Depends RUN apt-get install -f kmod -COPY ["start.sh", "syncd.sh", "/usr/bin/"] +COPY ["start.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] ## Clean up diff --git a/platform/centec/docker-syncd-centec/supervisord.conf b/platform/centec/docker-syncd-centec/supervisord.conf index 80d04a225ffd..1e015fef931f 100644 --- a/platform/centec/docker-syncd-centec/supervisord.conf +++ b/platform/centec/docker-syncd-centec/supervisord.conf @@ -20,7 +20,7 @@ stdout_logfile=syslog stderr_logfile=syslog [program:syncd] -command=/usr/bin/syncd.sh +command=/usr/bin/syncd_start.sh priority=3 autostart=false autorestart=false diff --git a/platform/centec/docker-syncd-centec/syncd.sh b/platform/centec/docker-syncd-centec/syncd.sh deleted file mode 100755 index 993cf100f2f0..000000000000 --- a/platform/centec/docker-syncd-centec/syncd.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -function clean_up { - service syncd stop - exit -} - -trap clean_up SIGTERM SIGKILL - -service syncd start - -read diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index 03257ad33e2f..0736df044162 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-base +FROM docker-config-engine ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -18,7 +18,7 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} -COPY ["start.sh", "syncd.sh", "mlnx-fw-upgrade.sh", "/usr/bin/"] +COPY ["start.sh", "mlnx-fw-upgrade.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["/debs/fw-SPC.mfa", "/etc/mlnx/"] diff --git a/platform/mellanox/docker-syncd-mlnx/start.sh b/platform/mellanox/docker-syncd-mlnx/start.sh index 96e2a9128081..0ad00c6fc252 100755 --- a/platform/mellanox/docker-syncd-mlnx/start.sh +++ b/platform/mellanox/docker-syncd-mlnx/start.sh @@ -4,5 +4,8 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd -supervisorctl start syncd +# mlnx-fw-upgrade.sh will exit if firmware was actually upgraded +# or if some error occurs +. mlnx-fw-upgrade.sh +supervisorctl start syncd diff --git a/platform/mellanox/docker-syncd-mlnx/supervisord.conf b/platform/mellanox/docker-syncd-mlnx/supervisord.conf index 80d04a225ffd..1e015fef931f 100644 --- a/platform/mellanox/docker-syncd-mlnx/supervisord.conf +++ b/platform/mellanox/docker-syncd-mlnx/supervisord.conf @@ -20,7 +20,7 @@ stdout_logfile=syslog stderr_logfile=syslog [program:syncd] -command=/usr/bin/syncd.sh +command=/usr/bin/syncd_start.sh priority=3 autostart=false autorestart=false diff --git a/platform/mellanox/docker-syncd-mlnx/syncd.sh b/platform/mellanox/docker-syncd-mlnx/syncd.sh deleted file mode 100755 index ad0e0e47be87..000000000000 --- a/platform/mellanox/docker-syncd-mlnx/syncd.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash - -function clean_up { - service syncd stop - exit -} - -trap clean_up SIGTERM SIGKILL - -# fw-upgrade will exit if firmware was actually upgraded or if some error -# occures -. mlnx-fw-upgrade.sh - -# FIXME: the script cannot trap SIGTERM signal and it exits without clean_up -# Remove rsyslogd.pid file manually so that to start the rsyslog instantly -service syncd start - -read - diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 9fe1e696c6a9..31131d7d76fa 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 9fe1e696c6a9b5e99406ff2548c6f52db4e0b604 +Subproject commit 31131d7d76fa68619b90d88528270a0740daa438 From 519802ec091b12708dd0f0656246dde11549855d Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 24 May 2017 11:57:33 -0700 Subject: [PATCH 0544/1011] [docker-swss]: Restore FDB and ARP entries after fast reboot (#621) * Restore FDB and ARP entries right after fast reboot to minimize traffic corruption * Fix typo --- dockers/docker-orchagent/swssconfig.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index f0f1e100f3d4..86ea010c2631 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -12,6 +12,30 @@ function config_acl { fi } +function fast_reboot { + case "$(cat /proc/cmdline)" in + *fast-reboot*) + if [[ -f /fdb.json ]]; + then + swssconfig /fdb.json + rm -f /fdb.json + fi + + if [[ -f /arp.json ]]; + then + swssconfig /arp.json + rm -f /arp.json + fi + ;; + *) + ;; + esac +} + + +# Restore FDB and ARP table ASAP +fast_reboot + HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json " From 13c18ed045b28d2b05d9d920769006f4865bea65 Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Wed, 24 May 2017 14:59:01 -0400 Subject: [PATCH 0545/1011] [device]: Add support for SKU Force10-S6000-Q32 (#624) --- device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000-Q32 | 1 + dockers/docker-orchagent/orchagent.sh | 2 ++ dockers/docker-orchagent/swssconfig.sh | 2 ++ 3 files changed, 5 insertions(+) create mode 120000 device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000-Q32 diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000-Q32 b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000-Q32 new file mode 120000 index 000000000000..175db8c15394 --- /dev/null +++ b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000-Q32 @@ -0,0 +1 @@ +Force10-S6000 \ No newline at end of file diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index a9330826d5e6..ff7a4ccf7c17 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -8,6 +8,8 @@ ORCHAGENT_ARGS="" if [ "$HWSKU" == "Force10-S6000" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "Force10-S6000-Q32" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "Force10-S6100" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "Force10-Z9100" ]; then diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index 86ea010c2631..ab6c39403b59 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -42,6 +42,8 @@ SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json " if [ "$HWSKU" == "Force10-S6000" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " +elif [ "$HWSKU" == "Force10-S6000-Q32" ]; then + SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [ "$HWSKU" == "Arista-7050-QX32" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [ "$HWSKU" == "ACS-MSN2700" ]; then From 0104dbbf9f8b9dfb34deaf4daf6f4c2b46c91fc6 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 24 May 2017 12:49:19 -0700 Subject: [PATCH 0546/1011] [image]: add --numeric_owner to perserve the original owner of the for docker filesystem (#626) --- installer/x86_64/install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 451edbe3f379..18669893bcb5 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -417,7 +417,8 @@ fi unzip $ONIE_INSTALLER_PAYLOAD -d $demo_mnt/$image_dir if [ -f $demo_mnt/$image_dir/$FILESYSTEM_DOCKERFS ]; then - cd $demo_mnt/$image_dir && mkdir -p $DOCKERFS_DIR && tar xf $FILESYSTEM_DOCKERFS -C $DOCKERFS_DIR && rm -f $FILESYSTEM_DOCKERFS; cd $OLDPWD + TAR_EXTRA_OPTION="--numeric-owner" + cd $demo_mnt/$image_dir && mkdir -p $DOCKERFS_DIR && tar x $TAR_EXTRA_OPTION -f $FILESYSTEM_DOCKERFS -C $DOCKERFS_DIR && rm -f $FILESYSTEM_DOCKERFS; cd $OLDPWD fi # Create loop device for /var/log to limit its size to $VAR_LOG_SIZE MB From 528effcacef3230bedf66d798b06d51d6fba8401 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 24 May 2017 13:49:43 -0700 Subject: [PATCH 0547/1011] Update submodule (#629) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index e8e1e70e6c30..46ab9d94535d 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit e8e1e70e6c30eee72cade87273d3ceed59bd0c8d +Subproject commit 46ab9d94535df16df8f7e2d252977d54e40caa30 From 31fbee21d0a1772c7e18ef9aed3a03810c8f24cd Mon Sep 17 00:00:00 2001 From: wadelnn Date: Thu, 25 May 2017 05:56:39 +0800 Subject: [PATCH 0548/1011] Update sonic-linux-kernel submodule (#609) Signed-off-by: Wade He chihen.he@gmail.com --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 73e99e9126c2..0d56999ccfcc 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 73e99e9126c2233a36609275a9e9bd0bb0f3d0f5 +Subproject commit 0d56999ccfccdc054178388f65c9442aa350caec From 0137f7ab5c3b886920e8bba45ff9aa4bd7542f57 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 25 May 2017 14:43:03 +0300 Subject: [PATCH 0549/1011] [Mellanox]: Update SAI revision (#632) New revision contains fixes for applying attributes on LAGs/LAG members Signed-off-by: marian-pritsak --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 8ad62aae2f52..67bc173ae8a6 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = 161120 -MLNX_SAI_REVISION = dd6b7cf8fcdc87a40cb694799daf8c081e859a14 +MLNX_SAI_REVISION = 579c19acf3b9bed181ac713fcf92302f4ebae422 export MLNX_SAI_VERSION MLNX_SAI_REVISION From 338e4e8839779dfcb4ffb9e7b6c377763ccae52e Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 25 May 2017 13:18:32 -0700 Subject: [PATCH 0550/1011] Syncd docker builds now depend on docker-config-engine (#634) --- platform/broadcom/docker-syncd-brcm.mk | 2 +- platform/cavium/docker-syncd-cavm.mk | 2 +- platform/centec/docker-syncd-centec.mk | 2 +- platform/mellanox/docker-syncd-mlnx.mk | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/docker-syncd-brcm.mk b/platform/broadcom/docker-syncd-brcm.mk index 8e48de8fe20f..cd44d651266f 100644 --- a/platform/broadcom/docker-syncd-brcm.mk +++ b/platform/broadcom/docker-syncd-brcm.mk @@ -4,7 +4,7 @@ DOCKER_SYNCD_BRCM = docker-syncd-brcm.gz $(DOCKER_SYNCD_BRCM)_PATH = $(PLATFORM_PATH)/docker-syncd-brcm $(DOCKER_SYNCD_BRCM)_DEPENDS += $(SYNCD) $(DOCKER_SYNCD_BRCM)_FILES += $(DSSERVE) $(BCMCMD) -$(DOCKER_SYNCD_BRCM)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_SYNCD_BRCM)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM) diff --git a/platform/cavium/docker-syncd-cavm.mk b/platform/cavium/docker-syncd-cavm.mk index ef4d578e0a3e..a61716c7bdb4 100644 --- a/platform/cavium/docker-syncd-cavm.mk +++ b/platform/cavium/docker-syncd-cavm.mk @@ -3,7 +3,7 @@ DOCKER_SYNCD_CAVM = docker-syncd-cavm.gz $(DOCKER_SYNCD_CAVM)_PATH = $(PLATFORM_PATH)/docker-syncd-cavm $(DOCKER_SYNCD_CAVM)_DEPENDS += $(SYNCD) $(CAVM_LIBSAI) $(XP_TOOLS) $(REDIS_TOOLS) -$(DOCKER_SYNCD_CAVM)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_SYNCD_CAVM)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CAVM) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_CAVM) diff --git a/platform/centec/docker-syncd-centec.mk b/platform/centec/docker-syncd-centec.mk index 9309ae885382..694005fb48cf 100644 --- a/platform/centec/docker-syncd-centec.mk +++ b/platform/centec/docker-syncd-centec.mk @@ -3,7 +3,7 @@ DOCKER_SYNCD_CENTEC = docker-syncd-centec.gz $(DOCKER_SYNCD_CENTEC)_PATH = $(PLATFORM_PATH)/docker-syncd-centec $(DOCKER_SYNCD_CENTEC)_DEPENDS += $(SYNCD) -$(DOCKER_SYNCD_CENTEC)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_SYNCD_CENTEC)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CENTEC) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_CENTEC) diff --git a/platform/mellanox/docker-syncd-mlnx.mk b/platform/mellanox/docker-syncd-mlnx.mk index 106257617a75..5ea1d7aa556a 100644 --- a/platform/mellanox/docker-syncd-mlnx.mk +++ b/platform/mellanox/docker-syncd-mlnx.mk @@ -4,7 +4,7 @@ DOCKER_SYNCD_MLNX = docker-syncd-mlnx.gz $(DOCKER_SYNCD_MLNX)_PATH = $(PLATFORM_PATH)/docker-syncd-mlnx $(DOCKER_SYNCD_MLNX)_DEPENDS += $(SYNCD) $(MFT) $(PYTHON_SDK_API) $(DOCKER_SYNCD_MLNX)_FILES += $(MLNX_FW) -$(DOCKER_SYNCD_MLNX)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_SYNCD_MLNX)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX) From edab38e321f01d1777eccac05662f3f9fcbd61fc Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 26 May 2017 13:31:33 -0700 Subject: [PATCH 0551/1011] Install ipython from packages (#637) --- dockers/docker-ptf/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 5b099176164b..d1d8e2466fa3 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -42,6 +42,7 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / libqt5core5a \ libqt5network5 \ less \ + ipython \ iputils-ping @@ -71,7 +72,6 @@ RUN rm -rf /debs \ && pip install dpkt \ && pip install ipaddress \ && pip install pysubnettree \ - && pip install 'ipython<6.0' \ && pip install paramiko \ && pip install parallel-ssh \ && mkdir -p /opt \ From f3312b8e0b75aebe13ad14bacc8fc56c246f5d55 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 26 May 2017 17:18:11 -0700 Subject: [PATCH 0552/1011] [docker-ptf-*]: Use buildimage infrastructure to build docker-ptf-* (#638) * Add files to build docker-ptf-{platform} --- dockers/docker-ptf-saithrift/Dockerfile | 15 --------------- dockers/docker-ptf-saithrift/Dockerfile.j2 | 17 +++++++++++++++++ platform/broadcom/docker-ptf-brcm.mk | 7 +++++++ platform/broadcom/rules.mk | 2 ++ platform/cavium/docker-ptf-cavm.mk | 7 +++++++ platform/cavium/rules.mk | 2 ++ platform/centec/docker-ptf-centec.mk | 7 +++++++ platform/centec/rules.mk | 2 ++ platform/mellanox/docker-ptf-mlnx.mk | 7 +++++++ platform/mellanox/rules.mk | 2 ++ 10 files changed, 53 insertions(+), 15 deletions(-) delete mode 100644 dockers/docker-ptf-saithrift/Dockerfile create mode 100644 dockers/docker-ptf-saithrift/Dockerfile.j2 create mode 100644 platform/broadcom/docker-ptf-brcm.mk create mode 100644 platform/cavium/docker-ptf-cavm.mk create mode 100644 platform/centec/docker-ptf-centec.mk create mode 100644 platform/mellanox/docker-ptf-mlnx.mk diff --git a/dockers/docker-ptf-saithrift/Dockerfile b/dockers/docker-ptf-saithrift/Dockerfile deleted file mode 100644 index 0aa494757711..000000000000 --- a/dockers/docker-ptf-saithrift/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM docker-ptf - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -RUN apt-get update - -COPY ["deps/saithrift-0.9.tar.gz", "/deps/"] -COPY ["*.ini", "/etc/ptf/"] -COPY ["deps/SAI/test/saithrift/tests/*", "/usr/share/ptf-tests/"] - -RUN tar xzf /deps/saithrift-0.9.tar.gz -C /usr/share/; \ - cd usr/share/saithrift-0.9; \ - python setup.py install; \ - rm -rf /deps diff --git a/dockers/docker-ptf-saithrift/Dockerfile.j2 b/dockers/docker-ptf-saithrift/Dockerfile.j2 new file mode 100644 index 000000000000..3076de4878b6 --- /dev/null +++ b/dockers/docker-ptf-saithrift/Dockerfile.j2 @@ -0,0 +1,17 @@ +FROM docker-ptf + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +COPY \ +{% for deb in docker_ptf_saithrift_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -i \ +{% for deb in docker_ptf_saithrift_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +COPY ["*.ini", "/etc/ptf/"] diff --git a/platform/broadcom/docker-ptf-brcm.mk b/platform/broadcom/docker-ptf-brcm.mk new file mode 100644 index 000000000000..7b78aa9ec316 --- /dev/null +++ b/platform/broadcom/docker-ptf-brcm.mk @@ -0,0 +1,7 @@ +# docker image for docker-ptf-brcm + +DOCKER_PTF_BRCM = docker-ptf-brcm.gz +$(DOCKER_PTF_BRCM)_PATH = $(DOCKERS_PATH)/docker-ptf-saithrift +$(DOCKER_PTF_BRCM)_DEPENDS += $(PYTHON_SAITHRIFT_BRCM) +$(DOCKER_PTF_BRCM)_LOAD_DOCKERS += $(DOCKER_PTF) +SONIC_DOCKER_IMAGES += $(DOCKER_PTF_BRCM) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index fff132c1c508..18ba86d1c0ce 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -11,6 +11,7 @@ include $(PLATFORM_PATH)/one-image.mk include $(PLATFORM_PATH)/one-aboot.mk include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk +include $(PLATFORM_PATH)/docker-ptf-brcm.mk BCMCMD = bcmcmd $(BCMCMD)_URL = "https://sonicstorage.blob.core.windows.net/packages/20170518/bcmcmd?sv=2015-04-05&sr=b&sig=OCW4mfmbQ6D0BH8nllpAWrS8XL9uczrw32w3XgL4jws%3D&se=2030-03-31T23%3A06%3A15Z&sp=r" @@ -22,6 +23,7 @@ SONIC_ONLINE_FILES += $(BCMCMD) $(DSSERVE) SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT_IMAGE) \ $(DOCKER_FPM) \ + $(DOCKER_PTF_BRCM) \ $(DOCKER_SYNCD_BRCM_RPC) # Inject brcm sai into sairedis diff --git a/platform/cavium/docker-ptf-cavm.mk b/platform/cavium/docker-ptf-cavm.mk new file mode 100644 index 000000000000..4665345586a8 --- /dev/null +++ b/platform/cavium/docker-ptf-cavm.mk @@ -0,0 +1,7 @@ +# docker image for docker-ptf-cavm + +DOCKER_PTF_CAVM = docker-ptf-cavm.gz +$(DOCKER_PTF_CAVM)_PATH = $(DOCKERS_PATH)/docker-ptf-saithrift +$(DOCKER_PTF_CAVM)_DEPENDS += $(PYTHON_SAITHRIFT_CAVM) +$(DOCKER_PTF_CAVM)_LOAD_DOCKERS += $(DOCKER_PTF) +SONIC_DOCKER_IMAGES += $(DOCKER_PTF_CAVM) diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index 6eeffbc7f9b2..67a69168e035 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -7,9 +7,11 @@ include $(PLATFORM_PATH)/cavm-xpnet.mk include $(PLATFORM_PATH)/one-image.mk include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk +include $(PLATFORM_PATH)/docker-ptf-cavm.mk SONIC_ALL += $(SONIC_ONE_IMAGE) \ $(DOCKER_FPM) \ + $(DOCKER_PTF_CAVM) \ $(DOCKER_SYNCD_CAVM_RPC) # Inject cavium sai into sairedis diff --git a/platform/centec/docker-ptf-centec.mk b/platform/centec/docker-ptf-centec.mk new file mode 100644 index 000000000000..ff84ed0becb7 --- /dev/null +++ b/platform/centec/docker-ptf-centec.mk @@ -0,0 +1,7 @@ +# docker image for docker-ptf-centec + +DOCKER_PTF_CENTEC = docker-ptf-centec.gz +$(DOCKER_PTF_CENTEC)_PATH = $(DOCKERS_PATH)/docker-ptf-saithrift +$(DOCKER_PTF_CENTEC)_DEPENDS += $(PYTHON_SAITHRIFT_CENTEC) +$(DOCKER_PTF_CENTEC)_LOAD_DOCKERS += $(DOCKER_PTF) +SONIC_DOCKER_IMAGES += $(DOCKER_PTF_CENTEC) diff --git a/platform/centec/rules.mk b/platform/centec/rules.mk index 0dcf050fe417..8b676f87ece4 100644 --- a/platform/centec/rules.mk +++ b/platform/centec/rules.mk @@ -6,8 +6,10 @@ include $(PLATFORM_PATH)/docker-syncd-centec-rpc.mk include $(PLATFORM_PATH)/one-image.mk include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk +include $(PLATFORM_PATH)/docker-ptf-centec.mk SONIC_ALL += $(SONIC_ONE_IMAGE) \ + $(DOCKER_PTF_CENTEC) \ $(DOCKER_SYNCD_CENTEC_RPC) # Inject centec sai into sairedis diff --git a/platform/mellanox/docker-ptf-mlnx.mk b/platform/mellanox/docker-ptf-mlnx.mk new file mode 100644 index 000000000000..7f23dc715e32 --- /dev/null +++ b/platform/mellanox/docker-ptf-mlnx.mk @@ -0,0 +1,7 @@ +# docker image for docker-ptf-mlnx + +DOCKER_PTF_MLNX = docker-ptf-mlnx.gz +$(DOCKER_PTF_MLNX)_PATH = $(DOCKERS_PATH)/docker-ptf-saithrift +$(DOCKER_PTF_MLNX)_DEPENDS += $(PYTHON_SAITHRIFT_MLNX) +$(DOCKER_PTF_MLNX)_LOAD_DOCKERS += $(DOCKER_PTF) +SONIC_DOCKER_IMAGES += $(DOCKER_PTF_MLNX) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index a56d9b0d5748..6b88748c73a2 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -9,9 +9,11 @@ include $(PLATFORM_PATH)/docker-orchagent-mlnx.mk include $(PLATFORM_PATH)/one-image.mk include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk +include $(PLATFORM_PATH)/docker-ptf-mlnx.mk SONIC_ALL += $(SONIC_ONE_IMAGE) \ $(DOCKER_FPM) \ + $(DOCKER_PTF_MLNX) \ $(DOCKER_SYNCD_MLNX_RPC) # Inject mlnx sai into sairedis From e6bb4b20a196f22a7e266f3e2de61df442ff09f4 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 26 May 2017 17:56:29 -0700 Subject: [PATCH 0553/1011] [swss]: Update submodules and mount /var/log to swss docker (#636) - [swss]: Update sairedis/swss/common submodules - [orchagent]: Mount /var/log folder and use the folder to save recording files - [orchagent]: Use -d to specify the folder path --- dockers/docker-orchagent/orchagent.sh | 4 +++- platform/broadcom/docker-orchagent-brcm.mk | 3 ++- platform/cavium/docker-orchagent-cavm.mk | 3 ++- platform/centec/docker-orchagent-centec.mk | 3 ++- platform/mellanox/docker-orchagent-mlnx.mk | 3 ++- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 8 files changed, 14 insertions(+), 8 deletions(-) diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index ff7a4ccf7c17..01959dd66ac4 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -4,7 +4,9 @@ HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` -ORCHAGENT_ARGS="" +# Create a folder for SsWW record files +mkdir -p /var/log/swss +ORCHAGENT_ARGS="-d /var/log/swss " if [ "$HWSKU" == "Force10-S6000" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" diff --git a/platform/broadcom/docker-orchagent-brcm.mk b/platform/broadcom/docker-orchagent-brcm.mk index 777f052042ba..70e087e73f4f 100644 --- a/platform/broadcom/docker-orchagent-brcm.mk +++ b/platform/broadcom/docker-orchagent-brcm.mk @@ -11,7 +11,8 @@ $(DOCKER_ORCHAGENT_BRCM)_CONTAINER_NAME = swss $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += --net=host --privileged -t $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro -$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf +$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf:ro $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /var/log:/var/log:rw $(DOCKER_ORCHAGENT_BRCM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel diff --git a/platform/cavium/docker-orchagent-cavm.mk b/platform/cavium/docker-orchagent-cavm.mk index 1d58e41edf89..702c661a7616 100644 --- a/platform/cavium/docker-orchagent-cavm.mk +++ b/platform/cavium/docker-orchagent-cavm.mk @@ -11,7 +11,8 @@ $(DOCKER_ORCHAGENT_CAVM)_CONTAINER_NAME = swss $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += --net=host --privileged -t $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro -$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf +$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf:ro $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /var/log:/var/log:rw $(DOCKER_ORCHAGENT_CAVM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel diff --git a/platform/centec/docker-orchagent-centec.mk b/platform/centec/docker-orchagent-centec.mk index 529778466bf3..3aff56c0b3b2 100644 --- a/platform/centec/docker-orchagent-centec.mk +++ b/platform/centec/docker-orchagent-centec.mk @@ -11,7 +11,8 @@ $(DOCKER_ORCHAGENT_CENTEC)_CONTAINER_NAME = swss $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += --net=host --privileged -t $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro -$(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /host/machine.conf:/host/machine.conf +$(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /host/machine.conf:/host/machine.conf:ro $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /var/log:/var/log:rw $(DOCKER_ORCHAGENT_CENTEC)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel diff --git a/platform/mellanox/docker-orchagent-mlnx.mk b/platform/mellanox/docker-orchagent-mlnx.mk index d56a1edf0db6..0e4005e436b4 100644 --- a/platform/mellanox/docker-orchagent-mlnx.mk +++ b/platform/mellanox/docker-orchagent-mlnx.mk @@ -11,7 +11,8 @@ $(DOCKER_ORCHAGENT_MLNX)_CONTAINER_NAME = swss $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += --net=host --privileged -t $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro -$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /host/machine.conf:/host/machine.conf +$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /host/machine.conf:/host/machine.conf:ro $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /var/log:/var/log:rw $(DOCKER_ORCHAGENT_MLNX)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 31131d7d76fa..7acacf385e30 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 31131d7d76fa68619b90d88528270a0740daa438 +Subproject commit 7acacf385e30e8525b0816f76963a6a36cb0b27d diff --git a/src/sonic-swss b/src/sonic-swss index 1210c45724f1..03428467606e 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 1210c45724f184152525f3ff5bc983ad4c3c9939 +Subproject commit 03428467606eab9d577bde29316ba98357e7a032 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 447c9a254be7..8bb0c9b8b71b 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 447c9a254be7254b7f62987a1d2d5341f27b2ba0 +Subproject commit 8bb0c9b8b71bffc2f323e6f25504d38ef3a9d9d8 From 122c03caee73e165161e5eb3b33b42cc423fe521 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 26 May 2017 18:32:52 -0700 Subject: [PATCH 0554/1011] [docker-ptf]: Overwrite ubuntu scapy with version from p4lang (#639) * Install scapy from p4lang * Overwrite standard scapy version --- dockers/docker-ptf/Dockerfile.j2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index d1d8e2466fa3..963282b27cb5 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -43,8 +43,11 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / libqt5network5 \ less \ ipython \ + git \ iputils-ping +## Reinstall scapy by version from p4lang +RUN git clone https://github.com/p4lang/scapy-vxlan.git && cd scapy-vxlan && python setup.py install RUN dpkg -i \ {% for deb in docker_ptf_debs.split(' ') -%} From bd52f411fff6675397f0b3ed7ed71374d9324069 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Sat, 27 May 2017 01:14:58 -0700 Subject: [PATCH 0555/1011] [interfaces]: Use default table instead of main table for forced_mgmt_routes (#635) If routes are inserted in main table, they wont' be overwritten by the routes learned via BGP. Then the routes will be missing from the ASIC. Thus a default table is used so that control plane and data plane routes are isolated and could be configured independently. --- files/image_config/interfaces/interfaces.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index c2728e5e032d..d23b677ff290 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -29,13 +29,13 @@ iface eth0 inet static up ip route add default via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 table default up ip rule add from {{ minigraph_mgmt_interface['addr'] }}/32 table default {% for prefix in forced_mgmt_routes %} - up ip route add {{ prefix }} via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 + up ip rule add to {{ prefix }} table default {% endfor %} # management port down rules down ip route delete default via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 table default down ip rule delete from {{ minigraph_mgmt_interface['addr'] }}/32 table default {% for prefix in forced_mgmt_routes %} - down ip route delete {{ prefix }} via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 + down ip rule delete to {{ prefix }} table default {% endfor %} {# TODO: COPP policy type rules #} {% else %} From 1b2b7b8e3505c5e8bf0568d20eee8b1c294c45b4 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 27 May 2017 16:05:21 -0700 Subject: [PATCH 0556/1011] [docker-swss]: mount /var/log/swss into the docker (#640) Fix the bug introduced by commit e6bb4b20a196f22a7e266f3e2de61df442ff09f4 The previous commit mount /var/log into the docker which override the original /var/log directory structure, causing swss docker failed to start due to following errors. Error: The directory named as part of the path /var/log/supervisor/supervisord.log does not exist. --- platform/broadcom/docker-orchagent-brcm.mk | 2 +- platform/cavium/docker-orchagent-cavm.mk | 2 +- platform/centec/docker-orchagent-centec.mk | 2 +- platform/mellanox/docker-orchagent-mlnx.mk | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/docker-orchagent-brcm.mk b/platform/broadcom/docker-orchagent-brcm.mk index 70e087e73f4f..196a4d589a24 100644 --- a/platform/broadcom/docker-orchagent-brcm.mk +++ b/platform/broadcom/docker-orchagent-brcm.mk @@ -13,6 +13,6 @@ $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/network/interfaces:/etc/network/inte $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf:ro $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro -$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /var/log:/var/log:rw +$(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /var/log/swss:/var/log/swss:rw $(DOCKER_ORCHAGENT_BRCM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel diff --git a/platform/cavium/docker-orchagent-cavm.mk b/platform/cavium/docker-orchagent-cavm.mk index 702c661a7616..57ebb2fd1534 100644 --- a/platform/cavium/docker-orchagent-cavm.mk +++ b/platform/cavium/docker-orchagent-cavm.mk @@ -13,6 +13,6 @@ $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/network/interfaces:/etc/network/inte $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /host/machine.conf:/host/machine.conf:ro $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro -$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /var/log:/var/log:rw +$(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /var/log/swss:/var/log/swss:rw $(DOCKER_ORCHAGENT_CAVM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel diff --git a/platform/centec/docker-orchagent-centec.mk b/platform/centec/docker-orchagent-centec.mk index 3aff56c0b3b2..695e481546b1 100644 --- a/platform/centec/docker-orchagent-centec.mk +++ b/platform/centec/docker-orchagent-centec.mk @@ -13,6 +13,6 @@ $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/network/interfaces:/etc/network/in $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /host/machine.conf:/host/machine.conf:ro $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro -$(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /var/log:/var/log:rw +$(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /var/log/swss:/var/log/swss:rw $(DOCKER_ORCHAGENT_CENTEC)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel diff --git a/platform/mellanox/docker-orchagent-mlnx.mk b/platform/mellanox/docker-orchagent-mlnx.mk index 0e4005e436b4..20aa38335361 100644 --- a/platform/mellanox/docker-orchagent-mlnx.mk +++ b/platform/mellanox/docker-orchagent-mlnx.mk @@ -13,6 +13,6 @@ $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/network/interfaces:/etc/network/inte $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /host/machine.conf:/host/machine.conf:ro $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro -$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /var/log:/var/log:rw +$(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /var/log/swss:/var/log/swss:rw $(DOCKER_ORCHAGENT_MLNX)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel From 17f063314355a11e3e298fb6af63ad8a6364be9a Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 28 May 2017 00:36:34 -0700 Subject: [PATCH 0557/1011] [image]: change mtu to jumbo size 9216 by default (#641) --- files/image_config/interfaces/interfaces.j2 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index d23b677ff290..7e07c4365171 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -49,6 +49,7 @@ iface eth0 inet dhcp auto {{ interface['attachto'] }} allow-hotplug {{ interface['attachto'] }} iface {{ interface['attachto'] }} {{ 'inet' if interface['addr'] | ipv4 else 'inet6' }} static + mtu 9216 address {{ interface['addr'] }} netmask {{ interface['mask'] }} # @@ -61,7 +62,7 @@ iface {{ interface['attachto'] }} {{ 'inet' if interface['addr'] | ipv4 else 'in auto {{ member }} allow-hotplug {{ member }} iface {{ member }} inet manual - pre-up ifconfig {{ member }} up + pre-up ifconfig {{ member }} up mtu 9216 post-up brctl addif {{ vlan }} {{ member }} || true post-down ifconfig {{ member }} down # @@ -103,6 +104,7 @@ iface {{ vlan_interface['attachto'] }} {{ 'inet' if vlan_interface['addr'] | ipv auto {{ pc_interface['attachto'] }} allow-hotplug {{ pc_interface['attachto'] }} iface {{ pc_interface['attachto'] }} {{ 'inet' if pc_interface['addr'] | ipv4 else 'inet6' }} static + mtu 9216 address {{ pc_interface['addr'] }} netmask {{ pc_interface['mask'] }} # From 2e582d22d1da9947a9292b534209ea59cf933330 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Tue, 30 May 2017 12:56:42 -0700 Subject: [PATCH 0558/1011] update SAI and sonic-utilities submodules (#644) * Update SAI and sonic-utilites submodules --- src/SAI | 2 +- src/sonic-utilities | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SAI b/src/SAI index 499ad7272264..a6b5b3115f39 160000 --- a/src/SAI +++ b/src/SAI @@ -1 +1 @@ -Subproject commit 499ad727226405b425473d6ed170c3bee1112cca +Subproject commit a6b5b3115f39f599d39629ab9bfaeea17333d0bc diff --git a/src/sonic-utilities b/src/sonic-utilities index b158a565ba5f..de5c31874bb8 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit b158a565ba5ff85665c225d12908a3b588552db5 +Subproject commit de5c31874bb89c62d50efec6d8541e85fe678548 From 7dfbca649793482ce6ecd6f884e85e8d69fc258e Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Tue, 30 May 2017 13:21:44 -0700 Subject: [PATCH 0559/1011] Fix SAI submodule id (#647) --- src/SAI | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SAI b/src/SAI index a6b5b3115f39..940c7b6afb1d 160000 --- a/src/SAI +++ b/src/SAI @@ -1 +1 @@ -Subproject commit a6b5b3115f39f599d39629ab9bfaeea17333d0bc +Subproject commit 940c7b6afb1db4e8504b7cdb24ccd669748dbde8 From 520fff5b2d85dc9ee209e861083db5e3ab6db7aa Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 31 May 2017 02:17:03 +0300 Subject: [PATCH 0560/1011] Add ENABLE_SYNCD_RPC option (#642) Under rules/config now there's additional configuration option ENABLE_SYNCD_RPC that allows building SONIC installer with docker-syncd-*-rpc for evaluation purposes. Signed-off-by: marian-pritsak --- Makefile | 1 + platform/broadcom/docker-syncd-brcm-rpc.mk | 9 +++++++++ platform/broadcom/docker-syncd-brcm.mk | 2 ++ platform/cavium/docker-syncd-cavm-rpc.mk | 8 ++++++++ platform/cavium/docker-syncd-cavm.mk | 2 ++ platform/centec/docker-syncd-centec-rpc.mk | 9 +++++++++ platform/centec/docker-syncd-centec.mk | 2 ++ platform/mellanox/docker-syncd-mlnx-rpc.mk | 8 ++++++++ platform/mellanox/docker-syncd-mlnx.mk | 2 ++ rules/config | 4 ++++ slave.mk | 4 ++++ 11 files changed, 51 insertions(+) diff --git a/Makefile b/Makefile index 116c751f228c..97f054c035b6 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) \ + SONIC_ENABLE_SYNCD_RPC=$(ENABLE_SYNCD_RPC) \ PASSWORD=$(PASSWORD) \ USERNAME=$(USERNAME) \ $@ diff --git a/platform/broadcom/docker-syncd-brcm-rpc.mk b/platform/broadcom/docker-syncd-brcm-rpc.mk index 8efd25eb9b49..fa7c0fb797c7 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc.mk +++ b/platform/broadcom/docker-syncd-brcm-rpc.mk @@ -6,3 +6,12 @@ $(DOCKER_SYNCD_BRCM_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) $(DOCKER_SYNCD_BRCM_RPC)_FILES += $(DSSERVE) $(BCMCMD) $(DOCKER_SYNCD_BRCM_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_BRCM) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM_RPC) +ifeq ($(ENABLE_SYNCD_RPC),y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM_RPC) +endif + +$(DOCKER_SYNCD_BRCM_RPC)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_BRCM_RPC)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_BRCM_RPC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_BRCM_RPC)_RUN_OPT += -v /var/run/docker-syncd:/var/run/sswsyncd +$(DOCKER_SYNCD_BRCM_RPC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/broadcom/docker-syncd-brcm.mk b/platform/broadcom/docker-syncd-brcm.mk index cd44d651266f..aeee6479a84f 100644 --- a/platform/broadcom/docker-syncd-brcm.mk +++ b/platform/broadcom/docker-syncd-brcm.mk @@ -6,7 +6,9 @@ $(DOCKER_SYNCD_BRCM)_DEPENDS += $(SYNCD) $(DOCKER_SYNCD_BRCM)_FILES += $(DSSERVE) $(BCMCMD) $(DOCKER_SYNCD_BRCM)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM) +ifneq ($(ENABLE_SYNCD_RPC),y) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_BRCM) +endif $(DOCKER_SYNCD_BRCM)_CONTAINER_NAME = syncd $(DOCKER_SYNCD_BRCM)_RUN_OPT += --net=host --privileged -t diff --git a/platform/cavium/docker-syncd-cavm-rpc.mk b/platform/cavium/docker-syncd-cavm-rpc.mk index ac725a1bbdeb..e0136f5324b6 100644 --- a/platform/cavium/docker-syncd-cavm-rpc.mk +++ b/platform/cavium/docker-syncd-cavm-rpc.mk @@ -5,3 +5,11 @@ $(DOCKER_SYNCD_CAVM_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-cavm-rpc $(DOCKER_SYNCD_CAVM_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) $(CAVM_LIBSAI) $(XP_TOOLS) $(REDIS_TOOLS) $(DOCKER_SYNCD_CAVM_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_CAVM) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CAVM_RPC) +ifeq ($(ENABLE_SYNCD_RPC),y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_CAVM_RPC) +endif + +$(DOCKER_SYNCD_CAVM_RPC)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_CAVM_RPC)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_CAVM_RPC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_CAVM_RPC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/cavium/docker-syncd-cavm.mk b/platform/cavium/docker-syncd-cavm.mk index a61716c7bdb4..8a3b0857dadf 100644 --- a/platform/cavium/docker-syncd-cavm.mk +++ b/platform/cavium/docker-syncd-cavm.mk @@ -5,7 +5,9 @@ $(DOCKER_SYNCD_CAVM)_PATH = $(PLATFORM_PATH)/docker-syncd-cavm $(DOCKER_SYNCD_CAVM)_DEPENDS += $(SYNCD) $(CAVM_LIBSAI) $(XP_TOOLS) $(REDIS_TOOLS) $(DOCKER_SYNCD_CAVM)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CAVM) +ifneq ($(ENABLE_SYNCD_RPC),y) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_CAVM) +endif $(DOCKER_SYNCD_CAVM)_CONTAINER_NAME = syncd $(DOCKER_SYNCD_CAVM)_RUN_OPT += --net=host --privileged -t diff --git a/platform/centec/docker-syncd-centec-rpc.mk b/platform/centec/docker-syncd-centec-rpc.mk index 68b940f8d2b6..1798a034980d 100644 --- a/platform/centec/docker-syncd-centec-rpc.mk +++ b/platform/centec/docker-syncd-centec-rpc.mk @@ -5,3 +5,12 @@ $(DOCKER_SYNCD_CENTEC_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-centec-rpc $(DOCKER_SYNCD_CENTEC_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) $(DOCKER_SYNCD_CENTEC_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_CENTEC) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CENTEC_RPC) +ifeq ($(ENABLE_SYNCD_RPC),y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_CENTEC_RPC) +endif + +$(DOCKER_SYNCD_CENTEC_RPC)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_CENTEC_RPC)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_CENTEC_RPC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_CENTEC_RPC)_RUN_OPT += -v /var/run/docker-syncd:/var/run/sswsyncd +$(DOCKER_SYNCD_CENTEC_RPC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/centec/docker-syncd-centec.mk b/platform/centec/docker-syncd-centec.mk index 694005fb48cf..c4335ab356ac 100644 --- a/platform/centec/docker-syncd-centec.mk +++ b/platform/centec/docker-syncd-centec.mk @@ -5,7 +5,9 @@ $(DOCKER_SYNCD_CENTEC)_PATH = $(PLATFORM_PATH)/docker-syncd-centec $(DOCKER_SYNCD_CENTEC)_DEPENDS += $(SYNCD) $(DOCKER_SYNCD_CENTEC)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_CENTEC) +ifneq ($(ENABLE_SYNCD_RPC),y) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_CENTEC) +endif $(DOCKER_SYNCD_CENTEC)_CONTAINER_NAME = syncd $(DOCKER_SYNCD_CENTEC)_RUN_OPT += --net=host --privileged -t diff --git a/platform/mellanox/docker-syncd-mlnx-rpc.mk b/platform/mellanox/docker-syncd-mlnx-rpc.mk index 8c5411454086..e8e55e71e8e5 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc.mk +++ b/platform/mellanox/docker-syncd-mlnx-rpc.mk @@ -6,3 +6,11 @@ $(DOCKER_SYNCD_MLNX_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) $(DOCKER_SYNCD_MLNX_RPC)_FILES += $(MLNX_FW) $(DOCKER_SYNCD_MLNX_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_MLNX) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX_RPC) +ifeq ($(ENABLE_SYNCD_RPC),y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX_RPC) +endif + +$(DOCKER_SYNCD_MLNX_RPC)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_MLNX_RPC)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_MLNX_RPC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_MLNX_RPC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/mellanox/docker-syncd-mlnx.mk b/platform/mellanox/docker-syncd-mlnx.mk index 5ea1d7aa556a..2675399b705e 100644 --- a/platform/mellanox/docker-syncd-mlnx.mk +++ b/platform/mellanox/docker-syncd-mlnx.mk @@ -6,7 +6,9 @@ $(DOCKER_SYNCD_MLNX)_DEPENDS += $(SYNCD) $(MFT) $(PYTHON_SDK_API) $(DOCKER_SYNCD_MLNX)_FILES += $(MLNX_FW) $(DOCKER_SYNCD_MLNX)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX) +ifneq ($(ENABLE_SYNCD_RPC),y) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX) +endif $(DOCKER_SYNCD_MLNX)_CONTAINER_NAME = syncd $(DOCKER_SYNCD_MLNX)_RUN_OPT += --net=host --privileged -t diff --git a/rules/config b/rules/config index e360c7a434c7..4d0fc7801c9a 100644 --- a/rules/config +++ b/rules/config @@ -46,3 +46,7 @@ DEFAULT_PASSWORD = YourPaSsWoRd # Quagga will be the default routing-stack for all the SONiC platforms. Other supported # routing-stacks: frr, gobgp. SONIC_ROUTING_STACK = quagga + +# ENABLE_SYNCD_RPC - build docker-syncd with rpc packages for testing purposes. +# Uncomment to enable: +# ENABLE_SYNCD_RPC = y diff --git a/slave.mk b/slave.mk index 9d9fc126f765..d17aea5722cc 100644 --- a/slave.mk +++ b/slave.mk @@ -67,6 +67,10 @@ ifeq ($(PASSWORD),) override PASSWORD := $(DEFAULT_PASSWORD) endif +ifeq ($(SONIC_ENABLE_SYNCD_RPC),y) +ENABLE_SYNCD_RPC = y +endif + MAKEFLAGS += -j $(SONIC_CONFIG_BUILD_JOBS) ############################################################################### From b8c11bccf205fd5691368845d3c29a3d4ead0ddf Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 30 May 2017 18:29:18 -0700 Subject: [PATCH 0561/1011] [DHCP Relay]: Listen on all front panel, VLAN and PortChannel interfaces with IPv4 addresses (#645) * DHCP relay now listens on all front panel, VLAN and PortChannel interfaces with IPv4 addresses * Add sample isc-dhcp-relay output file --- dockers/docker-dhcp-relay/isc-dhcp-relay.j2 | 24 ++++++++++++++++++- .../tests/sample_output/isc-dhcp-relay | 7 ++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/sonic-config-engine/tests/sample_output/isc-dhcp-relay diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 index aa5e21ac279a..05e633b7602f 100644 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 @@ -1,6 +1,28 @@ SERVERS="{{ dhcp_servers | join(' ') }}" -INTERFACES="{{ minigraph_vlan_interfaces[0]['attachto'] }}" +INTERFACES=" +{%- set add_preceding_space = { 'flag': False } %} +{%- for interface in minigraph_interfaces %} +{%- if interface['addr'] | ipv4 %} +{%- if add_preceding_space.flag %} {% endif %} +{{ interface['attachto'] }} +{%- set _dummy = add_preceding_space.update({'flag': True}) %} +{%- endif %} +{%- endfor %} +{%- for vlan_interface in minigraph_vlan_interfaces %} +{%- if vlan_interface['addr'] | ipv4 %} +{%- if add_preceding_space.flag %} {% endif %} +{{ vlan_interface['attachto'] }} +{%- set _dummy = add_preceding_space.update({'flag': True}) %} +{%- endif %} +{%- endfor %} +{%- for pc_interface in minigraph_portchannel_interfaces %} +{%- if pc_interface['addr'] | ipv4 %} +{%- if add_preceding_space.flag %} {% endif %} +{{ pc_interface['attachto'] }} +{%- set _dummy = add_preceding_space.update({'flag': True}) %} +{%- endif %} +{%- endfor %}" # '-a' option provides option 82 circuit id information OPTIONS="-a" diff --git a/src/sonic-config-engine/tests/sample_output/isc-dhcp-relay b/src/sonic-config-engine/tests/sample_output/isc-dhcp-relay new file mode 100644 index 000000000000..4a851af34eb9 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/isc-dhcp-relay @@ -0,0 +1,7 @@ +SERVERS="192.0.0.1 192.0.0.2 192.0.0.3 192.0.0.4 192.0.0.5 192.0.0.6 192.0.0.7 192.0.0.8 192.0.0.9 192.0.0.10 192.0.0.11 192.0.0.12 192.0.0.13 192.0.0.14 192.0.0.15 192.0.0.16 192.0.0.17 192.0.0.18 192.0.0.19 192.0.0.20 192.0.0.21 192.0.0.22 192.0.0.23 192.0.0.24 192.0.0.25 192.0.0.26 192.0.0.27 192.0.0.28 192.0.0.29 192.0.0.30 192.0.0.31 192.0.0.32 192.0.0.33 192.0.0.34 192.0.0.35 192.0.0.36 192.0.0.37 192.0.0.38 192.0.0.39 192.0.0.40 192.0.0.41 192.0.0.42 192.0.0.43 192.0.0.44 192.0.0.45 192.0.0.46 192.0.0.47 192.0.0.48" + +INTERFACES="Vlan1000 PortChannel01 PortChannel02 PortChannel03 PortChannel04" + +# '-a' option provides option 82 circuit id information +OPTIONS="-a" + From 8c11cdfb5d40218ca0e9cd0c63aeb4384eaa1e98 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 30 May 2017 19:29:25 -0700 Subject: [PATCH 0562/1011] [swss]: Update swss/sairedis/common submodules (#646) --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 7acacf385e30..d3a30baea06d 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 7acacf385e30e8525b0816f76963a6a36cb0b27d +Subproject commit d3a30baea06ddc26dfaba03c7002a3ca7f261194 diff --git a/src/sonic-swss b/src/sonic-swss index 03428467606e..83e46ba67e6c 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 03428467606eab9d577bde29316ba98357e7a032 +Subproject commit 83e46ba67e6c77a9c58069acaa090a4cd95e5eb0 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 8bb0c9b8b71b..2f81979f0afc 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 8bb0c9b8b71bffc2f323e6f25504d38ef3a9d9d8 +Subproject commit 2f81979f0afc2de9245ba37e68bed6be71f67108 From c3ef1025472a79df98bdf258cae0fea67c23a7ae Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 30 May 2017 19:29:52 -0700 Subject: [PATCH 0563/1011] [ptf]: Update PTF submodule to include DHCP packet creation changes (#648) --- src/ptf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ptf b/src/ptf index 9e762c9cdb63..f9b910d9fa5d 160000 --- a/src/ptf +++ b/src/ptf @@ -1 +1 @@ -Subproject commit 9e762c9cdb63d7ab9be017a41f638e776f4f0575 +Subproject commit f9b910d9fa5d393a90a1b99c77e7e1b5641a22c9 From 01a716cce24a034a0284355fb1b3a2b042f139cb Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 31 May 2017 10:48:00 -0700 Subject: [PATCH 0564/1011] [src/ptf update]: Submodule update (#652) * Update ptf submodule with ptf_nn_agent fixes --- src/ptf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ptf b/src/ptf index f9b910d9fa5d..aac6efd0a78b 160000 --- a/src/ptf +++ b/src/ptf @@ -1 +1 @@ -Subproject commit f9b910d9fa5d393a90a1b99c77e7e1b5641a22c9 +Subproject commit aac6efd0a78bf51f63727e7a13dc79f91f13686e From 26f98559b09e71df5c8315d264f977e521a8f9ff Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 31 May 2017 10:49:31 -0700 Subject: [PATCH 0565/1011] [docker-ptf]: add hping3 into docker-ptf (#651) --- dockers/docker-ptf/Dockerfile.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 963282b27cb5..c546ad2fab9c 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -44,7 +44,8 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / less \ ipython \ git \ - iputils-ping + iputils-ping \ + hping3 ## Reinstall scapy by version from p4lang RUN git clone https://github.com/p4lang/scapy-vxlan.git && cd scapy-vxlan && python setup.py install From 8adc490fe642e0ea246e82fcd85b263c499dbff5 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 31 May 2017 10:57:31 -0700 Subject: [PATCH 0566/1011] [swss]: Exiting orchagent with unsupported HWSKU (#650) Echo error message to stderr and exit orchagent.sh starting script --- dockers/docker-orchagent/orchagent.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index 01959dd66ac4..e1d289ff92a3 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -30,6 +30,9 @@ elif [ "$HWSKU" == "INGRASYS-S8900-54XC" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "INGRASYS-S8900-64XC" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +else + echo "Unsupported HWSKU:$HWSKU. Exiting..." > /dev/stderr + exit 1 fi exec /usr/bin/orchagent ${ORCHAGENT_ARGS} From a5c0dff2096a03f489bca698486dae506c2e9fda Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 31 May 2017 10:57:42 -0700 Subject: [PATCH 0567/1011] [Broadcom]: Update SAI package to 2.1.5.1-8 (#649) Add config_checker/permitted_list Please check etc/bcm/ folder to check the README.msft file! --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 611f80d94583..40ecb64e53b7 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-7-20170519212441.39_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-7-20170519212441.39_amd64.deb?sv=2015-04-05&sr=b&sig=CVc9ldYoy6xdUY0mKg4Rqz4uNDgkTUrPOw1ULrxa8N4%3D&se=2031-01-26T21%3A38%3A42Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-8-20170531021119.40_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-8-20170531021119.40_amd64.deb?sv=2015-04-05&sr=b&sig=rFP9dZ9aXpe3CN5jBVNo6rkgK94%2BJFzMiXd1I2954lU%3D&se=2031-02-07T02%3A13%3A20Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-7-20170519212441.39_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-8-20170531021119.40_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-7-20170519212441.39_amd64.deb?sv=2015-04-05&sr=b&sig=xzCr9xLGF3IaNK8aQGVeU4jY7YkqNEdYAuq5IP2uQM4%3D&se=2031-01-26T21%3A38%3A16Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-8-20170531021119.40_amd64.deb?sv=2015-04-05&sr=b&sig=m5AGCyfLkcYvv8xmY6gPZFiXmygYLQUGfFrEiMO8Jtk%3D&se=2031-02-07T02%3A13%3A55Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From b0c99338a1321381b431fd7dcb633f2036f6f32f Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 31 May 2017 19:27:47 -0700 Subject: [PATCH 0568/1011] [Aboot]: Add '--numeric-owner' when untarring docker filesystem to preserve original owners (#653) --- files/Aboot/boot0.j2 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index eca3db743131..7c2d202012fc 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -67,8 +67,12 @@ extract_image() { if [ -n "$sonic_upgrade" ] || [ "$rootfs_type" != "vfat" ]; then mkdir -p "$image_path/{{ DOCKERFS_DIR }}" + if [ -n "$sonic_upgrade" ]; then + TAR_EXTRA_OPTION="--numeric-owner" + fi + ## extract docker archive - tar xf "$image_path/{{ FILESYSTEM_DOCKERFS }}" -C "$image_path/{{ DOCKERFS_DIR }}" + tar xf "$image_path/{{ FILESYSTEM_DOCKERFS }}" -C "$image_path/{{ DOCKERFS_DIR }}" $TAR_EXTRA_OPTION ## clean up docker archive rm -f "$image_path/{{ FILESYSTEM_DOCKERFS }}" From 94c550a3a86512c8778bda0c930ba4bcb63757fb Mon Sep 17 00:00:00 2001 From: Nadiya Date: Thu, 1 Jun 2017 20:54:15 +0300 Subject: [PATCH 0569/1011] [cavium]: Update cavium libsai (#655) Signed-off-by: Nadiya.Stetskovych --- platform/cavium/cavm-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/cavium/cavm-sai.mk b/platform/cavium/cavm-sai.mk index 1b88b1ae1978..82e67035b07b 100644 --- a/platform/cavium/cavm-sai.mk +++ b/platform/cavium/cavm-sai.mk @@ -1,6 +1,6 @@ # Cavium SAI -CAVM_SAI_GITHUB = https://github.com/XPliant/OpenXPS/raw/1b28b78400656114c3b1ce46381e0e8ab3ecd6da/SAI/cavm-sai/ +CAVM_SAI_GITHUB = https://github.com/XPliant/OpenXPS/raw/509de965cf8cc7fcea677b9b4b793612bce40510/SAI/cavm-sai/ CAVM_LIBSAI = libsai.deb CAVM_SAI = sai.deb From a4f5ae799a3e28e2ed3530ed8ac957e1df234c9e Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 1 Jun 2017 11:09:21 -0700 Subject: [PATCH 0570/1011] [src/swss]: update submodule (#657) * Update swss --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 83e46ba67e6c..682d7cb3ba5b 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 83e46ba67e6c77a9c58069acaa090a4cd95e5eb0 +Subproject commit 682d7cb3ba5b77520621bc5b3bb0ee84aa501404 From 86f660298a3700d7a09484aa2ee9ed1b39276f31 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 1 Jun 2017 16:18:53 -0700 Subject: [PATCH 0571/1011] [swss]: Update swss/sairedis/common submodules (#654) --- src/sonic-sairedis | 2 +- src/sonic-swss-common | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index d3a30baea06d..f02e667d03f7 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit d3a30baea06ddc26dfaba03c7002a3ca7f261194 +Subproject commit f02e667d03f7840132c9dd210254cff2b2e0ad1d diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 2f81979f0afc..9673a7efe9b9 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 2f81979f0afc2de9245ba37e68bed6be71f67108 +Subproject commit 9673a7efe9b99698e45ce7d48efd1ddd5b292033 From 984e6c4bc9c9b357625183477e5c2bd79eb98ca7 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 1 Jun 2017 17:51:12 -0700 Subject: [PATCH 0572/1011] [Broadcom]: Update SAI package (#659) Add Ingrasys config.bcm files --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 40ecb64e53b7..f08721d6140e 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-8-20170531021119.40_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-8-20170531021119.40_amd64.deb?sv=2015-04-05&sr=b&sig=rFP9dZ9aXpe3CN5jBVNo6rkgK94%2BJFzMiXd1I2954lU%3D&se=2031-02-07T02%3A13%3A20Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-9-20170531184746.41_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-9-20170531184746.41_amd64.deb?sv=2015-04-05&sr=b&sig=VD4QFYR4J5nJPdS6ZHyfKbdroTILV%2Fz6s%2F251NWpyaE%3D&se=2031-02-08T18%3A26%3A35Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-8-20170531021119.40_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-9-20170531184746.41_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-8-20170531021119.40_amd64.deb?sv=2015-04-05&sr=b&sig=m5AGCyfLkcYvv8xmY6gPZFiXmygYLQUGfFrEiMO8Jtk%3D&se=2031-02-07T02%3A13%3A55Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-9-20170531184746.41_amd64.deb?sv=2015-04-05&sr=b&sig=baUDbmm7PzF7Y7Y8Lz%2B759Xl1vhOkcnPBcqd6ZWWwSA%3D&se=2031-02-08T18%3A26%3A58Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From e0d22acc9e94f657f71825d9efd2ae01f270c2e2 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 1 Jun 2017 18:38:33 -0700 Subject: [PATCH 0573/1011] [DHCP Relay]: Wait for all interfaces to come up before starting DHCP relay (#660) --- dockers/docker-dhcp-relay/start.sh | 33 ++++++++++++++++++--- files/build_templates/dhcp_relay.service.j2 | 2 +- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/dockers/docker-dhcp-relay/start.sh b/dockers/docker-dhcp-relay/start.sh index 6daff96d0129..a847428ffba6 100755 --- a/dockers/docker-dhcp-relay/start.sh +++ b/dockers/docker-dhcp-relay/start.sh @@ -1,16 +1,41 @@ #!/usr/bin/env bash +function wait_until_iface_exists +{ + IFACE=$1 + + echo "Waiting for interface ${IFACE}..." + + # Wait for the interface to come up (i.e., 'ip link show' returns 0) + until ip link show $IFACE > /dev/null 2>&1; do + sleep 1 + done + + echo "Interface ${IFACE} is created" +} + +# Create isc-dhcp-relay config file sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/isc-dhcp-relay.j2 > /etc/default/isc-dhcp-relay rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd -VLAN_IFACE_NAME=`sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_vlan_interfaces[0]['attachto']"` +# Wait for all interfaces to come up before starting the DHCP relay + +FRONT_PANEL_IFACES=$(sonic-cfggen -m /etc/sonic/minigraph.xml --var-json "minigraph_interfaces" | grep "\"attachto\":" | sed 's/^\s*"attachto":\s"\(.*\)".*$/\1/') +for IFACE in $FRONT_PANEL_IFACES; do + wait_until_iface_exists $IFACE +done + +VLAN_IFACES=$(sonic-cfggen -m /etc/sonic/minigraph.xml --var-json "minigraph_vlan_interfaces" | grep "\"attachto\":" | sed 's/^\s*"attachto":\s"\(.*\)".*$/\1/') +for IFACE in $VLAN_IFACES; do + wait_until_iface_exists $IFACE +done -# Wait for the VLAN to come up (i.e., 'ip link show' returns 0) -until ip link show $VLAN_IFACE_NAME > /dev/null 2>&1; do - sleep 1 +PORTCHANNEL_IFACES=$(sonic-cfggen -m /etc/sonic/minigraph.xml --var-json "minigraph_portchannel_interfaces" | grep "\"attachto\":" | sed 's/^\s*"attachto":\s"\(.*\)".*$/\1/') +for IFACE in $PORTCHANNEL_IFACES; do + wait_until_iface_exists $IFACE done # Start the DHCP relay diff --git a/files/build_templates/dhcp_relay.service.j2 b/files/build_templates/dhcp_relay.service.j2 index c0e993eec065..c1499c8f8797 100644 --- a/files/build_templates/dhcp_relay.service.j2 +++ b/files/build_templates/dhcp_relay.service.j2 @@ -1,7 +1,7 @@ [Unit] Description=DHCP relay container Requires=docker.service -After=interfaces-config.service +After=swss.service [Service] User={{ sonicadmin_user }} From 7d33387e7c96bc2e21011f2def25f3968462cbc7 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 2 Jun 2017 01:31:53 -0700 Subject: [PATCH 0574/1011] [platform] Complete support for Arista-7050QX-32S (#661) * Bump sonic-platform-modules-arista submodule * Use sonic_sfputil plugin from the arista library * Fix undefined variable varlog_size * Prevent minigraph.xml to be removed from the flash * Update DCS-7050QX-32 sensors config --- .../plugins/sfputil.py | 22 +-------- .../x86_64-arista_7050_qx32/sensors.conf | 47 ++++++++++--------- .../plugins/sfputil.py | 25 +--------- .../plugins/sfputil.py | 23 +-------- files/Aboot/boot0.j2 | 11 +++-- files/initramfs-tools/arista-convertfs.j2 | 2 +- .../broadcom/sonic-platform-modules-arista | 2 +- 7 files changed, 41 insertions(+), 91 deletions(-) diff --git a/device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py b/device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py index 5d2d28b8f328..b85e0f53653e 100644 --- a/device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py +++ b/device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py @@ -1,27 +1,9 @@ #!/usr/bin/env python try: - from sonic_sfp.sfputilbase import sfputilbase + import arista.utils.sonic_sfputil as arista_sfputil except ImportError, e: raise ImportError (str(e) + "- required module not found") -class sfputil(sfputilbase): - """Platform specific sfputil class""" - - port_start = 0 - port_end = 31 - ports_in_block = 32 - - eeprom_offset = 10 - - port_to_eeprom_mapping = {} - - _qsfp_ports = range(0, ports_in_block + 1) - - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' - for x in range(0, self.port_end + 1): - self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) - sfputilbase.__init__(self, port_num) +sfputil = arista_sfputil.getSfpUtil() diff --git a/device/arista/x86_64-arista_7050_qx32/sensors.conf b/device/arista/x86_64-arista_7050_qx32/sensors.conf index 7745054a05ca..dde0d35df8cb 100644 --- a/device/arista/x86_64-arista_7050_qx32/sensors.conf +++ b/device/arista/x86_64-arista_7050_qx32/sensors.conf @@ -1,7 +1,7 @@ -# libsensors configuration file -# ---------------------------------------------- -# - +# libsensors configuration file for DCS-7050QX-32 +# ------------------------------------------------ +# + bus "i2c-2" "SCD SMBus master 0 bus 0" bus "i2c-3" "SCD SMBus master 0 bus 1" bus "i2c-5" "SCD SMBus master 0 bus 3" @@ -13,31 +13,33 @@ chip "k10temp-pci-00c3" chip "lm73-i2c-3-48" label temp1 "Rear Temp Sensor" - set temp1_max 65 + set temp1_max 65 #set temp1_max_alarm 75 # read-only -chip "lm86-i2c-2-4c" +chip "max6658-i2c-2-4c" label temp1 "Board Temp Sensor" - set temp1_max 65 + set temp1_max 65 set temp1_crit 75 label temp2 "Front-panel Temp Sensor" set temp2_max 65 set temp2_crit 75 - -chip "pmbus-i2c-3-4e" - label temp1 "Power Controller Sensor 1" - set temp1_max 60 - set temp1_crit 70 - - label temp2 "Power Controller Sensor 2" - set temp2_max 60 - set temp2_crit 70 - ignore curr1 - -chip "pmbus-i2c-5-58" +# disabled because of some eeprom corruption risks +#chip "pmbus-i2c-3-4e" +# label temp1 "Power Controller Sensor 1" +# set temp1_max 60 +# set temp1_crit 70 + +# label temp2 "Power Controller Sensor 2" +# set temp2_max 60 +# set temp2_crit 70 + +# ignore curr1 + +chip "dps460-i2c-5-58" label temp1 "Power Supply 1 Sensor 1" + # maximum and critical thresholds are not supported for this psu set temp1_max 60 set temp1_crit 70 @@ -56,16 +58,17 @@ chip "pmbus-i2c-5-58" set curr1_crit 5.30 set curr2_max 36 set curr2_crit 37 - -chip "pmbus-i2c-6-58" + +chip "dps460-i2c-6-58" label temp1 "Power Supply 2 Sensor 1" + # maximum and critical thresholds are not supported for this psu set temp1_max 60 set temp1_crit 70 label temp2 "Power Supply 2 Sensor 2" set temp2_max 60 set temp2_crit 70 - + ignore temp3 set in1_max 250 diff --git a/device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py b/device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py index 18472c44c55b..b85e0f53653e 100644 --- a/device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py +++ b/device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py @@ -1,30 +1,9 @@ #!/usr/bin/env python try: - from sonic_sfp.sfputilbase import sfputilbase + import arista.utils.sonic_sfputil as arista_sfputil except ImportError, e: raise ImportError (str(e) + "- required module not found") -class sfputil(sfputilbase): - """Platform specific sfputil class""" - - port_start = 0 - port_end = 31 - ports_in_block = 32 - - eeprom_offset = 10 - - port_to_eeprom_mapping = {} - - _qsfp_ports = range(0, ports_in_block + 1) - - # also has sfp[1-4] ports handled by a mux to choose against qsfp5 - # i2c-40 to i2c-43 - - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' - for x in range(0, self.port_end + 1): - self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) - sfputilbase.__init__(self, port_num) +sfputil = arista_sfputil.getSfpUtil() diff --git a/device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py b/device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py index 0f7f0d2cac85..b85e0f53653e 100644 --- a/device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py +++ b/device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py @@ -1,28 +1,9 @@ #!/usr/bin/env python try: - from sonic_sfp.sfputilbase import sfputilbase + import arista.utils.sonic_sfputil as arista_sfputil except ImportError, e: raise ImportError (str(e) + "- required module not found") -class sfputil(sfputilbase): - """Platform specific sfputil class""" - - port_start = 0 - port_end = 33 - ports_in_block = 34 - - eeprom_offset = 18 - - port_to_eeprom_mapping = {} - - _qsfp_ports = range(0, 32 + 1) - _sfp_ports = range(33, 34 + 1) - - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' - for x in range(0, self.port_end + 1): - self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) - sfputilbase.__init__(self, port_num) +sfputil = arista_sfputil.getSfpUtil() diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 7c2d202012fc..48c5c5010213 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -44,7 +44,10 @@ parse_environment_config() { clean_flash() { ## Remove all the other unnecssary files except swi file, boot-config for f in $(ls -A $target_path); do - if [ $f != "${swipath##*/}" ] && [ $f != "boot-config" ]; then + if [ $f != "${swipath##*/}" ] && + [ $f != "boot-config" ] && + [ $f != "minigraph.xml" ] + then rm -rf "$target_path/$f" fi done @@ -104,6 +107,10 @@ EOF platform_specific() { local platform="$(grep -Eo 'platform=[^ ]+' /etc/cmdline | cut -f2 -d=)" local sid="$(grep -Eo 'sid=[^ ]+' /etc/cmdline | cut -f2 -d=)" + + # set varlog size to 100MB + echo "varlog_size=100" >>/tmp/append + # This is temporary as the platform= and sid= parameters don't provide enough # information to identify the SKU # An initramfs hook or a later processing done by the initscripts will be @@ -111,8 +118,6 @@ platform_specific() { if [ "$platform" = "raven" ]; then aboot_machine=arista_7050_qx32 echo "modprobe.blacklist=radeon" >>/tmp/append - # set varlog size to 100MB - echo "varlog_size=100" >>/tmp/append fi if [ "$platform" = "crow" ]; then aboot_machine=arista_7050_qx32s diff --git a/files/initramfs-tools/arista-convertfs.j2 b/files/initramfs-tools/arista-convertfs.j2 index 7f873e7771f3..a15233615f98 100644 --- a/files/initramfs-tools/arista-convertfs.j2 +++ b/files/initramfs-tools/arista-convertfs.j2 @@ -84,7 +84,7 @@ run_cmd() { create_varlog_file() { local err_msg="Error: create var-log ext4 file" - local cmd="[ -n $varlog_size ] && mkdir -p $root_mnt/disk-img && dd if=/dev/zero of=$root_mnt/disk-img/var-log.ext4 count=$((2048*$varlog_size)) && mke2fs -t ext4 -q -F $root_mnt/disk-img/var-log.ext4" + local cmd="[ -n "$varlog_size" ] && mkdir -p $root_mnt/disk-img && dd if=/dev/zero of=$root_mnt/disk-img/var-log.ext4 count=$((2048*$varlog_size)) && mke2fs -t ext4 -q -F $root_mnt/disk-img/var-log.ext4" run_cmd "$cmd" "$err_msg" } diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 43ed7b2330f2..393e5e1f19fd 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 43ed7b2330f2c7928f8098ca6c78bd9533b918c5 +Subproject commit 393e5e1f19fd33853bb375d70a10fa7cf4613e4a From cd0159ec62154e6ad4218f08b0e5863be89419e2 Mon Sep 17 00:00:00 2001 From: Nadiya Date: Fri, 2 Jun 2017 19:59:50 +0300 Subject: [PATCH 0575/1011] [platform] Control only 2 thermals (4A & 4B) (#663) Signed-off-by: Nadiya.Stetskovych --- device/accton/x86_64-accton_as7512_32x-r0/fancontrol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/accton/x86_64-accton_as7512_32x-r0/fancontrol b/device/accton/x86_64-accton_as7512_32x-r0/fancontrol index 899d2db79228..c80163771e86 100644 --- a/device/accton/x86_64-accton_as7512_32x-r0/fancontrol +++ b/device/accton/x86_64-accton_as7512_32x-r0/fancontrol @@ -1,5 +1,5 @@ INTERVAL=10 -FCTEMPS=/sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/3-0048/hwmon/hwmon[[:print:]]*/temp1_input /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/3-0049/hwmon/hwmon[[:print:]]*/temp1_input /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/3-004a/hwmon/hwmon[[:print:]]*/temp1_input +FCTEMPS=/sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/3-004b/hwmon/hwmon[[:print:]]*/temp1_input /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/3-004a/hwmon/hwmon[[:print:]]*/temp1_input FCFANS=/sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan1_front_speed_rpm /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan2_front_speed_rpm /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan3_front_speed_rpm /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan4_front_speed_rpm /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan5_front_speed_rpm /sys/bus/i2c/devices/2-0066/fan_pwm=/sys/bus/i2c/devices/2-0066/fan6_front_speed_rpm MINTEMP=/sys/bus/i2c/devices/2-0066/fan_pwm=20 MAXTEMP=/sys/bus/i2c/devices/2-0066/fan_pwm=60 From 5f8e495cb0ba20e89809e7ef511cea3ce3dfa388 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 2 Jun 2017 23:33:37 -0700 Subject: [PATCH 0576/1011] [Broadcom]: Update SAI package (#665) Increase the maximum logical ports supported to prevent TH initialization crash --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index f08721d6140e..a75952e2f72c 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-9-20170531184746.41_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-9-20170531184746.41_amd64.deb?sv=2015-04-05&sr=b&sig=VD4QFYR4J5nJPdS6ZHyfKbdroTILV%2Fz6s%2F251NWpyaE%3D&se=2031-02-08T18%3A26%3A35Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-10-20170602191744.42_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-10-20170602191744.42_amd64.deb?sv=2015-04-05&sr=b&sig=aSmyd3pgiI2LkssoqGY6PDDhFKvWS2RxFB%2Bcpe%2FRiCg%3D&se=2031-02-09T19%3A29%3A48Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-9-20170531184746.41_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-10-20170602191744.42_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-9-20170531184746.41_amd64.deb?sv=2015-04-05&sr=b&sig=baUDbmm7PzF7Y7Y8Lz%2B759Xl1vhOkcnPBcqd6ZWWwSA%3D&se=2031-02-08T18%3A26%3A58Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-10-20170602191744.42_amd64.deb?sv=2015-04-05&sr=b&sig=NSJ96np%2FHmXJdMN3Dnzp8UHBlo4OUiG00ETejp7wARI%3D&se=2031-02-09T19%3A30%3A14Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From 8944ee64f5ae3d20799e49f7dd02fec5312ebb99 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Sat, 3 Jun 2017 12:44:34 -0700 Subject: [PATCH 0577/1011] [Facebook]: Add Facebook Wedge 100 support (#666) - Add a sample minigraph and Facebook-W100-C32 HWSKU - update orchagent.sh script --- .../Facebook-W100-C32/port_config.ini | 33 ++++ .../Facebook-W100-C32/sai.profile | 1 + .../x86_64-facebook_wedge100-r0/minigraph.xml | 151 ++++++++++++++++++ dockers/docker-orchagent/orchagent.sh | 2 + 4 files changed, 187 insertions(+) create mode 100644 device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/port_config.ini create mode 100644 device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/sai.profile create mode 100644 device/facebook/x86_64-facebook_wedge100-r0/minigraph.xml diff --git a/device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/port_config.ini b/device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/port_config.ini new file mode 100644 index 000000000000..973e47589aaa --- /dev/null +++ b/device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 117,118,119,120 +Ethernet4 113,114,115,116 +Ethernet8 125,126,127,128 +Ethernet12 121,122,123,124 +Ethernet16 5,6,7,8 +Ethernet20 1,2,3,4 +Ethernet24 13,14,15,16 +Ethernet28 9,10,11,12 +Ethernet32 21,22,23,24 +Ethernet36 17,18,19,20 +Ethernet40 29,30,31,32 +Ethernet44 25,26,27,28 +Ethernet48 37,38,39,40 +Ethernet52 33,34,35,36 +Ethernet56 45,46,47,48 +Ethernet60 41,42,43,44 +Ethernet64 53,54,55,56 +Ethernet68 49,50,51,52 +Ethernet72 61,62,63,64 +Ethernet76 57,58,59,60 +Ethernet80 69,70,71,72 +Ethernet84 65,66,67,68 +Ethernet88 77,78,79,80 +Ethernet92 73,74,75,76 +Ethernet96 85,86,87,88 +Ethernet100 81,82,83,84 +Ethernet104 93,94,95,96 +Ethernet108 89,90,91,92 +Ethernet112 101,102,103,104 +Ethernet116 97,98,99,100 +Ethernet120 109,110,111,112 +Ethernet124 105,106,107,108 diff --git a/device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/sai.profile b/device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/sai.profile new file mode 100644 index 000000000000..5c93f84deb0b --- /dev/null +++ b/device/facebook/x86_64-facebook_wedge100-r0/Facebook-W100-C32/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-wedge100-32x100G.config.bcm diff --git a/device/facebook/x86_64-facebook_wedge100-r0/minigraph.xml b/device/facebook/x86_64-facebook_wedge100-r0/minigraph.xml new file mode 100644 index 000000000000..2e9c121e0b36 --- /dev/null +++ b/device/facebook/x86_64-facebook_wedge100-r0/minigraph.xml @@ -0,0 +1,151 @@ + + + + + + OCPSCH0104001MS + 10.10.1.26 + SONiC-Facebook-Wedge100 + 10.10.1.25 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.26 + SONiC-Facebook-Wedge100 + 10.10.2.25 + 1 + 10 + 3 + + + + + 64536 + SONiC-Facebook-Wedge100 + + +
10.10.1.26
+ + +
+ +
10.10.2.26
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.9/32 + + 100.0.0.9/32 + + + + + + + + SONiC-Facebook-Wedge100 + + + + + + Ethernet0 + 10.10.1.25/30 + + + + Ethernet4 + 10.10.2.25/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet24 + SONiC-Facebook-Wedge100 + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104002MS + Ethernet24 + SONiC-Facebook-Wedge100 + Ethernet4 + + + + + SONiC-Facebook-Wedge100 + Facebook-W100-C32 + + + + + + + SONiC-Facebook-Wedge100 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + SONiC-Facebook-Wedge100 + Facebook-W100-C32 +
diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index e1d289ff92a3..5c2cd06748cb 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -30,6 +30,8 @@ elif [ "$HWSKU" == "INGRASYS-S8900-54XC" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$HWSKU" == "INGRASYS-S8900-64XC" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$HWSKU" == "Facebook-W100-C32" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" else echo "Unsupported HWSKU:$HWSKU. Exiting..." > /dev/stderr exit 1 From c3aa513dae62ccc9b101170777a48a84ab371d31 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Sat, 3 Jun 2017 13:49:33 -0700 Subject: [PATCH 0578/1011] [swss]: Update orchagent.sh script to use asic_type to add arguments (#667) - Right now Broadcom and Cavium platforms need to set MAC address when starting orchagent daemon. --- dockers/docker-orchagent/orchagent.sh | 30 ++++----------------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index 5c2cd06748cb..9cbb22988ac6 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` +ASIC=`sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type` MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` @@ -8,33 +8,11 @@ MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` mkdir -p /var/log/swss ORCHAGENT_ARGS="-d /var/log/swss " -if [ "$HWSKU" == "Force10-S6000" ]; then +# Add platform specific arguments if necessary +if [ "$ASIC" == "broadcom" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "Force10-S6000-Q32" ]; then +elif [ "$ASIC" == "cavium" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "Force10-S6100" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "Force10-Z9100" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "Arista-7050-QX32" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "Arista-7050-QX32S" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "Arista-7060-CX32S" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "AS7512" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "INGRASYS-S9100-C32" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "INGRASYS-S8900-54XC" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "INGRASYS-S8900-64XC" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$HWSKU" == "Facebook-W100-C32" ]; then - ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -else - echo "Unsupported HWSKU:$HWSKU. Exiting..." > /dev/stderr - exit 1 fi exec /usr/bin/orchagent ${ORCHAGENT_ARGS} From d8c55840d0c07e6d3ab43b61c0bf0d70d81d8401 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Sun, 4 Jun 2017 01:35:47 -0700 Subject: [PATCH 0579/1011] [swss]: Update swss/common and add --batch_size 8192 option to orchagent (#668) --- dockers/docker-orchagent/orchagent.sh | 3 +++ src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index 9cbb22988ac6..01b980b99c1a 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -8,6 +8,9 @@ MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` mkdir -p /var/log/swss ORCHAGENT_ARGS="-d /var/log/swss " +# Set orchagent pop batch size to 8192 +ORCHAGENT_ARGS+="-b 8192 " + # Add platform specific arguments if necessary if [ "$ASIC" == "broadcom" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" diff --git a/src/sonic-swss b/src/sonic-swss index 682d7cb3ba5b..b893b4f70b79 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 682d7cb3ba5b77520621bc5b3bb0ee84aa501404 +Subproject commit b893b4f70b79f5a87674e3a67a64accff0dd9437 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 9673a7efe9b9..ececc0a99ce1 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 9673a7efe9b99698e45ce7d48efd1ddd5b292033 +Subproject commit ececc0a99ce1c188007b5b59de1bb11a06dd006d From aabe9677f2ed707b475618c1f7cda8be10a6f84e Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Tue, 6 Jun 2017 01:38:47 -0400 Subject: [PATCH 0580/1011] [sonic-utilities]: update submodule (#672) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index de5c31874bb8..c1b48a6a28f9 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit de5c31874bb89c62d50efec6d8541e85fe678548 +Subproject commit c1b48a6a28f9897ebfebf9989b5cb4a472cf1967 From b55ab4614bd8442cf5ea3387094862771aba5945 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 5 Jun 2017 22:41:20 -0700 Subject: [PATCH 0581/1011] [Broadcom]: Update SAI package to support Arista-7050-QX32S (#671) --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index a75952e2f72c..74baaa712f10 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-10-20170602191744.42_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-10-20170602191744.42_amd64.deb?sv=2015-04-05&sr=b&sig=aSmyd3pgiI2LkssoqGY6PDDhFKvWS2RxFB%2Bcpe%2FRiCg%3D&se=2031-02-09T19%3A29%3A48Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-11-20170605231900.43_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-11-20170605231900.43_amd64.deb?sv=2015-04-05&sr=b&sig=NNBDS1OSXn2w4dNSbqBbJnqXTrqH7YAkKIa%2Fi9yaOJs%3D&se=2031-02-12T23%3A22%3A01Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-10-20170602191744.42_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-11-20170605231900.43_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-10-20170602191744.42_amd64.deb?sv=2015-04-05&sr=b&sig=NSJ96np%2FHmXJdMN3Dnzp8UHBlo4OUiG00ETejp7wARI%3D&se=2031-02-09T19%3A30%3A14Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-11-20170605231900.43_amd64.deb?sv=2015-04-05&sr=b&sig=jxozueiuQdOuJdEfC9%2BWSfFXSL68FQVwL%2FM5Obfj3gs%3D&se=2031-02-12T23%3A21%3A35Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From fedfb82ebf3c44d1393232195aececee2294ed5c Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 5 Jun 2017 22:41:39 -0700 Subject: [PATCH 0582/1011] [Arista]: Update port_config.ini file for Arista-7050-QX32S (#674) --- .../Arista-7050-QX32S/port_config.ini | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/port_config.ini b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/port_config.ini index b56d958499d4..5f29d189f352 100644 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/port_config.ini +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/port_config.ini @@ -1,33 +1,33 @@ # name lanes alias -Ethernet0 9,10,11,12 Ethernet5/1 -Ethernet4 13,14,15,16 Ethernet6/1 -Ethernet8 17,18,19,20 Ethernet7/1 -Ethernet12 21,22,23,24 Ethernet8/1 -Ethernet16 29,30,31,32 Ethernet9/1 -Ethernet20 25,26,27,28 Ethernet10/1 -Ethernet24 33,34,35,36 Ethernet11/1 -Ethernet28 37,38,39,40 Ethernet12/1 -Ethernet32 45,46,47,48 Ethernet13/1 -Ethernet36 41,42,43,44 Ethernet14/1 -Ethernet40 49,50,51,52 Ethernet15/1 -Ethernet44 53,54,55,56 Ethernet16/1 -Ethernet48 69,70,71,72 Ethernet17/1 -Ethernet52 65,66,67,68 Ethernet18/1 -Ethernet56 73,74,75,76 Ethernet19/1 -Ethernet60 77,78,79,80 Ethernet20/1 -Ethernet64 93,94,95,96 Ethernet21/1 -Ethernet68 89,90,91,92 Ethernet22/1 -Ethernet72 97,98,99,100 Ethernet23/1 -Ethernet76 101,102,103,104 Ethernet24/1 -Ethernet80 109,110,111,112 Ethernet25/1 -Ethernet84 105,106,107,108 Ethernet26/1 -Ethernet88 121,122,123,124 Ethernet27/1 -Ethernet92 125,126,127,128 Ethernet28/1 -Ethernet96 61,62,63,64 Ethernet29 -Ethernet100 57,58,59,60 Ethernet30 -Ethernet104 81,82,83,84 Ethernet31 -Ethernet108 85,86,87,88 Ethernet32 -Ethernet112 117,118,119,120 Ethernet33 -Ethernet116 113,114,115,116 Ethernet34 -Ethernet120 1,2,3,4 Ethernet35 -Ethernet124 5,6,7,8 Ethernet36 +Ethernet0 9,10,11,12 Ethernet1/1 +Ethernet4 13,14,15,16 Ethernet2/1 +Ethernet8 17,18,19,20 Ethernet3/1 +Ethernet12 21,22,23,24 Ethernet4/1 +Ethernet16 29,30,31,32 Ethernet5/1 +Ethernet20 25,26,27,28 Ethernet6/1 +Ethernet24 33,34,35,36 Ethernet7/1 +Ethernet28 37,38,39,40 Ethernet8/1 +Ethernet32 45,46,47,48 Ethernet9/1 +Ethernet36 41,42,43,44 Ethernet10/1 +Ethernet40 49,50,51,52 Ethernet11/1 +Ethernet44 53,54,55,56 Ethernet12/1 +Ethernet48 69,70,71,72 Ethernet13/1 +Ethernet52 65,66,67,68 Ethernet14/1 +Ethernet56 73,74,75,76 Ethernet15/1 +Ethernet60 77,78,79,80 Ethernet16/1 +Ethernet64 93,94,95,96 Ethernet17/1 +Ethernet68 89,90,91,92 Ethernet18/1 +Ethernet72 97,98,99,100 Ethernet19/1 +Ethernet76 101,102,103,104 Ethernet20/1 +Ethernet80 109,110,111,112 Ethernet21/1 +Ethernet84 105,106,107,108 Ethernet22/1 +Ethernet88 121,122,123,124 Ethernet23/1 +Ethernet92 125,126,127,128 Ethernet24/1 +Ethernet96 61,62,63,64 Ethernet25 +Ethernet100 57,58,59,60 Ethernet26 +Ethernet104 81,82,83,84 Ethernet27 +Ethernet108 85,86,87,88 Ethernet28 +Ethernet112 117,118,119,120 Ethernet29 +Ethernet116 113,114,115,116 Ethernet30 +Ethernet120 1,2,3,4 Ethernet31 +Ethernet124 5,6,7,8 Ethernet32 From b968cf73a199f485dccacfd5353ec55dfd36c0c0 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 6 Jun 2017 10:41:06 -0700 Subject: [PATCH 0583/1011] [aboot]: use pipe to extract docker archive to save disk space (#677) --- files/Aboot/boot0.j2 | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 48c5c5010213..f278f1070fb1 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -57,11 +57,8 @@ extract_image() { mkdir -p "$image_path" - ## Unzip the image - unzip -oq "$swipath" -x boot0 -d "$image_path" - - ## Remove installer swi as it has lots of redundunt contents - rm -f $swipath + ## Unzip the image except boot0 and dockerfs archive + unzip -oq "$swipath" -x boot0 {{ FILESYSTEM_DOCKERFS }} -d "$image_path" ## detect rootfs type rootfs_type=`grep " $target_path " /proc/mounts | cut -d' ' -f3` @@ -75,17 +72,19 @@ extract_image() { fi ## extract docker archive - tar xf "$image_path/{{ FILESYSTEM_DOCKERFS }}" -C "$image_path/{{ DOCKERFS_DIR }}" $TAR_EXTRA_OPTION - - ## clean up docker archive - rm -f "$image_path/{{ FILESYSTEM_DOCKERFS }}" + unzip -oqp "$swipath" {{ FILESYSTEM_DOCKERFS }} | tar xzf - -C "$image_path/{{ DOCKERFS_DIR }}" $TAR_EXTRA_OPTION else + ## save dockerfs archive in the image directory + unzip -oq "$swipath" {{ FILESYSTEM_DOCKERFS }} -d "$image_path" echo "$target_path is $rootfs_type, extract {{ FILESYSTEM_DOCKERFS }} in later stage" fi ## use new reduced-size boot swi echo "SWI=flash:image-%%IMAGE_VERSION%%/{{ ABOOT_BOOT_IMAGE }}" > "$target_path/boot-config" + ## Remove installer swi as it has lots of redundunt contents + rm -f "$swipath" + ## sync disk operations sync } From 820e7aafd031db7458a92f6cbdabb0ae06a4b891 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 7 Jun 2017 02:13:38 +0300 Subject: [PATCH 0584/1011] [docker-teamd]: Explicitly set LAG hwaddr (#664) * [docker-teamd]: Explicitly set LAG hwaddr Team device is initially created without any members and has a random HW address, which is later changed to port's address. This configuration sets team device's address explicitly to base MAC to avoid reassignment. Signed-off-by: marian-pritsak * Update teamd config tests with hwaddr Signed-off-by: marian-pritsak * Align HW addr byte for Centec and Mellanox Signed-off-by: marian-pritsak * Change HW addr to unicast in config tests Signed-off-by: marian-pritsak --- dockers/docker-teamd/start.sh | 12 +++++++++++- dockers/docker-teamd/teamd.j2 | 1 + .../tests/sample_output/PortChannel01.conf | 1 + .../tests/sample_output/PortChannel02.conf | 1 + .../tests/sample_output/PortChannel03.conf | 1 + .../tests/sample_output/PortChannel04.conf | 1 + src/sonic-config-engine/tests/test_j2files.py | 2 +- 7 files changed, 17 insertions(+), 2 deletions(-) diff --git a/dockers/docker-teamd/start.sh b/dockers/docker-teamd/start.sh index 77a3ff43be85..0f6a8c9f9ceb 100755 --- a/dockers/docker-teamd/start.sh +++ b/dockers/docker-teamd/start.sh @@ -5,8 +5,18 @@ TEAMD_CONF_PATH=/etc/teamd rm -rf $TEAMD_CONF_PATH mkdir -p $TEAMD_CONF_PATH +SONIC_ASIC_TYPE=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type) +MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') + +# Align last byte +if [ "$SONIC_ASIC_TYPE" == "mellanox" -o "$SONIC_ASIC_TYPE" == "centec" ]; then + last_byte=$(python -c "print '$MAC_ADDRESS'[-2:]") + aligned_last_byte=$(python -c "print format(int(int('$last_byte', 16) & 0b11000000), '02x')") # put mask and take away the 0x prefix + MAC_ADDRESS=$(python -c "print '$MAC_ADDRESS'[:-2] + '$aligned_last_byte'") # put aligned byte into the end of MAC +fi + for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_portchannels.keys() | join(' ')"`; do - sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'"}' -t /usr/share/sonic/templates/teamd.j2 > $TEAMD_CONF_PATH/$pc.conf + sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'","hwaddr":"'$MAC_ADDRESS'"}' -t /usr/share/sonic/templates/teamd.j2 > $TEAMD_CONF_PATH/$pc.conf done mkdir -p /var/sonic diff --git a/dockers/docker-teamd/teamd.j2 b/dockers/docker-teamd/teamd.j2 index e2ef239c8266..08a3415f5188 100644 --- a/dockers/docker-teamd/teamd.j2 +++ b/dockers/docker-teamd/teamd.j2 @@ -1,5 +1,6 @@ { "device": "{{ pc }}", + "hwaddr": "{{ hwaddr }}", "runner": { "name": "lacp", "active": true, diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel01.conf b/src/sonic-config-engine/tests/sample_output/PortChannel01.conf index 95369ce06a2e..d69c0d6697b2 100644 --- a/src/sonic-config-engine/tests/sample_output/PortChannel01.conf +++ b/src/sonic-config-engine/tests/sample_output/PortChannel01.conf @@ -1,5 +1,6 @@ { "device": "PortChannel01", + "hwaddr": "e4:1d:2d:a5:f3:ad", "runner": { "name": "lacp", "active": true, diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel02.conf b/src/sonic-config-engine/tests/sample_output/PortChannel02.conf index 960ca2d0db65..e9b2ff4f1ad9 100644 --- a/src/sonic-config-engine/tests/sample_output/PortChannel02.conf +++ b/src/sonic-config-engine/tests/sample_output/PortChannel02.conf @@ -1,5 +1,6 @@ { "device": "PortChannel02", + "hwaddr": "e4:1d:2d:a5:f3:ad", "runner": { "name": "lacp", "active": true, diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel03.conf b/src/sonic-config-engine/tests/sample_output/PortChannel03.conf index d26ad7795e54..a73617abade0 100644 --- a/src/sonic-config-engine/tests/sample_output/PortChannel03.conf +++ b/src/sonic-config-engine/tests/sample_output/PortChannel03.conf @@ -1,5 +1,6 @@ { "device": "PortChannel03", + "hwaddr": "e4:1d:2d:a5:f3:ad", "runner": { "name": "lacp", "active": true, diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel04.conf b/src/sonic-config-engine/tests/sample_output/PortChannel04.conf index 76c97b3f7c03..073b8057d461 100644 --- a/src/sonic-config-engine/tests/sample_output/PortChannel04.conf +++ b/src/sonic-config-engine/tests/sample_output/PortChannel04.conf @@ -1,5 +1,6 @@ { "device": "PortChannel04", + "hwaddr": "e4:1d:2d:a5:f3:ad", "runner": { "name": "lacp", "active": true, diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 6ea49efc75f2..2a8c7a35688f 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -37,7 +37,7 @@ def test_teamd(self): def test_render_teamd(self, pc): teamd_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-teamd', 'teamd.j2') sample_output_file = os.path.join(self.test_dir, 'sample_output',pc + '.conf') - argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -a \'{\"pc\":\"' + pc + '\"}\' -t ' + teamd_file + ' > ' + self.output_file + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -a \'{\"pc\":\"' + pc + '\",\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + teamd_file + ' > ' + self.output_file self.run_script(argument) assert filecmp.cmp(sample_output_file, self.output_file) From e74196cd75ed1c8bb2556c2ee0199d03bad98dc2 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 6 Jun 2017 17:12:26 -0700 Subject: [PATCH 0585/1011] [baseos] Avoid disconnecting mgmt when re-cfg interfaces (#553) * [baseos] Avoid disconnecting mgmt when recfg interfaces * Kill dhclient after interfaces-config --- files/image_config/interfaces/interfaces-config.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index 3e2f852c1263..f966e82e8030 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -1,5 +1,12 @@ #!/bin/bash +ifdown -a -X eth0 sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/interfaces.j2 >/etc/network/interfaces -service networking restart -ifdown lo && ifup lo +ifup -a -X eth0 + +NEW_MGMT_IP=`sonic-cfggen -m /etc/sonic/minigraph.xml -v 'minigraph_mgmt_interface["addr"]'` +NEW_MGMT_MASK=`sonic-cfggen -m /etc/sonic/minigraph.xml -v 'minigraph_mgmt_interface["mask"]'` + +ifconfig eth0 $NEW_MGMT_IP netmask $NEW_MGMT_MASK +[ -f /var/run/dhclient.eth0.pid ] && kill `cat /var/run/dhclient.eth0.pid` && rm -f /var/run/dhclient.eth0.pid + From ec273c88920e66dc2daa1bfb2703774b3861255a Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 6 Jun 2017 22:58:58 -0700 Subject: [PATCH 0586/1011] Disable snmpd native ipCidrRouteTable implementation (#675) The SNMP subagent implements ipCidrRouteTable. If there is no nexthops for default route, ie. switch isolated, the SNMP subagent will response 'no instance'. Then snmpd will response kernel routes, which include non-front panel interfaces. To remove snmpd native implementation, we only expose SNMP subagent's implementation. --- dockers/docker-snmp-sv2/supervisord.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-snmp-sv2/supervisord.conf b/dockers/docker-snmp-sv2/supervisord.conf index 624b61f96225..6c3685b32cdb 100644 --- a/dockers/docker-snmp-sv2/supervisord.conf +++ b/dockers/docker-snmp-sv2/supervisord.conf @@ -20,7 +20,7 @@ stdout_logfile=syslog stderr_logfile=syslog [program:snmpd] -command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable,inetCidrRouteTable,ip -p /run/snmpd.pid +command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable,inetCidrRouteTable,ipCidrRouteTable,ip -p /run/snmpd.pid priority=3 autostart=false autorestart=false From 67acc0171b6022631ca53bfc2ece2fb8b0ec6b02 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 7 Jun 2017 00:41:25 -0700 Subject: [PATCH 0587/1011] [platform]: update platform modules for dell s6100 and z9100 (#679) --- platform/broadcom/sonic-platform-modules-dell | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-dell b/platform/broadcom/sonic-platform-modules-dell index af6556c488e7..6cff8248fa8c 160000 --- a/platform/broadcom/sonic-platform-modules-dell +++ b/platform/broadcom/sonic-platform-modules-dell @@ -1 +1 @@ -Subproject commit af6556c488e7fbe0f0c074fb6cc32d27bf40cc83 +Subproject commit 6cff8248fa8c772a077bf3dcb5c86a376357f261 From 50aba596a919fae7b0deb058d3ee093c9bfcade6 Mon Sep 17 00:00:00 2001 From: wadelnn Date: Thu, 8 Jun 2017 01:29:19 +0800 Subject: [PATCH 0588/1011] [platform]: Update submodule platform/broadcom/sonic-platform-modules-ingrasys (#670) * Update submodule platform/broadcom/sonic-platform-modules-ingrasys * Fixed FAN Status Setup Error. * Add Drivers deinitialization feature. * Allow for updating drivers on a running system. * Let fans returned to full speed when driver uninstalled. * Change S8900-64XC fancontrol config * Delete S9100 syncd.conf Signed-off-by: Wade He * Update submodule * Fixed build error in fsroot on different kernel versions between host and rootfs. * Fixed Read HW Revision in CPLD. * rmmod check to avoid error. Signed-off-by: Wade He --- .../x86_64-ingrasys_s8900_64xc-r0/fancontrol | 16 ++++++++-------- .../ingrasys/x86_64-ingrasys_s9100-r0/syncd.conf | 1 - .../broadcom/sonic-platform-modules-ingrasys | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) delete mode 100644 device/ingrasys/x86_64-ingrasys_s9100-r0/syncd.conf diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol index 938440304540..d5d5fa82b2d2 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol @@ -1,11 +1,11 @@ # Configuration file generated by pwmconfig, changes will be lost INTERVAL=10 -DEVPATH=hwmon1=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f -DEVNAME=hwmon1=w83795adg -FCTEMPS=hwmon1/device/pwm1=hwmon1/device/temp2_input hwmon1/device/pwm2=hwmon1/device/temp2_input -FCFANS=hwmon1/device/pwm2=hwmon1/device/fan10_input hwmon1/device/pwm2=hwmon1/device/fan9_input hwmon1/device/pwm2=hwmon1/device/fan8_input hwmon1/device/pwm2=hwmon1/device/fan7_input hwmon1/device/pwm2=hwmon1/device/fan6_input hwmon1/device/pwm2=hwmon1/device/fan5_input hwmon1/device/pwm1=hwmon1/device/fan4_input hwmon1/device/pwm1=hwmon1/device/fan3_input hwmon1/device/pwm1=hwmon1/device/fan2_input hwmon1/device/pwm1=hwmon1/device/fan1_input -MINTEMP=hwmon1/device/pwm1=20 hwmon1/device/pwm2=20 -MAXTEMP=hwmon1/device/pwm1=60 hwmon1/device/pwm2=60 -MINSTART=hwmon1/device/pwm1=150 hwmon1/device/pwm2=150 -MINSTOP=hwmon1/device/pwm1=0 hwmon1/device/pwm2=0 +DEVPATH=hwmon2=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f +DEVNAME=hwmon2=w83795adg +FCTEMPS=hwmon2/device/pwm1=hwmon2/device/temp2_input hwmon2/device/pwm2=hwmon2/device/temp2_input +FCFANS=hwmon2/device/pwm2=hwmon2/device/fan10_input hwmon2/device/pwm2=hwmon2/device/fan9_input hwmon2/device/pwm2=hwmon2/device/fan8_input hwmon2/device/pwm2=hwmon2/device/fan7_input hwmon2/device/pwm2=hwmon2/device/fan6_input hwmon2/device/pwm2=hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input hwmon2/device/pwm1=hwmon2/device/fan3_input hwmon2/device/pwm1=hwmon2/device/fan2_input hwmon2/device/pwm1=hwmon2/device/fan1_input +MINTEMP=hwmon2/device/pwm1=20 hwmon2/device/pwm2=20 +MAXTEMP=hwmon2/device/pwm1=60 hwmon2/device/pwm2=60 +MINSTART=hwmon2/device/pwm1=150 hwmon2/device/pwm2=150 +MINSTOP=hwmon2/device/pwm1=0 hwmon2/device/pwm2=0 diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/syncd.conf b/device/ingrasys/x86_64-ingrasys_s9100-r0/syncd.conf deleted file mode 100644 index bd5ba3938842..000000000000 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/syncd.conf +++ /dev/null @@ -1 +0,0 @@ -export OPENNSL_CONFIG_POST_INIT_FILE=/etc/bcm/th-ingrasys-s9100-32x100G.soc diff --git a/platform/broadcom/sonic-platform-modules-ingrasys b/platform/broadcom/sonic-platform-modules-ingrasys index 46f1b3303fec..8d0229c94865 160000 --- a/platform/broadcom/sonic-platform-modules-ingrasys +++ b/platform/broadcom/sonic-platform-modules-ingrasys @@ -1 +1 @@ -Subproject commit 46f1b3303fecf728b66b88941fa162e91520cc32 +Subproject commit 8d0229c94865228eff63c0d79396d0b924d7c6b1 From ea4dfa48c9d9a34e38bcf97bc0ad8e1c4415cedc Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 7 Jun 2017 10:37:49 -0700 Subject: [PATCH 0589/1011] Revert "[baseos] Avoid disconnecting mgmt when re-cfg interfaces" (#681) This reverts commit e74196cd75ed1c8bb2556c2ee0199d03bad98dc2. --- files/image_config/interfaces/interfaces-config.sh | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index f966e82e8030..3e2f852c1263 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -1,12 +1,5 @@ #!/bin/bash -ifdown -a -X eth0 sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/interfaces.j2 >/etc/network/interfaces -ifup -a -X eth0 - -NEW_MGMT_IP=`sonic-cfggen -m /etc/sonic/minigraph.xml -v 'minigraph_mgmt_interface["addr"]'` -NEW_MGMT_MASK=`sonic-cfggen -m /etc/sonic/minigraph.xml -v 'minigraph_mgmt_interface["mask"]'` - -ifconfig eth0 $NEW_MGMT_IP netmask $NEW_MGMT_MASK -[ -f /var/run/dhclient.eth0.pid ] && kill `cat /var/run/dhclient.eth0.pid` && rm -f /var/run/dhclient.eth0.pid - +service networking restart +ifdown lo && ifup lo From a7de6ebe2433d6ab1239a0654be6f6c3d77e8e5b Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 8 Jun 2017 00:26:42 -0700 Subject: [PATCH 0590/1011] [dockerbase]: make sure /var/cache/apt/archives directory exists (#684) --- dockers/docker-base/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-base/Dockerfile.j2 b/dockers/docker-base/Dockerfile.j2 index d02d3c545027..3b372c61674f 100644 --- a/dockers/docker-base/Dockerfile.j2 +++ b/dockers/docker-base/Dockerfile.j2 @@ -19,7 +19,7 @@ ENV DEBIAN_FRONTEND=noninteractive ## Configure data sources for apt/dpkg COPY ["sources.list", "/etc/apt/sources.list"] COPY ["dpkg_01_drop", "/etc/dpkg/dpkg.cfg.d/01_drop"] -RUN apt-get clean && apt-get update +RUN mkdir -p /var/cache/apt/archives && apt-get clean && apt-get update ## Pre-install fundamental packages RUN apt-get -y install \ From cefd024c26c888f2f36bed34af60c6909a5cee5c Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 8 Jun 2017 01:50:04 -0700 Subject: [PATCH 0591/1011] Kill dhclient when reconfig interfaces (#683) --- files/image_config/interfaces/interfaces-config.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index 3e2f852c1263..d2b42051cc8d 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -1,5 +1,6 @@ #!/bin/bash sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/interfaces.j2 >/etc/network/interfaces +[ -f /var/run/dhclient.eth0.pid ] && kill `cat /var/run/dhclient.eth0.pid` && rm -f /var/run/dhclient.eth0.pid service networking restart ifdown lo && ifup lo From 3903b45d419c7ad7f8f69e5561d4048962a15700 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 8 Jun 2017 11:53:51 +0300 Subject: [PATCH 0592/1011] [teamd.sh]: Remove LAG interfaces on exit (#643) Use -k option for teamd to properly remove LAG interfaces when docker is exiting. Signed-off-by: marian-pritsak --- dockers/docker-teamd/teamd.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/dockers/docker-teamd/teamd.sh b/dockers/docker-teamd/teamd.sh index 71bc24512ebc..2c7c716b00b7 100755 --- a/dockers/docker-teamd/teamd.sh +++ b/dockers/docker-teamd/teamd.sh @@ -2,17 +2,10 @@ TEAMD_CONF_PATH=/etc/teamd -# Before teamd could automatically add newly created host interfaces into the -# LAG, this workaround will be needed. It will remove the obsolete files and -# net devices that are failed to be removed in the previous run. function start_app { - # Remove *.pid and *.sock files if there are any rm -f /var/run/teamd/* - if [ -d $TEAMD_CONF_PATH ]; then + if [ "$(ls -A $TEAMD_CONF_PATH)" ]; then for f in $TEAMD_CONF_PATH/*; do - # Remove netdevs if there are any - intf=`echo $f | awk -F'[/.]' '{print $4}'` - ip link del $intf teamd -f $f -d done fi @@ -20,7 +13,11 @@ function start_app { } function clean_up { - pkill -9 teamd + if [ "$(ls -A $TEAMD_CONF_PATH)" ]; then + for f in $TEAMD_CONF_PATH/*; do + teamd -f $f -k + done + fi pkill -9 teamsyncd exit } From bc5bca66cc89ac135d0af640ae008f6c5e6ac108 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 8 Jun 2017 02:47:53 -0700 Subject: [PATCH 0593/1011] [dockerbase]: remove apt-get clean (#685) --- dockers/docker-base/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-base/Dockerfile.j2 b/dockers/docker-base/Dockerfile.j2 index 3b372c61674f..b8b1e23a1c2d 100644 --- a/dockers/docker-base/Dockerfile.j2 +++ b/dockers/docker-base/Dockerfile.j2 @@ -19,7 +19,7 @@ ENV DEBIAN_FRONTEND=noninteractive ## Configure data sources for apt/dpkg COPY ["sources.list", "/etc/apt/sources.list"] COPY ["dpkg_01_drop", "/etc/dpkg/dpkg.cfg.d/01_drop"] -RUN mkdir -p /var/cache/apt/archives && apt-get clean && apt-get update +RUN apt-get update ## Pre-install fundamental packages RUN apt-get -y install \ From 30db4ec1911914858fe853b191b73c71b89043fe Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Fri, 9 Jun 2017 04:24:28 +0300 Subject: [PATCH 0594/1011] [slave.mk]: Move initialization of ENABLE_SYNCD_RPC up (#680) ENABLE_SYNCD_RPC should be initialized before all recipes are included in order for them to be able to use this variable Signed-off-by: marian-pritsak --- slave.mk | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/slave.mk b/slave.mk index d17aea5722cc..40f3d617c081 100644 --- a/slave.mk +++ b/slave.mk @@ -51,6 +51,9 @@ distclean : .platform clean ## Include other rules ############################################################################### +ifeq ($(SONIC_ENABLE_SYNCD_RPC),y) +ENABLE_SYNCD_RPC = y +endif include $(RULES_PATH)/config include $(RULES_PATH)/functions @@ -67,10 +70,6 @@ ifeq ($(PASSWORD),) override PASSWORD := $(DEFAULT_PASSWORD) endif -ifeq ($(SONIC_ENABLE_SYNCD_RPC),y) -ENABLE_SYNCD_RPC = y -endif - MAKEFLAGS += -j $(SONIC_CONFIG_BUILD_JOBS) ############################################################################### From 942e2062afb7927898ae2679e91203c33a5df273 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 9 Jun 2017 08:40:14 -0700 Subject: [PATCH 0595/1011] Update submodule sonic-snmpagent (#687) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 46ab9d94535d..2a575b403909 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 46ab9d94535df16df8f7e2d252977d54e40caa30 +Subproject commit 2a575b403909052b14e40a45fb71d2b9c2ad9af8 From 390591de90a96e1ee38fdfd95ac1871c9ed17790 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Sat, 10 Jun 2017 17:05:48 -0700 Subject: [PATCH 0596/1011] [docker-bgp]: Use address-family ipv6 for ipv6 vlan addresses (#692) * Fix SAI submodule id * Fix bgpd template. Use v6 address family for vlan ipv6 addr --- dockers/docker-fpm-frr/bgpd.conf.j2 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dockers/docker-fpm-frr/bgpd.conf.j2 b/dockers/docker-fpm-frr/bgpd.conf.j2 index ed9afe0c3388..9b8195943444 100644 --- a/dockers/docker-fpm-frr/bgpd.conf.j2 +++ b/dockers/docker-fpm-frr/bgpd.conf.j2 @@ -36,7 +36,13 @@ router bgp {{ minigraph_bgp_asn }} {% endblock bgp_init %} {% block vlan_advertisement %} {% for vlan_interface in minigraph_vlan_interfaces %} +{% if vlan_interface['addr'] | ipv4 %} network {{ vlan_interface['subnet'] }} +{% elif vlan_interface['addr'] | ipv6 %} + address-family ipv6 + network {{ vlan_interface['subnet'] }} + exit-address-family +{% endif %} {% endfor %} {% endblock vlan_advertisement %} {% block bgp_sessions %} From d094ceecc26088e7bf804729e8ee803379fae6b4 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Sat, 10 Jun 2017 22:05:11 -0700 Subject: [PATCH 0597/1011] [docker-platform-monitor]: Add LED control daemon and plugin for x86_64-arista_7050_qx32 platform (#691) * Add files for building ledd package; add ledd to docker-platform-monitor; Control platform monitor docker using supervisord * Add sonic-platform-daemons submodule * Rename ledd.mk -> sonic-ledd.mk * Add led_control.py plugin for x86_64-arista_7050_qx32 platform * Rename Dockerfile -> Dockerfile.j2 * Fix build * Remove blank line --- .gitignore | 1 + .gitmodules | 3 + .../plugins/led_control.py | 80 +++++++++++++++++++ dockers/docker-platform-monitor/Dockerfile | 18 ----- dockers/docker-platform-monitor/Dockerfile.j2 | 61 ++++++++++++++ dockers/docker-platform-monitor/start.sh | 3 +- .../docker-platform-monitor/supervisord.conf | 7 ++ rules/docker-platform-monitor.mk | 5 +- rules/sonic-ledd.mk | 5 ++ src/sonic-platform-daemons | 1 + 10 files changed, 163 insertions(+), 21 deletions(-) create mode 100644 device/arista/x86_64-arista_7050_qx32/plugins/led_control.py delete mode 100755 dockers/docker-platform-monitor/Dockerfile create mode 100755 dockers/docker-platform-monitor/Dockerfile.j2 create mode 100644 rules/sonic-ledd.mk create mode 160000 src/sonic-platform-daemons diff --git a/.gitignore b/.gitignore index 481363b1e00a..2222458d1026 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ dockers/docker-fpm-gobgp/Dockerfile dockers/docker-fpm-quagga/Dockerfile dockers/docker-lldp-sv2/Dockerfile dockers/docker-orchagent/Dockerfile +dockers/docker-platform-monitor/Dockerfile dockers/docker-snmp-sv2/Dockerfile dockers/docker-teamd/Dockerfile platform/*/docker-syncd-*/Dockerfile diff --git a/.gitmodules b/.gitmodules index c35e478ae43f..99938c4abaca 100644 --- a/.gitmodules +++ b/.gitmodules @@ -60,3 +60,6 @@ path = src/SAI url = https://github.com/opencomputeproject/SAI branch = v0.9.4 +[submodule "src/sonic-platform-daemons"] + path = src/sonic-platform-daemons + url = https://github.com/Azure/sonic-platform-daemons diff --git a/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py b/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py new file mode 100644 index 000000000000..e246a2e61581 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# +# led_control.py +# +# Platform-specific LED control functionality for SONiC +# + +try: + from sonic_led.led_control_base import LedControlBase +except ImportError, e: + raise ImportError (str(e) + " - required module not found") + + +class LedControl(LedControlBase): + """Platform specific LED control class""" + + SONIC_PORT_NAME_PREFIX = "Ethernet" + + LED_SYSFS_PATH_BREAKOUT_CAPABLE = "/sys/class/leds/qsfp{0}_{1}/brightness" + LED_SYSFS_PATH_NO_BREAKOUT = "/sys/class/leds/qsfp{0}/brightness" + + QSFP_BREAKOUT_START_IDX = 1 + QSFP_BREAKOUT_END_IDX = 24 + QSFP_NO_BREAKOUT_START_IDX = 25 + QSFP_NO_BREAKOUT_END_IDX = 32 + + LED_COLOR_OFF = 0 + LED_COLOR_GREEN = 1 + LED_COLOR_YELLOW = 2 + + # Helper method to map SONiC port name to Arista QSFP index + def _port_name_to_qsfp_index(self, port_name): + # Strip "Ethernet" off port name + if not port_name.startswith(self.SONIC_PORT_NAME_PREFIX): + return -1 + + sonic_port_num = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):]) + + # SONiC port nums are 0-based and increment by 4 + # Arista QSFP indices are 1-based and increment by 1 + return ((sonic_port_num/4) + 1) + + # Concrete implementation of port_link_state_change() method + def port_link_state_change(self, port, state): + qsfp_index = self._port_name_to_qsfp_index(port) + + # Ignore invalid QSFP indices + if qsfp_index <= 0: + return + + # QSFP indices 1-24 are breakout-capable and have four LEDs, + # whereas indices 25-32 are not breakout-capable, and only have one + if qsfp_index <= self.QSFP_BREAKOUT_END_IDX: + led_sysfs_path = self.LED_SYSFS_PATH_BREAKOUT_CAPABLE.format(qsfp_index, 1) + else: + led_sysfs_path = self.LED_SYSFS_PATH_NO_BREAKOUT.format(qsfp_index) + + led_file = open(led_sysfs_path, "w") + + if state == "up": + led_file.write("%d" % self.LED_COLOR_GREEN) + else: + led_file.write("%d" % self.LED_COLOR_OFF) + + led_file.close() + + # Constructor + def __init__(self): + # Initialize: Turn all front panel QSFP LEDs off + for qsfp_index in range(self.QSFP_BREAKOUT_START_IDX, self.QSFP_BREAKOUT_END_IDX + 1): + for lane in range(1, 5): + led_sysfs_path = self.LED_SYSFS_PATH_BREAKOUT_CAPABLE.format(qsfp_index, lane) + with open(led_sysfs_path, 'w') as led_file: + led_file.write("%d" % self.LED_COLOR_OFF) + + for qsfp_index in range(self.QSFP_NO_BREAKOUT_START_IDX, self.QSFP_NO_BREAKOUT_END_IDX + 1): + led_sysfs_path = self.LED_SYSFS_PATH_NO_BREAKOUT.format(qsfp_index) + with open(led_sysfs_path, 'w') as led_file: + led_file.write("%d" % self.LED_COLOR_OFF) + diff --git a/dockers/docker-platform-monitor/Dockerfile b/dockers/docker-platform-monitor/Dockerfile deleted file mode 100755 index 22eb4144cec5..000000000000 --- a/dockers/docker-platform-monitor/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM docker-config-engine - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -RUN apt-get update - -RUN apt-get install -y sensord - -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs - -COPY ["start.sh", "lm-sensors.sh", "/usr/bin/"] -COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] - -ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 new file mode 100755 index 000000000000..9b407bdef6bc --- /dev/null +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -0,0 +1,61 @@ +FROM docker-config-engine + +# Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +# Update apt's package index files +RUN apt-get update + +RUN apt-get install -y python-pip sensord + +{% if docker_platform_monitor_debs.strip() %} +# Copy built Debian packages +COPY \ +{% for deb in docker_platform_monitor_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ +{%- endif %} + +{% if docker_platform_monitor_debs.strip() %} +# Install built Debian packages +RUN dpkg -i \ +{% for deb in docker_platform_monitor_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} +{%- endif %} + +{% if docker_platform_monitor_whls.strip() %} +# Copy built Python wheels +COPY \ +{% for whl in docker_platform_monitor_whls.split(' ') -%} +python-wheels/{{ whl }}{{' '}} +{%- endfor -%} +python-wheels/ +{%- endif %} + +{% if docker_platform_monitor_whls.strip() %} +# Install built Python wheels +RUN pip install \ +{% for whl in docker_platform_monitor_whls.split(' ') -%} +python-wheels/{{ whl }}{{' '}} +{%- endfor %} +{%- endif %} + +COPY python-wheels /python-wheels + +# Install Python SwSS SDK (dependency of sonic-ledd) +RUN pip install /python-wheels/swsssdk-2.0.1-py2-none-any.whl + +# Clean up +RUN apt-get remove -y python-pip +RUN apt-get clean -y +RUN apt-get autoclean -y +RUN apt-get autoremove -y +RUN rm -rf /debs /python-wheels ~/.cache + +COPY ["start.sh", "lm-sensors.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/dockers/docker-platform-monitor/start.sh b/dockers/docker-platform-monitor/start.sh index 0e8a6dd32760..b550cc037a5d 100755 --- a/dockers/docker-platform-monitor/start.sh +++ b/dockers/docker-platform-monitor/start.sh @@ -2,7 +2,7 @@ mkdir -p /etc/sensors.d if [ -e /usr/share/sonic/platform/sensors.conf ]; then - /bin/cp -rf /usr/share/sonic/platform/sensors.conf /etc/sensors.d/ + /bin/cp -rf /usr/share/sonic/platform/sensors.conf /etc/sensors.d/ fi mkdir -p /var/sonic @@ -12,4 +12,5 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd supervisorctl start lm-sensors +supervisorctl start ledd diff --git a/dockers/docker-platform-monitor/supervisord.conf b/dockers/docker-platform-monitor/supervisord.conf index d4f21cf609fa..051829eae65f 100644 --- a/dockers/docker-platform-monitor/supervisord.conf +++ b/dockers/docker-platform-monitor/supervisord.conf @@ -27,3 +27,10 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog +[program:ledd] +command=/usr/bin/ledd +priority=6 +autostart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index 09bec7125c08..39f8cdd3f297 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -1,10 +1,11 @@ -# docker platform monitor image +# Docker image for SONiC platform monitoring tools DOCKER_PLATFORM_MONITOR = docker-platform-monitor.gz $(DOCKER_PLATFORM_MONITOR)_PATH = $(DOCKERS_PATH)/docker-platform-monitor +$(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(SONIC_LEDD) $(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE) -SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) +SONIC_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) $(DOCKER_PLATFORM_MONITOR)_CONTAINER_NAME = pmon diff --git a/rules/sonic-ledd.mk b/rules/sonic-ledd.mk new file mode 100644 index 000000000000..aa95b46cf478 --- /dev/null +++ b/rules/sonic-ledd.mk @@ -0,0 +1,5 @@ +# sonic-ledd (SONiC Front-panel LED control daemon) Debian package + +SONIC_LEDD = python-sonic-ledd_1.0-1_all.deb +$(SONIC_LEDD)_SRC_PATH = $(SRC_PATH)/sonic-platform-daemons/sonic-ledd +SONIC_PYTHON_STDEB_DEBS += $(SONIC_LEDD) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons new file mode 160000 index 000000000000..bd7c31075765 --- /dev/null +++ b/src/sonic-platform-daemons @@ -0,0 +1 @@ +Subproject commit bd7c310757658396ccfaaf653ede4a931b3d4154 From c7908e1d428ff8b3be4ae1a150822463f224ce6d Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Sun, 11 Jun 2017 11:46:17 -0700 Subject: [PATCH 0598/1011] [slave]: remove apt-get clean (#693) --- sonic-slave/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 76b01ea2f608..ee37f57ee0b5 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -11,7 +11,7 @@ RUN echo "deb http://debian-archive.trafficmanager.net/debian/ jessie main contr ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get clean && apt-get update && apt-get install -y \ +RUN apt-get update && apt-get install -y \ apt-utils \ default-jre-headless \ openssh-server \ From 5e6620e19ec7644428c8acd3761af2d85fc6689c Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 12 Jun 2017 11:05:22 -0700 Subject: [PATCH 0599/1011] [bgp] Save bgp admin state (#690) * [bgp] Save admin state and set default state to shutdown * Set default behavior to no shutdown * Add build option SHUTDOWN_BGP_ON_START * Script change for default admin state to be on * Address CR comments to bgp_neighbor script * Fix script bug --- Makefile | 1 + .../base_image_files/bgp_neighbor | 55 +++++++++++++++++++ dockers/docker-fpm-quagga/bgpd.conf.j2 | 3 + dockers/docker-fpm-quagga/start.sh | 6 +- .../build_templates/sonic_debian_extension.j2 | 5 +- rules/config | 4 ++ rules/docker-fpm-quagga.mk | 1 + slave.mk | 1 + 8 files changed, 74 insertions(+), 2 deletions(-) create mode 100755 dockers/docker-fpm-quagga/base_image_files/bgp_neighbor diff --git a/Makefile b/Makefile index 97f054c035b6..b2938221b240 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/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor b/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor new file mode 100755 index 000000000000..d6bd67a0a02d --- /dev/null +++ b/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor @@ -0,0 +1,55 @@ +#!/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 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" + + # Save admin state in config file + sed -i "/^\s*$NEIGHBOR:/d" /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 + # 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 + 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 diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index fff27678c95b..0c848939df9d 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 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' %} 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 a02117dee5ef..bc3fbf4e907a 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/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 94f8292fb955..00398654b12c 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 4d0fc7801c9a..e813cd7ef1cb 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/rules/docker-fpm-quagga.mk b/rules/docker-fpm-quagga.mk index a9c0511ba173..1e95c96e001b 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 diff --git a/slave.mk b/slave.mk index 40f3d617c081..c8ffbd8086f0 100644 --- a/slave.mk +++ b/slave.mk @@ -339,6 +339,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 f1ea4aa34f0735f5ade358b78b43bd0bcef2ce7f Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 12 Jun 2017 16:00:46 -0700 Subject: [PATCH 0600/1011] Update submodule sonic-snmpagent (#694) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 2a575b403909..7c2c18c69118 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 2a575b403909052b14e40a45fb71d2b9c2ad9af8 +Subproject commit 7c2c18c69118ecdc794e7f56f44ccae8f16bb54e From d9cf39885536044ec08864c0da6f793457ceb6ca Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 12 Jun 2017 21:13:11 -0700 Subject: [PATCH 0601/1011] [pmon]: add swsssdk dependency for pmon docker (#700) --- rules/docker-platform-monitor.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index 39f8cdd3f297..dea73d2c90ba 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -3,6 +3,7 @@ DOCKER_PLATFORM_MONITOR = docker-platform-monitor.gz $(DOCKER_PLATFORM_MONITOR)_PATH = $(DOCKERS_PATH)/docker-platform-monitor $(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(SONIC_LEDD) +$(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SWSSSDK_PY2) $(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) From 023a5b9714c8d2c41ab4469beae3569c0e43933a Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 12 Jun 2017 21:22:46 -0700 Subject: [PATCH 0602/1011] [sonic-cfggen]: translate_acl tool adds TCP mask (#697) In orchagent, the TCP_FLAGS expects both value and mask as the input. Right now, translate_acl tool only support one TCP flag and generate the ACL with both value and mask equal to the flag. This rule will match packets that have this specific flag set regardless of the other flags. --- .../sample_output/rules_for_dataacl.json | 9 +++ .../tests/t0-sample-acl.json | 62 +++++++++++++------ src/sonic-config-engine/translate_acl | 2 +- 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json b/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json index 9fd0199c4cf2..48fa240c9dc6 100644 --- a/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json +++ b/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json @@ -25,5 +25,14 @@ "priority":9998 }, "OP":"SET" + }, + { + "ACL_RULE_TABLE:dataacl:Rule_4":{ + "IP_PROTOCOL":6, + "PACKET_ACTION":"FORWARD", + "TCP_FLAGS":"0x10/0x10", + "priority":9996 + }, + "OP":"SET" } ] \ No newline at end of file diff --git a/src/sonic-config-engine/tests/t0-sample-acl.json b/src/sonic-config-engine/tests/t0-sample-acl.json index e04971e5f2ec..4157a1701b60 100644 --- a/src/sonic-config-engine/tests/t0-sample-acl.json +++ b/src/sonic-config-engine/tests/t0-sample-acl.json @@ -10,55 +10,77 @@ "config": { "forwarding-action": "ACCEPT" } - }, + }, "config": { "sequence-id": 1 - }, + }, "ip": { "config": { - "protocol": "IP_UDP", + "protocol": "IP_UDP", "source-ip-address": "10.0.0.0/8" } } - }, + }, "2": { "actions": { "config": { "forwarding-action": "ACCEPT" } - }, + }, "config": { "sequence-id": 2 - }, + }, "ip": { "config": { - "protocol": "IP_UDP", + "protocol": "IP_UDP", "source-ip-address": "100.64.0.0/10" } } - }, + }, "3": { "actions": { "config": { "forwarding-action": "ACCEPT" } - }, + }, "config": { "sequence-id": 3 - }, + }, "ip": { "config": { - "protocol": "IP_UDP", + "protocol": "IP_UDP", "source-ip-address": "25.0.0.0/8" } } + }, + "4": { + "actions": { + "config": { + "forwarding-action": "ACCEPT" + } + }, + "config": { + "sequence-id": 4 + }, + "ip": { + "config": { + "protocol": "IP_TCP" + } + }, + "transport": { + "config": { + "tcp-flags": [ + "TCP_ACK" + ] + } + } } } - }, + }, "config": { "name": "dataacl" } - }, + }, "everflow": { "acl-entries": { "acl-entry": { @@ -67,26 +89,26 @@ "config": { "forwarding-action": "ACCEPT" } - }, + }, "config": { "sequence-id": 1 - }, + }, "ip": { "config": { - "destination-ip-address": "127.0.0.1/32", - "protocol": "IP_TCP", + "destination-ip-address": "127.0.0.1/32", + "protocol": "IP_TCP", "source-ip-address": "127.0.0.1/32" } - }, + }, "transport": { "config": { - "destination-port": "0", + "destination-port": "0", "source-port": "0" } } } } - }, + }, "config": { "name": "everflow" } diff --git a/src/sonic-config-engine/translate_acl b/src/sonic-config-engine/translate_acl index 6ee89cfd4612..584db7b64488 100755 --- a/src/sonic-config-engine/translate_acl +++ b/src/sonic-config-engine/translate_acl @@ -97,7 +97,7 @@ def generate_rule_json(table_name, rule, max_priority, mirror): if flag == "TCP_CWR": tcp_flags = tcp_flags | 0x80 if tcp_flags != 0x00: - rule_props["TCP_FLAGS"] = '0x{:02x}'.format(tcp_flags) + rule_props["TCP_FLAGS"] = '0x{:02x}/0x{:02x}'.format(tcp_flags, tcp_flags) return rule_data def generate_table_json(aclset, aclname, ports, mirror, max_priority, output_path='.'): From 94f491ecb8d4b4411adc37deb52beeb69f962dd2 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 12 Jun 2017 21:23:27 -0700 Subject: [PATCH 0603/1011] [submodule]: Update submodule sonic-snmpagent (#698) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 7c2c18c69118..f66288d50821 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 7c2c18c69118ecdc794e7f56f44ccae8f16bb54e +Subproject commit f66288d50821d7b70ee7dc3321bdc626b3eb34cf From b616a33ff3574690d57f76468be5270ae6b75925 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Tue, 13 Jun 2017 11:37:43 -0700 Subject: [PATCH 0604/1011] [sonic-cfg]: Use vlanid to generate sonic vlan name (#695) * Use Vlan{{vlanid}} schema name of sonic vlans --- src/sonic-config-engine/minigraph.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 49e8b104a46e..7dc060900886 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -212,7 +212,8 @@ def parse_dpg(dpg, hname): for i, member in enumerate(vmbr_list): vmbr_list[i] = port_alias_map[member] vlan_attributes = {'name': vintfname, 'members': vmbr_list, 'vlanid': vlanid} - vlans[vintfname] = vlan_attributes + sonic_vlan_name = "Vlan%s" % vlanid + vlans[sonic_vlan_name] = vlan_attributes aclintfs = child.find(str(QName(ns, "AclInterfaces"))) acls = {} From e46cf29f0be930e6cf6bbbcfb1f197740e54b90c Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 13 Jun 2017 19:16:43 -0700 Subject: [PATCH 0605/1011] [sonic-mgmt]: fix paramiko to version 2.1.2 (#704) --- sonic-mgmt/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sonic-mgmt/Dockerfile b/sonic-mgmt/Dockerfile index f657b18a1dc0..f462b99cdf45 100644 --- a/sonic-mgmt/Dockerfile +++ b/sonic-mgmt/Dockerfile @@ -36,7 +36,8 @@ RUN pip install ipaddr \ pexpect \ pyasn1==0.1.9 \ pysnmp==4.2.5 \ - jinja2==2.7.2 + jinja2==2.7.2 \ + paramiko==2.1.2 RUN git clone https://github.com/ansible/ansible RUN cd ansible && git checkout v2.0.0.2-1 -b v2.0.0.2-1 && git submodule update --init --recursive && make && make install From 8843c6f1925eadbffa4a45265435cd86ccb634b8 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 14 Jun 2017 07:05:34 -0700 Subject: [PATCH 0606/1011] [logrotate]: Add /var/log/swss/*.rec to logrotate target (#703) SwSS record files in /var/log/swss/ folder get larger and larger and were not rotated. Add them here to rotate these files. --- files/image_config/logrotate.d/rsyslog | 1 + 1 file changed, 1 insertion(+) diff --git a/files/image_config/logrotate.d/rsyslog b/files/image_config/logrotate.d/rsyslog index d24bc32abe17..a212ddfce15c 100644 --- a/files/image_config/logrotate.d/rsyslog +++ b/files/image_config/logrotate.d/rsyslog @@ -1,6 +1,7 @@ /var/log/syslog /var/log/quagga/*.log /var/log/teamd.log +/var/log/swss/*.rec { rotate 7 daily From 88b98c7b899bfc79312ac85c35808835c765203b Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 14 Jun 2017 15:18:02 -0700 Subject: [PATCH 0607/1011] [image]: Update login message (#706) --- files/image_config/environment/motd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/files/image_config/environment/motd b/files/image_config/environment/motd index aa96d66ba7c5..8562e330fe2c 100644 --- a/files/image_config/environment/motd +++ b/files/image_config/environment/motd @@ -10,3 +10,5 @@ You are on Unauthorized access and/or use are prohibited. All access and/or use are subject to monitoring. +Help: http://azure.github.io/SONiC/ + From 90412883593666c60ff6c3fbc5872ecc7d9968e9 Mon Sep 17 00:00:00 2001 From: Haiyang Zheng Date: Thu, 15 Jun 2017 10:31:13 -0700 Subject: [PATCH 0608/1011] [build_debian]: Add dbus package to update timezone (#702) Signed-off-by: Hiayang Zheng haiyang.z@alibaba.inc --- build_debian.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build_debian.sh b/build_debian.sh index eed63e6eb070..71f849151a94 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -176,6 +176,7 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in sudo \ vim \ tcpdump \ + dbus \ ntp \ ntpstat \ openssh-server \ From c1c8a122bea2aac5eefc8d19ada0beed059daed5 Mon Sep 17 00:00:00 2001 From: Polly Hsu Date: Fri, 16 Jun 2017 01:33:42 +0800 Subject: [PATCH 0609/1011] [Accton]: Add a new supported device and platform, AS7712-32X (#662) * platform/broadcom: Add a new supported device and platform, AS7712-32X * Switch Vendor: Edge-core * Switch SKU: AS7712-32X * ASIC Vendor: Broadcom * Swich ASIC: Tomahawk * Port Configuration: 32x100G * SONiC Image: SONiC-ONIE-Broadcom Signed-off-by: polly_hsu@accton.com --- .../Accton-AS7712-32X/port_config.ini | 33 + .../Accton-AS7712-32X/sai.profile | 2 + .../installer.conf | 3 + .../x86_64-accton_as7712_32x-r0/minigraph.xml | 1074 ++++++++++++++++ platform/broadcom/one-image.mk | 3 +- platform/broadcom/platform-modules-accton.mk | 14 + platform/broadcom/rules.mk | 1 + .../sonic-platform-modules-accton/.gitignore | 33 + .../sonic-platform-modules-accton/LICENSE | 16 + .../sonic-platform-modules-accton/README.md | 1 + .../as7712-32x/cfg/as7712_32x-modules.conf | 13 + .../as7712-32x/modules/Makefile | 2 + .../modules/accton_as7712_32x_fan.c | 452 +++++++ .../modules/accton_as7712_32x_psu.c | 293 +++++ .../modules/accton_as7712_32x_sfp.c | 1083 +++++++++++++++++ .../as7712-32x/modules/accton_i2c_cpld.c | 259 ++++ .../modules/leds-accton_as7712_32x.c | 443 +++++++ .../as7712-32x/modules/ym2651y.c | 589 +++++++++ .../scripts/as7712_32x_platform_init.sh | 3 + .../debian/changelog | 5 + .../debian/compat | 1 + .../debian/control | 11 + .../debian/platform-modules-as7712-32x.init | 44 + .../platform-modules-as7712-32x.install | 2 + .../debian/rules | 36 + 25 files changed, 4415 insertions(+), 1 deletion(-) create mode 100644 device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/port_config.ini create mode 100644 device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile create mode 100644 device/accton/x86_64-accton_as7712_32x-r0/installer.conf create mode 100644 device/accton/x86_64-accton_as7712_32x-r0/minigraph.xml create mode 100644 platform/broadcom/platform-modules-accton.mk create mode 100644 platform/broadcom/sonic-platform-modules-accton/.gitignore create mode 100644 platform/broadcom/sonic-platform-modules-accton/LICENSE create mode 100644 platform/broadcom/sonic-platform-modules-accton/README.md create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/cfg/as7712_32x-modules.conf create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_fan.c create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_psu.c create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_sfp.c create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_i2c_cpld.c create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/leds-accton_as7712_32x.c create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/ym2651y.c create mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/scripts/as7712_32x_platform_init.sh create mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/changelog create mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/compat create mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/control create mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.init create mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.install create mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/rules diff --git a/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/port_config.ini b/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/port_config.ini new file mode 100644 index 000000000000..1fa6d21d9609 --- /dev/null +++ b/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 49,50,51,52 hundredGigE1 +Ethernet4 53,54,55,56 hundredGigE2 +Ethernet8 57,58,59,60 hundredGigE3 +Ethernet12 61,62,63,64 hundredGigE4 +Ethernet16 65,66,67,68 hundredGigE5 +Ethernet20 69,70,71,72 hundredGigE6 +Ethernet24 73,74,75,76 hundredGigE7 +Ethernet28 77,78,79,80 hundredGigE8 +Ethernet32 33,34,35,36 hundredGigE9 +Ethernet36 37,38,39,40 hundredGigE10 +Ethernet40 41,42,43,44 hundredGigE11 +Ethernet44 45,46,47,48 hundredGigE12 +Ethernet48 81,82,83,84 hundredGigE13 +Ethernet52 85,86,87,88 hundredGigE14 +Ethernet56 89,90,91,92 hundredGigE15 +Ethernet60 93,94,95,96 hundredGigE16 +Ethernet64 97,98,99,100 hundredGigE17 +Ethernet68 101,102,103,104 hundredGigE18 +Ethernet72 105,106,107,108 hundredGigE19 +Ethernet76 109,110,111,112 hundredGigE20 +Ethernet80 17,18,19,20 hundredGigE21 +Ethernet84 21,22,23,24 hundredGigE22 +Ethernet88 25,26,27,28 hundredGigE23 +Ethernet92 29,30,31,32 hundredGigE24 +Ethernet96 113,114,115,116 hundredGigE25 +Ethernet100 117,118,119,120 hundredGigE26 +Ethernet104 121,122,123,124 hundredGigE27 +Ethernet108 125,126,127,128 hundredGigE28 +Ethernet112 1,2,3,4 hundredGigE29 +Ethernet116 5,6,7,8 hundredGigE30 +Ethernet120 9,10,11,12 hundredGigE31 +Ethernet124 13,14,15,16 hundredGigE32 diff --git a/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile b/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile new file mode 100644 index 000000000000..5ed350f24d7f --- /dev/null +++ b/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-as7712-32x100G.config.bcm + diff --git a/device/accton/x86_64-accton_as7712_32x-r0/installer.conf b/device/accton/x86_64-accton_as7712_32x-r0/installer.conf new file mode 100644 index 000000000000..14404194ef53 --- /dev/null +++ b/device/accton/x86_64-accton_as7712_32x-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x2f8 +CONSOLE_DEV=1 +CONSOLE_SPEED=115200 diff --git a/device/accton/x86_64-accton_as7712_32x-r0/minigraph.xml b/device/accton/x86_64-accton_as7712_32x-r0/minigraph.xml new file mode 100644 index 000000000000..025985c83675 --- /dev/null +++ b/device/accton/x86_64-accton_as7712_32x-r0/minigraph.xml @@ -0,0 +1,1074 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet60 + 10.0.0.30/31 + + + + Ethernet64 + 10.0.0.32/31 + + + + Ethernet68 + 10.0.0.34/31 + + + + Ethernet72 + 10.0.0.36/31 + + + + Ethernet76 + 10.0.0.38/31 + + + + Ethernet80 + 10.0.0.40/31 + + + + Ethernet84 + 10.0.0.42/31 + + + + Ethernet88 + 10.0.0.44/31 + + + + Ethernet92 + 10.0.0.46/31 + + + + Ethernet96 + 10.0.0.48/31 + + + + Ethernet100 + 10.0.0.50/31 + + + + Ethernet104 + 10.0.0.52/31 + + + + Ethernet108 + 10.0.0.54/31 + + + + Ethernet112 + 10.0.0.56/31 + + + + Ethernet116 + 10.0.0.58/31 + + + + Ethernet120 + 10.0.0.60/31 + + + + Ethernet124 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet60 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet64 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet68 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet72 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet76 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet80 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet84 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet88 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet92 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet96 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet100 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet104 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet108 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet112 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet116 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet120 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet124 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Accton-AS7712-32X + + + + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + + switch1 + Accton-AS7712-32X +
diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 3af81b325d77..600e1159b400 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -9,6 +9,7 @@ $(SONIC_ONE_IMAGE)_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(DELL_S6100_PLATFORM_MODULE) \ $(INGRASYS_S8900_54XC_PLATFORM_MODULE) \ $(INGRASYS_S8900_64XC_PLATFORM_MODULE) \ - $(INGRASYS_S9100_PLATFORM_MODULE) + $(INGRASYS_S9100_PLATFORM_MODULE) \ + $(ACCTON_AS7712_32X_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/broadcom/platform-modules-accton.mk b/platform/broadcom/platform-modules-accton.mk new file mode 100644 index 000000000000..00128a20f8d2 --- /dev/null +++ b/platform/broadcom/platform-modules-accton.mk @@ -0,0 +1,14 @@ +# Accton Platform modules + +ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION = 1.0 + +export ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION + +ACCTON_AS7712_32X_PLATFORM_MODULE = platform-modules-as7712-32x_$(ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION)_amd64.deb +$(ACCTON_AS7712_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-accton +$(ACCTON_AS7712_32X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(ACCTON_AS7712_32X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as7712_32x-r0 +SONIC_DPKG_DEBS += $(ACCTON_AS7712_32X_PLATFORM_MODULE) + +$(eval $(call add_extra_package,$(ACCTON_AS7712_32X_PLATFORM_MODULE))) + diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 18ba86d1c0ce..3f0d523d4204 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -4,6 +4,7 @@ include $(PLATFORM_PATH)/platform-modules-s6000.mk include $(PLATFORM_PATH)/platform-modules-dell.mk include $(PLATFORM_PATH)/platform-modules-arista.mk include $(PLATFORM_PATH)/platform-modules-ingrasys.mk +include $(PLATFORM_PATH)/platform-modules-accton.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm-rpc.mk diff --git a/platform/broadcom/sonic-platform-modules-accton/.gitignore b/platform/broadcom/sonic-platform-modules-accton/.gitignore new file mode 100644 index 000000000000..f805e810e5c6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/.gitignore @@ -0,0 +1,33 @@ +# Object files +*.o +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su diff --git a/platform/broadcom/sonic-platform-modules-accton/LICENSE b/platform/broadcom/sonic-platform-modules-accton/LICENSE new file mode 100644 index 000000000000..bc693f7a4c40 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/LICENSE @@ -0,0 +1,16 @@ +Copyright (C) 2016 Microsoft, Inc +Copyright (C) 2017 Accton Technology Corporation + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/platform/broadcom/sonic-platform-modules-accton/README.md b/platform/broadcom/sonic-platform-modules-accton/README.md new file mode 100644 index 000000000000..743db0cb238f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/README.md @@ -0,0 +1 @@ +platform drivers for AS7712_32X for the SONiC project diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/cfg/as7712_32x-modules.conf b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/cfg/as7712_32x-modules.conf new file mode 100644 index 000000000000..cf2c5fa775bd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/cfg/as7712_32x-modules.conf @@ -0,0 +1,13 @@ +# /etc/modules: kernel modules to load at boot time. +# +# This file contains the names of kernel modules that should be loaded +# at boot time, one per line. Lines beginning with "#" are ignored. + +i2c_dev +i2c_mux_pca954x +accton_i2c_cpld +accton_as7712_32x_fan +accton_as7712_32x_sfp +leds-accton_as7712_32x +accton_as7712_32x_psu + diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/Makefile b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/Makefile new file mode 100644 index 000000000000..83319ec62e58 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/Makefile @@ -0,0 +1,2 @@ +obj-m:=accton_as7712_32x_fan.o accton_as7712_32x_sfp.o leds-accton_as7712_32x.o \ + accton_as7712_32x_psu.o accton_i2c_cpld.o ym2651y.o \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_fan.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_fan.c new file mode 100644 index 000000000000..52db1e9dc028 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_fan.c @@ -0,0 +1,452 @@ +/* + * A hwmon driver for the Accton as7712 32x fan + * + * Copyright (C) 2014 Accton Technology Corporation. + * Brandon Chuang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRVNAME "as7712_32x_fan" + +static struct as7712_32x_fan_data *as7712_32x_fan_update_device(struct device *dev); +static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_duty_cycle(struct device *dev, struct device_attribute *da, + const char *buf, size_t count); +extern int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg); +extern int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); + +/* fan related data, the index should match sysfs_fan_attributes + */ +static const u8 fan_reg[] = { + 0x0F, /* fan 1-6 present status */ + 0x11, /* fan PWM(for all fan) */ + 0x12, /* front fan 1 speed(rpm) */ + 0x13, /* front fan 2 speed(rpm) */ + 0x14, /* front fan 3 speed(rpm) */ + 0x15, /* front fan 4 speed(rpm) */ + 0x16, /* front fan 5 speed(rpm) */ + 0x17, /* front fan 6 speed(rpm) */ + 0x22, /* rear fan 1 speed(rpm) */ + 0x23, /* rear fan 2 speed(rpm) */ + 0x24, /* rear fan 3 speed(rpm) */ + 0x25, /* rear fan 4 speed(rpm) */ + 0x26, /* rear fan 5 speed(rpm) */ + 0x27, /* rear fan 6 speed(rpm) */ +}; + +/* Each client has this additional data */ +struct as7712_32x_fan_data { + struct device *hwmon_dev; + struct mutex update_lock; + char valid; /* != 0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + u8 reg_val[ARRAY_SIZE(fan_reg)]; /* Register value */ +}; + +enum fan_id { + FAN1_ID, + FAN2_ID, + FAN3_ID, + FAN4_ID, + FAN5_ID, + FAN6_ID +}; + +enum sysfs_fan_attributes { + FAN_PRESENT_REG, + FAN_DUTY_CYCLE_PERCENTAGE, /* Only one CPLD register to control duty cycle for all fans */ + FAN1_FRONT_SPEED_RPM, + FAN2_FRONT_SPEED_RPM, + FAN3_FRONT_SPEED_RPM, + FAN4_FRONT_SPEED_RPM, + FAN5_FRONT_SPEED_RPM, + FAN6_FRONT_SPEED_RPM, + FAN1_REAR_SPEED_RPM, + FAN2_REAR_SPEED_RPM, + FAN3_REAR_SPEED_RPM, + FAN4_REAR_SPEED_RPM, + FAN5_REAR_SPEED_RPM, + FAN6_REAR_SPEED_RPM, + FAN1_PRESENT, + FAN2_PRESENT, + FAN3_PRESENT, + FAN4_PRESENT, + FAN5_PRESENT, + FAN6_PRESENT, + FAN1_FAULT, + FAN2_FAULT, + FAN3_FAULT, + FAN4_FAULT, + FAN5_FAULT, + FAN6_FAULT +}; + +/* Define attributes + */ +#define DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_fault, S_IRUGO, fan_show_value, NULL, FAN##index##_FAULT) +#define DECLARE_FAN_FAULT_ATTR(index) &sensor_dev_attr_fan##index##_fault.dev_attr.attr + +#define DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_direction, S_IRUGO, fan_show_value, NULL, FAN##index##_DIRECTION) +#define DECLARE_FAN_DIRECTION_ATTR(index) &sensor_dev_attr_fan##index##_direction.dev_attr.attr + +#define DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_duty_cycle_percentage, S_IWUSR | S_IRUGO, fan_show_value, set_duty_cycle, FAN##index##_DUTY_CYCLE_PERCENTAGE) +#define DECLARE_FAN_DUTY_CYCLE_ATTR(index) &sensor_dev_attr_fan##index##_duty_cycle_percentage.dev_attr.attr + +#define DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_present, S_IRUGO, fan_show_value, NULL, FAN##index##_PRESENT) +#define DECLARE_FAN_PRESENT_ATTR(index) &sensor_dev_attr_fan##index##_present.dev_attr.attr + +#define DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_front_speed_rpm, S_IRUGO, fan_show_value, NULL, FAN##index##_FRONT_SPEED_RPM);\ + static SENSOR_DEVICE_ATTR(fan##index##_rear_speed_rpm, S_IRUGO, fan_show_value, NULL, FAN##index##_REAR_SPEED_RPM) +#define DECLARE_FAN_SPEED_RPM_ATTR(index) &sensor_dev_attr_fan##index##_front_speed_rpm.dev_attr.attr, \ + &sensor_dev_attr_fan##index##_rear_speed_rpm.dev_attr.attr + +/* 6 fan fault attributes in this platform */ +DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(1); +DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(2); +DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(3); +DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(4); +DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(5); +DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(6); +/* 6 fan speed(rpm) attributes in this platform */ +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(1); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(2); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(3); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(4); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(5); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(6); +/* 6 fan present attributes in this platform */ +DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(1); +DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(2); +DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(3); +DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(4); +DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(5); +DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(6); +/* 1 fan duty cycle attribute in this platform */ +DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(); + +static struct attribute *as7712_32x_fan_attributes[] = { + /* fan related attributes */ + DECLARE_FAN_FAULT_ATTR(1), + DECLARE_FAN_FAULT_ATTR(2), + DECLARE_FAN_FAULT_ATTR(3), + DECLARE_FAN_FAULT_ATTR(4), + DECLARE_FAN_FAULT_ATTR(5), + DECLARE_FAN_FAULT_ATTR(6), + DECLARE_FAN_SPEED_RPM_ATTR(1), + DECLARE_FAN_SPEED_RPM_ATTR(2), + DECLARE_FAN_SPEED_RPM_ATTR(3), + DECLARE_FAN_SPEED_RPM_ATTR(4), + DECLARE_FAN_SPEED_RPM_ATTR(5), + DECLARE_FAN_SPEED_RPM_ATTR(6), + DECLARE_FAN_PRESENT_ATTR(1), + DECLARE_FAN_PRESENT_ATTR(2), + DECLARE_FAN_PRESENT_ATTR(3), + DECLARE_FAN_PRESENT_ATTR(4), + DECLARE_FAN_PRESENT_ATTR(5), + DECLARE_FAN_PRESENT_ATTR(6), + DECLARE_FAN_DUTY_CYCLE_ATTR(), + NULL +}; + +#define FAN_DUTY_CYCLE_REG_MASK 0xF +#define FAN_MAX_DUTY_CYCLE 100 +#define FAN_REG_VAL_TO_SPEED_RPM_STEP 100 + +static int as7712_32x_fan_read_value(struct i2c_client *client, u8 reg) +{ + return i2c_smbus_read_byte_data(client, reg); +} + +static int as7712_32x_fan_write_value(struct i2c_client *client, u8 reg, u8 value) +{ + return i2c_smbus_write_byte_data(client, reg, value); +} + +/* fan utility functions + */ +static u32 reg_val_to_duty_cycle(u8 reg_val) +{ + reg_val &= FAN_DUTY_CYCLE_REG_MASK; + return ((u32)(reg_val+1) * 625 + 75)/ 100; +} + +static u8 duty_cycle_to_reg_val(u8 duty_cycle) +{ + return ((u32)duty_cycle * 100 / 625) - 1; +} + +static u32 reg_val_to_speed_rpm(u8 reg_val) +{ + return (u32)reg_val * FAN_REG_VAL_TO_SPEED_RPM_STEP; +} + +static u8 reg_val_to_is_present(u8 reg_val, enum fan_id id) +{ + u8 mask = (1 << id); + + reg_val &= mask; + + return reg_val ? 0 : 1; +} + +static u8 is_fan_fault(struct as7712_32x_fan_data *data, enum fan_id id) +{ + u8 ret = 1; + int front_fan_index = FAN1_FRONT_SPEED_RPM + id; + int rear_fan_index = FAN1_REAR_SPEED_RPM + id; + + /* Check if the speed of front or rear fan is ZERO, + */ + if (reg_val_to_speed_rpm(data->reg_val[front_fan_index]) && + reg_val_to_speed_rpm(data->reg_val[rear_fan_index])) { + ret = 0; + } + + return ret; +} + +static ssize_t set_duty_cycle(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + int error, value; + struct i2c_client *client = to_i2c_client(dev); + + error = kstrtoint(buf, 10, &value); + if (error) + return error; + + if (value < 0 || value > FAN_MAX_DUTY_CYCLE) + return -EINVAL; + + as7712_32x_fan_write_value(client, 0x33, 0); /* Disable fan speed watch dog */ + as7712_32x_fan_write_value(client, fan_reg[FAN_DUTY_CYCLE_PERCENTAGE], duty_cycle_to_reg_val(value)); + return count; +} + +static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct as7712_32x_fan_data *data = as7712_32x_fan_update_device(dev); + ssize_t ret = 0; + + if (data->valid) { + switch (attr->index) { + case FAN_DUTY_CYCLE_PERCENTAGE: + { + u32 duty_cycle = reg_val_to_duty_cycle(data->reg_val[FAN_DUTY_CYCLE_PERCENTAGE]); + ret = sprintf(buf, "%u\n", duty_cycle); + break; + } + case FAN1_FRONT_SPEED_RPM: + case FAN2_FRONT_SPEED_RPM: + case FAN3_FRONT_SPEED_RPM: + case FAN4_FRONT_SPEED_RPM: + case FAN5_FRONT_SPEED_RPM: + case FAN6_FRONT_SPEED_RPM: + case FAN1_REAR_SPEED_RPM: + case FAN2_REAR_SPEED_RPM: + case FAN3_REAR_SPEED_RPM: + case FAN4_REAR_SPEED_RPM: + case FAN5_REAR_SPEED_RPM: + case FAN6_REAR_SPEED_RPM: + ret = sprintf(buf, "%u\n", reg_val_to_speed_rpm(data->reg_val[attr->index])); + break; + case FAN1_PRESENT: + case FAN2_PRESENT: + case FAN3_PRESENT: + case FAN4_PRESENT: + case FAN5_PRESENT: + case FAN6_PRESENT: + ret = sprintf(buf, "%d\n", + reg_val_to_is_present(data->reg_val[FAN_PRESENT_REG], + attr->index - FAN1_PRESENT)); + break; + case FAN1_FAULT: + case FAN2_FAULT: + case FAN3_FAULT: + case FAN4_FAULT: + case FAN5_FAULT: + case FAN6_FAULT: + ret = sprintf(buf, "%d\n", is_fan_fault(data, attr->index - FAN1_FAULT)); + break; + default: + break; + } + } + + return ret; +} + +static const struct attribute_group as7712_32x_fan_group = { + .attrs = as7712_32x_fan_attributes, +}; + +static struct as7712_32x_fan_data *as7712_32x_fan_update_device(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct as7712_32x_fan_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->update_lock); + + if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || + !data->valid) { + int i; + + dev_dbg(&client->dev, "Starting as7712_32x_fan update\n"); + data->valid = 0; + + /* Update fan data + */ + for (i = 0; i < ARRAY_SIZE(data->reg_val); i++) { + int status = as7712_32x_fan_read_value(client, fan_reg[i]); + + if (status < 0) { + data->valid = 0; + mutex_unlock(&data->update_lock); + dev_dbg(&client->dev, "reg %d, err %d\n", fan_reg[i], status); + return data; + } + else { + data->reg_val[i] = status; + } + } + + data->last_updated = jiffies; + data->valid = 1; + } + + mutex_unlock(&data->update_lock); + + return data; +} + +static int as7712_32x_fan_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + struct as7712_32x_fan_data *data; + int status; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { + status = -EIO; + goto exit; + } + + data = kzalloc(sizeof(struct as7712_32x_fan_data), GFP_KERNEL); + if (!data) { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + data->valid = 0; + mutex_init(&data->update_lock); + + dev_info(&client->dev, "chip found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &as7712_32x_fan_group); + if (status) { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: fan '%s'\n", + dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &as7712_32x_fan_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int as7712_32x_fan_remove(struct i2c_client *client) +{ + struct as7712_32x_fan_data *data = i2c_get_clientdata(client); + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &as7712_32x_fan_group); + + return 0; +} + +/* Addresses to scan */ +static const unsigned short normal_i2c[] = { 0x66, I2C_CLIENT_END }; + +static const struct i2c_device_id as7712_32x_fan_id[] = { + { "as7712_32x_fan", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, as7712_32x_fan_id); + +static struct i2c_driver as7712_32x_fan_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = DRVNAME, + }, + .probe = as7712_32x_fan_probe, + .remove = as7712_32x_fan_remove, + .id_table = as7712_32x_fan_id, + .address_list = normal_i2c, +}; + +static int __init as7712_32x_fan_init(void) +{ + extern int platform_accton_as7712_32x(void); + if (!platform_accton_as7712_32x()) { + return -ENODEV; + } + + return i2c_add_driver(&as7712_32x_fan_driver); +} + +static void __exit as7712_32x_fan_exit(void) +{ + i2c_del_driver(&as7712_32x_fan_driver); +} + +module_init(as7712_32x_fan_init); +module_exit(as7712_32x_fan_exit); + +MODULE_AUTHOR("Brandon Chuang "); +MODULE_DESCRIPTION("as7712_32x_fan driver"); +MODULE_LICENSE("GPL"); + diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_psu.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_psu.c new file mode 100644 index 000000000000..8c9230ab2d24 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_psu.c @@ -0,0 +1,293 @@ +/* + * An hwmon driver for accton as7712_32x Power Module + * + * Copyright (C) 2014 Accton Technology Corporation. + * Brandon Chuang + * + * Based on ad7414.c + * Copyright 2006 Stefan Roese , DENX Software Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static ssize_t show_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t show_model_name(struct device *dev, struct device_attribute *da, char *buf); +static int as7712_32x_psu_read_block(struct i2c_client *client, u8 command, u8 *data,int data_len); +extern int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg); + +/* Addresses scanned + */ +static const unsigned short normal_i2c[] = { 0x50, 0x53, I2C_CLIENT_END }; + +/* Each client has this additional data + */ +struct as7712_32x_psu_data { + struct device *hwmon_dev; + struct mutex update_lock; + char valid; /* !=0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + u8 index; /* PSU index */ + u8 status; /* Status(present/power_good) register read from CPLD */ + char model_name[9]; /* Model name, read from eeprom */ +}; + +static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *dev); + +enum as7712_32x_psu_sysfs_attributes { + PSU_PRESENT, + PSU_MODEL_NAME, + PSU_POWER_GOOD +}; + +/* sysfs attributes for hwmon + */ +static SENSOR_DEVICE_ATTR(psu_present, S_IRUGO, show_status, NULL, PSU_PRESENT); +static SENSOR_DEVICE_ATTR(psu_model_name, S_IRUGO, show_model_name,NULL, PSU_MODEL_NAME); +static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_status, NULL, PSU_POWER_GOOD); + +static struct attribute *as7712_32x_psu_attributes[] = { + &sensor_dev_attr_psu_present.dev_attr.attr, + &sensor_dev_attr_psu_model_name.dev_attr.attr, + &sensor_dev_attr_psu_power_good.dev_attr.attr, + NULL +}; + +static ssize_t show_status(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct as7712_32x_psu_data *data = as7712_32x_psu_update_device(dev); + u8 status = 0; + + if (attr->index == PSU_PRESENT) { + status = !(data->status >> (1-data->index) & 0x1); + } + else { /* PSU_POWER_GOOD */ + status = (data->status >> (3-data->index) & 0x1); + } + + return sprintf(buf, "%d\n", status); +} + +static ssize_t show_model_name(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct as7712_32x_psu_data *data = as7712_32x_psu_update_device(dev); + + return sprintf(buf, "%s\n", data->model_name); +} + +static const struct attribute_group as7712_32x_psu_group = { + .attrs = as7712_32x_psu_attributes, +}; + +static int as7712_32x_psu_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + struct as7712_32x_psu_data *data; + int status; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) { + status = -EIO; + goto exit; + } + + data = kzalloc(sizeof(struct as7712_32x_psu_data), GFP_KERNEL); + if (!data) { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + data->valid = 0; + data->index = dev_id->driver_data; + mutex_init(&data->update_lock); + + dev_info(&client->dev, "chip found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &as7712_32x_psu_group); + if (status) { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: psu '%s'\n", + dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &as7712_32x_psu_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int as7712_32x_psu_remove(struct i2c_client *client) +{ + struct as7712_32x_psu_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &as7712_32x_psu_group); + kfree(data); + + return 0; +} + +enum psu_index +{ + as7712_32x_psu1, + as7712_32x_psu2 +}; + +static const struct i2c_device_id as7712_32x_psu_id[] = { + { "as7712_32x_psu1", as7712_32x_psu1 }, + { "as7712_32x_psu2", as7712_32x_psu2 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, as7712_32x_psu_id); + +static struct i2c_driver as7712_32x_psu_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "as7712_32x_psu", + }, + .probe = as7712_32x_psu_probe, + .remove = as7712_32x_psu_remove, + .id_table = as7712_32x_psu_id, + .address_list = normal_i2c, +}; + +static int as7712_32x_psu_read_block(struct i2c_client *client, u8 command, u8 *data, + int data_len) +{ + int result = 0; + int retry_count = 5; + + while (retry_count) { + retry_count--; + + result = i2c_smbus_read_i2c_block_data(client, command, data_len, data); + + if (unlikely(result < 0)) { + msleep(10); + continue; + } + + if (unlikely(result != data_len)) { + result = -EIO; + msleep(10); + continue; + } + + result = 0; + break; + } + + return result; +} + +static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct as7712_32x_psu_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->update_lock); + + if (time_after(jiffies, data->last_updated + HZ + HZ / 2) + || !data->valid) { + int status; + int power_good = 0; + + dev_dbg(&client->dev, "Starting as7712_32x update\n"); + + /* Read psu status */ + status = accton_i2c_cpld_read(0x60, 0x2); + + if (status < 0) { + dev_dbg(&client->dev, "cpld reg 0x60 err %d\n", status); + } + else { + data->status = status; + } + + /* Read model name */ + memset(data->model_name, 0, sizeof(data->model_name)); + power_good = (data->status >> (3-data->index) & 0x1); + + if (power_good) { + status = as7712_32x_psu_read_block(client, 0x20, data->model_name, + ARRAY_SIZE(data->model_name)-1); + + if (status < 0) { + data->model_name[0] = '\0'; + dev_dbg(&client->dev, "unable to read model name from (0x%x)\n", client->addr); + } + else { + data->model_name[ARRAY_SIZE(data->model_name)-1] = '\0'; + } + } + + data->last_updated = jiffies; + data->valid = 1; + } + + mutex_unlock(&data->update_lock); + + return data; +} + +static int __init as7712_32x_psu_init(void) +{ + extern int platform_accton_as7712_32x(void); + if (!platform_accton_as7712_32x()) { + return -ENODEV; + } + + return i2c_add_driver(&as7712_32x_psu_driver); +} + +static void __exit as7712_32x_psu_exit(void) +{ + i2c_del_driver(&as7712_32x_psu_driver); +} + +module_init(as7712_32x_psu_init); +module_exit(as7712_32x_psu_exit); + +MODULE_AUTHOR("Brandon Chuang "); +MODULE_DESCRIPTION("as7712_32x_psu driver"); +MODULE_LICENSE("GPL"); + diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_sfp.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_sfp.c new file mode 100644 index 000000000000..4366d2a6ea1d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_sfp.c @@ -0,0 +1,1083 @@ +/* + * SFP driver for accton as7712_32x sfp + * + * Copyright (C) Brandon Chuang + * + * Based on ad7414.c + * Copyright 2006 Stefan Roese , DENX Software Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_NAME "as7712_32x_sfp" + +#define DEBUG_MODE 0 + +#if (DEBUG_MODE == 1) + #define DEBUG_PRINT(fmt, args...) \ + printk (KERN_INFO "%s:%s[%d]: " fmt "\r\n", __FILE__, __FUNCTION__, __LINE__, ##args) +#else + #define DEBUG_PRINT(fmt, args...) +#endif + +#define NUM_OF_SFP_PORT 32 +#define EEPROM_NAME "sfp_eeprom" +#define EEPROM_SIZE 256 /* 256 byte eeprom */ +#define BIT_INDEX(i) (1ULL << (i)) +#define USE_I2C_BLOCK_READ 1 +#define I2C_RW_RETRY_COUNT 3 +#define I2C_RW_RETRY_INTERVAL 100 /* ms */ + +#define SFP_EEPROM_A0_I2C_ADDR (0xA0 >> 1) +#define SFP_EEPROM_A2_I2C_ADDR (0xA2 >> 1) + +#define SFF8024_PHYSICAL_DEVICE_ID_ADDR 0x0 +#define SFF8024_DEVICE_ID_SFP 0x3 +#define SFF8024_DEVICE_ID_QSFP 0xC +#define SFF8024_DEVICE_ID_QSFP_PLUS 0xD +#define SFF8024_DEVICE_ID_QSFP28 0x11 + +#define SFF8472_DIAG_MON_TYPE_ADDR 92 +#define SFF8472_DIAG_MON_TYPE_DDM_MASK 0x40 +#define SFF8472_10G_ETH_COMPLIANCE_ADDR 0x3 +#define SFF8472_10G_BASE_MASK 0xF0 + +#define SFF8436_RX_LOS_ADDR 3 +#define SFF8436_TX_FAULT_ADDR 4 +#define SFF8436_TX_DISABLE_ADDR 86 + +static ssize_t sfp_eeprom_read(struct i2c_client *, u8, u8 *,int); +static ssize_t sfp_eeprom_write(struct i2c_client *, u8 , const char *,int); +extern int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg); +extern int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); + +/* Addresses scanned + */ +static const unsigned short normal_i2c[] = { SFP_EEPROM_A0_I2C_ADDR, SFP_EEPROM_A2_I2C_ADDR, I2C_CLIENT_END }; + +#define CPLD_PORT_TO_FRONT_PORT(port) (port+1) + +enum port_numbers { +sfp1, sfp2, sfp3, sfp4, sfp5, sfp6, sfp7, sfp8, +sfp9, sfp10, sfp11, sfp12, sfp13, sfp14, sfp15, sfp16, +sfp17, sfp18, sfp19, sfp20, sfp21, sfp22, sfp23, sfp24, +sfp25, sfp26, sfp27, sfp28, sfp29, sfp30, sfp31, sfp32 +}; + +static const struct i2c_device_id sfp_device_id[] = { +{ "sfp1", sfp1 }, { "sfp2", sfp2 }, { "sfp3", sfp3 }, { "sfp4", sfp4 }, +{ "sfp5", sfp5 }, { "sfp6", sfp6 }, { "sfp7", sfp7 }, { "sfp8", sfp8 }, +{ "sfp9", sfp9 }, { "sfp10", sfp10 }, { "sfp11", sfp11 }, { "sfp12", sfp12 }, +{ "sfp13", sfp13 }, { "sfp14", sfp14 }, { "sfp15", sfp15 }, { "sfp16", sfp16 }, +{ "sfp17", sfp17 }, { "sfp18", sfp18 }, { "sfp19", sfp19 }, { "sfp20", sfp20 }, +{ "sfp21", sfp21 }, { "sfp22", sfp22 }, { "sfp23", sfp23 }, { "sfp24", sfp24 }, +{ "sfp25", sfp25 }, { "sfp26", sfp26 }, { "sfp27", sfp27 }, { "sfp28", sfp28 }, +{ "sfp29", sfp29 }, { "sfp30", sfp30 }, { "sfp31", sfp31 }, { "sfp32", sfp32 }, +{} +}; +MODULE_DEVICE_TABLE(i2c, sfp_device_id); + +/* + * list of valid port types + * note OOM_PORT_TYPE_NOT_PRESENT to indicate no + * module is present in this port + */ +typedef enum oom_driver_port_type_e { + OOM_DRIVER_PORT_TYPE_INVALID, + OOM_DRIVER_PORT_TYPE_NOT_PRESENT, + OOM_DRIVER_PORT_TYPE_SFP, + OOM_DRIVER_PORT_TYPE_SFP_PLUS, + OOM_DRIVER_PORT_TYPE_QSFP, + OOM_DRIVER_PORT_TYPE_QSFP_PLUS, + OOM_DRIVER_PORT_TYPE_QSFP28 +} oom_driver_port_type_t; + +enum driver_type_e { + DRIVER_TYPE_SFP_MSA, + DRIVER_TYPE_SFP_DDM, + DRIVER_TYPE_QSFP +}; + +/* Each client has this additional data + */ +struct eeprom_data { + char valid; /* !=0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + struct bin_attribute bin; /* eeprom data */ +}; + +struct sfp_msa_data { + char valid; /* !=0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + u64 status[2]; /* index 0 => device id + 1 => 10G Ethernet Compliance Codes + to distinguish SFP or SFP+ + 2 => DIAGNOSTIC MONITORING TYPE */ + struct eeprom_data eeprom; +}; + +struct sfp_ddm_data { + char valid; /* !=0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + u64 status[3]; /* bit0:port0, bit1:port1 and so on */ + /* index 0 => tx_fail + 1 => tx_disable + 2 => rx_loss */ + struct eeprom_data eeprom; +}; + +struct qsfp_data { + char valid; /* !=0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + u8 status[3]; /* bit0:port0, bit1:port1 and so on */ + /* index 0 => tx_fail + 1 => tx_disable + 2 => rx_loss */ + + u8 device_id; + struct eeprom_data eeprom; +}; + +struct sfp_port_data { + struct mutex update_lock; + enum driver_type_e driver_type; + int port; /* CPLD port index */ + oom_driver_port_type_t port_type; + u64 present; /* present status, bit0:port0, bit1:port1 and so on */ + + struct sfp_msa_data *msa; + struct sfp_ddm_data *ddm; + struct qsfp_data *qsfp; + + struct i2c_client *client; +}; + +enum sfp_sysfs_attributes { + PRESENT, + PRESENT_ALL, + PORT_NUMBER, + PORT_TYPE, + DDM_IMPLEMENTED, + TX_FAULT, + TX_FAULT1, + TX_FAULT2, + TX_FAULT3, + TX_FAULT4, + TX_DISABLE, + TX_DISABLE1, + TX_DISABLE2, + TX_DISABLE3, + TX_DISABLE4, + TX_DISABLE_ALL, + RX_LOS, + RX_LOS1, + RX_LOS2, + RX_LOS3, + RX_LOS4, + RX_LOS_ALL +}; + +static ssize_t show_port_number(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sfp_port_data *data = i2c_get_clientdata(client); + return sprintf(buf, "%d\n", CPLD_PORT_TO_FRONT_PORT(data->port)); +} + +static struct sfp_port_data *sfp_update_present(struct i2c_client *client) +{ + struct sfp_port_data *data = i2c_get_clientdata(client); + int i = 0; + int status = -1; + u8 regs[] = {0x30, 0x31, 0x32, 0x33}; + + DEBUG_PRINT("Starting sfp present status update"); + mutex_lock(&data->update_lock); + + /* Read present status of port 1~32 */ + data->present = 0; + + for (i = 0; i < ARRAY_SIZE(regs); i++) { + status = accton_i2c_cpld_read(0x60, regs[i]); + + if (status < 0) { + DEBUG_PRINT("cpld(0x60) reg(0x%x) err %d", regs[i], status); + goto exit; + } + + DEBUG_PRINT("Present status = 0x%lx", data->present); + data->present |= (u64)status << (i*8); + } + + DEBUG_PRINT("Present status = 0x%lx", data->present); +exit: + mutex_unlock(&data->update_lock); + return data; +} + +static struct sfp_port_data *sfp_update_tx_rx_status(struct device *dev) +{ + return NULL; +} + +static ssize_t sfp_set_tx_disable(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + return 0; +} + +static int sfp_is_port_present(struct i2c_client *client, int port) +{ + struct sfp_port_data *data = sfp_update_present(client); + return (data->present & BIT_INDEX(data->port)) ? 0 : 1; +} + +static ssize_t show_present(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sfp_port_data *data = i2c_get_clientdata(client); + + if (PRESENT_ALL == attr->index) { + + } + + /* PRESENT */ + return sprintf(buf, "%d\n", sfp_is_port_present(client, data->port)); +} + +static struct sfp_port_data *sfp_update_port_type(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sfp_port_data *data = i2c_get_clientdata(client); + u8 buf = 0; + int status; + + mutex_lock(&data->update_lock); + + switch (data->driver_type) { + case DRIVER_TYPE_SFP_MSA: + { + status = sfp_eeprom_read(data->client, SFF8024_PHYSICAL_DEVICE_ID_ADDR, &buf, sizeof(buf)); + if (status < 0) { + data->port_type = OOM_DRIVER_PORT_TYPE_INVALID; + break; + } + + if (buf != SFF8024_DEVICE_ID_SFP) { + data->port_type = OOM_DRIVER_PORT_TYPE_INVALID; + break; + } + + status = sfp_eeprom_read(data->client, SFF8472_10G_ETH_COMPLIANCE_ADDR, &buf, sizeof(buf)); + if (status < 0) { + data->port_type = OOM_DRIVER_PORT_TYPE_INVALID; + break; + } + + DEBUG_PRINT("sfp port type (0x3) data = (0x%x)", buf); + data->port_type = buf & SFF8472_10G_BASE_MASK ? OOM_DRIVER_PORT_TYPE_SFP_PLUS : OOM_DRIVER_PORT_TYPE_SFP; + break; + } + case DRIVER_TYPE_QSFP: + { + status = sfp_eeprom_read(data->client, SFF8024_PHYSICAL_DEVICE_ID_ADDR, &buf, sizeof(buf)); + if (status < 0) { + data->port_type = OOM_DRIVER_PORT_TYPE_INVALID; + break; + } + + DEBUG_PRINT("qsfp port type (0x0) buf = (0x%x)", buf); + switch (buf) { + case SFF8024_DEVICE_ID_QSFP: + data->port_type = OOM_DRIVER_PORT_TYPE_QSFP; + break; + case SFF8024_DEVICE_ID_QSFP_PLUS: + data->port_type = OOM_DRIVER_PORT_TYPE_QSFP_PLUS; + break; + case SFF8024_DEVICE_ID_QSFP28: + data->port_type = OOM_DRIVER_PORT_TYPE_QSFP_PLUS; + break; + default: + data->port_type = OOM_DRIVER_PORT_TYPE_INVALID; + break; + } + + break; + } + default: + break; + } + + mutex_unlock(&data->update_lock); + return data; +} + +static ssize_t show_port_type(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sfp_port_data *data = i2c_get_clientdata(client); + + if (!sfp_is_port_present(client, data->port)) { + return sprintf(buf, "%d\n", OOM_DRIVER_PORT_TYPE_NOT_PRESENT); + } + + sfp_update_port_type(dev); + return sprintf(buf, "%d\n", data->port_type); +} + +static struct sfp_port_data *qsfp_update_tx_rx_status(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sfp_port_data *data = i2c_get_clientdata(client); + int i, status = -1; + u8 buf = 0; + u8 reg[] = {SFF8436_TX_FAULT_ADDR, SFF8436_TX_DISABLE_ADDR, SFF8436_RX_LOS_ADDR}; + + if (time_before(jiffies, data->qsfp->last_updated + HZ + HZ / 2) && data->qsfp->valid) { + return data; + } + + dev_dbg(dev, "Starting sfp tx rx status update"); + mutex_lock(&data->update_lock); + data->qsfp->valid = 0; + memset(data->qsfp->status, 0, sizeof(data->qsfp->status)); + + /* Notify device to update tx fault/ tx disable/ rx los status */ + for (i = 0; i < ARRAY_SIZE(reg); i++) { + status = sfp_eeprom_read(data->client, reg[i], &buf, sizeof(buf)); + if (status < 0) { + goto exit; + } + } + msleep(200); + + /* Read actual tx fault/ tx disable/ rx los status */ + for (i = 0; i < ARRAY_SIZE(reg); i++) { + status = sfp_eeprom_read(data->client, reg[i], &buf, sizeof(buf)); + if (status < 0) { + goto exit; + } + + DEBUG_PRINT("qsfp reg(0x%x) status = (0x%x)", reg[i], data->qsfp->status[i]); + data->qsfp->status[i] = (buf & 0xF); + } + + data->qsfp->valid = 1; + data->qsfp->last_updated = jiffies; + mutex_unlock(&data->update_lock); + return data; + +exit: + mutex_unlock(&data->update_lock); + return NULL; +} + +static ssize_t qsfp_show_tx_rx_status(struct device *dev, struct device_attribute *da, + char *buf) +{ + u8 val = 0; + struct i2c_client *client = to_i2c_client(dev); + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct sfp_port_data *data = i2c_get_clientdata(client); + + if (!sfp_is_port_present(client, data->port)) { + return -ENODEV; + } + + data = qsfp_update_tx_rx_status(dev); + if (!data) { + return -EIO; + } + + switch (attr->index) { + case TX_FAULT1: + case TX_FAULT2: + case TX_FAULT3: + case TX_FAULT4: + val = (data->qsfp->status[2] & BIT_INDEX(attr->index - TX_FAULT1)) ? 1 : 0; + break; + case TX_DISABLE1: + case TX_DISABLE2: + case TX_DISABLE3: + case TX_DISABLE4: + val = (data->qsfp->status[1] & BIT_INDEX(attr->index - TX_DISABLE1)) ? 1 : 0; + break; + case TX_DISABLE_ALL: + val = ((data->qsfp->status[1] & 0xF) == 0xF) ? 1 : 0; + break; + + case RX_LOS1: + case RX_LOS2: + case RX_LOS3: + case RX_LOS4: + val = (data->qsfp->status[0] & BIT_INDEX(attr->index - RX_LOS1)) ? 1 : 0; + break; + default: + break; + } + + return sprintf(buf, "%d\n", val); +} + +static ssize_t qsfp_set_tx_disable(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + long disable; + int result; + struct i2c_client *client = to_i2c_client(dev); + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct sfp_port_data *data; + + result = kstrtol(buf, 10, &disable); + if (result) { + return result; + } + + data = qsfp_update_tx_rx_status(dev); + if (!data) { + return -EIO; + } + + mutex_lock(&data->update_lock); + + DEBUG_PRINT ("%s-%d: disable:%u %d==%d %u\r\n", __FUNCTION__, __LINE__, + disable, attr->index, TX_DISABLE_ALL, data->qsfp->status[1]); + + if (attr->index == TX_DISABLE_ALL) + { + data->qsfp->status[1] = disable? 0xF:0; + } + else + { + if (disable) { + data->qsfp->status[1] |= (1 << (attr->index - TX_DISABLE1)); + } + else { + data->qsfp->status[1] &= ~(1 << (attr->index - TX_DISABLE1)); + } + } + DEBUG_PRINT("index = (%d), status = (0x%x)", attr->index, data->qsfp->status[1]); + result = sfp_eeprom_write(client, SFF8436_TX_DISABLE_ADDR, &data->qsfp->status[1], sizeof(data->qsfp->status[1])); + mutex_unlock(&data->update_lock); + return count; +} + +static ssize_t sfp_show_ddm_implemented(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + char ddm; + struct i2c_client *client = to_i2c_client(dev); + struct sfp_port_data *data = i2c_get_clientdata(client); + + if (!sfp_is_port_present(client, data->port)) { + return -ENODEV; + } + + status = sfp_eeprom_read(data->client, SFF8472_DIAG_MON_TYPE_ADDR, &ddm, sizeof(ddm)); + if (status < 0) { + return -EIO; + } + + return sprintf(buf, "%d\n", (ddm & SFF8472_DIAG_MON_TYPE_DDM_MASK) ? 1 : 0); +} + +static ssize_t sfp_show_tx_rx_status(struct device *dev, struct device_attribute *da, + char *buf) +{ + u8 val = 0, index = 0; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct sfp_port_data *data; + + data = sfp_update_tx_rx_status(dev); + if (!data) { + return -EIO; + } + + switch (attr->index) { + case TX_FAULT: + index = 0; + break; + case TX_DISABLE: + index = 1; + break; + case RX_LOS: + index = 2; + break; + default: + break; + } + + val = (data->ddm->status[index] & BIT_INDEX(data->port)) ? 1 : 0; + return sprintf(buf, "%d\n", val); +} + +/* SFP/QSFP common attributes for sysfs */ +static SENSOR_DEVICE_ATTR(sfp_port_number, S_IRUGO, show_port_number, NULL, PORT_NUMBER); +static SENSOR_DEVICE_ATTR(sfp_is_present, S_IRUGO, show_present, NULL, PRESENT); +static SENSOR_DEVICE_ATTR(sfp_port_type, S_IRUGO, show_port_type, NULL, PORT_TYPE); +static SENSOR_DEVICE_ATTR(sfp_is_present_all, S_IRUGO, show_present, NULL, PRESENT); + +/* QSFP attributes for sysfs */ +static SENSOR_DEVICE_ATTR(sfp_rx_los1, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS1); +static SENSOR_DEVICE_ATTR(sfp_rx_los2, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS2); +static SENSOR_DEVICE_ATTR(sfp_rx_los3, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS3); +static SENSOR_DEVICE_ATTR(sfp_rx_los4, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS4); +static SENSOR_DEVICE_ATTR(sfp_tx_disable1, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE1); +static SENSOR_DEVICE_ATTR(sfp_tx_disable2, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE2); +static SENSOR_DEVICE_ATTR(sfp_tx_disable3, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE3); +static SENSOR_DEVICE_ATTR(sfp_tx_disable4, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE4); +static SENSOR_DEVICE_ATTR(sfp_tx_disable_all, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE_ALL); +static SENSOR_DEVICE_ATTR(sfp_tx_fault1, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT1); +static SENSOR_DEVICE_ATTR(sfp_tx_fault2, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT2); +static SENSOR_DEVICE_ATTR(sfp_tx_fault3, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT3); +static SENSOR_DEVICE_ATTR(sfp_tx_fault4, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT4); +static struct attribute *qsfp_attributes[] = { + &sensor_dev_attr_sfp_port_number.dev_attr.attr, + &sensor_dev_attr_sfp_port_type.dev_attr.attr, + &sensor_dev_attr_sfp_is_present.dev_attr.attr, + &sensor_dev_attr_sfp_rx_los1.dev_attr.attr, + &sensor_dev_attr_sfp_rx_los2.dev_attr.attr, + &sensor_dev_attr_sfp_rx_los3.dev_attr.attr, + &sensor_dev_attr_sfp_rx_los4.dev_attr.attr, + &sensor_dev_attr_sfp_tx_disable1.dev_attr.attr, + &sensor_dev_attr_sfp_tx_disable2.dev_attr.attr, + &sensor_dev_attr_sfp_tx_disable3.dev_attr.attr, + &sensor_dev_attr_sfp_tx_disable4.dev_attr.attr, + &sensor_dev_attr_sfp_tx_disable_all.dev_attr.attr, + &sensor_dev_attr_sfp_tx_fault1.dev_attr.attr, + &sensor_dev_attr_sfp_tx_fault2.dev_attr.attr, + &sensor_dev_attr_sfp_tx_fault3.dev_attr.attr, + &sensor_dev_attr_sfp_tx_fault4.dev_attr.attr, + NULL +}; + +/* SFP msa attributes for sysfs */ +static SENSOR_DEVICE_ATTR(sfp_ddm_implemented, S_IRUGO, sfp_show_ddm_implemented, NULL, DDM_IMPLEMENTED); +static struct attribute *sfp_msa_attributes[] = { + &sensor_dev_attr_sfp_port_number.dev_attr.attr, + &sensor_dev_attr_sfp_port_type.dev_attr.attr, + &sensor_dev_attr_sfp_is_present.dev_attr.attr, + &sensor_dev_attr_sfp_ddm_implemented.dev_attr.attr, + NULL +}; + +/* SFP ddm attributes for sysfs */ +static SENSOR_DEVICE_ATTR(sfp_rx_los, S_IRUGO, sfp_show_tx_rx_status, NULL, RX_LOS); +static SENSOR_DEVICE_ATTR(sfp_tx_disable, S_IWUSR | S_IRUGO, sfp_show_tx_rx_status, sfp_set_tx_disable, TX_DISABLE); +static SENSOR_DEVICE_ATTR(sfp_tx_fault, S_IRUGO, sfp_show_tx_rx_status, NULL, TX_FAULT); +static struct attribute *sfp_ddm_attributes[] = { + &sensor_dev_attr_sfp_tx_fault.dev_attr.attr, + &sensor_dev_attr_sfp_rx_los.dev_attr.attr, + &sensor_dev_attr_sfp_tx_disable.dev_attr.attr, + NULL +}; + +static ssize_t sfp_eeprom_write(struct i2c_client *client, u8 command, const char *data, + int data_len) +{ +#if USE_I2C_BLOCK_READ + int result, retry = I2C_RW_RETRY_COUNT; + + if (data_len > I2C_SMBUS_BLOCK_MAX) { + data_len = I2C_SMBUS_BLOCK_MAX; + } + + while (retry) { + result = i2c_smbus_write_i2c_block_data(client, command, data_len, data); + if (result < 0) { + msleep(I2C_RW_RETRY_INTERVAL); + retry--; + continue; + } + + break; + } + + if (unlikely(result < 0)) { + return result; + } + + return data_len; +#else + int result, retry = I2C_RW_RETRY_COUNT; + + while (retry) { + result = i2c_smbus_write_byte_data(client, command, *data); + if (result < 0) { + msleep(I2C_RW_RETRY_INTERVAL); + retry--; + continue; + } + + break; + } + + if (unlikely(result < 0)) { + return result; + } + + return 1; +#endif + + +} + + +static ssize_t sfp_port_write(struct sfp_port_data *data, + const char *buf, loff_t off, size_t count) +{ + ssize_t retval = 0; + + if (unlikely(!count)) { + return count; + } + + /* + * Write data to chip, protecting against concurrent updates + * from this host, but not from other I2C masters. + */ + mutex_lock(&data->update_lock); + + while (count) { + ssize_t status; + + status = sfp_eeprom_write(data->client, off, buf, count); + if (status <= 0) { + if (retval == 0) { + retval = status; + } + break; + } + buf += status; + off += status; + count -= status; + retval += status; + } + + mutex_unlock(&data->update_lock); + return retval; +} + + +static ssize_t sfp_bin_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct sfp_port_data *data; + DEBUG_PRINT("%s(%d) offset = (%d), count = (%d)", off, count); + data = dev_get_drvdata(container_of(kobj, struct device, kobj)); + return sfp_port_write(data, buf, off, count); +} + +static ssize_t sfp_eeprom_read(struct i2c_client *client, u8 command, u8 *data, + int data_len) +{ +#if USE_I2C_BLOCK_READ + int result, retry = I2C_RW_RETRY_COUNT; + + if (data_len > I2C_SMBUS_BLOCK_MAX) { + data_len = I2C_SMBUS_BLOCK_MAX; + } + + while (retry) { + result = i2c_smbus_read_i2c_block_data(client, command, data_len, data); + if (result < 0) { + msleep(I2C_RW_RETRY_INTERVAL); + retry--; + continue; + } + + break; + } + + if (unlikely(result < 0)) + goto abort; + if (unlikely(result != data_len)) { + result = -EIO; + goto abort; + } + + //result = data_len; + +abort: + return result; +#else + int result, retry = I2C_RW_RETRY_COUNT; + + while (retry) { + result = i2c_smbus_read_byte_data(client, command); + if (result < 0) { + msleep(I2C_RW_RETRY_INTERVAL); + retry--; + continue; + } + + break; + } + + if (unlikely(result < 0)) { + dev_dbg(&client->dev, "sfp read byte data failed, command(0x%2x), data(0x%2x)\r\n", command, result); + goto abort; + } + + *data = (u8)result; + result = 1; + +abort: + return result; +#endif +} + +static ssize_t sfp_port_read(struct sfp_port_data *data, + char *buf, loff_t off, size_t count) +{ + ssize_t retval = 0; + + if (unlikely(!count)) { + DEBUG_PRINT("Count = 0, return"); + return count; + } + + /* + * Read data from chip, protecting against concurrent updates + * from this host, but not from other I2C masters. + */ + mutex_lock(&data->update_lock); + + while (count) { + ssize_t status; + + status = sfp_eeprom_read(data->client, off, buf, count); + if (status <= 0) { + if (retval == 0) { + retval = status; + } + break; + } + + buf += status; + off += status; + count -= status; + retval += status; + } + + mutex_unlock(&data->update_lock); + return retval; + +} + +static ssize_t sfp_bin_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct sfp_port_data *data; + DEBUG_PRINT("offset = (%d), count = (%d)", off, count); + data = dev_get_drvdata(container_of(kobj, struct device, kobj)); + return sfp_port_read(data, buf, off, count); +} + +static int sfp_sysfs_eeprom_init(struct kobject *kobj, struct bin_attribute *eeprom) +{ + int err; + + sysfs_bin_attr_init(eeprom); + eeprom->attr.name = EEPROM_NAME; + eeprom->attr.mode = S_IWUSR | S_IRUGO; + eeprom->read = sfp_bin_read; + eeprom->write = sfp_bin_write; + eeprom->size = EEPROM_SIZE; + + /* Create eeprom file */ + err = sysfs_create_bin_file(kobj, eeprom); + if (err) { + return err; + } + + return 0; +} + +static int sfp_sysfs_eeprom_cleanup(struct kobject *kobj, struct bin_attribute *eeprom) +{ + sysfs_remove_bin_file(kobj, eeprom); + return 0; +} + +static const struct attribute_group sfp_msa_group = { + .attrs = sfp_msa_attributes, +}; + +static int sfp_i2c_check_functionality(struct i2c_client *client) +{ +#if USE_I2C_BLOCK_READ + return i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK); +#else + return i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA); +#endif +} + +static int sfp_msa_probe(struct i2c_client *client, const struct i2c_device_id *dev_id, + struct sfp_msa_data **data) +{ + int status; + struct sfp_msa_data *msa; + + if (!sfp_i2c_check_functionality(client)) { + status = -EIO; + goto exit; + } + + msa = kzalloc(sizeof(struct sfp_msa_data), GFP_KERNEL); + if (!msa) { + status = -ENOMEM; + goto exit; + } + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &sfp_msa_group); + if (status) { + goto exit_free; + } + + /* init eeprom */ + status = sfp_sysfs_eeprom_init(&client->dev.kobj, &msa->eeprom.bin); + if (status) { + goto exit_remove; + } + + *data = msa; + dev_info(&client->dev, "sfp msa '%s'\n", client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &sfp_msa_group); +exit_free: + kfree(msa); +exit: + + return status; +} + +static const struct attribute_group sfp_ddm_group = { + .attrs = sfp_ddm_attributes, +}; + +static int sfp_ddm_probe(struct i2c_client *client, const struct i2c_device_id *dev_id, + struct sfp_ddm_data **data) +{ + int status; + struct sfp_ddm_data *ddm; + + if (!sfp_i2c_check_functionality(client)) { + status = -EIO; + goto exit; + } + + ddm = kzalloc(sizeof(struct sfp_ddm_data), GFP_KERNEL); + if (!ddm) { + status = -ENOMEM; + goto exit; + } + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &sfp_ddm_group); + if (status) { + goto exit_free; + } + + /* init eeprom */ + status = sfp_sysfs_eeprom_init(&client->dev.kobj, &ddm->eeprom.bin); + if (status) { + goto exit_remove; + } + + *data = ddm; + dev_info(&client->dev, "sfp ddm '%s'\n", client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &sfp_ddm_group); +exit_free: + kfree(ddm); +exit: + + return status; +} + +static const struct attribute_group qsfp_group = { + .attrs = qsfp_attributes, +}; + +static int qsfp_probe(struct i2c_client *client, const struct i2c_device_id *dev_id, + struct qsfp_data **data) +{ + int status; + struct qsfp_data *qsfp; + + if (!sfp_i2c_check_functionality(client)) { + status = -EIO; + goto exit; + } + + qsfp = kzalloc(sizeof(struct qsfp_data), GFP_KERNEL); + if (!qsfp) { + status = -ENOMEM; + goto exit; + } + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &qsfp_group); + if (status) { + goto exit_free; + } + + /* init eeprom */ + status = sfp_sysfs_eeprom_init(&client->dev.kobj, &qsfp->eeprom.bin); + if (status) { + goto exit_remove; + } + + /* Bring QSFPs out of reset + as6712_32x_i2c_cpld_write(0x62, 0x4, 0xFF); + as6712_32x_i2c_cpld_write(0x62, 0x5, 0xFF); + as6712_32x_i2c_cpld_write(0x64, 0x4, 0xFF); + as6712_32x_i2c_cpld_write(0x64, 0x5, 0xFF);*/ + + *data = qsfp; + dev_info(&client->dev, "qsfp '%s'\n", client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &qsfp_group); +exit_free: + kfree(qsfp); +exit: + + return status; +} + +static int sfp_device_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + struct sfp_port_data *data = NULL; + + data = kzalloc(sizeof(struct sfp_port_data), GFP_KERNEL); + if (!data) { + return -ENOMEM; + } + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + data->port = dev_id->driver_data; + data->client = client; + + if (client->addr != SFP_EEPROM_A0_I2C_ADDR) { + return -ENODEV; + } + + data->driver_type = DRIVER_TYPE_QSFP; + return qsfp_probe(client, dev_id, &data->qsfp); +} + +static int sfp_msa_remove(struct i2c_client *client, struct sfp_msa_data *data) +{ + sfp_sysfs_eeprom_cleanup(&client->dev.kobj, &data->eeprom.bin); + sysfs_remove_group(&client->dev.kobj, &sfp_msa_group); + kfree(data); + return 0; +} + +static int sfp_ddm_remove(struct i2c_client *client, struct sfp_ddm_data *data) +{ + sfp_sysfs_eeprom_cleanup(&client->dev.kobj, &data->eeprom.bin); + sysfs_remove_group(&client->dev.kobj, &sfp_ddm_group); + kfree(data); + return 0; +} + +static int qfp_remove(struct i2c_client *client, struct qsfp_data *data) +{ + sfp_sysfs_eeprom_cleanup(&client->dev.kobj, &data->eeprom.bin); + sysfs_remove_group(&client->dev.kobj, &qsfp_group); + kfree(data); + return 0; +} + +static int sfp_device_remove(struct i2c_client *client) +{ + struct sfp_port_data *data = i2c_get_clientdata(client); + + switch (data->driver_type) { + case DRIVER_TYPE_SFP_MSA: + return sfp_msa_remove(client, data->msa); + case DRIVER_TYPE_SFP_DDM: + return sfp_ddm_remove(client, data->ddm); + case DRIVER_TYPE_QSFP: + return qfp_remove(client, data->qsfp); + } + + return 0; +} + +static struct i2c_driver sfp_driver = { + .driver = { + .name = DRIVER_NAME, + }, + .probe = sfp_device_probe, + .remove = sfp_device_remove, + .id_table = sfp_device_id, + .address_list = normal_i2c, +}; + +static int __init sfp_init(void) +{ + extern int platform_accton_as7712_32x(void); + if (!platform_accton_as7712_32x()) { + return -ENODEV; + } + + return i2c_add_driver(&sfp_driver); +} + +static void __exit sfp_exit(void) +{ + i2c_del_driver(&sfp_driver); +} + +MODULE_AUTHOR("Brandon Chuang "); +MODULE_DESCRIPTION("accton as7712_32x_sfp driver"); +MODULE_LICENSE("GPL"); + +module_init(sfp_init); +module_exit(sfp_exit); + diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_i2c_cpld.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_i2c_cpld.c new file mode 100644 index 000000000000..b25bf1c2aff4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_i2c_cpld.c @@ -0,0 +1,259 @@ +/* + * A hwmon driver for the accton_i2c_cpld + * + * Copyright (C) 2014 Accton Technology Corporation. + * Brandon Chuang + * + * Based on ad7414.c + * Copyright 2006 Stefan Roese , DENX Software Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CPLD_VERSION_REG 0x1 + +enum as5712_54x_cpld_sysfs_attributes { + CPLD_READ_VERSION, + CPLD_BYTE_ACCESS, + CPLD_DUMP_ALL, +}; + +static ssize_t read_cpld_version(struct device *dev, struct device_attribute *da, + char *buf); +int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg); + + +static LIST_HEAD(cpld_client_list); +static struct mutex list_lock; + +struct cpld_client_node { + struct i2c_client *client; + struct list_head list; +}; + +/* Addresses scanned for accton_i2c_cpld + */ +static const unsigned short normal_i2c[] = { 0x31, 0x35, 0x60, 0x61, 0x62, I2C_CLIENT_END }; + +static SENSOR_DEVICE_ATTR(cpld_get_version, S_IRUGO, read_cpld_version, NULL, CPLD_READ_VERSION); + +static struct attribute *as5712_54x_cpld_attributes[] = { + &sensor_dev_attr_cpld_get_version.dev_attr.attr, + NULL +}; + +static const struct attribute_group as5712_54x_cpld_group = { + .attrs = as5712_54x_cpld_attributes, +}; + +static ssize_t read_cpld_version(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + unsigned short cpld_reg = CPLD_VERSION_REG; + u8 reg; + + if(attr->index == CPLD_READ_VERSION) { + reg = accton_i2c_cpld_read(client->addr, cpld_reg); + return sprintf(buf, "%02x\n",reg); + } + return -1 ; +} + + +static void accton_i2c_cpld_add_client(struct i2c_client *client) +{ + struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); + + if (!node) { + dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr); + return; + } + + node->client = client; + + mutex_lock(&list_lock); + list_add(&node->list, &cpld_client_list); + mutex_unlock(&list_lock); +} + +static void accton_i2c_cpld_remove_client(struct i2c_client *client) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int found = 0; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client == client) { + found = 1; + break; + } + } + + if (found) { + list_del(list_node); + kfree(cpld_node); + } + + mutex_unlock(&list_lock); +} + +static int accton_i2c_cpld_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + int status; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { + dev_dbg(&client->dev, "i2c_check_functionality failed (0x%x)\n", client->addr); + status = -EIO; + goto exit; + } + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &as5712_54x_cpld_group); + if (status) { + goto exit; + } + + dev_info(&client->dev, "chip found\n"); + accton_i2c_cpld_add_client(client); + + return 0; +exit: + return status; +} + +static int accton_i2c_cpld_remove(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &as5712_54x_cpld_group); + + accton_i2c_cpld_remove_client(client); + return 0; +} + +static const struct i2c_device_id accton_i2c_cpld_id[] = { + { "accton_i2c_cpld", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, accton_i2c_cpld_id); + +static struct i2c_driver accton_i2c_cpld_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "accton_i2c_cpld", + }, + .probe = accton_i2c_cpld_probe, + .remove = accton_i2c_cpld_remove, + .id_table = accton_i2c_cpld_id, + .address_list = normal_i2c, +}; + +int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EPERM; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == cpld_addr) { + ret = i2c_smbus_read_byte_data(cpld_node->client, reg); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(accton_i2c_cpld_read); + +int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == cpld_addr) { + ret = i2c_smbus_write_byte_data(cpld_node->client, reg, value); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(accton_i2c_cpld_write); + +static int __init accton_i2c_cpld_init(void) +{ + mutex_init(&list_lock); + return i2c_add_driver(&accton_i2c_cpld_driver); +} + +static void __exit accton_i2c_cpld_exit(void) +{ + i2c_del_driver(&accton_i2c_cpld_driver); +} + +static struct dmi_system_id as7712_dmi_table[] = { + { + .ident = "Accton AS7712", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Accton"), + DMI_MATCH(DMI_PRODUCT_NAME, "AS7712"), + }, + } +}; + +int platform_accton_as7712_32x(void) +{ + return dmi_check_system(as7712_dmi_table); +} +EXPORT_SYMBOL(platform_accton_as7712_32x); + +MODULE_AUTHOR("Brandon Chuang "); +MODULE_DESCRIPTION("accton_i2c_cpld driver"); +MODULE_LICENSE("GPL"); + +module_init(accton_i2c_cpld_init); +module_exit(accton_i2c_cpld_exit); diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/leds-accton_as7712_32x.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/leds-accton_as7712_32x.c new file mode 100644 index 000000000000..8b14437bca35 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/leds-accton_as7712_32x.c @@ -0,0 +1,443 @@ +/* + * A LED driver for the accton_as7712_32x_led + * + * Copyright (C) 2014 Accton Technology Corporation. + * Brandon Chuang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/*#define DEBUG*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +extern int accton_i2c_cpld_read (unsigned short cpld_addr, u8 reg); +extern int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); + +extern void led_classdev_unregister(struct led_classdev *led_cdev); +extern int led_classdev_register(struct device *parent, struct led_classdev *led_cdev); +extern void led_classdev_resume(struct led_classdev *led_cdev); +extern void led_classdev_suspend(struct led_classdev *led_cdev); + +#define DRVNAME "accton_as7712_32x_led" + +struct accton_as7712_32x_led_data { + struct platform_device *pdev; + struct mutex update_lock; + char valid; /* != 0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + u8 reg_val[1]; /* only 1 register*/ +}; + +static struct accton_as7712_32x_led_data *ledctl = NULL; + +/* LED related data + */ + +#define LED_CNTRLER_I2C_ADDRESS (0x60) + +#define LED_TYPE_DIAG_REG_MASK (0x3) +#define LED_MODE_DIAG_GREEN_VALUE (0x02) +#define LED_MODE_DIAG_RED_VALUE (0x01) +#define LED_MODE_DIAG_AMBER_VALUE (0x00) /*It's yellow actually. Green+Red=Yellow*/ +#define LED_MODE_DIAG_OFF_VALUE (0x03) + + +#define LED_TYPE_LOC_REG_MASK (0x80) +#define LED_MODE_LOC_ON_VALUE (0) +#define LED_MODE_LOC_OFF_VALUE (0x80) + +enum led_type { + LED_TYPE_DIAG, + LED_TYPE_LOC, + LED_TYPE_FAN, + LED_TYPE_PSU1, + LED_TYPE_PSU2 +}; + +struct led_reg { + u32 types; + u8 reg_addr; +}; + +static const struct led_reg led_reg_map[] = { + {(1<update_lock); + + if (time_after(jiffies, ledctl->last_updated + HZ + HZ / 2) + || !ledctl->valid) { + int i; + + dev_dbg(&ledctl->pdev->dev, "Starting accton_as7712_32x_led update\n"); + + /* Update LED data + */ + for (i = 0; i < ARRAY_SIZE(ledctl->reg_val); i++) { + int status = accton_as7712_32x_led_read_value(led_reg_map[i].reg_addr); + + if (status < 0) { + ledctl->valid = 0; + dev_dbg(&ledctl->pdev->dev, "reg %d, err %d\n", led_reg_map[i].reg_addr, status); + goto exit; + } + else + { + ledctl->reg_val[i] = status; + } + } + + ledctl->last_updated = jiffies; + ledctl->valid = 1; + } + +exit: + mutex_unlock(&ledctl->update_lock); +} + +static void accton_as7712_32x_led_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode, + enum led_type type) +{ + int reg_val; + u8 reg ; + mutex_lock(&ledctl->update_lock); + + if( !accton_getLedReg(type, ®)) + { + dev_dbg(&ledctl->pdev->dev, "Not match item for %d.\n", type); + } + + reg_val = accton_as7712_32x_led_read_value(reg); + + if (reg_val < 0) { + dev_dbg(&ledctl->pdev->dev, "reg %d, err %d\n", reg, reg_val); + goto exit; + } + reg_val = led_light_mode_to_reg_val(type, led_light_mode, reg_val); + accton_as7712_32x_led_write_value(reg, reg_val); + + /* to prevent the slow-update issue */ + ledctl->valid = 0; + +exit: + mutex_unlock(&ledctl->update_lock); +} + + +static void accton_as7712_32x_led_diag_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + accton_as7712_32x_led_set(led_cdev, led_light_mode, LED_TYPE_DIAG); +} + +static enum led_brightness accton_as7712_32x_led_diag_get(struct led_classdev *cdev) +{ + accton_as7712_32x_led_update(); + return led_reg_val_to_light_mode(LED_TYPE_DIAG, ledctl->reg_val[0]); +} + +static void accton_as7712_32x_led_loc_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + accton_as7712_32x_led_set(led_cdev, led_light_mode, LED_TYPE_LOC); +} + +static enum led_brightness accton_as7712_32x_led_loc_get(struct led_classdev *cdev) +{ + accton_as7712_32x_led_update(); + return led_reg_val_to_light_mode(LED_TYPE_LOC, ledctl->reg_val[0]); +} + +static void accton_as7712_32x_led_auto_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ +} + +static enum led_brightness accton_as7712_32x_led_auto_get(struct led_classdev *cdev) +{ + return LED_MODE_AUTO; +} + +static struct led_classdev accton_as7712_32x_leds[] = { + [LED_TYPE_DIAG] = { + .name = "accton_as7712_32x_led::diag", + .default_trigger = "unused", + .brightness_set = accton_as7712_32x_led_diag_set, + .brightness_get = accton_as7712_32x_led_diag_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_RED, + }, + [LED_TYPE_LOC] = { + .name = "accton_as7712_32x_led::loc", + .default_trigger = "unused", + .brightness_set = accton_as7712_32x_led_loc_set, + .brightness_get = accton_as7712_32x_led_loc_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_BLUE, + }, + [LED_TYPE_FAN] = { + .name = "accton_as7712_32x_led::fan", + .default_trigger = "unused", + .brightness_set = accton_as7712_32x_led_auto_set, + .brightness_get = accton_as7712_32x_led_auto_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AUTO, + }, + [LED_TYPE_PSU1] = { + .name = "accton_as7712_32x_led::psu1", + .default_trigger = "unused", + .brightness_set = accton_as7712_32x_led_auto_set, + .brightness_get = accton_as7712_32x_led_auto_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AUTO, + }, + [LED_TYPE_PSU2] = { + .name = "accton_as7712_32x_led::psu2", + .default_trigger = "unused", + .brightness_set = accton_as7712_32x_led_auto_set, + .brightness_get = accton_as7712_32x_led_auto_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AUTO, + }, +}; + +static int accton_as7712_32x_led_suspend(struct platform_device *dev, + pm_message_t state) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(accton_as7712_32x_leds); i++) { + led_classdev_suspend(&accton_as7712_32x_leds[i]); + } + + return 0; +} + +static int accton_as7712_32x_led_resume(struct platform_device *dev) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(accton_as7712_32x_leds); i++) { + led_classdev_resume(&accton_as7712_32x_leds[i]); + } + + return 0; +} + +static int accton_as7712_32x_led_probe(struct platform_device *pdev) +{ + int ret, i; + + for (i = 0; i < ARRAY_SIZE(accton_as7712_32x_leds); i++) { + ret = led_classdev_register(&pdev->dev, &accton_as7712_32x_leds[i]); + + if (ret < 0) + break; + } + + /* Check if all LEDs were successfully registered */ + if (i != ARRAY_SIZE(accton_as7712_32x_leds)){ + int j; + + /* only unregister the LEDs that were successfully registered */ + for (j = 0; j < i; j++) { + led_classdev_unregister(&accton_as7712_32x_leds[i]); + } + } + + return ret; +} + +static int accton_as7712_32x_led_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(accton_as7712_32x_leds); i++) { + led_classdev_unregister(&accton_as7712_32x_leds[i]); + } + + return 0; +} + +static struct platform_driver accton_as7712_32x_led_driver = { + .probe = accton_as7712_32x_led_probe, + .remove = accton_as7712_32x_led_remove, + .suspend = accton_as7712_32x_led_suspend, + .resume = accton_as7712_32x_led_resume, + .driver = { + .name = DRVNAME, + .owner = THIS_MODULE, + }, +}; + +static int __init accton_as7712_32x_led_init(void) +{ + int ret; + + extern int platform_accton_as7712_32x(void); + if (!platform_accton_as7712_32x()) { + return -ENODEV; + } + + ret = platform_driver_register(&accton_as7712_32x_led_driver); + if (ret < 0) { + goto exit; + } + + ledctl = kzalloc(sizeof(struct accton_as7712_32x_led_data), GFP_KERNEL); + if (!ledctl) { + ret = -ENOMEM; + platform_driver_unregister(&accton_as7712_32x_led_driver); + goto exit; + } + + mutex_init(&ledctl->update_lock); + + ledctl->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); + if (IS_ERR(ledctl->pdev)) { + ret = PTR_ERR(ledctl->pdev); + platform_driver_unregister(&accton_as7712_32x_led_driver); + kfree(ledctl); + goto exit; + } + +exit: + return ret; +} + +static void __exit accton_as7712_32x_led_exit(void) +{ + platform_device_unregister(ledctl->pdev); + platform_driver_unregister(&accton_as7712_32x_led_driver); + kfree(ledctl); +} + +module_init(accton_as7712_32x_led_init); +module_exit(accton_as7712_32x_led_exit); + +MODULE_AUTHOR("Brandon Chuang "); +MODULE_DESCRIPTION("accton_as7712_32x_led driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/ym2651y.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/ym2651y.c new file mode 100644 index 000000000000..2745b095b7e2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/ym2651y.c @@ -0,0 +1,589 @@ +/* + * An hwmon driver for the 3Y Power YM-2651Y Power Module + * + * Copyright (C) 2014 Accton Technology Corporation. + * Brandon Chuang + * + * Based on ad7414.c + * Copyright 2006 Stefan Roese , DENX Software Engineering + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_FAN_DUTY_CYCLE 100 + +/* Addresses scanned + */ +static const unsigned short normal_i2c[] = { 0x58, 0x5b, I2C_CLIENT_END }; + +/* Each client has this additional data + */ +struct ym2651y_data { + struct device *hwmon_dev; + struct mutex update_lock; + char valid; /* !=0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + u8 capability; /* Register value */ + u16 status_word; /* Register value */ + u8 fan_fault; /* Register value */ + u8 over_temp; /* Register value */ + u16 v_out; /* Register value */ + u16 i_out; /* Register value */ + u16 p_out; /* Register value */ + u16 temp; /* Register value */ + u16 fan_speed; /* Register value */ + u16 fan_duty_cycle[2]; /* Register value */ + u8 fan_dir[4]; /* Register value */ + u8 pmbus_revision; /* Register value */ + u8 mfr_id[10]; /* Register value */ + u8 mfr_model[10]; /* Register value */ + u8 mfr_revsion[3]; /* Register value */ + u16 mfr_vin_min; /* Register value */ + u16 mfr_vin_max; /* Register value */ + u16 mfr_iin_max; /* Register value */ + u16 mfr_iout_max; /* Register value */ + u16 mfr_pin_max; /* Register value */ + u16 mfr_pout_max; /* Register value */ + u16 mfr_vout_min; /* Register value */ + u16 mfr_vout_max; /* Register value */ +}; + +static ssize_t show_byte(struct device *dev, struct device_attribute *da, + char *buf); +static ssize_t show_word(struct device *dev, struct device_attribute *da, + char *buf); +static ssize_t show_linear(struct device *dev, struct device_attribute *da, + char *buf); +static ssize_t show_fan_fault(struct device *dev, struct device_attribute *da, + char *buf); +static ssize_t show_over_temp(struct device *dev, struct device_attribute *da, + char *buf); +static ssize_t show_ascii(struct device *dev, struct device_attribute *da, + char *buf); +static struct ym2651y_data *ym2651y_update_device(struct device *dev); +static ssize_t set_fan_duty_cycle(struct device *dev, struct device_attribute *da, + const char *buf, size_t count); +static int ym2651y_write_word(struct i2c_client *client, u8 reg, u16 value); + +enum ym2651y_sysfs_attributes { + PSU_POWER_ON = 0, + PSU_TEMP_FAULT, + PSU_POWER_GOOD, + PSU_FAN1_FAULT, + PSU_FAN_DIRECTION, + PSU_OVER_TEMP, + PSU_V_OUT, + PSU_I_OUT, + PSU_P_OUT, + PSU_TEMP1_INPUT, + PSU_FAN1_SPEED, + PSU_FAN1_DUTY_CYCLE, + PSU_PMBUS_REVISION, + PSU_MFR_ID, + PSU_MFR_MODEL, + PSU_MFR_REVISION, + PSU_MFR_VIN_MIN, + PSU_MFR_VIN_MAX, + PSU_MFR_VOUT_MIN, + PSU_MFR_VOUT_MAX, + PSU_MFR_IIN_MAX, + PSU_MFR_IOUT_MAX, + PSU_MFR_PIN_MAX, + PSU_MFR_POUT_MAX +}; + +/* sysfs attributes for hwmon + */ +static SENSOR_DEVICE_ATTR(psu_power_on, S_IRUGO, show_word, NULL, PSU_POWER_ON); +static SENSOR_DEVICE_ATTR(psu_temp_fault, S_IRUGO, show_word, NULL, PSU_TEMP_FAULT); +static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_word, NULL, PSU_POWER_GOOD); +static SENSOR_DEVICE_ATTR(psu_fan1_fault, S_IRUGO, show_fan_fault, NULL, PSU_FAN1_FAULT); +static SENSOR_DEVICE_ATTR(psu_over_temp, S_IRUGO, show_over_temp, NULL, PSU_OVER_TEMP); +static SENSOR_DEVICE_ATTR(psu_v_out, S_IRUGO, show_linear, NULL, PSU_V_OUT); +static SENSOR_DEVICE_ATTR(psu_i_out, S_IRUGO, show_linear, NULL, PSU_I_OUT); +static SENSOR_DEVICE_ATTR(psu_p_out, S_IRUGO, show_linear, NULL, PSU_P_OUT); +static SENSOR_DEVICE_ATTR(psu_temp1_input, S_IRUGO, show_linear, NULL, PSU_TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(psu_fan1_speed_rpm, S_IRUGO, show_linear, NULL, PSU_FAN1_SPEED); +static SENSOR_DEVICE_ATTR(psu_fan1_duty_cycle_percentage, S_IWUSR | S_IRUGO, show_linear, set_fan_duty_cycle, PSU_FAN1_DUTY_CYCLE); +static SENSOR_DEVICE_ATTR(psu_fan_dir, S_IRUGO, show_ascii, NULL, PSU_FAN_DIRECTION); +static SENSOR_DEVICE_ATTR(psu_pmbus_revision, S_IRUGO, show_byte, NULL, PSU_PMBUS_REVISION); +static SENSOR_DEVICE_ATTR(psu_mfr_id, S_IRUGO, show_ascii, NULL, PSU_MFR_ID); +static SENSOR_DEVICE_ATTR(psu_mfr_model, S_IRUGO, show_ascii, NULL, PSU_MFR_MODEL); +static SENSOR_DEVICE_ATTR(psu_mfr_revision, S_IRUGO, show_ascii, NULL, PSU_MFR_REVISION); +static SENSOR_DEVICE_ATTR(psu_mfr_vin_min, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MIN); +static SENSOR_DEVICE_ATTR(psu_mfr_vin_max, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MAX); +static SENSOR_DEVICE_ATTR(psu_mfr_vout_min, S_IRUGO, show_linear, NULL, PSU_MFR_VOUT_MIN); +static SENSOR_DEVICE_ATTR(psu_mfr_vout_max, S_IRUGO, show_linear, NULL, PSU_MFR_VOUT_MAX); +static SENSOR_DEVICE_ATTR(psu_mfr_iin_max, S_IRUGO, show_linear, NULL, PSU_MFR_IIN_MAX); +static SENSOR_DEVICE_ATTR(psu_mfr_iout_max, S_IRUGO, show_linear, NULL, PSU_MFR_IOUT_MAX); +static SENSOR_DEVICE_ATTR(psu_mfr_pin_max, S_IRUGO, show_linear, NULL, PSU_MFR_PIN_MAX); +static SENSOR_DEVICE_ATTR(psu_mfr_pout_max, S_IRUGO, show_linear, NULL, PSU_MFR_POUT_MAX); + +static struct attribute *ym2651y_attributes[] = { + &sensor_dev_attr_psu_power_on.dev_attr.attr, + &sensor_dev_attr_psu_temp_fault.dev_attr.attr, + &sensor_dev_attr_psu_power_good.dev_attr.attr, + &sensor_dev_attr_psu_fan1_fault.dev_attr.attr, + &sensor_dev_attr_psu_over_temp.dev_attr.attr, + &sensor_dev_attr_psu_v_out.dev_attr.attr, + &sensor_dev_attr_psu_i_out.dev_attr.attr, + &sensor_dev_attr_psu_p_out.dev_attr.attr, + &sensor_dev_attr_psu_temp1_input.dev_attr.attr, + &sensor_dev_attr_psu_fan1_speed_rpm.dev_attr.attr, + &sensor_dev_attr_psu_fan1_duty_cycle_percentage.dev_attr.attr, + &sensor_dev_attr_psu_fan_dir.dev_attr.attr, + &sensor_dev_attr_psu_pmbus_revision.dev_attr.attr, + &sensor_dev_attr_psu_mfr_id.dev_attr.attr, + &sensor_dev_attr_psu_mfr_model.dev_attr.attr, + &sensor_dev_attr_psu_mfr_revision.dev_attr.attr, + &sensor_dev_attr_psu_mfr_vin_min.dev_attr.attr, + &sensor_dev_attr_psu_mfr_vin_max.dev_attr.attr, + &sensor_dev_attr_psu_mfr_pout_max.dev_attr.attr, + &sensor_dev_attr_psu_mfr_iin_max.dev_attr.attr, + &sensor_dev_attr_psu_mfr_pin_max.dev_attr.attr, + &sensor_dev_attr_psu_mfr_vout_min.dev_attr.attr, + &sensor_dev_attr_psu_mfr_vout_max.dev_attr.attr, + &sensor_dev_attr_psu_mfr_iout_max.dev_attr.attr, + NULL +}; + +static ssize_t show_byte(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct ym2651y_data *data = ym2651y_update_device(dev); + + return (attr->index == PSU_PMBUS_REVISION) ? sprintf(buf, "%d\n", data->pmbus_revision) : + sprintf(buf, "0\n"); +} + +static ssize_t show_word(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct ym2651y_data *data = ym2651y_update_device(dev); + u16 status = 0; + + switch (attr->index) { + case PSU_POWER_ON: /* psu_power_on, low byte bit 6 of status_word, 0=>ON, 1=>OFF */ + status = (data->status_word & 0x40) ? 0 : 1; + break; + case PSU_TEMP_FAULT: /* psu_temp_fault, low byte bit 2 of status_word, 0=>Normal, 1=>temp fault */ + status = (data->status_word & 0x4) >> 2; + break; + case PSU_POWER_GOOD: /* psu_power_good, high byte bit 3 of status_word, 0=>OK, 1=>FAIL */ + status = (data->status_word & 0x800) ? 0 : 1; + break; + } + + return sprintf(buf, "%d\n", status); +} + +static int two_complement_to_int(u16 data, u8 valid_bit, int mask) +{ + u16 valid_data = data & mask; + bool is_negative = valid_data >> (valid_bit - 1); + + return is_negative ? (-(((~valid_data) & mask) + 1)) : valid_data; +} + +static ssize_t set_fan_duty_cycle(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct ym2651y_data *data = i2c_get_clientdata(client); + int nr = (attr->index == PSU_FAN1_DUTY_CYCLE) ? 0 : 1; + long speed; + int error; + + error = kstrtol(buf, 10, &speed); + if (error) + return error; + + if (speed < 0 || speed > MAX_FAN_DUTY_CYCLE) + return -EINVAL; + + mutex_lock(&data->update_lock); + data->fan_duty_cycle[nr] = speed; + ym2651y_write_word(client, 0x3B + nr, data->fan_duty_cycle[nr]); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_linear(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct ym2651y_data *data = ym2651y_update_device(dev); + + u16 value = 0; + int exponent, mantissa; + int multiplier = 1000; + + switch (attr->index) { + case PSU_V_OUT: + value = data->v_out; + break; + case PSU_I_OUT: + value = data->i_out; + break; + case PSU_P_OUT: + value = data->p_out; + break; + case PSU_TEMP1_INPUT: + value = data->temp; + break; + case PSU_FAN1_SPEED: + value = data->fan_speed; + multiplier = 1; + break; + case PSU_FAN1_DUTY_CYCLE: + value = data->fan_duty_cycle[0]; + multiplier = 1; + break; + case PSU_MFR_VIN_MIN: + value = data->mfr_vin_min; + break; + case PSU_MFR_VIN_MAX: + value = data->mfr_vin_max; + break; + case PSU_MFR_VOUT_MIN: + value = data->mfr_vout_min; + break; + case PSU_MFR_VOUT_MAX: + value = data->mfr_vout_max; + break; + case PSU_MFR_PIN_MAX: + value = data->mfr_pin_max; + break; + case PSU_MFR_POUT_MAX: + value = data->mfr_pout_max; + break; + case PSU_MFR_IOUT_MAX: + value = data->mfr_iout_max; + break; + case PSU_MFR_IIN_MAX: + value = data->mfr_iin_max; + break; + } + + exponent = two_complement_to_int(value >> 11, 5, 0x1f); + mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); + + return (exponent >= 0) ? sprintf(buf, "%d\n", (mantissa << exponent) * multiplier) : + sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); +} + +static ssize_t show_fan_fault(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct ym2651y_data *data = ym2651y_update_device(dev); + + u8 shift = (attr->index == PSU_FAN1_FAULT) ? 7 : 6; + + return sprintf(buf, "%d\n", data->fan_fault >> shift); +} + +static ssize_t show_over_temp(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct ym2651y_data *data = ym2651y_update_device(dev); + + return sprintf(buf, "%d\n", data->over_temp >> 7); +} + +static ssize_t show_ascii(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct ym2651y_data *data = ym2651y_update_device(dev); + u8 *ptr = NULL; + + switch (attr->index) { + case PSU_FAN_DIRECTION: /* psu_fan_dir */ + ptr = data->fan_dir; + break; + case PSU_MFR_ID: /* psu_mfr_id */ + ptr = data->mfr_id; + break; + case PSU_MFR_MODEL: /* psu_mfr_model */ + ptr = data->mfr_model; + break; + case PSU_MFR_REVISION: /* psu_mfr_revision */ + ptr = data->mfr_revsion; + break; + default: + return 0; + } + + return sprintf(buf, "%s\n", ptr); +} + +static const struct attribute_group ym2651y_group = { + .attrs = ym2651y_attributes, +}; + +static int ym2651y_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + struct ym2651y_data *data; + int status; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA | + I2C_FUNC_SMBUS_I2C_BLOCK)) { + status = -EIO; + goto exit; + } + + data = kzalloc(sizeof(struct ym2651y_data), GFP_KERNEL); + if (!data) { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + dev_info(&client->dev, "chip found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &ym2651y_group); + if (status) { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: psu '%s'\n", + dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &ym2651y_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int ym2651y_remove(struct i2c_client *client) +{ + struct ym2651y_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &ym2651y_group); + kfree(data); + + return 0; +} + +static const struct i2c_device_id ym2651y_id[] = { + { "ym2651", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, ym2651y_id); + +static struct i2c_driver ym2651y_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "ym2651", + }, + .probe = ym2651y_probe, + .remove = ym2651y_remove, + .id_table = ym2651y_id, + .address_list = normal_i2c, +}; + +static int ym2651y_read_byte(struct i2c_client *client, u8 reg) +{ + return i2c_smbus_read_byte_data(client, reg); +} + +static int ym2651y_read_word(struct i2c_client *client, u8 reg) +{ + return i2c_smbus_read_word_data(client, reg); +} + +static int ym2651y_write_word(struct i2c_client *client, u8 reg, u16 value) +{ + return i2c_smbus_write_word_data(client, reg, value); +} + +static int ym2651y_read_block(struct i2c_client *client, u8 command, u8 *data, + int data_len) +{ + int result = i2c_smbus_read_i2c_block_data(client, command, data_len, data); + + if (unlikely(result < 0)) + goto abort; + if (unlikely(result != data_len)) { + result = -EIO; + goto abort; + } + + result = 0; + +abort: + return result; +} + +struct reg_data_byte { + u8 reg; + u8 *value; +}; + +struct reg_data_word { + u8 reg; + u16 *value; +}; + +static struct ym2651y_data *ym2651y_update_device(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ym2651y_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->update_lock); + + if (time_after(jiffies, data->last_updated + HZ + HZ / 2) + || !data->valid) { + int i, status; + u8 command; + u8 fan_dir[5] = {0}; + struct reg_data_byte regs_byte[] = { {0x19, &data->capability}, + {0x7d, &data->over_temp}, + {0x81, &data->fan_fault}, + {0x98, &data->pmbus_revision}}; + struct reg_data_word regs_word[] = { {0x79, &data->status_word}, + {0x8b, &data->v_out}, + {0x8c, &data->i_out}, + {0x96, &data->p_out}, + {0x8d, &data->temp}, + {0x3b, &(data->fan_duty_cycle[0])}, + {0x3c, &(data->fan_duty_cycle[1])}, + {0x90, &data->fan_speed}, + {0xa0, &data->mfr_vin_min}, + {0xa1, &data->mfr_vin_max}, + {0xa2, &data->mfr_iin_max}, + {0xa3, &data->mfr_pin_max}, + {0xa4, &data->mfr_vout_min}, + {0xa5, &data->mfr_vout_max}, + {0xa6, &data->mfr_iout_max}, + {0xa7, &data->mfr_pout_max}}; + + dev_dbg(&client->dev, "Starting ym2651 update\n"); + + /* Read byte data */ + for (i = 0; i < ARRAY_SIZE(regs_byte); i++) { + status = ym2651y_read_byte(client, regs_byte[i].reg); + + if (status < 0) + { + dev_dbg(&client->dev, "reg %d, err %d\n", + regs_byte[i].reg, status); + } + else { + *(regs_byte[i].value) = status; + } + } + + /* Read word data */ + for (i = 0; i < ARRAY_SIZE(regs_word); i++) { + status = ym2651y_read_word(client, regs_word[i].reg); + + if (status < 0) + { + dev_dbg(&client->dev, "reg %d, err %d\n", + regs_word[i].reg, status); + } + else { + *(regs_word[i].value) = status; + } + } + + /* Read fan_direction */ + command = 0xC3; + status = ym2651y_read_block(client, command, fan_dir, ARRAY_SIZE(fan_dir)-1); + + if (status < 0) { + dev_dbg(&client->dev, "reg %d, err %d\n", command, status); + } + + strncpy(data->fan_dir, fan_dir+1, ARRAY_SIZE(data->fan_dir)-1); + data->fan_dir[ARRAY_SIZE(data->fan_dir)-1] = '\0'; + + /* Read mfr_id */ + command = 0x99; + status = ym2651y_read_block(client, command, data->mfr_id, + ARRAY_SIZE(data->mfr_id)-1); + data->mfr_id[ARRAY_SIZE(data->mfr_id)-1] = '\0'; + + if (status < 0) + dev_dbg(&client->dev, "reg %d, err %d\n", command, status); + + /* Read mfr_model */ + command = 0x9a; + status = ym2651y_read_block(client, command, data->mfr_model, + ARRAY_SIZE(data->mfr_model)-1); + data->mfr_model[ARRAY_SIZE(data->mfr_model)-1] = '\0'; + + if (status < 0) + dev_dbg(&client->dev, "reg %d, err %d\n", command, status); + + /* Read mfr_revsion */ + command = 0x9b; + status = ym2651y_read_block(client, command, data->mfr_revsion, + ARRAY_SIZE(data->mfr_revsion)-1); + data->mfr_revsion[ARRAY_SIZE(data->mfr_revsion)-1] = '\0'; + + if (status < 0) + dev_dbg(&client->dev, "reg %d, err %d\n", command, status); + + data->last_updated = jiffies; + data->valid = 1; + } + + mutex_unlock(&data->update_lock); + + return data; +} + +module_i2c_driver(ym2651y_driver); + +MODULE_AUTHOR("Brandon Chuang "); +MODULE_DESCRIPTION("3Y Power YM-2651Y driver"); +MODULE_LICENSE("GPL"); + + diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/scripts/as7712_32x_platform_init.sh b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/scripts/as7712_32x_platform_init.sh new file mode 100644 index 000000000000..448f2ec341a4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/scripts/as7712_32x_platform_init.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "TO-DO: as7712-32x driver setting" diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/changelog b/platform/broadcom/sonic-platform-modules-accton/debian/changelog new file mode 100644 index 000000000000..6a687800eeac --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/debian/changelog @@ -0,0 +1,5 @@ +sonic-accton-platform-modules (1.0) unstable; urgency=low + + * Initial release + + -- Polly Hsu Tue, 9 May 2017 17:54:11 -0800 \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/compat b/platform/broadcom/sonic-platform-modules-accton/debian/compat new file mode 100644 index 000000000000..ec635144f600 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/debian/compat @@ -0,0 +1 @@ +9 diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/control b/platform/broadcom/sonic-platform-modules-accton/debian/control new file mode 100644 index 000000000000..755c58612bb0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/debian/control @@ -0,0 +1,11 @@ +Source: sonic-accton-platform-modules +Section: main +Priority: extra +Maintainer: polly_hsu +Build-Depends: debhelper (>= 8.0.0), bzip2 +Standards-Version: 3.9.3 + +Package: platform-modules-as7712-32x +Architecture: amd64 +Depends: linux-image-3.16.0-4-amd64 +Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.init b/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.init new file mode 100644 index 000000000000..c54b2a3e310d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.init @@ -0,0 +1,44 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: setup-board +# Required-Start: +# Required-Stop: +# Should-Start: +# Should-Stop: +# Default-Start: S +# Default-Stop: 0 6 +# Short-Description: Setup AS7712-32X board. +### END INIT INFO + +case "$1" in +start) + echo -n "Setting up board... " + + modprobe i2c_dev + modprobe i2c_mux_pca954x + modprobe accton_i2c_cpld + modprobe accton_as7712_32x_fan + modprobe accton_as7712_32x_sfp + modprobe leds-accton_as7712_32x + modprobe accton_as7712_32x_psu + + echo "done." + ;; + +stop) + echo "done." + + ;; + +force-reload|restart) + echo "Not supported" + ;; + +*) + echo "Usage: /etc/init.d/platform-modules-as7712-32x.init {start|stop}" + exit 1 + ;; +esac + +exit 0 diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.install b/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.install new file mode 100644 index 000000000000..39abf57e2f65 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.install @@ -0,0 +1,2 @@ +as7712-32x/scripts/as7712_32x_platform_init.sh usr/local/bin +as7712-32x/cfg/as7712_32x-modules.conf etc/modules-load.d diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/rules b/platform/broadcom/sonic-platform-modules-accton/debian/rules new file mode 100644 index 000000000000..a1026ca62832 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/debian/rules @@ -0,0 +1,36 @@ +#!/usr/bin/make -f + +export INSTALL_MOD_DIR:=extra + +KVERSION ?= $(shell uname -r) +KERNEL_SRC := /lib/modules/$(KVERSION) +MOD_SRC_DIR:= $(shell pwd) +MODULE_DIRS:= as7712-32x + +%: + dh $@ + +override_dh_auto_build: + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ + done) + + + +override_dh_auto_install: + (for mod in $(MODULE_DIRS); do \ + dh_installdirs -pplatform-modules-$${mod} \ + $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + cp $(MOD_SRC_DIR)/$${mod}/modules/*.ko \ + debian/platform-modules-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + mkdir -p debian/platform-modules-$${mod}/etc/bcm; \ + done) + +override_dh_usrlocal: + +override_dh_clean: + dh_clean + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ + done) + From 7472cd303e622fe3dba3202d97f9909eb8436081 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 16 Jun 2017 00:05:41 -0700 Subject: [PATCH 0610/1011] [image]: load platform specific settings in sonic-to-sonic upgrade (#710) --- .../dell/x86_64-dell_s6000_s1220-r0/installer.conf | 4 ++++ installer/x86_64/install.sh | 12 ++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/installer.conf b/device/dell/x86_64-dell_s6000_s1220-r0/installer.conf index eb135bee0ff1..a8fef6185912 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/installer.conf +++ b/device/dell/x86_64-dell_s6000_s1220-r0/installer.conf @@ -1,5 +1,7 @@ ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="processor.max_cstate=1 intel_idle.max_cstate=0" +if [ "$install_env" = "onie" ]; then + echo "Replace ONIE reboot with Dell reset commands" # set I2C GPIO mux @@ -21,3 +23,5 @@ i2cset -y 0 0x31 1 0xfd EOF chmod a+x /sbin/reboot + +fi diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 18669893bcb5..f7d1dbb29a6f 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -36,7 +36,14 @@ if [ $(id -u) -ne 0 ] fi # get running machine from conf file -[ -r /etc/machine.conf ] && . /etc/machine.conf +if [ -r /etc/machine.conf ]; then + . /etc/machine.conf +elif [ -r /host/machine.conf ]; then + . /host/machine.conf +else + echo "cannot find machine.conf" + exit 1 +fi echo "onie_platform: $onie_platform" @@ -57,9 +64,10 @@ if [ -d "/etc/sonic" ]; then else echo "Installing SONiC in ONIE" install_env="onie" - [ -r platforms/$onie_platform ] && source platforms/$onie_platform fi +[ -r platforms/$onie_platform ] && . platforms/$onie_platform + # Install demo on same block device as ONIE onie_dev=$(blkid | grep ONIE-BOOT | head -n 1 | awk '{print $1}' | sed -e 's/:.*$//') blk_dev=$(echo $onie_dev | sed -e 's/[1-9][0-9]*$//' | sed -e 's/\([0-9]\)\(p\)/\1/') From 7267da3ff866dd1d13e90b2631a2b32034c9dba7 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Fri, 16 Jun 2017 10:35:36 +0300 Subject: [PATCH 0611/1011] [submodule]: Update sairedis submodule (#712) Include fix for saithrift port split parsing --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index f02e667d03f7..1eeb716837bb 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit f02e667d03f7840132c9dd210254cff2b2e0ad1d +Subproject commit 1eeb716837bb4e6cd4d179e3654ee67e74cf5736 From 6867458058cf94fe6a8aa2685160db535061449e Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Fri, 16 Jun 2017 07:25:40 -0700 Subject: [PATCH 0612/1011] [docker-ptf]: Install exabgp in docker ptf (#709) --- dockers/docker-ptf/Dockerfile.j2 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index c546ad2fab9c..59360ee4fa2e 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -45,7 +45,8 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / ipython \ git \ iputils-ping \ - hping3 + hping3 \ + curl ## Reinstall scapy by version from p4lang RUN git clone https://github.com/p4lang/scapy-vxlan.git && cd scapy-vxlan && python setup.py install @@ -78,6 +79,8 @@ RUN rm -rf /debs \ && pip install pysubnettree \ && pip install paramiko \ && pip install parallel-ssh \ + && pip install flask \ + && pip install exabgp==3.4.17\ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py From 897cc2bbb55a6d90ff5ef5aa4ca2d97e8ab10019 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 18 Jun 2017 14:38:31 -0700 Subject: [PATCH 0613/1011] [platform]: fix file mode for acction platform to create clean build (#714) --- platform/broadcom/sonic-platform-modules-accton/debian/rules | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 platform/broadcom/sonic-platform-modules-accton/debian/rules diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/rules b/platform/broadcom/sonic-platform-modules-accton/debian/rules old mode 100644 new mode 100755 From 2f231f36538886b43d0963fc6e793ef920a8a2b4 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 18 Jun 2017 15:52:49 -0700 Subject: [PATCH 0614/1011] [image]: expand dockerfs.tar.gz directly on to disk without intermediate file (#715) --- installer/x86_64/install.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index f7d1dbb29a6f..ca8c4d3e47e7 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -422,12 +422,11 @@ else fi # Decompress the file for the file system directly to the partition -unzip $ONIE_INSTALLER_PAYLOAD -d $demo_mnt/$image_dir +unzip -o $ONIE_INSTALLER_PAYLOAD -x "$FILESYSTEM_DOCKERFS" -d $demo_mnt/$image_dir -if [ -f $demo_mnt/$image_dir/$FILESYSTEM_DOCKERFS ]; then - TAR_EXTRA_OPTION="--numeric-owner" - cd $demo_mnt/$image_dir && mkdir -p $DOCKERFS_DIR && tar x $TAR_EXTRA_OPTION -f $FILESYSTEM_DOCKERFS -C $DOCKERFS_DIR && rm -f $FILESYSTEM_DOCKERFS; cd $OLDPWD -fi +TAR_EXTRA_OPTION="--numeric-owner" +mkdir -p $demo_mnt/$image_dir/$DOCKERFS_DIR +unzip -op $ONIE_INSTALLER_PAYLOAD "$FILESYSTEM_DOCKERFS" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/$DOCKERFS_DIR # Create loop device for /var/log to limit its size to $VAR_LOG_SIZE MB if [ -f $demo_mnt/disk-img/var-log.ext4 ]; then From 4a780f4a6ac30e91d6b7a8dc71f87a4902a23367 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 18 Jun 2017 16:54:13 -0700 Subject: [PATCH 0615/1011] [submodule]: update swss/sairedis/swss-common submodule (#716) fix bug for logrotate sairedis log --- files/image_config/logrotate.d/rsyslog | 15 ++++++++++++++- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/files/image_config/logrotate.d/rsyslog b/files/image_config/logrotate.d/rsyslog index a212ddfce15c..4693288f18cc 100644 --- a/files/image_config/logrotate.d/rsyslog +++ b/files/image_config/logrotate.d/rsyslog @@ -1,7 +1,6 @@ /var/log/syslog /var/log/quagga/*.log /var/log/teamd.log -/var/log/swss/*.rec { rotate 7 daily @@ -18,6 +17,20 @@ kill -HUP $(cat /var/run/rsyslogd.pid) endscript } +/var/log/swss/*.rec +{ + rotate 7 + daily + maxsize 20M + missingok + notifempty + compress + delaycompress + sharedscripts + postrotate + pgrep -x orchagent | xargs /bin/kill -HUP 2>/dev/null || true + endscript +} /var/log/mail.info /var/log/mail.warn /var/log/mail.err diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 1eeb716837bb..b865912105f2 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 1eeb716837bb4e6cd4d179e3654ee67e74cf5736 +Subproject commit b865912105f2f80ee2516899e6367f863d5f6235 diff --git a/src/sonic-swss b/src/sonic-swss index b893b4f70b79..002adc7bdea0 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit b893b4f70b79f5a87674e3a67a64accff0dd9437 +Subproject commit 002adc7bdea0894eb11835374463eb9c2f208790 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index ececc0a99ce1..345576ea38cc 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit ececc0a99ce1c188007b5b59de1bb11a06dd006d +Subproject commit 345576ea38cc511b265825b445c48dbfbf444792 From 35cec022e6f51e7a8ceb218578b6e48baf0b0544 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 19 Jun 2017 11:17:30 -0700 Subject: [PATCH 0616/1011] [submodule]: update sonic-swss (#719) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 002adc7bdea0..316b33371dcb 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 002adc7bdea0894eb11835374463eb9c2f208790 +Subproject commit 316b33371dcbccd3d81fa6987170be3e7a3a1536 From 493edb45848564c9489a3f4fad4a46446bd59862 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 19 Jun 2017 22:16:05 -0700 Subject: [PATCH 0617/1011] [image]: add debian security update in the apt source list (#724) --- .../sources.list.d/debian_archive_trafficmanager_net_debian.list | 1 + 1 file changed, 1 insertion(+) diff --git a/files/image_config/apt/sources.list.d/debian_archive_trafficmanager_net_debian.list b/files/image_config/apt/sources.list.d/debian_archive_trafficmanager_net_debian.list index 503897133ca3..d5ecf56d4069 100644 --- a/files/image_config/apt/sources.list.d/debian_archive_trafficmanager_net_debian.list +++ b/files/image_config/apt/sources.list.d/debian_archive_trafficmanager_net_debian.list @@ -1 +1,2 @@ deb http://debian-archive.trafficmanager.net/debian/ jessie main contrib non-free +deb http://debian-archive.trafficmanager.net/debian-security/ jessie/updates main contrib non-free From fe56389a0f8d9350744038f560e66a70a159bb07 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 19 Jun 2017 22:16:21 -0700 Subject: [PATCH 0618/1011] [submodule]: update sonic-platform-daemons (#722) --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index bd7c31075765..dac4bf5a242f 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit bd7c310757658396ccfaaf653ede4a931b3d4154 +Subproject commit dac4bf5a242fe3c10d750378b7aaf6d41ac573ee From 894976e15569d6cc109b0c523e4b3409dc0735be Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 19 Jun 2017 22:16:50 -0700 Subject: [PATCH 0619/1011] [platform]: turn on/off four leds for breakout-able front panel ports (#723) turn on/off four leds for breakout-able front panel ports on arista 7050 qx32 platform --- .../plugins/led_control.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py b/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py index e246a2e61581..9b8fd2f79186 100644 --- a/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py +++ b/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py @@ -48,21 +48,23 @@ def port_link_state_change(self, port, state): if qsfp_index <= 0: return - # QSFP indices 1-24 are breakout-capable and have four LEDs, + # QSFP indices 1-24 are breakout-capable and have four LEDs, and each LED indicate one lane. # whereas indices 25-32 are not breakout-capable, and only have one if qsfp_index <= self.QSFP_BREAKOUT_END_IDX: - led_sysfs_path = self.LED_SYSFS_PATH_BREAKOUT_CAPABLE.format(qsfp_index, 1) + # assuming 40G, then we need to control four lanes + led_sysfs_paths = [ self.LED_SYSFS_PATH_BREAKOUT_CAPABLE.format(qsfp_index, i) for i in range(1, 5) ] else: - led_sysfs_path = self.LED_SYSFS_PATH_NO_BREAKOUT.format(qsfp_index) + led_sysfs_paths = [ self.LED_SYSFS_PATH_NO_BREAKOUT.format(qsfp_index) ] - led_file = open(led_sysfs_path, "w") + for led_sysfs_path in led_sysfs_paths: + led_file = open(led_sysfs_path, "w") - if state == "up": - led_file.write("%d" % self.LED_COLOR_GREEN) - else: - led_file.write("%d" % self.LED_COLOR_OFF) + if state == "up": + led_file.write("%d" % self.LED_COLOR_GREEN) + else: + led_file.write("%d" % self.LED_COLOR_OFF) - led_file.close() + led_file.close() # Constructor def __init__(self): From cc218b34510b11bc73bbb87dbab68fcfee2caa7d Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Tue, 20 Jun 2017 12:22:30 -0700 Subject: [PATCH 0620/1011] [sonic-quagga]:update submodule (#718) Signed-off-by: Sihui Han --- src/sonic-quagga | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-quagga b/src/sonic-quagga index 5da3e26ecddf..df6b70902b4c 160000 --- a/src/sonic-quagga +++ b/src/sonic-quagga @@ -1 +1 @@ -Subproject commit 5da3e26ecddfec6f5983f34b27056b64f67e09d3 +Subproject commit df6b70902b4c29447ac52277cf6d5b7f6abca71e From c2c232a1619845108985292ee854bb9e6a954ed5 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 20 Jun 2017 16:37:07 -0700 Subject: [PATCH 0621/1011] Add Broadcom LED microprocessor initialization for Dell S6000 (#726) * Add Broadcom LED microprocessor initialization for Dell S6000 * Increase bcmcmd timeout to 60 seconds --- .../led_proc_init.soc | 43 +++++++++++++++++++ platform/broadcom/docker-syncd-brcm/start.sh | 7 +++ 2 files changed, 50 insertions(+) create mode 100644 device/dell/x86_64-dell_s6000_s1220-r0/led_proc_init.soc diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/led_proc_init.soc b/device/dell/x86_64-dell_s6000_s1220-r0/led_proc_init.soc new file mode 100644 index 000000000000..ddda7bdb639a --- /dev/null +++ b/device/dell/x86_64-dell_s6000_s1220-r0/led_proc_init.soc @@ -0,0 +1,43 @@ +# LED microprocessor initialization for Dell s6000 + +led 0 stop +led 0 prog 02 31 60 F7 02 01 28 60 F6 D6 F7 70 28 67 44 06 F6 06 F6 80 D2 35 74 06 86 F8 3A 40 67 80 67 44 06 F6 67 80 67 80 67 3C D2 32 70 1C D2 34 70 1C 67 44 06 F6 67 80 67 80 67 80 67 3C 06 F7 F2 01 60 F7 77 11 32 08 97 71 4C 77 80 57 67 61 32 00 32 01 B7 97 71 5C 95 75 74 85 77 7C 02 0A 50 77 56 06 F6 D2 17 75 6C 12 88 FE F6 57 06 F6 E2 17 12 D4 F8 57 16 F8 CA 05 74 80 77 7C 22 0E 87 57 22 0F 87 57 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=0x31 REMAP_PORT_2=0 REMAP_PORT_1=0 REMAP_PORT_0=0 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=0x32 REMAP_PORT_6=0 REMAP_PORT_5=0 REMAP_PORT_4=0 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_9=0 REMAP_PORT_8=0 REMAP_PORT_11=0x34 REMAP_PORT_10=0 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=0x33 REMAP_PORT_14=0 REMAP_PORT_13=0 REMAP_PORT_12=0 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=0x16 REMAP_PORT_18=0x15 REMAP_PORT_17=0x18 REMAP_PORT_16=0x17 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=0x11 REMAP_PORT_22=0x12 REMAP_PORT_21=0x13 REMAP_PORT_20=0x14 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=9 REMAP_PORT_26=0xa REMAP_PORT_25=0xb REMAP_PORT_24=0xc +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=0xe REMAP_PORT_30=0xd REMAP_PORT_29=0x10 REMAP_PORT_28=0xf +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=0x2e REMAP_PORT_34=0x2d REMAP_PORT_33=0x30 REMAP_PORT_32=0x2f +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=0x29 REMAP_PORT_38=0x2a REMAP_PORT_37=0x2b REMAP_PORT_36=0x2c +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=6 REMAP_PORT_42=5 REMAP_PORT_41=8 REMAP_PORT_40=7 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=1 REMAP_PORT_46=2 REMAP_PORT_45=3 REMAP_PORT_44=4 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=0x26 REMAP_PORT_50=0x25 REMAP_PORT_49=0x28 REMAP_PORT_48=0x27 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=0x21 REMAP_PORT_54=0x22 REMAP_PORT_53=0x23 REMAP_PORT_52=0x24 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=0x19 REMAP_PORT_58=0x1a REMAP_PORT_57=0x1b REMAP_PORT_56=0x1c +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0x1e REMAP_PORT_62=0x1d REMAP_PORT_61=0x20 REMAP_PORT_60=0x1f +led 0 auto on +led 0 start + +led 1 stop +led 1 prog 02 31 60 F7 02 01 28 60 F6 D6 F7 70 28 67 44 06 F6 06 F6 80 D2 35 74 06 86 F8 3A 40 67 80 67 44 06 F6 67 80 67 80 67 3C D2 32 70 1C D2 34 70 1C 67 44 06 F6 67 80 67 80 67 80 67 3C 06 F7 F2 01 60 F7 77 11 32 08 97 71 4C 77 80 57 67 61 32 00 32 01 B7 97 71 5C 95 75 74 85 77 7C 02 0A 50 77 56 06 F6 D2 17 75 6C 12 88 FE F6 57 06 F6 E2 17 12 D4 F8 57 16 F8 CA 05 74 80 77 7C 22 0E 87 57 22 0F 87 57 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=0x1e REMAP_PORT_2=0x1d REMAP_PORT_1=0x20 REMAP_PORT_0=0x1f +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=0x19 REMAP_PORT_6=0x1a REMAP_PORT_5=0x1b REMAP_PORT_4=0x1c +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_9=0x23 REMAP_PORT_8=0x24 REMAP_PORT_11=0x21 REMAP_PORT_10=0x22 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=0x26 REMAP_PORT_14=0x25 REMAP_PORT_13=0x28 REMAP_PORT_12=0x27 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=0x16 REMAP_PORT_18=0x15 REMAP_PORT_17=0x18 REMAP_PORT_16=0x17 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=0x11 REMAP_PORT_22=0x12 REMAP_PORT_21=0x13 REMAP_PORT_20=0x14 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=0x34 REMAP_PORT_26=0 REMAP_PORT_25=0 REMAP_PORT_24=0 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=0x33 REMAP_PORT_30=0 REMAP_PORT_29=0 REMAP_PORT_28=0 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=0x2e REMAP_PORT_34=0x2d REMAP_PORT_33=0x30 REMAP_PORT_32=0x2f +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=0x29 REMAP_PORT_38=0x2a REMAP_PORT_37=0x2b REMAP_PORT_36=0x2c +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=0x31 REMAP_PORT_42=0 REMAP_PORT_41=0 REMAP_PORT_40=0 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=0x32 REMAP_PORT_46=0 REMAP_PORT_45=0 REMAP_PORT_44=0 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=9 REMAP_PORT_50=0xa REMAP_PORT_49=0xb REMAP_PORT_48=0xc +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=0xe REMAP_PORT_54=0xd REMAP_PORT_53=0x10 REMAP_PORT_52=0xf +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=6 REMAP_PORT_58=5 REMAP_PORT_57=8 REMAP_PORT_56=7 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=1 REMAP_PORT_62=2 REMAP_PORT_61=3 REMAP_PORT_60=4 +led 1 auto on +led 1 start diff --git a/platform/broadcom/docker-syncd-brcm/start.sh b/platform/broadcom/docker-syncd-brcm/start.sh index 96e2a9128081..6f9b69ff8d40 100755 --- a/platform/broadcom/docker-syncd-brcm/start.sh +++ b/platform/broadcom/docker-syncd-brcm/start.sh @@ -1,8 +1,15 @@ #!/usr/bin/env bash +PLATFORM_DIR=/usr/share/sonic/platform + rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd supervisorctl start syncd +# If this platform has an initialization file for the Broadcom LED microprocessor, load it +if [ -r ${PLATFORM_DIR}/led_proc_init.soc ]; then + /usr/bin/bcmcmd -t 60 "rcload ${PLATFORM_DIR}/led_proc_init.soc" +fi + From 6feef14f2e5e2a06a3f0aa1153feed80b41fa357 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Tue, 20 Jun 2017 20:39:42 -0700 Subject: [PATCH 0622/1011] [platform]: Update sonic-platform-modules-arista (#727) --- platform/broadcom/sonic-platform-modules-arista | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 393e5e1f19fd..75e84737680f 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 393e5e1f19fd33853bb375d70a10fa7cf4613e4a +Subproject commit 75e84737680f5451eb9c947d01968b972d989bb3 From c4133e166b09e9787228a2edbf7e31955f25fd37 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 20 Jun 2017 20:50:51 -0700 Subject: [PATCH 0623/1011] [Broadcom]: Update SAI package to support Accton-AS7712-C32 (#720) --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 74baaa712f10..130520298120 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-11-20170605231900.43_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-11-20170605231900.43_amd64.deb?sv=2015-04-05&sr=b&sig=NNBDS1OSXn2w4dNSbqBbJnqXTrqH7YAkKIa%2Fi9yaOJs%3D&se=2031-02-12T23%3A22%3A01Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-12-20170607194342.44_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-12-20170607194342.44_amd64.deb?sv=2015-04-05&sr=b&sig=gJJVxVT2o%2Bm14%2BwCBYFmBfcrDCzBA4b4iSmDKxnS13o%3D&se=2031-02-26T17%3A39%3A50Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-11-20170605231900.43_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-12-20170607194342.44_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-11-20170605231900.43_amd64.deb?sv=2015-04-05&sr=b&sig=jxozueiuQdOuJdEfC9%2BWSfFXSL68FQVwL%2FM5Obfj3gs%3D&se=2031-02-12T23%3A21%3A35Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-12-20170607194342.44_amd64.deb?sv=2015-04-05&sr=b&sig=AfYK3Qz%2FTV61E89u0kASm7wF3LEiqaZb%2Fde2jvbw9yk%3D&se=2031-02-26T17%3A40%3A14Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From 66859385b676d9b1c504ac0d492ba2b033e8bf33 Mon Sep 17 00:00:00 2001 From: Roy Lee Date: Wed, 21 Jun 2017 11:52:16 +0800 Subject: [PATCH 0624/1011] =?UTF-8?q?Remove=20exsiting=20sonic-platform-mo?= =?UTF-8?q?dules-accton=20and=20apply=20submodule=20add=E2=80=A6=20(#717)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove exsiting sonic-platform-modules-accton and apply submodule adding on this folder. * Remove redundant commnet * Remove folder platform/broadcom/sonic-platform-modules-accton. * Add this dir for submodule. --- .gitmodules | 3 + .../plugins/eeprom.py | 24 + .../plugins/sfputil.py | 60 + platform/broadcom/platform-modules-accton.mk | 5 +- .../broadcom/sonic-platform-modules-accton | 1 + .../sonic-platform-modules-accton/.gitignore | 33 - .../sonic-platform-modules-accton/LICENSE | 16 - .../sonic-platform-modules-accton/README.md | 1 - .../as7712-32x/cfg/as7712_32x-modules.conf | 13 - .../as7712-32x/modules/Makefile | 2 - .../modules/accton_as7712_32x_fan.c | 452 ------- .../modules/accton_as7712_32x_psu.c | 293 ----- .../modules/accton_as7712_32x_sfp.c | 1083 ----------------- .../as7712-32x/modules/accton_i2c_cpld.c | 259 ---- .../modules/leds-accton_as7712_32x.c | 443 ------- .../as7712-32x/modules/ym2651y.c | 589 --------- .../scripts/as7712_32x_platform_init.sh | 3 - .../debian/changelog | 5 - .../debian/compat | 1 - .../debian/control | 11 - .../debian/platform-modules-as7712-32x.init | 44 - .../platform-modules-as7712-32x.install | 2 - .../debian/rules | 36 - 23 files changed, 89 insertions(+), 3290 deletions(-) create mode 100644 device/accton/x86_64-accton_as7712_32x-r0/plugins/eeprom.py create mode 100644 device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py create mode 160000 platform/broadcom/sonic-platform-modules-accton delete mode 100644 platform/broadcom/sonic-platform-modules-accton/.gitignore delete mode 100644 platform/broadcom/sonic-platform-modules-accton/LICENSE delete mode 100644 platform/broadcom/sonic-platform-modules-accton/README.md delete mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/cfg/as7712_32x-modules.conf delete mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/Makefile delete mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_fan.c delete mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_psu.c delete mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_sfp.c delete mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_i2c_cpld.c delete mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/leds-accton_as7712_32x.c delete mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/ym2651y.c delete mode 100644 platform/broadcom/sonic-platform-modules-accton/as7712-32x/scripts/as7712_32x_platform_init.sh delete mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/changelog delete mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/compat delete mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/control delete mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.init delete mode 100644 platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.install delete mode 100755 platform/broadcom/sonic-platform-modules-accton/debian/rules diff --git a/.gitmodules b/.gitmodules index 99938c4abaca..454019f9ebdd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -63,3 +63,6 @@ [submodule "src/sonic-platform-daemons"] path = src/sonic-platform-daemons url = https://github.com/Azure/sonic-platform-daemons +[submodule "platform/broadcom/sonic-platform-modules-accton"] + path = platform/broadcom/sonic-platform-modules-accton + url = https://github.com/edge-core/sonic-platform-modules-accton.git diff --git a/device/accton/x86_64-accton_as7712_32x-r0/plugins/eeprom.py b/device/accton/x86_64-accton_as7712_32x-r0/plugins/eeprom.py new file mode 100644 index 000000000000..7681caafeef4 --- /dev/null +++ b/device/accton/x86_64-accton_as7712_32x-r0/plugins/eeprom.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/1-0057/eeprom" + #Two i2c buses might get flipped order, check them both. + if not os.path.exists(self.eeprom_path): + self.eeprom_path = "/sys/bus/i2c/devices/0-0057/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py new file mode 100644 index 000000000000..6dc35d72bb21 --- /dev/null +++ b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 9 : 18, + 10 : 19, + 11 : 20, + 12 : 21, + 1 : 22, + 2 : 23, + 3 : 24, + 4 : 25, + 6 : 26, + 5 : 27, + 8 : 28, + 7 : 29, + 13 : 30, + 14 : 31, + 15 : 32, + 16 : 33, + 17 : 34, + 18 : 35, + 19 : 36, + 20 : 37, + 25 : 38, + 26 : 39, + 27 : 40, + 28 : 41, + 29 : 42, + 30 : 43, + 31 : 44, + 32 : 45, + 21 : 46, + 22 : 47, + 23 : 48, + 24 : 49, + } + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/bus/i2c/devices/{0}-0050/sfp_eeprom' + for x in range(self.port_start, self.port_end + 1): + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x+1]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + sfputilbase.__init__(self, port_num) diff --git a/platform/broadcom/platform-modules-accton.mk b/platform/broadcom/platform-modules-accton.mk index 00128a20f8d2..e5357c5e9f14 100644 --- a/platform/broadcom/platform-modules-accton.mk +++ b/platform/broadcom/platform-modules-accton.mk @@ -4,11 +4,8 @@ ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION = 1.0 export ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION -ACCTON_AS7712_32X_PLATFORM_MODULE = platform-modules-as7712-32x_$(ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION)_amd64.deb +ACCTON_AS7712_32X_PLATFORM_MODULE = sonic-platform-accton-as7712-32x_$(ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION)_amd64.deb $(ACCTON_AS7712_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-accton $(ACCTON_AS7712_32X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) $(ACCTON_AS7712_32X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as7712_32x-r0 SONIC_DPKG_DEBS += $(ACCTON_AS7712_32X_PLATFORM_MODULE) - -$(eval $(call add_extra_package,$(ACCTON_AS7712_32X_PLATFORM_MODULE))) - diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton new file mode 160000 index 000000000000..99607d63220d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton @@ -0,0 +1 @@ +Subproject commit 99607d63220de336a61d81f6b4d1e64062761abe diff --git a/platform/broadcom/sonic-platform-modules-accton/.gitignore b/platform/broadcom/sonic-platform-modules-accton/.gitignore deleted file mode 100644 index f805e810e5c6..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -# Object files -*.o -*.ko -*.obj -*.elf - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su diff --git a/platform/broadcom/sonic-platform-modules-accton/LICENSE b/platform/broadcom/sonic-platform-modules-accton/LICENSE deleted file mode 100644 index bc693f7a4c40..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -Copyright (C) 2016 Microsoft, Inc -Copyright (C) 2017 Accton Technology Corporation - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/platform/broadcom/sonic-platform-modules-accton/README.md b/platform/broadcom/sonic-platform-modules-accton/README.md deleted file mode 100644 index 743db0cb238f..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/README.md +++ /dev/null @@ -1 +0,0 @@ -platform drivers for AS7712_32X for the SONiC project diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/cfg/as7712_32x-modules.conf b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/cfg/as7712_32x-modules.conf deleted file mode 100644 index cf2c5fa775bd..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/cfg/as7712_32x-modules.conf +++ /dev/null @@ -1,13 +0,0 @@ -# /etc/modules: kernel modules to load at boot time. -# -# This file contains the names of kernel modules that should be loaded -# at boot time, one per line. Lines beginning with "#" are ignored. - -i2c_dev -i2c_mux_pca954x -accton_i2c_cpld -accton_as7712_32x_fan -accton_as7712_32x_sfp -leds-accton_as7712_32x -accton_as7712_32x_psu - diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/Makefile b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/Makefile deleted file mode 100644 index 83319ec62e58..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -obj-m:=accton_as7712_32x_fan.o accton_as7712_32x_sfp.o leds-accton_as7712_32x.o \ - accton_as7712_32x_psu.o accton_i2c_cpld.o ym2651y.o \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_fan.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_fan.c deleted file mode 100644 index 52db1e9dc028..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_fan.c +++ /dev/null @@ -1,452 +0,0 @@ -/* - * A hwmon driver for the Accton as7712 32x fan - * - * Copyright (C) 2014 Accton Technology Corporation. - * Brandon Chuang - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define DRVNAME "as7712_32x_fan" - -static struct as7712_32x_fan_data *as7712_32x_fan_update_device(struct device *dev); -static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, char *buf); -static ssize_t set_duty_cycle(struct device *dev, struct device_attribute *da, - const char *buf, size_t count); -extern int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg); -extern int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); - -/* fan related data, the index should match sysfs_fan_attributes - */ -static const u8 fan_reg[] = { - 0x0F, /* fan 1-6 present status */ - 0x11, /* fan PWM(for all fan) */ - 0x12, /* front fan 1 speed(rpm) */ - 0x13, /* front fan 2 speed(rpm) */ - 0x14, /* front fan 3 speed(rpm) */ - 0x15, /* front fan 4 speed(rpm) */ - 0x16, /* front fan 5 speed(rpm) */ - 0x17, /* front fan 6 speed(rpm) */ - 0x22, /* rear fan 1 speed(rpm) */ - 0x23, /* rear fan 2 speed(rpm) */ - 0x24, /* rear fan 3 speed(rpm) */ - 0x25, /* rear fan 4 speed(rpm) */ - 0x26, /* rear fan 5 speed(rpm) */ - 0x27, /* rear fan 6 speed(rpm) */ -}; - -/* Each client has this additional data */ -struct as7712_32x_fan_data { - struct device *hwmon_dev; - struct mutex update_lock; - char valid; /* != 0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u8 reg_val[ARRAY_SIZE(fan_reg)]; /* Register value */ -}; - -enum fan_id { - FAN1_ID, - FAN2_ID, - FAN3_ID, - FAN4_ID, - FAN5_ID, - FAN6_ID -}; - -enum sysfs_fan_attributes { - FAN_PRESENT_REG, - FAN_DUTY_CYCLE_PERCENTAGE, /* Only one CPLD register to control duty cycle for all fans */ - FAN1_FRONT_SPEED_RPM, - FAN2_FRONT_SPEED_RPM, - FAN3_FRONT_SPEED_RPM, - FAN4_FRONT_SPEED_RPM, - FAN5_FRONT_SPEED_RPM, - FAN6_FRONT_SPEED_RPM, - FAN1_REAR_SPEED_RPM, - FAN2_REAR_SPEED_RPM, - FAN3_REAR_SPEED_RPM, - FAN4_REAR_SPEED_RPM, - FAN5_REAR_SPEED_RPM, - FAN6_REAR_SPEED_RPM, - FAN1_PRESENT, - FAN2_PRESENT, - FAN3_PRESENT, - FAN4_PRESENT, - FAN5_PRESENT, - FAN6_PRESENT, - FAN1_FAULT, - FAN2_FAULT, - FAN3_FAULT, - FAN4_FAULT, - FAN5_FAULT, - FAN6_FAULT -}; - -/* Define attributes - */ -#define DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(index) \ - static SENSOR_DEVICE_ATTR(fan##index##_fault, S_IRUGO, fan_show_value, NULL, FAN##index##_FAULT) -#define DECLARE_FAN_FAULT_ATTR(index) &sensor_dev_attr_fan##index##_fault.dev_attr.attr - -#define DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(index) \ - static SENSOR_DEVICE_ATTR(fan##index##_direction, S_IRUGO, fan_show_value, NULL, FAN##index##_DIRECTION) -#define DECLARE_FAN_DIRECTION_ATTR(index) &sensor_dev_attr_fan##index##_direction.dev_attr.attr - -#define DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(index) \ - static SENSOR_DEVICE_ATTR(fan##index##_duty_cycle_percentage, S_IWUSR | S_IRUGO, fan_show_value, set_duty_cycle, FAN##index##_DUTY_CYCLE_PERCENTAGE) -#define DECLARE_FAN_DUTY_CYCLE_ATTR(index) &sensor_dev_attr_fan##index##_duty_cycle_percentage.dev_attr.attr - -#define DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(index) \ - static SENSOR_DEVICE_ATTR(fan##index##_present, S_IRUGO, fan_show_value, NULL, FAN##index##_PRESENT) -#define DECLARE_FAN_PRESENT_ATTR(index) &sensor_dev_attr_fan##index##_present.dev_attr.attr - -#define DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(index) \ - static SENSOR_DEVICE_ATTR(fan##index##_front_speed_rpm, S_IRUGO, fan_show_value, NULL, FAN##index##_FRONT_SPEED_RPM);\ - static SENSOR_DEVICE_ATTR(fan##index##_rear_speed_rpm, S_IRUGO, fan_show_value, NULL, FAN##index##_REAR_SPEED_RPM) -#define DECLARE_FAN_SPEED_RPM_ATTR(index) &sensor_dev_attr_fan##index##_front_speed_rpm.dev_attr.attr, \ - &sensor_dev_attr_fan##index##_rear_speed_rpm.dev_attr.attr - -/* 6 fan fault attributes in this platform */ -DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(1); -DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(2); -DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(3); -DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(4); -DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(5); -DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(6); -/* 6 fan speed(rpm) attributes in this platform */ -DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(1); -DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(2); -DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(3); -DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(4); -DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(5); -DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(6); -/* 6 fan present attributes in this platform */ -DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(1); -DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(2); -DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(3); -DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(4); -DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(5); -DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(6); -/* 1 fan duty cycle attribute in this platform */ -DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(); - -static struct attribute *as7712_32x_fan_attributes[] = { - /* fan related attributes */ - DECLARE_FAN_FAULT_ATTR(1), - DECLARE_FAN_FAULT_ATTR(2), - DECLARE_FAN_FAULT_ATTR(3), - DECLARE_FAN_FAULT_ATTR(4), - DECLARE_FAN_FAULT_ATTR(5), - DECLARE_FAN_FAULT_ATTR(6), - DECLARE_FAN_SPEED_RPM_ATTR(1), - DECLARE_FAN_SPEED_RPM_ATTR(2), - DECLARE_FAN_SPEED_RPM_ATTR(3), - DECLARE_FAN_SPEED_RPM_ATTR(4), - DECLARE_FAN_SPEED_RPM_ATTR(5), - DECLARE_FAN_SPEED_RPM_ATTR(6), - DECLARE_FAN_PRESENT_ATTR(1), - DECLARE_FAN_PRESENT_ATTR(2), - DECLARE_FAN_PRESENT_ATTR(3), - DECLARE_FAN_PRESENT_ATTR(4), - DECLARE_FAN_PRESENT_ATTR(5), - DECLARE_FAN_PRESENT_ATTR(6), - DECLARE_FAN_DUTY_CYCLE_ATTR(), - NULL -}; - -#define FAN_DUTY_CYCLE_REG_MASK 0xF -#define FAN_MAX_DUTY_CYCLE 100 -#define FAN_REG_VAL_TO_SPEED_RPM_STEP 100 - -static int as7712_32x_fan_read_value(struct i2c_client *client, u8 reg) -{ - return i2c_smbus_read_byte_data(client, reg); -} - -static int as7712_32x_fan_write_value(struct i2c_client *client, u8 reg, u8 value) -{ - return i2c_smbus_write_byte_data(client, reg, value); -} - -/* fan utility functions - */ -static u32 reg_val_to_duty_cycle(u8 reg_val) -{ - reg_val &= FAN_DUTY_CYCLE_REG_MASK; - return ((u32)(reg_val+1) * 625 + 75)/ 100; -} - -static u8 duty_cycle_to_reg_val(u8 duty_cycle) -{ - return ((u32)duty_cycle * 100 / 625) - 1; -} - -static u32 reg_val_to_speed_rpm(u8 reg_val) -{ - return (u32)reg_val * FAN_REG_VAL_TO_SPEED_RPM_STEP; -} - -static u8 reg_val_to_is_present(u8 reg_val, enum fan_id id) -{ - u8 mask = (1 << id); - - reg_val &= mask; - - return reg_val ? 0 : 1; -} - -static u8 is_fan_fault(struct as7712_32x_fan_data *data, enum fan_id id) -{ - u8 ret = 1; - int front_fan_index = FAN1_FRONT_SPEED_RPM + id; - int rear_fan_index = FAN1_REAR_SPEED_RPM + id; - - /* Check if the speed of front or rear fan is ZERO, - */ - if (reg_val_to_speed_rpm(data->reg_val[front_fan_index]) && - reg_val_to_speed_rpm(data->reg_val[rear_fan_index])) { - ret = 0; - } - - return ret; -} - -static ssize_t set_duty_cycle(struct device *dev, struct device_attribute *da, - const char *buf, size_t count) -{ - int error, value; - struct i2c_client *client = to_i2c_client(dev); - - error = kstrtoint(buf, 10, &value); - if (error) - return error; - - if (value < 0 || value > FAN_MAX_DUTY_CYCLE) - return -EINVAL; - - as7712_32x_fan_write_value(client, 0x33, 0); /* Disable fan speed watch dog */ - as7712_32x_fan_write_value(client, fan_reg[FAN_DUTY_CYCLE_PERCENTAGE], duty_cycle_to_reg_val(value)); - return count; -} - -static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct as7712_32x_fan_data *data = as7712_32x_fan_update_device(dev); - ssize_t ret = 0; - - if (data->valid) { - switch (attr->index) { - case FAN_DUTY_CYCLE_PERCENTAGE: - { - u32 duty_cycle = reg_val_to_duty_cycle(data->reg_val[FAN_DUTY_CYCLE_PERCENTAGE]); - ret = sprintf(buf, "%u\n", duty_cycle); - break; - } - case FAN1_FRONT_SPEED_RPM: - case FAN2_FRONT_SPEED_RPM: - case FAN3_FRONT_SPEED_RPM: - case FAN4_FRONT_SPEED_RPM: - case FAN5_FRONT_SPEED_RPM: - case FAN6_FRONT_SPEED_RPM: - case FAN1_REAR_SPEED_RPM: - case FAN2_REAR_SPEED_RPM: - case FAN3_REAR_SPEED_RPM: - case FAN4_REAR_SPEED_RPM: - case FAN5_REAR_SPEED_RPM: - case FAN6_REAR_SPEED_RPM: - ret = sprintf(buf, "%u\n", reg_val_to_speed_rpm(data->reg_val[attr->index])); - break; - case FAN1_PRESENT: - case FAN2_PRESENT: - case FAN3_PRESENT: - case FAN4_PRESENT: - case FAN5_PRESENT: - case FAN6_PRESENT: - ret = sprintf(buf, "%d\n", - reg_val_to_is_present(data->reg_val[FAN_PRESENT_REG], - attr->index - FAN1_PRESENT)); - break; - case FAN1_FAULT: - case FAN2_FAULT: - case FAN3_FAULT: - case FAN4_FAULT: - case FAN5_FAULT: - case FAN6_FAULT: - ret = sprintf(buf, "%d\n", is_fan_fault(data, attr->index - FAN1_FAULT)); - break; - default: - break; - } - } - - return ret; -} - -static const struct attribute_group as7712_32x_fan_group = { - .attrs = as7712_32x_fan_attributes, -}; - -static struct as7712_32x_fan_data *as7712_32x_fan_update_device(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct as7712_32x_fan_data *data = i2c_get_clientdata(client); - - mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || - !data->valid) { - int i; - - dev_dbg(&client->dev, "Starting as7712_32x_fan update\n"); - data->valid = 0; - - /* Update fan data - */ - for (i = 0; i < ARRAY_SIZE(data->reg_val); i++) { - int status = as7712_32x_fan_read_value(client, fan_reg[i]); - - if (status < 0) { - data->valid = 0; - mutex_unlock(&data->update_lock); - dev_dbg(&client->dev, "reg %d, err %d\n", fan_reg[i], status); - return data; - } - else { - data->reg_val[i] = status; - } - } - - data->last_updated = jiffies; - data->valid = 1; - } - - mutex_unlock(&data->update_lock); - - return data; -} - -static int as7712_32x_fan_probe(struct i2c_client *client, - const struct i2c_device_id *dev_id) -{ - struct as7712_32x_fan_data *data; - int status; - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { - status = -EIO; - goto exit; - } - - data = kzalloc(sizeof(struct as7712_32x_fan_data), GFP_KERNEL); - if (!data) { - status = -ENOMEM; - goto exit; - } - - i2c_set_clientdata(client, data); - data->valid = 0; - mutex_init(&data->update_lock); - - dev_info(&client->dev, "chip found\n"); - - /* Register sysfs hooks */ - status = sysfs_create_group(&client->dev.kobj, &as7712_32x_fan_group); - if (status) { - goto exit_free; - } - - data->hwmon_dev = hwmon_device_register(&client->dev); - if (IS_ERR(data->hwmon_dev)) { - status = PTR_ERR(data->hwmon_dev); - goto exit_remove; - } - - dev_info(&client->dev, "%s: fan '%s'\n", - dev_name(data->hwmon_dev), client->name); - - return 0; - -exit_remove: - sysfs_remove_group(&client->dev.kobj, &as7712_32x_fan_group); -exit_free: - kfree(data); -exit: - - return status; -} - -static int as7712_32x_fan_remove(struct i2c_client *client) -{ - struct as7712_32x_fan_data *data = i2c_get_clientdata(client); - hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_group(&client->dev.kobj, &as7712_32x_fan_group); - - return 0; -} - -/* Addresses to scan */ -static const unsigned short normal_i2c[] = { 0x66, I2C_CLIENT_END }; - -static const struct i2c_device_id as7712_32x_fan_id[] = { - { "as7712_32x_fan", 0 }, - {} -}; -MODULE_DEVICE_TABLE(i2c, as7712_32x_fan_id); - -static struct i2c_driver as7712_32x_fan_driver = { - .class = I2C_CLASS_HWMON, - .driver = { - .name = DRVNAME, - }, - .probe = as7712_32x_fan_probe, - .remove = as7712_32x_fan_remove, - .id_table = as7712_32x_fan_id, - .address_list = normal_i2c, -}; - -static int __init as7712_32x_fan_init(void) -{ - extern int platform_accton_as7712_32x(void); - if (!platform_accton_as7712_32x()) { - return -ENODEV; - } - - return i2c_add_driver(&as7712_32x_fan_driver); -} - -static void __exit as7712_32x_fan_exit(void) -{ - i2c_del_driver(&as7712_32x_fan_driver); -} - -module_init(as7712_32x_fan_init); -module_exit(as7712_32x_fan_exit); - -MODULE_AUTHOR("Brandon Chuang "); -MODULE_DESCRIPTION("as7712_32x_fan driver"); -MODULE_LICENSE("GPL"); - diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_psu.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_psu.c deleted file mode 100644 index 8c9230ab2d24..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_psu.c +++ /dev/null @@ -1,293 +0,0 @@ -/* - * An hwmon driver for accton as7712_32x Power Module - * - * Copyright (C) 2014 Accton Technology Corporation. - * Brandon Chuang - * - * Based on ad7414.c - * Copyright 2006 Stefan Roese , DENX Software Engineering - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static ssize_t show_status(struct device *dev, struct device_attribute *da, char *buf); -static ssize_t show_model_name(struct device *dev, struct device_attribute *da, char *buf); -static int as7712_32x_psu_read_block(struct i2c_client *client, u8 command, u8 *data,int data_len); -extern int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg); - -/* Addresses scanned - */ -static const unsigned short normal_i2c[] = { 0x50, 0x53, I2C_CLIENT_END }; - -/* Each client has this additional data - */ -struct as7712_32x_psu_data { - struct device *hwmon_dev; - struct mutex update_lock; - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u8 index; /* PSU index */ - u8 status; /* Status(present/power_good) register read from CPLD */ - char model_name[9]; /* Model name, read from eeprom */ -}; - -static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *dev); - -enum as7712_32x_psu_sysfs_attributes { - PSU_PRESENT, - PSU_MODEL_NAME, - PSU_POWER_GOOD -}; - -/* sysfs attributes for hwmon - */ -static SENSOR_DEVICE_ATTR(psu_present, S_IRUGO, show_status, NULL, PSU_PRESENT); -static SENSOR_DEVICE_ATTR(psu_model_name, S_IRUGO, show_model_name,NULL, PSU_MODEL_NAME); -static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_status, NULL, PSU_POWER_GOOD); - -static struct attribute *as7712_32x_psu_attributes[] = { - &sensor_dev_attr_psu_present.dev_attr.attr, - &sensor_dev_attr_psu_model_name.dev_attr.attr, - &sensor_dev_attr_psu_power_good.dev_attr.attr, - NULL -}; - -static ssize_t show_status(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct as7712_32x_psu_data *data = as7712_32x_psu_update_device(dev); - u8 status = 0; - - if (attr->index == PSU_PRESENT) { - status = !(data->status >> (1-data->index) & 0x1); - } - else { /* PSU_POWER_GOOD */ - status = (data->status >> (3-data->index) & 0x1); - } - - return sprintf(buf, "%d\n", status); -} - -static ssize_t show_model_name(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct as7712_32x_psu_data *data = as7712_32x_psu_update_device(dev); - - return sprintf(buf, "%s\n", data->model_name); -} - -static const struct attribute_group as7712_32x_psu_group = { - .attrs = as7712_32x_psu_attributes, -}; - -static int as7712_32x_psu_probe(struct i2c_client *client, - const struct i2c_device_id *dev_id) -{ - struct as7712_32x_psu_data *data; - int status; - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) { - status = -EIO; - goto exit; - } - - data = kzalloc(sizeof(struct as7712_32x_psu_data), GFP_KERNEL); - if (!data) { - status = -ENOMEM; - goto exit; - } - - i2c_set_clientdata(client, data); - data->valid = 0; - data->index = dev_id->driver_data; - mutex_init(&data->update_lock); - - dev_info(&client->dev, "chip found\n"); - - /* Register sysfs hooks */ - status = sysfs_create_group(&client->dev.kobj, &as7712_32x_psu_group); - if (status) { - goto exit_free; - } - - data->hwmon_dev = hwmon_device_register(&client->dev); - if (IS_ERR(data->hwmon_dev)) { - status = PTR_ERR(data->hwmon_dev); - goto exit_remove; - } - - dev_info(&client->dev, "%s: psu '%s'\n", - dev_name(data->hwmon_dev), client->name); - - return 0; - -exit_remove: - sysfs_remove_group(&client->dev.kobj, &as7712_32x_psu_group); -exit_free: - kfree(data); -exit: - - return status; -} - -static int as7712_32x_psu_remove(struct i2c_client *client) -{ - struct as7712_32x_psu_data *data = i2c_get_clientdata(client); - - hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_group(&client->dev.kobj, &as7712_32x_psu_group); - kfree(data); - - return 0; -} - -enum psu_index -{ - as7712_32x_psu1, - as7712_32x_psu2 -}; - -static const struct i2c_device_id as7712_32x_psu_id[] = { - { "as7712_32x_psu1", as7712_32x_psu1 }, - { "as7712_32x_psu2", as7712_32x_psu2 }, - {} -}; -MODULE_DEVICE_TABLE(i2c, as7712_32x_psu_id); - -static struct i2c_driver as7712_32x_psu_driver = { - .class = I2C_CLASS_HWMON, - .driver = { - .name = "as7712_32x_psu", - }, - .probe = as7712_32x_psu_probe, - .remove = as7712_32x_psu_remove, - .id_table = as7712_32x_psu_id, - .address_list = normal_i2c, -}; - -static int as7712_32x_psu_read_block(struct i2c_client *client, u8 command, u8 *data, - int data_len) -{ - int result = 0; - int retry_count = 5; - - while (retry_count) { - retry_count--; - - result = i2c_smbus_read_i2c_block_data(client, command, data_len, data); - - if (unlikely(result < 0)) { - msleep(10); - continue; - } - - if (unlikely(result != data_len)) { - result = -EIO; - msleep(10); - continue; - } - - result = 0; - break; - } - - return result; -} - -static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct as7712_32x_psu_data *data = i2c_get_clientdata(client); - - mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { - int status; - int power_good = 0; - - dev_dbg(&client->dev, "Starting as7712_32x update\n"); - - /* Read psu status */ - status = accton_i2c_cpld_read(0x60, 0x2); - - if (status < 0) { - dev_dbg(&client->dev, "cpld reg 0x60 err %d\n", status); - } - else { - data->status = status; - } - - /* Read model name */ - memset(data->model_name, 0, sizeof(data->model_name)); - power_good = (data->status >> (3-data->index) & 0x1); - - if (power_good) { - status = as7712_32x_psu_read_block(client, 0x20, data->model_name, - ARRAY_SIZE(data->model_name)-1); - - if (status < 0) { - data->model_name[0] = '\0'; - dev_dbg(&client->dev, "unable to read model name from (0x%x)\n", client->addr); - } - else { - data->model_name[ARRAY_SIZE(data->model_name)-1] = '\0'; - } - } - - data->last_updated = jiffies; - data->valid = 1; - } - - mutex_unlock(&data->update_lock); - - return data; -} - -static int __init as7712_32x_psu_init(void) -{ - extern int platform_accton_as7712_32x(void); - if (!platform_accton_as7712_32x()) { - return -ENODEV; - } - - return i2c_add_driver(&as7712_32x_psu_driver); -} - -static void __exit as7712_32x_psu_exit(void) -{ - i2c_del_driver(&as7712_32x_psu_driver); -} - -module_init(as7712_32x_psu_init); -module_exit(as7712_32x_psu_exit); - -MODULE_AUTHOR("Brandon Chuang "); -MODULE_DESCRIPTION("as7712_32x_psu driver"); -MODULE_LICENSE("GPL"); - diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_sfp.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_sfp.c deleted file mode 100644 index 4366d2a6ea1d..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_as7712_32x_sfp.c +++ /dev/null @@ -1,1083 +0,0 @@ -/* - * SFP driver for accton as7712_32x sfp - * - * Copyright (C) Brandon Chuang - * - * Based on ad7414.c - * Copyright 2006 Stefan Roese , DENX Software Engineering - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define DRIVER_NAME "as7712_32x_sfp" - -#define DEBUG_MODE 0 - -#if (DEBUG_MODE == 1) - #define DEBUG_PRINT(fmt, args...) \ - printk (KERN_INFO "%s:%s[%d]: " fmt "\r\n", __FILE__, __FUNCTION__, __LINE__, ##args) -#else - #define DEBUG_PRINT(fmt, args...) -#endif - -#define NUM_OF_SFP_PORT 32 -#define EEPROM_NAME "sfp_eeprom" -#define EEPROM_SIZE 256 /* 256 byte eeprom */ -#define BIT_INDEX(i) (1ULL << (i)) -#define USE_I2C_BLOCK_READ 1 -#define I2C_RW_RETRY_COUNT 3 -#define I2C_RW_RETRY_INTERVAL 100 /* ms */ - -#define SFP_EEPROM_A0_I2C_ADDR (0xA0 >> 1) -#define SFP_EEPROM_A2_I2C_ADDR (0xA2 >> 1) - -#define SFF8024_PHYSICAL_DEVICE_ID_ADDR 0x0 -#define SFF8024_DEVICE_ID_SFP 0x3 -#define SFF8024_DEVICE_ID_QSFP 0xC -#define SFF8024_DEVICE_ID_QSFP_PLUS 0xD -#define SFF8024_DEVICE_ID_QSFP28 0x11 - -#define SFF8472_DIAG_MON_TYPE_ADDR 92 -#define SFF8472_DIAG_MON_TYPE_DDM_MASK 0x40 -#define SFF8472_10G_ETH_COMPLIANCE_ADDR 0x3 -#define SFF8472_10G_BASE_MASK 0xF0 - -#define SFF8436_RX_LOS_ADDR 3 -#define SFF8436_TX_FAULT_ADDR 4 -#define SFF8436_TX_DISABLE_ADDR 86 - -static ssize_t sfp_eeprom_read(struct i2c_client *, u8, u8 *,int); -static ssize_t sfp_eeprom_write(struct i2c_client *, u8 , const char *,int); -extern int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg); -extern int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); - -/* Addresses scanned - */ -static const unsigned short normal_i2c[] = { SFP_EEPROM_A0_I2C_ADDR, SFP_EEPROM_A2_I2C_ADDR, I2C_CLIENT_END }; - -#define CPLD_PORT_TO_FRONT_PORT(port) (port+1) - -enum port_numbers { -sfp1, sfp2, sfp3, sfp4, sfp5, sfp6, sfp7, sfp8, -sfp9, sfp10, sfp11, sfp12, sfp13, sfp14, sfp15, sfp16, -sfp17, sfp18, sfp19, sfp20, sfp21, sfp22, sfp23, sfp24, -sfp25, sfp26, sfp27, sfp28, sfp29, sfp30, sfp31, sfp32 -}; - -static const struct i2c_device_id sfp_device_id[] = { -{ "sfp1", sfp1 }, { "sfp2", sfp2 }, { "sfp3", sfp3 }, { "sfp4", sfp4 }, -{ "sfp5", sfp5 }, { "sfp6", sfp6 }, { "sfp7", sfp7 }, { "sfp8", sfp8 }, -{ "sfp9", sfp9 }, { "sfp10", sfp10 }, { "sfp11", sfp11 }, { "sfp12", sfp12 }, -{ "sfp13", sfp13 }, { "sfp14", sfp14 }, { "sfp15", sfp15 }, { "sfp16", sfp16 }, -{ "sfp17", sfp17 }, { "sfp18", sfp18 }, { "sfp19", sfp19 }, { "sfp20", sfp20 }, -{ "sfp21", sfp21 }, { "sfp22", sfp22 }, { "sfp23", sfp23 }, { "sfp24", sfp24 }, -{ "sfp25", sfp25 }, { "sfp26", sfp26 }, { "sfp27", sfp27 }, { "sfp28", sfp28 }, -{ "sfp29", sfp29 }, { "sfp30", sfp30 }, { "sfp31", sfp31 }, { "sfp32", sfp32 }, -{} -}; -MODULE_DEVICE_TABLE(i2c, sfp_device_id); - -/* - * list of valid port types - * note OOM_PORT_TYPE_NOT_PRESENT to indicate no - * module is present in this port - */ -typedef enum oom_driver_port_type_e { - OOM_DRIVER_PORT_TYPE_INVALID, - OOM_DRIVER_PORT_TYPE_NOT_PRESENT, - OOM_DRIVER_PORT_TYPE_SFP, - OOM_DRIVER_PORT_TYPE_SFP_PLUS, - OOM_DRIVER_PORT_TYPE_QSFP, - OOM_DRIVER_PORT_TYPE_QSFP_PLUS, - OOM_DRIVER_PORT_TYPE_QSFP28 -} oom_driver_port_type_t; - -enum driver_type_e { - DRIVER_TYPE_SFP_MSA, - DRIVER_TYPE_SFP_DDM, - DRIVER_TYPE_QSFP -}; - -/* Each client has this additional data - */ -struct eeprom_data { - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - struct bin_attribute bin; /* eeprom data */ -}; - -struct sfp_msa_data { - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u64 status[2]; /* index 0 => device id - 1 => 10G Ethernet Compliance Codes - to distinguish SFP or SFP+ - 2 => DIAGNOSTIC MONITORING TYPE */ - struct eeprom_data eeprom; -}; - -struct sfp_ddm_data { - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u64 status[3]; /* bit0:port0, bit1:port1 and so on */ - /* index 0 => tx_fail - 1 => tx_disable - 2 => rx_loss */ - struct eeprom_data eeprom; -}; - -struct qsfp_data { - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u8 status[3]; /* bit0:port0, bit1:port1 and so on */ - /* index 0 => tx_fail - 1 => tx_disable - 2 => rx_loss */ - - u8 device_id; - struct eeprom_data eeprom; -}; - -struct sfp_port_data { - struct mutex update_lock; - enum driver_type_e driver_type; - int port; /* CPLD port index */ - oom_driver_port_type_t port_type; - u64 present; /* present status, bit0:port0, bit1:port1 and so on */ - - struct sfp_msa_data *msa; - struct sfp_ddm_data *ddm; - struct qsfp_data *qsfp; - - struct i2c_client *client; -}; - -enum sfp_sysfs_attributes { - PRESENT, - PRESENT_ALL, - PORT_NUMBER, - PORT_TYPE, - DDM_IMPLEMENTED, - TX_FAULT, - TX_FAULT1, - TX_FAULT2, - TX_FAULT3, - TX_FAULT4, - TX_DISABLE, - TX_DISABLE1, - TX_DISABLE2, - TX_DISABLE3, - TX_DISABLE4, - TX_DISABLE_ALL, - RX_LOS, - RX_LOS1, - RX_LOS2, - RX_LOS3, - RX_LOS4, - RX_LOS_ALL -}; - -static ssize_t show_port_number(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct i2c_client *client = to_i2c_client(dev); - struct sfp_port_data *data = i2c_get_clientdata(client); - return sprintf(buf, "%d\n", CPLD_PORT_TO_FRONT_PORT(data->port)); -} - -static struct sfp_port_data *sfp_update_present(struct i2c_client *client) -{ - struct sfp_port_data *data = i2c_get_clientdata(client); - int i = 0; - int status = -1; - u8 regs[] = {0x30, 0x31, 0x32, 0x33}; - - DEBUG_PRINT("Starting sfp present status update"); - mutex_lock(&data->update_lock); - - /* Read present status of port 1~32 */ - data->present = 0; - - for (i = 0; i < ARRAY_SIZE(regs); i++) { - status = accton_i2c_cpld_read(0x60, regs[i]); - - if (status < 0) { - DEBUG_PRINT("cpld(0x60) reg(0x%x) err %d", regs[i], status); - goto exit; - } - - DEBUG_PRINT("Present status = 0x%lx", data->present); - data->present |= (u64)status << (i*8); - } - - DEBUG_PRINT("Present status = 0x%lx", data->present); -exit: - mutex_unlock(&data->update_lock); - return data; -} - -static struct sfp_port_data *sfp_update_tx_rx_status(struct device *dev) -{ - return NULL; -} - -static ssize_t sfp_set_tx_disable(struct device *dev, struct device_attribute *da, - const char *buf, size_t count) -{ - return 0; -} - -static int sfp_is_port_present(struct i2c_client *client, int port) -{ - struct sfp_port_data *data = sfp_update_present(client); - return (data->present & BIT_INDEX(data->port)) ? 0 : 1; -} - -static ssize_t show_present(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct sfp_port_data *data = i2c_get_clientdata(client); - - if (PRESENT_ALL == attr->index) { - - } - - /* PRESENT */ - return sprintf(buf, "%d\n", sfp_is_port_present(client, data->port)); -} - -static struct sfp_port_data *sfp_update_port_type(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct sfp_port_data *data = i2c_get_clientdata(client); - u8 buf = 0; - int status; - - mutex_lock(&data->update_lock); - - switch (data->driver_type) { - case DRIVER_TYPE_SFP_MSA: - { - status = sfp_eeprom_read(data->client, SFF8024_PHYSICAL_DEVICE_ID_ADDR, &buf, sizeof(buf)); - if (status < 0) { - data->port_type = OOM_DRIVER_PORT_TYPE_INVALID; - break; - } - - if (buf != SFF8024_DEVICE_ID_SFP) { - data->port_type = OOM_DRIVER_PORT_TYPE_INVALID; - break; - } - - status = sfp_eeprom_read(data->client, SFF8472_10G_ETH_COMPLIANCE_ADDR, &buf, sizeof(buf)); - if (status < 0) { - data->port_type = OOM_DRIVER_PORT_TYPE_INVALID; - break; - } - - DEBUG_PRINT("sfp port type (0x3) data = (0x%x)", buf); - data->port_type = buf & SFF8472_10G_BASE_MASK ? OOM_DRIVER_PORT_TYPE_SFP_PLUS : OOM_DRIVER_PORT_TYPE_SFP; - break; - } - case DRIVER_TYPE_QSFP: - { - status = sfp_eeprom_read(data->client, SFF8024_PHYSICAL_DEVICE_ID_ADDR, &buf, sizeof(buf)); - if (status < 0) { - data->port_type = OOM_DRIVER_PORT_TYPE_INVALID; - break; - } - - DEBUG_PRINT("qsfp port type (0x0) buf = (0x%x)", buf); - switch (buf) { - case SFF8024_DEVICE_ID_QSFP: - data->port_type = OOM_DRIVER_PORT_TYPE_QSFP; - break; - case SFF8024_DEVICE_ID_QSFP_PLUS: - data->port_type = OOM_DRIVER_PORT_TYPE_QSFP_PLUS; - break; - case SFF8024_DEVICE_ID_QSFP28: - data->port_type = OOM_DRIVER_PORT_TYPE_QSFP_PLUS; - break; - default: - data->port_type = OOM_DRIVER_PORT_TYPE_INVALID; - break; - } - - break; - } - default: - break; - } - - mutex_unlock(&data->update_lock); - return data; -} - -static ssize_t show_port_type(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct i2c_client *client = to_i2c_client(dev); - struct sfp_port_data *data = i2c_get_clientdata(client); - - if (!sfp_is_port_present(client, data->port)) { - return sprintf(buf, "%d\n", OOM_DRIVER_PORT_TYPE_NOT_PRESENT); - } - - sfp_update_port_type(dev); - return sprintf(buf, "%d\n", data->port_type); -} - -static struct sfp_port_data *qsfp_update_tx_rx_status(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct sfp_port_data *data = i2c_get_clientdata(client); - int i, status = -1; - u8 buf = 0; - u8 reg[] = {SFF8436_TX_FAULT_ADDR, SFF8436_TX_DISABLE_ADDR, SFF8436_RX_LOS_ADDR}; - - if (time_before(jiffies, data->qsfp->last_updated + HZ + HZ / 2) && data->qsfp->valid) { - return data; - } - - dev_dbg(dev, "Starting sfp tx rx status update"); - mutex_lock(&data->update_lock); - data->qsfp->valid = 0; - memset(data->qsfp->status, 0, sizeof(data->qsfp->status)); - - /* Notify device to update tx fault/ tx disable/ rx los status */ - for (i = 0; i < ARRAY_SIZE(reg); i++) { - status = sfp_eeprom_read(data->client, reg[i], &buf, sizeof(buf)); - if (status < 0) { - goto exit; - } - } - msleep(200); - - /* Read actual tx fault/ tx disable/ rx los status */ - for (i = 0; i < ARRAY_SIZE(reg); i++) { - status = sfp_eeprom_read(data->client, reg[i], &buf, sizeof(buf)); - if (status < 0) { - goto exit; - } - - DEBUG_PRINT("qsfp reg(0x%x) status = (0x%x)", reg[i], data->qsfp->status[i]); - data->qsfp->status[i] = (buf & 0xF); - } - - data->qsfp->valid = 1; - data->qsfp->last_updated = jiffies; - mutex_unlock(&data->update_lock); - return data; - -exit: - mutex_unlock(&data->update_lock); - return NULL; -} - -static ssize_t qsfp_show_tx_rx_status(struct device *dev, struct device_attribute *da, - char *buf) -{ - u8 val = 0; - struct i2c_client *client = to_i2c_client(dev); - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct sfp_port_data *data = i2c_get_clientdata(client); - - if (!sfp_is_port_present(client, data->port)) { - return -ENODEV; - } - - data = qsfp_update_tx_rx_status(dev); - if (!data) { - return -EIO; - } - - switch (attr->index) { - case TX_FAULT1: - case TX_FAULT2: - case TX_FAULT3: - case TX_FAULT4: - val = (data->qsfp->status[2] & BIT_INDEX(attr->index - TX_FAULT1)) ? 1 : 0; - break; - case TX_DISABLE1: - case TX_DISABLE2: - case TX_DISABLE3: - case TX_DISABLE4: - val = (data->qsfp->status[1] & BIT_INDEX(attr->index - TX_DISABLE1)) ? 1 : 0; - break; - case TX_DISABLE_ALL: - val = ((data->qsfp->status[1] & 0xF) == 0xF) ? 1 : 0; - break; - - case RX_LOS1: - case RX_LOS2: - case RX_LOS3: - case RX_LOS4: - val = (data->qsfp->status[0] & BIT_INDEX(attr->index - RX_LOS1)) ? 1 : 0; - break; - default: - break; - } - - return sprintf(buf, "%d\n", val); -} - -static ssize_t qsfp_set_tx_disable(struct device *dev, struct device_attribute *da, - const char *buf, size_t count) -{ - long disable; - int result; - struct i2c_client *client = to_i2c_client(dev); - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct sfp_port_data *data; - - result = kstrtol(buf, 10, &disable); - if (result) { - return result; - } - - data = qsfp_update_tx_rx_status(dev); - if (!data) { - return -EIO; - } - - mutex_lock(&data->update_lock); - - DEBUG_PRINT ("%s-%d: disable:%u %d==%d %u\r\n", __FUNCTION__, __LINE__, - disable, attr->index, TX_DISABLE_ALL, data->qsfp->status[1]); - - if (attr->index == TX_DISABLE_ALL) - { - data->qsfp->status[1] = disable? 0xF:0; - } - else - { - if (disable) { - data->qsfp->status[1] |= (1 << (attr->index - TX_DISABLE1)); - } - else { - data->qsfp->status[1] &= ~(1 << (attr->index - TX_DISABLE1)); - } - } - DEBUG_PRINT("index = (%d), status = (0x%x)", attr->index, data->qsfp->status[1]); - result = sfp_eeprom_write(client, SFF8436_TX_DISABLE_ADDR, &data->qsfp->status[1], sizeof(data->qsfp->status[1])); - mutex_unlock(&data->update_lock); - return count; -} - -static ssize_t sfp_show_ddm_implemented(struct device *dev, struct device_attribute *da, - char *buf) -{ - int status; - char ddm; - struct i2c_client *client = to_i2c_client(dev); - struct sfp_port_data *data = i2c_get_clientdata(client); - - if (!sfp_is_port_present(client, data->port)) { - return -ENODEV; - } - - status = sfp_eeprom_read(data->client, SFF8472_DIAG_MON_TYPE_ADDR, &ddm, sizeof(ddm)); - if (status < 0) { - return -EIO; - } - - return sprintf(buf, "%d\n", (ddm & SFF8472_DIAG_MON_TYPE_DDM_MASK) ? 1 : 0); -} - -static ssize_t sfp_show_tx_rx_status(struct device *dev, struct device_attribute *da, - char *buf) -{ - u8 val = 0, index = 0; - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct sfp_port_data *data; - - data = sfp_update_tx_rx_status(dev); - if (!data) { - return -EIO; - } - - switch (attr->index) { - case TX_FAULT: - index = 0; - break; - case TX_DISABLE: - index = 1; - break; - case RX_LOS: - index = 2; - break; - default: - break; - } - - val = (data->ddm->status[index] & BIT_INDEX(data->port)) ? 1 : 0; - return sprintf(buf, "%d\n", val); -} - -/* SFP/QSFP common attributes for sysfs */ -static SENSOR_DEVICE_ATTR(sfp_port_number, S_IRUGO, show_port_number, NULL, PORT_NUMBER); -static SENSOR_DEVICE_ATTR(sfp_is_present, S_IRUGO, show_present, NULL, PRESENT); -static SENSOR_DEVICE_ATTR(sfp_port_type, S_IRUGO, show_port_type, NULL, PORT_TYPE); -static SENSOR_DEVICE_ATTR(sfp_is_present_all, S_IRUGO, show_present, NULL, PRESENT); - -/* QSFP attributes for sysfs */ -static SENSOR_DEVICE_ATTR(sfp_rx_los1, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS1); -static SENSOR_DEVICE_ATTR(sfp_rx_los2, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS2); -static SENSOR_DEVICE_ATTR(sfp_rx_los3, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS3); -static SENSOR_DEVICE_ATTR(sfp_rx_los4, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS4); -static SENSOR_DEVICE_ATTR(sfp_tx_disable1, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE1); -static SENSOR_DEVICE_ATTR(sfp_tx_disable2, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE2); -static SENSOR_DEVICE_ATTR(sfp_tx_disable3, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE3); -static SENSOR_DEVICE_ATTR(sfp_tx_disable4, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE4); -static SENSOR_DEVICE_ATTR(sfp_tx_disable_all, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE_ALL); -static SENSOR_DEVICE_ATTR(sfp_tx_fault1, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT1); -static SENSOR_DEVICE_ATTR(sfp_tx_fault2, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT2); -static SENSOR_DEVICE_ATTR(sfp_tx_fault3, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT3); -static SENSOR_DEVICE_ATTR(sfp_tx_fault4, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT4); -static struct attribute *qsfp_attributes[] = { - &sensor_dev_attr_sfp_port_number.dev_attr.attr, - &sensor_dev_attr_sfp_port_type.dev_attr.attr, - &sensor_dev_attr_sfp_is_present.dev_attr.attr, - &sensor_dev_attr_sfp_rx_los1.dev_attr.attr, - &sensor_dev_attr_sfp_rx_los2.dev_attr.attr, - &sensor_dev_attr_sfp_rx_los3.dev_attr.attr, - &sensor_dev_attr_sfp_rx_los4.dev_attr.attr, - &sensor_dev_attr_sfp_tx_disable1.dev_attr.attr, - &sensor_dev_attr_sfp_tx_disable2.dev_attr.attr, - &sensor_dev_attr_sfp_tx_disable3.dev_attr.attr, - &sensor_dev_attr_sfp_tx_disable4.dev_attr.attr, - &sensor_dev_attr_sfp_tx_disable_all.dev_attr.attr, - &sensor_dev_attr_sfp_tx_fault1.dev_attr.attr, - &sensor_dev_attr_sfp_tx_fault2.dev_attr.attr, - &sensor_dev_attr_sfp_tx_fault3.dev_attr.attr, - &sensor_dev_attr_sfp_tx_fault4.dev_attr.attr, - NULL -}; - -/* SFP msa attributes for sysfs */ -static SENSOR_DEVICE_ATTR(sfp_ddm_implemented, S_IRUGO, sfp_show_ddm_implemented, NULL, DDM_IMPLEMENTED); -static struct attribute *sfp_msa_attributes[] = { - &sensor_dev_attr_sfp_port_number.dev_attr.attr, - &sensor_dev_attr_sfp_port_type.dev_attr.attr, - &sensor_dev_attr_sfp_is_present.dev_attr.attr, - &sensor_dev_attr_sfp_ddm_implemented.dev_attr.attr, - NULL -}; - -/* SFP ddm attributes for sysfs */ -static SENSOR_DEVICE_ATTR(sfp_rx_los, S_IRUGO, sfp_show_tx_rx_status, NULL, RX_LOS); -static SENSOR_DEVICE_ATTR(sfp_tx_disable, S_IWUSR | S_IRUGO, sfp_show_tx_rx_status, sfp_set_tx_disable, TX_DISABLE); -static SENSOR_DEVICE_ATTR(sfp_tx_fault, S_IRUGO, sfp_show_tx_rx_status, NULL, TX_FAULT); -static struct attribute *sfp_ddm_attributes[] = { - &sensor_dev_attr_sfp_tx_fault.dev_attr.attr, - &sensor_dev_attr_sfp_rx_los.dev_attr.attr, - &sensor_dev_attr_sfp_tx_disable.dev_attr.attr, - NULL -}; - -static ssize_t sfp_eeprom_write(struct i2c_client *client, u8 command, const char *data, - int data_len) -{ -#if USE_I2C_BLOCK_READ - int result, retry = I2C_RW_RETRY_COUNT; - - if (data_len > I2C_SMBUS_BLOCK_MAX) { - data_len = I2C_SMBUS_BLOCK_MAX; - } - - while (retry) { - result = i2c_smbus_write_i2c_block_data(client, command, data_len, data); - if (result < 0) { - msleep(I2C_RW_RETRY_INTERVAL); - retry--; - continue; - } - - break; - } - - if (unlikely(result < 0)) { - return result; - } - - return data_len; -#else - int result, retry = I2C_RW_RETRY_COUNT; - - while (retry) { - result = i2c_smbus_write_byte_data(client, command, *data); - if (result < 0) { - msleep(I2C_RW_RETRY_INTERVAL); - retry--; - continue; - } - - break; - } - - if (unlikely(result < 0)) { - return result; - } - - return 1; -#endif - - -} - - -static ssize_t sfp_port_write(struct sfp_port_data *data, - const char *buf, loff_t off, size_t count) -{ - ssize_t retval = 0; - - if (unlikely(!count)) { - return count; - } - - /* - * Write data to chip, protecting against concurrent updates - * from this host, but not from other I2C masters. - */ - mutex_lock(&data->update_lock); - - while (count) { - ssize_t status; - - status = sfp_eeprom_write(data->client, off, buf, count); - if (status <= 0) { - if (retval == 0) { - retval = status; - } - break; - } - buf += status; - off += status; - count -= status; - retval += status; - } - - mutex_unlock(&data->update_lock); - return retval; -} - - -static ssize_t sfp_bin_write(struct file *filp, struct kobject *kobj, - struct bin_attribute *attr, - char *buf, loff_t off, size_t count) -{ - struct sfp_port_data *data; - DEBUG_PRINT("%s(%d) offset = (%d), count = (%d)", off, count); - data = dev_get_drvdata(container_of(kobj, struct device, kobj)); - return sfp_port_write(data, buf, off, count); -} - -static ssize_t sfp_eeprom_read(struct i2c_client *client, u8 command, u8 *data, - int data_len) -{ -#if USE_I2C_BLOCK_READ - int result, retry = I2C_RW_RETRY_COUNT; - - if (data_len > I2C_SMBUS_BLOCK_MAX) { - data_len = I2C_SMBUS_BLOCK_MAX; - } - - while (retry) { - result = i2c_smbus_read_i2c_block_data(client, command, data_len, data); - if (result < 0) { - msleep(I2C_RW_RETRY_INTERVAL); - retry--; - continue; - } - - break; - } - - if (unlikely(result < 0)) - goto abort; - if (unlikely(result != data_len)) { - result = -EIO; - goto abort; - } - - //result = data_len; - -abort: - return result; -#else - int result, retry = I2C_RW_RETRY_COUNT; - - while (retry) { - result = i2c_smbus_read_byte_data(client, command); - if (result < 0) { - msleep(I2C_RW_RETRY_INTERVAL); - retry--; - continue; - } - - break; - } - - if (unlikely(result < 0)) { - dev_dbg(&client->dev, "sfp read byte data failed, command(0x%2x), data(0x%2x)\r\n", command, result); - goto abort; - } - - *data = (u8)result; - result = 1; - -abort: - return result; -#endif -} - -static ssize_t sfp_port_read(struct sfp_port_data *data, - char *buf, loff_t off, size_t count) -{ - ssize_t retval = 0; - - if (unlikely(!count)) { - DEBUG_PRINT("Count = 0, return"); - return count; - } - - /* - * Read data from chip, protecting against concurrent updates - * from this host, but not from other I2C masters. - */ - mutex_lock(&data->update_lock); - - while (count) { - ssize_t status; - - status = sfp_eeprom_read(data->client, off, buf, count); - if (status <= 0) { - if (retval == 0) { - retval = status; - } - break; - } - - buf += status; - off += status; - count -= status; - retval += status; - } - - mutex_unlock(&data->update_lock); - return retval; - -} - -static ssize_t sfp_bin_read(struct file *filp, struct kobject *kobj, - struct bin_attribute *attr, - char *buf, loff_t off, size_t count) -{ - struct sfp_port_data *data; - DEBUG_PRINT("offset = (%d), count = (%d)", off, count); - data = dev_get_drvdata(container_of(kobj, struct device, kobj)); - return sfp_port_read(data, buf, off, count); -} - -static int sfp_sysfs_eeprom_init(struct kobject *kobj, struct bin_attribute *eeprom) -{ - int err; - - sysfs_bin_attr_init(eeprom); - eeprom->attr.name = EEPROM_NAME; - eeprom->attr.mode = S_IWUSR | S_IRUGO; - eeprom->read = sfp_bin_read; - eeprom->write = sfp_bin_write; - eeprom->size = EEPROM_SIZE; - - /* Create eeprom file */ - err = sysfs_create_bin_file(kobj, eeprom); - if (err) { - return err; - } - - return 0; -} - -static int sfp_sysfs_eeprom_cleanup(struct kobject *kobj, struct bin_attribute *eeprom) -{ - sysfs_remove_bin_file(kobj, eeprom); - return 0; -} - -static const struct attribute_group sfp_msa_group = { - .attrs = sfp_msa_attributes, -}; - -static int sfp_i2c_check_functionality(struct i2c_client *client) -{ -#if USE_I2C_BLOCK_READ - return i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK); -#else - return i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA); -#endif -} - -static int sfp_msa_probe(struct i2c_client *client, const struct i2c_device_id *dev_id, - struct sfp_msa_data **data) -{ - int status; - struct sfp_msa_data *msa; - - if (!sfp_i2c_check_functionality(client)) { - status = -EIO; - goto exit; - } - - msa = kzalloc(sizeof(struct sfp_msa_data), GFP_KERNEL); - if (!msa) { - status = -ENOMEM; - goto exit; - } - - /* Register sysfs hooks */ - status = sysfs_create_group(&client->dev.kobj, &sfp_msa_group); - if (status) { - goto exit_free; - } - - /* init eeprom */ - status = sfp_sysfs_eeprom_init(&client->dev.kobj, &msa->eeprom.bin); - if (status) { - goto exit_remove; - } - - *data = msa; - dev_info(&client->dev, "sfp msa '%s'\n", client->name); - - return 0; - -exit_remove: - sysfs_remove_group(&client->dev.kobj, &sfp_msa_group); -exit_free: - kfree(msa); -exit: - - return status; -} - -static const struct attribute_group sfp_ddm_group = { - .attrs = sfp_ddm_attributes, -}; - -static int sfp_ddm_probe(struct i2c_client *client, const struct i2c_device_id *dev_id, - struct sfp_ddm_data **data) -{ - int status; - struct sfp_ddm_data *ddm; - - if (!sfp_i2c_check_functionality(client)) { - status = -EIO; - goto exit; - } - - ddm = kzalloc(sizeof(struct sfp_ddm_data), GFP_KERNEL); - if (!ddm) { - status = -ENOMEM; - goto exit; - } - - /* Register sysfs hooks */ - status = sysfs_create_group(&client->dev.kobj, &sfp_ddm_group); - if (status) { - goto exit_free; - } - - /* init eeprom */ - status = sfp_sysfs_eeprom_init(&client->dev.kobj, &ddm->eeprom.bin); - if (status) { - goto exit_remove; - } - - *data = ddm; - dev_info(&client->dev, "sfp ddm '%s'\n", client->name); - - return 0; - -exit_remove: - sysfs_remove_group(&client->dev.kobj, &sfp_ddm_group); -exit_free: - kfree(ddm); -exit: - - return status; -} - -static const struct attribute_group qsfp_group = { - .attrs = qsfp_attributes, -}; - -static int qsfp_probe(struct i2c_client *client, const struct i2c_device_id *dev_id, - struct qsfp_data **data) -{ - int status; - struct qsfp_data *qsfp; - - if (!sfp_i2c_check_functionality(client)) { - status = -EIO; - goto exit; - } - - qsfp = kzalloc(sizeof(struct qsfp_data), GFP_KERNEL); - if (!qsfp) { - status = -ENOMEM; - goto exit; - } - - /* Register sysfs hooks */ - status = sysfs_create_group(&client->dev.kobj, &qsfp_group); - if (status) { - goto exit_free; - } - - /* init eeprom */ - status = sfp_sysfs_eeprom_init(&client->dev.kobj, &qsfp->eeprom.bin); - if (status) { - goto exit_remove; - } - - /* Bring QSFPs out of reset - as6712_32x_i2c_cpld_write(0x62, 0x4, 0xFF); - as6712_32x_i2c_cpld_write(0x62, 0x5, 0xFF); - as6712_32x_i2c_cpld_write(0x64, 0x4, 0xFF); - as6712_32x_i2c_cpld_write(0x64, 0x5, 0xFF);*/ - - *data = qsfp; - dev_info(&client->dev, "qsfp '%s'\n", client->name); - - return 0; - -exit_remove: - sysfs_remove_group(&client->dev.kobj, &qsfp_group); -exit_free: - kfree(qsfp); -exit: - - return status; -} - -static int sfp_device_probe(struct i2c_client *client, - const struct i2c_device_id *dev_id) -{ - struct sfp_port_data *data = NULL; - - data = kzalloc(sizeof(struct sfp_port_data), GFP_KERNEL); - if (!data) { - return -ENOMEM; - } - - i2c_set_clientdata(client, data); - mutex_init(&data->update_lock); - data->port = dev_id->driver_data; - data->client = client; - - if (client->addr != SFP_EEPROM_A0_I2C_ADDR) { - return -ENODEV; - } - - data->driver_type = DRIVER_TYPE_QSFP; - return qsfp_probe(client, dev_id, &data->qsfp); -} - -static int sfp_msa_remove(struct i2c_client *client, struct sfp_msa_data *data) -{ - sfp_sysfs_eeprom_cleanup(&client->dev.kobj, &data->eeprom.bin); - sysfs_remove_group(&client->dev.kobj, &sfp_msa_group); - kfree(data); - return 0; -} - -static int sfp_ddm_remove(struct i2c_client *client, struct sfp_ddm_data *data) -{ - sfp_sysfs_eeprom_cleanup(&client->dev.kobj, &data->eeprom.bin); - sysfs_remove_group(&client->dev.kobj, &sfp_ddm_group); - kfree(data); - return 0; -} - -static int qfp_remove(struct i2c_client *client, struct qsfp_data *data) -{ - sfp_sysfs_eeprom_cleanup(&client->dev.kobj, &data->eeprom.bin); - sysfs_remove_group(&client->dev.kobj, &qsfp_group); - kfree(data); - return 0; -} - -static int sfp_device_remove(struct i2c_client *client) -{ - struct sfp_port_data *data = i2c_get_clientdata(client); - - switch (data->driver_type) { - case DRIVER_TYPE_SFP_MSA: - return sfp_msa_remove(client, data->msa); - case DRIVER_TYPE_SFP_DDM: - return sfp_ddm_remove(client, data->ddm); - case DRIVER_TYPE_QSFP: - return qfp_remove(client, data->qsfp); - } - - return 0; -} - -static struct i2c_driver sfp_driver = { - .driver = { - .name = DRIVER_NAME, - }, - .probe = sfp_device_probe, - .remove = sfp_device_remove, - .id_table = sfp_device_id, - .address_list = normal_i2c, -}; - -static int __init sfp_init(void) -{ - extern int platform_accton_as7712_32x(void); - if (!platform_accton_as7712_32x()) { - return -ENODEV; - } - - return i2c_add_driver(&sfp_driver); -} - -static void __exit sfp_exit(void) -{ - i2c_del_driver(&sfp_driver); -} - -MODULE_AUTHOR("Brandon Chuang "); -MODULE_DESCRIPTION("accton as7712_32x_sfp driver"); -MODULE_LICENSE("GPL"); - -module_init(sfp_init); -module_exit(sfp_exit); - diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_i2c_cpld.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_i2c_cpld.c deleted file mode 100644 index b25bf1c2aff4..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/accton_i2c_cpld.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - * A hwmon driver for the accton_i2c_cpld - * - * Copyright (C) 2014 Accton Technology Corporation. - * Brandon Chuang - * - * Based on ad7414.c - * Copyright 2006 Stefan Roese , DENX Software Engineering - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define CPLD_VERSION_REG 0x1 - -enum as5712_54x_cpld_sysfs_attributes { - CPLD_READ_VERSION, - CPLD_BYTE_ACCESS, - CPLD_DUMP_ALL, -}; - -static ssize_t read_cpld_version(struct device *dev, struct device_attribute *da, - char *buf); -int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg); - - -static LIST_HEAD(cpld_client_list); -static struct mutex list_lock; - -struct cpld_client_node { - struct i2c_client *client; - struct list_head list; -}; - -/* Addresses scanned for accton_i2c_cpld - */ -static const unsigned short normal_i2c[] = { 0x31, 0x35, 0x60, 0x61, 0x62, I2C_CLIENT_END }; - -static SENSOR_DEVICE_ATTR(cpld_get_version, S_IRUGO, read_cpld_version, NULL, CPLD_READ_VERSION); - -static struct attribute *as5712_54x_cpld_attributes[] = { - &sensor_dev_attr_cpld_get_version.dev_attr.attr, - NULL -}; - -static const struct attribute_group as5712_54x_cpld_group = { - .attrs = as5712_54x_cpld_attributes, -}; - -static ssize_t read_cpld_version(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - unsigned short cpld_reg = CPLD_VERSION_REG; - u8 reg; - - if(attr->index == CPLD_READ_VERSION) { - reg = accton_i2c_cpld_read(client->addr, cpld_reg); - return sprintf(buf, "%02x\n",reg); - } - return -1 ; -} - - -static void accton_i2c_cpld_add_client(struct i2c_client *client) -{ - struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); - - if (!node) { - dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr); - return; - } - - node->client = client; - - mutex_lock(&list_lock); - list_add(&node->list, &cpld_client_list); - mutex_unlock(&list_lock); -} - -static void accton_i2c_cpld_remove_client(struct i2c_client *client) -{ - struct list_head *list_node = NULL; - struct cpld_client_node *cpld_node = NULL; - int found = 0; - - mutex_lock(&list_lock); - - list_for_each(list_node, &cpld_client_list) - { - cpld_node = list_entry(list_node, struct cpld_client_node, list); - - if (cpld_node->client == client) { - found = 1; - break; - } - } - - if (found) { - list_del(list_node); - kfree(cpld_node); - } - - mutex_unlock(&list_lock); -} - -static int accton_i2c_cpld_probe(struct i2c_client *client, - const struct i2c_device_id *dev_id) -{ - int status; - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { - dev_dbg(&client->dev, "i2c_check_functionality failed (0x%x)\n", client->addr); - status = -EIO; - goto exit; - } - - /* Register sysfs hooks */ - status = sysfs_create_group(&client->dev.kobj, &as5712_54x_cpld_group); - if (status) { - goto exit; - } - - dev_info(&client->dev, "chip found\n"); - accton_i2c_cpld_add_client(client); - - return 0; -exit: - return status; -} - -static int accton_i2c_cpld_remove(struct i2c_client *client) -{ - sysfs_remove_group(&client->dev.kobj, &as5712_54x_cpld_group); - - accton_i2c_cpld_remove_client(client); - return 0; -} - -static const struct i2c_device_id accton_i2c_cpld_id[] = { - { "accton_i2c_cpld", 0 }, - {} -}; -MODULE_DEVICE_TABLE(i2c, accton_i2c_cpld_id); - -static struct i2c_driver accton_i2c_cpld_driver = { - .class = I2C_CLASS_HWMON, - .driver = { - .name = "accton_i2c_cpld", - }, - .probe = accton_i2c_cpld_probe, - .remove = accton_i2c_cpld_remove, - .id_table = accton_i2c_cpld_id, - .address_list = normal_i2c, -}; - -int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg) -{ - struct list_head *list_node = NULL; - struct cpld_client_node *cpld_node = NULL; - int ret = -EPERM; - - mutex_lock(&list_lock); - - list_for_each(list_node, &cpld_client_list) - { - cpld_node = list_entry(list_node, struct cpld_client_node, list); - - if (cpld_node->client->addr == cpld_addr) { - ret = i2c_smbus_read_byte_data(cpld_node->client, reg); - break; - } - } - - mutex_unlock(&list_lock); - - return ret; -} -EXPORT_SYMBOL(accton_i2c_cpld_read); - -int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value) -{ - struct list_head *list_node = NULL; - struct cpld_client_node *cpld_node = NULL; - int ret = -EIO; - - mutex_lock(&list_lock); - - list_for_each(list_node, &cpld_client_list) - { - cpld_node = list_entry(list_node, struct cpld_client_node, list); - - if (cpld_node->client->addr == cpld_addr) { - ret = i2c_smbus_write_byte_data(cpld_node->client, reg, value); - break; - } - } - - mutex_unlock(&list_lock); - - return ret; -} -EXPORT_SYMBOL(accton_i2c_cpld_write); - -static int __init accton_i2c_cpld_init(void) -{ - mutex_init(&list_lock); - return i2c_add_driver(&accton_i2c_cpld_driver); -} - -static void __exit accton_i2c_cpld_exit(void) -{ - i2c_del_driver(&accton_i2c_cpld_driver); -} - -static struct dmi_system_id as7712_dmi_table[] = { - { - .ident = "Accton AS7712", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Accton"), - DMI_MATCH(DMI_PRODUCT_NAME, "AS7712"), - }, - } -}; - -int platform_accton_as7712_32x(void) -{ - return dmi_check_system(as7712_dmi_table); -} -EXPORT_SYMBOL(platform_accton_as7712_32x); - -MODULE_AUTHOR("Brandon Chuang "); -MODULE_DESCRIPTION("accton_i2c_cpld driver"); -MODULE_LICENSE("GPL"); - -module_init(accton_i2c_cpld_init); -module_exit(accton_i2c_cpld_exit); diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/leds-accton_as7712_32x.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/leds-accton_as7712_32x.c deleted file mode 100644 index 8b14437bca35..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/leds-accton_as7712_32x.c +++ /dev/null @@ -1,443 +0,0 @@ -/* - * A LED driver for the accton_as7712_32x_led - * - * Copyright (C) 2014 Accton Technology Corporation. - * Brandon Chuang - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/*#define DEBUG*/ - -#include -#include -#include -#include -#include -#include -#include -#include - -extern int accton_i2c_cpld_read (unsigned short cpld_addr, u8 reg); -extern int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); - -extern void led_classdev_unregister(struct led_classdev *led_cdev); -extern int led_classdev_register(struct device *parent, struct led_classdev *led_cdev); -extern void led_classdev_resume(struct led_classdev *led_cdev); -extern void led_classdev_suspend(struct led_classdev *led_cdev); - -#define DRVNAME "accton_as7712_32x_led" - -struct accton_as7712_32x_led_data { - struct platform_device *pdev; - struct mutex update_lock; - char valid; /* != 0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u8 reg_val[1]; /* only 1 register*/ -}; - -static struct accton_as7712_32x_led_data *ledctl = NULL; - -/* LED related data - */ - -#define LED_CNTRLER_I2C_ADDRESS (0x60) - -#define LED_TYPE_DIAG_REG_MASK (0x3) -#define LED_MODE_DIAG_GREEN_VALUE (0x02) -#define LED_MODE_DIAG_RED_VALUE (0x01) -#define LED_MODE_DIAG_AMBER_VALUE (0x00) /*It's yellow actually. Green+Red=Yellow*/ -#define LED_MODE_DIAG_OFF_VALUE (0x03) - - -#define LED_TYPE_LOC_REG_MASK (0x80) -#define LED_MODE_LOC_ON_VALUE (0) -#define LED_MODE_LOC_OFF_VALUE (0x80) - -enum led_type { - LED_TYPE_DIAG, - LED_TYPE_LOC, - LED_TYPE_FAN, - LED_TYPE_PSU1, - LED_TYPE_PSU2 -}; - -struct led_reg { - u32 types; - u8 reg_addr; -}; - -static const struct led_reg led_reg_map[] = { - {(1<update_lock); - - if (time_after(jiffies, ledctl->last_updated + HZ + HZ / 2) - || !ledctl->valid) { - int i; - - dev_dbg(&ledctl->pdev->dev, "Starting accton_as7712_32x_led update\n"); - - /* Update LED data - */ - for (i = 0; i < ARRAY_SIZE(ledctl->reg_val); i++) { - int status = accton_as7712_32x_led_read_value(led_reg_map[i].reg_addr); - - if (status < 0) { - ledctl->valid = 0; - dev_dbg(&ledctl->pdev->dev, "reg %d, err %d\n", led_reg_map[i].reg_addr, status); - goto exit; - } - else - { - ledctl->reg_val[i] = status; - } - } - - ledctl->last_updated = jiffies; - ledctl->valid = 1; - } - -exit: - mutex_unlock(&ledctl->update_lock); -} - -static void accton_as7712_32x_led_set(struct led_classdev *led_cdev, - enum led_brightness led_light_mode, - enum led_type type) -{ - int reg_val; - u8 reg ; - mutex_lock(&ledctl->update_lock); - - if( !accton_getLedReg(type, ®)) - { - dev_dbg(&ledctl->pdev->dev, "Not match item for %d.\n", type); - } - - reg_val = accton_as7712_32x_led_read_value(reg); - - if (reg_val < 0) { - dev_dbg(&ledctl->pdev->dev, "reg %d, err %d\n", reg, reg_val); - goto exit; - } - reg_val = led_light_mode_to_reg_val(type, led_light_mode, reg_val); - accton_as7712_32x_led_write_value(reg, reg_val); - - /* to prevent the slow-update issue */ - ledctl->valid = 0; - -exit: - mutex_unlock(&ledctl->update_lock); -} - - -static void accton_as7712_32x_led_diag_set(struct led_classdev *led_cdev, - enum led_brightness led_light_mode) -{ - accton_as7712_32x_led_set(led_cdev, led_light_mode, LED_TYPE_DIAG); -} - -static enum led_brightness accton_as7712_32x_led_diag_get(struct led_classdev *cdev) -{ - accton_as7712_32x_led_update(); - return led_reg_val_to_light_mode(LED_TYPE_DIAG, ledctl->reg_val[0]); -} - -static void accton_as7712_32x_led_loc_set(struct led_classdev *led_cdev, - enum led_brightness led_light_mode) -{ - accton_as7712_32x_led_set(led_cdev, led_light_mode, LED_TYPE_LOC); -} - -static enum led_brightness accton_as7712_32x_led_loc_get(struct led_classdev *cdev) -{ - accton_as7712_32x_led_update(); - return led_reg_val_to_light_mode(LED_TYPE_LOC, ledctl->reg_val[0]); -} - -static void accton_as7712_32x_led_auto_set(struct led_classdev *led_cdev, - enum led_brightness led_light_mode) -{ -} - -static enum led_brightness accton_as7712_32x_led_auto_get(struct led_classdev *cdev) -{ - return LED_MODE_AUTO; -} - -static struct led_classdev accton_as7712_32x_leds[] = { - [LED_TYPE_DIAG] = { - .name = "accton_as7712_32x_led::diag", - .default_trigger = "unused", - .brightness_set = accton_as7712_32x_led_diag_set, - .brightness_get = accton_as7712_32x_led_diag_get, - .flags = LED_CORE_SUSPENDRESUME, - .max_brightness = LED_MODE_RED, - }, - [LED_TYPE_LOC] = { - .name = "accton_as7712_32x_led::loc", - .default_trigger = "unused", - .brightness_set = accton_as7712_32x_led_loc_set, - .brightness_get = accton_as7712_32x_led_loc_get, - .flags = LED_CORE_SUSPENDRESUME, - .max_brightness = LED_MODE_BLUE, - }, - [LED_TYPE_FAN] = { - .name = "accton_as7712_32x_led::fan", - .default_trigger = "unused", - .brightness_set = accton_as7712_32x_led_auto_set, - .brightness_get = accton_as7712_32x_led_auto_get, - .flags = LED_CORE_SUSPENDRESUME, - .max_brightness = LED_MODE_AUTO, - }, - [LED_TYPE_PSU1] = { - .name = "accton_as7712_32x_led::psu1", - .default_trigger = "unused", - .brightness_set = accton_as7712_32x_led_auto_set, - .brightness_get = accton_as7712_32x_led_auto_get, - .flags = LED_CORE_SUSPENDRESUME, - .max_brightness = LED_MODE_AUTO, - }, - [LED_TYPE_PSU2] = { - .name = "accton_as7712_32x_led::psu2", - .default_trigger = "unused", - .brightness_set = accton_as7712_32x_led_auto_set, - .brightness_get = accton_as7712_32x_led_auto_get, - .flags = LED_CORE_SUSPENDRESUME, - .max_brightness = LED_MODE_AUTO, - }, -}; - -static int accton_as7712_32x_led_suspend(struct platform_device *dev, - pm_message_t state) -{ - int i = 0; - - for (i = 0; i < ARRAY_SIZE(accton_as7712_32x_leds); i++) { - led_classdev_suspend(&accton_as7712_32x_leds[i]); - } - - return 0; -} - -static int accton_as7712_32x_led_resume(struct platform_device *dev) -{ - int i = 0; - - for (i = 0; i < ARRAY_SIZE(accton_as7712_32x_leds); i++) { - led_classdev_resume(&accton_as7712_32x_leds[i]); - } - - return 0; -} - -static int accton_as7712_32x_led_probe(struct platform_device *pdev) -{ - int ret, i; - - for (i = 0; i < ARRAY_SIZE(accton_as7712_32x_leds); i++) { - ret = led_classdev_register(&pdev->dev, &accton_as7712_32x_leds[i]); - - if (ret < 0) - break; - } - - /* Check if all LEDs were successfully registered */ - if (i != ARRAY_SIZE(accton_as7712_32x_leds)){ - int j; - - /* only unregister the LEDs that were successfully registered */ - for (j = 0; j < i; j++) { - led_classdev_unregister(&accton_as7712_32x_leds[i]); - } - } - - return ret; -} - -static int accton_as7712_32x_led_remove(struct platform_device *pdev) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(accton_as7712_32x_leds); i++) { - led_classdev_unregister(&accton_as7712_32x_leds[i]); - } - - return 0; -} - -static struct platform_driver accton_as7712_32x_led_driver = { - .probe = accton_as7712_32x_led_probe, - .remove = accton_as7712_32x_led_remove, - .suspend = accton_as7712_32x_led_suspend, - .resume = accton_as7712_32x_led_resume, - .driver = { - .name = DRVNAME, - .owner = THIS_MODULE, - }, -}; - -static int __init accton_as7712_32x_led_init(void) -{ - int ret; - - extern int platform_accton_as7712_32x(void); - if (!platform_accton_as7712_32x()) { - return -ENODEV; - } - - ret = platform_driver_register(&accton_as7712_32x_led_driver); - if (ret < 0) { - goto exit; - } - - ledctl = kzalloc(sizeof(struct accton_as7712_32x_led_data), GFP_KERNEL); - if (!ledctl) { - ret = -ENOMEM; - platform_driver_unregister(&accton_as7712_32x_led_driver); - goto exit; - } - - mutex_init(&ledctl->update_lock); - - ledctl->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); - if (IS_ERR(ledctl->pdev)) { - ret = PTR_ERR(ledctl->pdev); - platform_driver_unregister(&accton_as7712_32x_led_driver); - kfree(ledctl); - goto exit; - } - -exit: - return ret; -} - -static void __exit accton_as7712_32x_led_exit(void) -{ - platform_device_unregister(ledctl->pdev); - platform_driver_unregister(&accton_as7712_32x_led_driver); - kfree(ledctl); -} - -module_init(accton_as7712_32x_led_init); -module_exit(accton_as7712_32x_led_exit); - -MODULE_AUTHOR("Brandon Chuang "); -MODULE_DESCRIPTION("accton_as7712_32x_led driver"); -MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/ym2651y.c b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/ym2651y.c deleted file mode 100644 index 2745b095b7e2..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/modules/ym2651y.c +++ /dev/null @@ -1,589 +0,0 @@ -/* - * An hwmon driver for the 3Y Power YM-2651Y Power Module - * - * Copyright (C) 2014 Accton Technology Corporation. - * Brandon Chuang - * - * Based on ad7414.c - * Copyright 2006 Stefan Roese , DENX Software Engineering - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_FAN_DUTY_CYCLE 100 - -/* Addresses scanned - */ -static const unsigned short normal_i2c[] = { 0x58, 0x5b, I2C_CLIENT_END }; - -/* Each client has this additional data - */ -struct ym2651y_data { - struct device *hwmon_dev; - struct mutex update_lock; - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u8 capability; /* Register value */ - u16 status_word; /* Register value */ - u8 fan_fault; /* Register value */ - u8 over_temp; /* Register value */ - u16 v_out; /* Register value */ - u16 i_out; /* Register value */ - u16 p_out; /* Register value */ - u16 temp; /* Register value */ - u16 fan_speed; /* Register value */ - u16 fan_duty_cycle[2]; /* Register value */ - u8 fan_dir[4]; /* Register value */ - u8 pmbus_revision; /* Register value */ - u8 mfr_id[10]; /* Register value */ - u8 mfr_model[10]; /* Register value */ - u8 mfr_revsion[3]; /* Register value */ - u16 mfr_vin_min; /* Register value */ - u16 mfr_vin_max; /* Register value */ - u16 mfr_iin_max; /* Register value */ - u16 mfr_iout_max; /* Register value */ - u16 mfr_pin_max; /* Register value */ - u16 mfr_pout_max; /* Register value */ - u16 mfr_vout_min; /* Register value */ - u16 mfr_vout_max; /* Register value */ -}; - -static ssize_t show_byte(struct device *dev, struct device_attribute *da, - char *buf); -static ssize_t show_word(struct device *dev, struct device_attribute *da, - char *buf); -static ssize_t show_linear(struct device *dev, struct device_attribute *da, - char *buf); -static ssize_t show_fan_fault(struct device *dev, struct device_attribute *da, - char *buf); -static ssize_t show_over_temp(struct device *dev, struct device_attribute *da, - char *buf); -static ssize_t show_ascii(struct device *dev, struct device_attribute *da, - char *buf); -static struct ym2651y_data *ym2651y_update_device(struct device *dev); -static ssize_t set_fan_duty_cycle(struct device *dev, struct device_attribute *da, - const char *buf, size_t count); -static int ym2651y_write_word(struct i2c_client *client, u8 reg, u16 value); - -enum ym2651y_sysfs_attributes { - PSU_POWER_ON = 0, - PSU_TEMP_FAULT, - PSU_POWER_GOOD, - PSU_FAN1_FAULT, - PSU_FAN_DIRECTION, - PSU_OVER_TEMP, - PSU_V_OUT, - PSU_I_OUT, - PSU_P_OUT, - PSU_TEMP1_INPUT, - PSU_FAN1_SPEED, - PSU_FAN1_DUTY_CYCLE, - PSU_PMBUS_REVISION, - PSU_MFR_ID, - PSU_MFR_MODEL, - PSU_MFR_REVISION, - PSU_MFR_VIN_MIN, - PSU_MFR_VIN_MAX, - PSU_MFR_VOUT_MIN, - PSU_MFR_VOUT_MAX, - PSU_MFR_IIN_MAX, - PSU_MFR_IOUT_MAX, - PSU_MFR_PIN_MAX, - PSU_MFR_POUT_MAX -}; - -/* sysfs attributes for hwmon - */ -static SENSOR_DEVICE_ATTR(psu_power_on, S_IRUGO, show_word, NULL, PSU_POWER_ON); -static SENSOR_DEVICE_ATTR(psu_temp_fault, S_IRUGO, show_word, NULL, PSU_TEMP_FAULT); -static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_word, NULL, PSU_POWER_GOOD); -static SENSOR_DEVICE_ATTR(psu_fan1_fault, S_IRUGO, show_fan_fault, NULL, PSU_FAN1_FAULT); -static SENSOR_DEVICE_ATTR(psu_over_temp, S_IRUGO, show_over_temp, NULL, PSU_OVER_TEMP); -static SENSOR_DEVICE_ATTR(psu_v_out, S_IRUGO, show_linear, NULL, PSU_V_OUT); -static SENSOR_DEVICE_ATTR(psu_i_out, S_IRUGO, show_linear, NULL, PSU_I_OUT); -static SENSOR_DEVICE_ATTR(psu_p_out, S_IRUGO, show_linear, NULL, PSU_P_OUT); -static SENSOR_DEVICE_ATTR(psu_temp1_input, S_IRUGO, show_linear, NULL, PSU_TEMP1_INPUT); -static SENSOR_DEVICE_ATTR(psu_fan1_speed_rpm, S_IRUGO, show_linear, NULL, PSU_FAN1_SPEED); -static SENSOR_DEVICE_ATTR(psu_fan1_duty_cycle_percentage, S_IWUSR | S_IRUGO, show_linear, set_fan_duty_cycle, PSU_FAN1_DUTY_CYCLE); -static SENSOR_DEVICE_ATTR(psu_fan_dir, S_IRUGO, show_ascii, NULL, PSU_FAN_DIRECTION); -static SENSOR_DEVICE_ATTR(psu_pmbus_revision, S_IRUGO, show_byte, NULL, PSU_PMBUS_REVISION); -static SENSOR_DEVICE_ATTR(psu_mfr_id, S_IRUGO, show_ascii, NULL, PSU_MFR_ID); -static SENSOR_DEVICE_ATTR(psu_mfr_model, S_IRUGO, show_ascii, NULL, PSU_MFR_MODEL); -static SENSOR_DEVICE_ATTR(psu_mfr_revision, S_IRUGO, show_ascii, NULL, PSU_MFR_REVISION); -static SENSOR_DEVICE_ATTR(psu_mfr_vin_min, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MIN); -static SENSOR_DEVICE_ATTR(psu_mfr_vin_max, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MAX); -static SENSOR_DEVICE_ATTR(psu_mfr_vout_min, S_IRUGO, show_linear, NULL, PSU_MFR_VOUT_MIN); -static SENSOR_DEVICE_ATTR(psu_mfr_vout_max, S_IRUGO, show_linear, NULL, PSU_MFR_VOUT_MAX); -static SENSOR_DEVICE_ATTR(psu_mfr_iin_max, S_IRUGO, show_linear, NULL, PSU_MFR_IIN_MAX); -static SENSOR_DEVICE_ATTR(psu_mfr_iout_max, S_IRUGO, show_linear, NULL, PSU_MFR_IOUT_MAX); -static SENSOR_DEVICE_ATTR(psu_mfr_pin_max, S_IRUGO, show_linear, NULL, PSU_MFR_PIN_MAX); -static SENSOR_DEVICE_ATTR(psu_mfr_pout_max, S_IRUGO, show_linear, NULL, PSU_MFR_POUT_MAX); - -static struct attribute *ym2651y_attributes[] = { - &sensor_dev_attr_psu_power_on.dev_attr.attr, - &sensor_dev_attr_psu_temp_fault.dev_attr.attr, - &sensor_dev_attr_psu_power_good.dev_attr.attr, - &sensor_dev_attr_psu_fan1_fault.dev_attr.attr, - &sensor_dev_attr_psu_over_temp.dev_attr.attr, - &sensor_dev_attr_psu_v_out.dev_attr.attr, - &sensor_dev_attr_psu_i_out.dev_attr.attr, - &sensor_dev_attr_psu_p_out.dev_attr.attr, - &sensor_dev_attr_psu_temp1_input.dev_attr.attr, - &sensor_dev_attr_psu_fan1_speed_rpm.dev_attr.attr, - &sensor_dev_attr_psu_fan1_duty_cycle_percentage.dev_attr.attr, - &sensor_dev_attr_psu_fan_dir.dev_attr.attr, - &sensor_dev_attr_psu_pmbus_revision.dev_attr.attr, - &sensor_dev_attr_psu_mfr_id.dev_attr.attr, - &sensor_dev_attr_psu_mfr_model.dev_attr.attr, - &sensor_dev_attr_psu_mfr_revision.dev_attr.attr, - &sensor_dev_attr_psu_mfr_vin_min.dev_attr.attr, - &sensor_dev_attr_psu_mfr_vin_max.dev_attr.attr, - &sensor_dev_attr_psu_mfr_pout_max.dev_attr.attr, - &sensor_dev_attr_psu_mfr_iin_max.dev_attr.attr, - &sensor_dev_attr_psu_mfr_pin_max.dev_attr.attr, - &sensor_dev_attr_psu_mfr_vout_min.dev_attr.attr, - &sensor_dev_attr_psu_mfr_vout_max.dev_attr.attr, - &sensor_dev_attr_psu_mfr_iout_max.dev_attr.attr, - NULL -}; - -static ssize_t show_byte(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ym2651y_data *data = ym2651y_update_device(dev); - - return (attr->index == PSU_PMBUS_REVISION) ? sprintf(buf, "%d\n", data->pmbus_revision) : - sprintf(buf, "0\n"); -} - -static ssize_t show_word(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ym2651y_data *data = ym2651y_update_device(dev); - u16 status = 0; - - switch (attr->index) { - case PSU_POWER_ON: /* psu_power_on, low byte bit 6 of status_word, 0=>ON, 1=>OFF */ - status = (data->status_word & 0x40) ? 0 : 1; - break; - case PSU_TEMP_FAULT: /* psu_temp_fault, low byte bit 2 of status_word, 0=>Normal, 1=>temp fault */ - status = (data->status_word & 0x4) >> 2; - break; - case PSU_POWER_GOOD: /* psu_power_good, high byte bit 3 of status_word, 0=>OK, 1=>FAIL */ - status = (data->status_word & 0x800) ? 0 : 1; - break; - } - - return sprintf(buf, "%d\n", status); -} - -static int two_complement_to_int(u16 data, u8 valid_bit, int mask) -{ - u16 valid_data = data & mask; - bool is_negative = valid_data >> (valid_bit - 1); - - return is_negative ? (-(((~valid_data) & mask) + 1)) : valid_data; -} - -static ssize_t set_fan_duty_cycle(struct device *dev, struct device_attribute *da, - const char *buf, size_t count) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct ym2651y_data *data = i2c_get_clientdata(client); - int nr = (attr->index == PSU_FAN1_DUTY_CYCLE) ? 0 : 1; - long speed; - int error; - - error = kstrtol(buf, 10, &speed); - if (error) - return error; - - if (speed < 0 || speed > MAX_FAN_DUTY_CYCLE) - return -EINVAL; - - mutex_lock(&data->update_lock); - data->fan_duty_cycle[nr] = speed; - ym2651y_write_word(client, 0x3B + nr, data->fan_duty_cycle[nr]); - mutex_unlock(&data->update_lock); - - return count; -} - -static ssize_t show_linear(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ym2651y_data *data = ym2651y_update_device(dev); - - u16 value = 0; - int exponent, mantissa; - int multiplier = 1000; - - switch (attr->index) { - case PSU_V_OUT: - value = data->v_out; - break; - case PSU_I_OUT: - value = data->i_out; - break; - case PSU_P_OUT: - value = data->p_out; - break; - case PSU_TEMP1_INPUT: - value = data->temp; - break; - case PSU_FAN1_SPEED: - value = data->fan_speed; - multiplier = 1; - break; - case PSU_FAN1_DUTY_CYCLE: - value = data->fan_duty_cycle[0]; - multiplier = 1; - break; - case PSU_MFR_VIN_MIN: - value = data->mfr_vin_min; - break; - case PSU_MFR_VIN_MAX: - value = data->mfr_vin_max; - break; - case PSU_MFR_VOUT_MIN: - value = data->mfr_vout_min; - break; - case PSU_MFR_VOUT_MAX: - value = data->mfr_vout_max; - break; - case PSU_MFR_PIN_MAX: - value = data->mfr_pin_max; - break; - case PSU_MFR_POUT_MAX: - value = data->mfr_pout_max; - break; - case PSU_MFR_IOUT_MAX: - value = data->mfr_iout_max; - break; - case PSU_MFR_IIN_MAX: - value = data->mfr_iin_max; - break; - } - - exponent = two_complement_to_int(value >> 11, 5, 0x1f); - mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); - - return (exponent >= 0) ? sprintf(buf, "%d\n", (mantissa << exponent) * multiplier) : - sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); -} - -static ssize_t show_fan_fault(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ym2651y_data *data = ym2651y_update_device(dev); - - u8 shift = (attr->index == PSU_FAN1_FAULT) ? 7 : 6; - - return sprintf(buf, "%d\n", data->fan_fault >> shift); -} - -static ssize_t show_over_temp(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct ym2651y_data *data = ym2651y_update_device(dev); - - return sprintf(buf, "%d\n", data->over_temp >> 7); -} - -static ssize_t show_ascii(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ym2651y_data *data = ym2651y_update_device(dev); - u8 *ptr = NULL; - - switch (attr->index) { - case PSU_FAN_DIRECTION: /* psu_fan_dir */ - ptr = data->fan_dir; - break; - case PSU_MFR_ID: /* psu_mfr_id */ - ptr = data->mfr_id; - break; - case PSU_MFR_MODEL: /* psu_mfr_model */ - ptr = data->mfr_model; - break; - case PSU_MFR_REVISION: /* psu_mfr_revision */ - ptr = data->mfr_revsion; - break; - default: - return 0; - } - - return sprintf(buf, "%s\n", ptr); -} - -static const struct attribute_group ym2651y_group = { - .attrs = ym2651y_attributes, -}; - -static int ym2651y_probe(struct i2c_client *client, - const struct i2c_device_id *dev_id) -{ - struct ym2651y_data *data; - int status; - - if (!i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_BYTE_DATA | - I2C_FUNC_SMBUS_WORD_DATA | - I2C_FUNC_SMBUS_I2C_BLOCK)) { - status = -EIO; - goto exit; - } - - data = kzalloc(sizeof(struct ym2651y_data), GFP_KERNEL); - if (!data) { - status = -ENOMEM; - goto exit; - } - - i2c_set_clientdata(client, data); - mutex_init(&data->update_lock); - - dev_info(&client->dev, "chip found\n"); - - /* Register sysfs hooks */ - status = sysfs_create_group(&client->dev.kobj, &ym2651y_group); - if (status) { - goto exit_free; - } - - data->hwmon_dev = hwmon_device_register(&client->dev); - if (IS_ERR(data->hwmon_dev)) { - status = PTR_ERR(data->hwmon_dev); - goto exit_remove; - } - - dev_info(&client->dev, "%s: psu '%s'\n", - dev_name(data->hwmon_dev), client->name); - - return 0; - -exit_remove: - sysfs_remove_group(&client->dev.kobj, &ym2651y_group); -exit_free: - kfree(data); -exit: - - return status; -} - -static int ym2651y_remove(struct i2c_client *client) -{ - struct ym2651y_data *data = i2c_get_clientdata(client); - - hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_group(&client->dev.kobj, &ym2651y_group); - kfree(data); - - return 0; -} - -static const struct i2c_device_id ym2651y_id[] = { - { "ym2651", 0 }, - {} -}; -MODULE_DEVICE_TABLE(i2c, ym2651y_id); - -static struct i2c_driver ym2651y_driver = { - .class = I2C_CLASS_HWMON, - .driver = { - .name = "ym2651", - }, - .probe = ym2651y_probe, - .remove = ym2651y_remove, - .id_table = ym2651y_id, - .address_list = normal_i2c, -}; - -static int ym2651y_read_byte(struct i2c_client *client, u8 reg) -{ - return i2c_smbus_read_byte_data(client, reg); -} - -static int ym2651y_read_word(struct i2c_client *client, u8 reg) -{ - return i2c_smbus_read_word_data(client, reg); -} - -static int ym2651y_write_word(struct i2c_client *client, u8 reg, u16 value) -{ - return i2c_smbus_write_word_data(client, reg, value); -} - -static int ym2651y_read_block(struct i2c_client *client, u8 command, u8 *data, - int data_len) -{ - int result = i2c_smbus_read_i2c_block_data(client, command, data_len, data); - - if (unlikely(result < 0)) - goto abort; - if (unlikely(result != data_len)) { - result = -EIO; - goto abort; - } - - result = 0; - -abort: - return result; -} - -struct reg_data_byte { - u8 reg; - u8 *value; -}; - -struct reg_data_word { - u8 reg; - u16 *value; -}; - -static struct ym2651y_data *ym2651y_update_device(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct ym2651y_data *data = i2c_get_clientdata(client); - - mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { - int i, status; - u8 command; - u8 fan_dir[5] = {0}; - struct reg_data_byte regs_byte[] = { {0x19, &data->capability}, - {0x7d, &data->over_temp}, - {0x81, &data->fan_fault}, - {0x98, &data->pmbus_revision}}; - struct reg_data_word regs_word[] = { {0x79, &data->status_word}, - {0x8b, &data->v_out}, - {0x8c, &data->i_out}, - {0x96, &data->p_out}, - {0x8d, &data->temp}, - {0x3b, &(data->fan_duty_cycle[0])}, - {0x3c, &(data->fan_duty_cycle[1])}, - {0x90, &data->fan_speed}, - {0xa0, &data->mfr_vin_min}, - {0xa1, &data->mfr_vin_max}, - {0xa2, &data->mfr_iin_max}, - {0xa3, &data->mfr_pin_max}, - {0xa4, &data->mfr_vout_min}, - {0xa5, &data->mfr_vout_max}, - {0xa6, &data->mfr_iout_max}, - {0xa7, &data->mfr_pout_max}}; - - dev_dbg(&client->dev, "Starting ym2651 update\n"); - - /* Read byte data */ - for (i = 0; i < ARRAY_SIZE(regs_byte); i++) { - status = ym2651y_read_byte(client, regs_byte[i].reg); - - if (status < 0) - { - dev_dbg(&client->dev, "reg %d, err %d\n", - regs_byte[i].reg, status); - } - else { - *(regs_byte[i].value) = status; - } - } - - /* Read word data */ - for (i = 0; i < ARRAY_SIZE(regs_word); i++) { - status = ym2651y_read_word(client, regs_word[i].reg); - - if (status < 0) - { - dev_dbg(&client->dev, "reg %d, err %d\n", - regs_word[i].reg, status); - } - else { - *(regs_word[i].value) = status; - } - } - - /* Read fan_direction */ - command = 0xC3; - status = ym2651y_read_block(client, command, fan_dir, ARRAY_SIZE(fan_dir)-1); - - if (status < 0) { - dev_dbg(&client->dev, "reg %d, err %d\n", command, status); - } - - strncpy(data->fan_dir, fan_dir+1, ARRAY_SIZE(data->fan_dir)-1); - data->fan_dir[ARRAY_SIZE(data->fan_dir)-1] = '\0'; - - /* Read mfr_id */ - command = 0x99; - status = ym2651y_read_block(client, command, data->mfr_id, - ARRAY_SIZE(data->mfr_id)-1); - data->mfr_id[ARRAY_SIZE(data->mfr_id)-1] = '\0'; - - if (status < 0) - dev_dbg(&client->dev, "reg %d, err %d\n", command, status); - - /* Read mfr_model */ - command = 0x9a; - status = ym2651y_read_block(client, command, data->mfr_model, - ARRAY_SIZE(data->mfr_model)-1); - data->mfr_model[ARRAY_SIZE(data->mfr_model)-1] = '\0'; - - if (status < 0) - dev_dbg(&client->dev, "reg %d, err %d\n", command, status); - - /* Read mfr_revsion */ - command = 0x9b; - status = ym2651y_read_block(client, command, data->mfr_revsion, - ARRAY_SIZE(data->mfr_revsion)-1); - data->mfr_revsion[ARRAY_SIZE(data->mfr_revsion)-1] = '\0'; - - if (status < 0) - dev_dbg(&client->dev, "reg %d, err %d\n", command, status); - - data->last_updated = jiffies; - data->valid = 1; - } - - mutex_unlock(&data->update_lock); - - return data; -} - -module_i2c_driver(ym2651y_driver); - -MODULE_AUTHOR("Brandon Chuang "); -MODULE_DESCRIPTION("3Y Power YM-2651Y driver"); -MODULE_LICENSE("GPL"); - - diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/scripts/as7712_32x_platform_init.sh b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/scripts/as7712_32x_platform_init.sh deleted file mode 100644 index 448f2ec341a4..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/scripts/as7712_32x_platform_init.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -echo "TO-DO: as7712-32x driver setting" diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/changelog b/platform/broadcom/sonic-platform-modules-accton/debian/changelog deleted file mode 100644 index 6a687800eeac..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/debian/changelog +++ /dev/null @@ -1,5 +0,0 @@ -sonic-accton-platform-modules (1.0) unstable; urgency=low - - * Initial release - - -- Polly Hsu Tue, 9 May 2017 17:54:11 -0800 \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/compat b/platform/broadcom/sonic-platform-modules-accton/debian/compat deleted file mode 100644 index ec635144f600..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/debian/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/control b/platform/broadcom/sonic-platform-modules-accton/debian/control deleted file mode 100644 index 755c58612bb0..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/debian/control +++ /dev/null @@ -1,11 +0,0 @@ -Source: sonic-accton-platform-modules -Section: main -Priority: extra -Maintainer: polly_hsu -Build-Depends: debhelper (>= 8.0.0), bzip2 -Standards-Version: 3.9.3 - -Package: platform-modules-as7712-32x -Architecture: amd64 -Depends: linux-image-3.16.0-4-amd64 -Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.init b/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.init deleted file mode 100644 index c54b2a3e310d..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.init +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -### BEGIN INIT INFO -# Provides: setup-board -# Required-Start: -# Required-Stop: -# Should-Start: -# Should-Stop: -# Default-Start: S -# Default-Stop: 0 6 -# Short-Description: Setup AS7712-32X board. -### END INIT INFO - -case "$1" in -start) - echo -n "Setting up board... " - - modprobe i2c_dev - modprobe i2c_mux_pca954x - modprobe accton_i2c_cpld - modprobe accton_as7712_32x_fan - modprobe accton_as7712_32x_sfp - modprobe leds-accton_as7712_32x - modprobe accton_as7712_32x_psu - - echo "done." - ;; - -stop) - echo "done." - - ;; - -force-reload|restart) - echo "Not supported" - ;; - -*) - echo "Usage: /etc/init.d/platform-modules-as7712-32x.init {start|stop}" - exit 1 - ;; -esac - -exit 0 diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.install b/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.install deleted file mode 100644 index 39abf57e2f65..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/debian/platform-modules-as7712-32x.install +++ /dev/null @@ -1,2 +0,0 @@ -as7712-32x/scripts/as7712_32x_platform_init.sh usr/local/bin -as7712-32x/cfg/as7712_32x-modules.conf etc/modules-load.d diff --git a/platform/broadcom/sonic-platform-modules-accton/debian/rules b/platform/broadcom/sonic-platform-modules-accton/debian/rules deleted file mode 100755 index a1026ca62832..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/debian/rules +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/make -f - -export INSTALL_MOD_DIR:=extra - -KVERSION ?= $(shell uname -r) -KERNEL_SRC := /lib/modules/$(KVERSION) -MOD_SRC_DIR:= $(shell pwd) -MODULE_DIRS:= as7712-32x - -%: - dh $@ - -override_dh_auto_build: - (for mod in $(MODULE_DIRS); do \ - make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ - done) - - - -override_dh_auto_install: - (for mod in $(MODULE_DIRS); do \ - dh_installdirs -pplatform-modules-$${mod} \ - $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ - cp $(MOD_SRC_DIR)/$${mod}/modules/*.ko \ - debian/platform-modules-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ - mkdir -p debian/platform-modules-$${mod}/etc/bcm; \ - done) - -override_dh_usrlocal: - -override_dh_clean: - dh_clean - (for mod in $(MODULE_DIRS); do \ - make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ - done) - From dd104e1b5216f5332ffcb7c40c160be7695e3ce4 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 20 Jun 2017 22:45:36 -0700 Subject: [PATCH 0625/1011] [submodule]: update sonic-platform-daemons submodule (#731) --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index dac4bf5a242f..d68c286ba7c9 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit dac4bf5a242fe3c10d750378b7aaf6d41ac573ee +Subproject commit d68c286ba7c984c98ebfafc2bb5fe24905659e5f From 95906a64903ed8b02f9a021287dce443125bd2e4 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 21 Jun 2017 11:02:25 -0700 Subject: [PATCH 0626/1011] [installer] Copy old config files rather than only minigraph (#730) --- .../base_image_files/bgp_neighbor | 55 ------------------- files/image_config/platform/rc.local | 7 ++- rules/docker-fpm-quagga.mk | 1 - src/sonic-utilities | 2 +- 4 files changed, 6 insertions(+), 59 deletions(-) delete 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 deleted file mode 100755 index d6bd67a0a02d..000000000000 --- a/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor +++ /dev/null @@ -1,55 +0,0 @@ -#!/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 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" - - # Save admin state in config file - sed -i "/^\s*$NEIGHBOR:/d" /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 - # 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 - 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 diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index 26f59bf94aad..dad2510ce756 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -29,8 +29,11 @@ if [ -f /host/image-$sonic_version/platform/firsttime ]; then exit 0 fi - # Try to take minigraph saved during installation - if [ -f /host/minigraph.xml ]; then + # Try to take old configuration saved during installation + if [ -d /host/old_config ]; then + rm -f /host/old_config/sonic_version.yml + mv -f /host/old_config/* /etc/sonic/ + elif [ -f /host/minigraph.xml ]; then mv /host/minigraph.xml /etc/sonic/ else cp /usr/share/sonic/device/$platform/minigraph.xml /etc/sonic/ diff --git a/rules/docker-fpm-quagga.mk b/rules/docker-fpm-quagga.mk index 1e95c96e001b..a9c0511ba173 100644 --- a/rules/docker-fpm-quagga.mk +++ b/rules/docker-fpm-quagga.mk @@ -11,4 +11,3 @@ $(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 diff --git a/src/sonic-utilities b/src/sonic-utilities index c1b48a6a28f9..0ad528043019 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit c1b48a6a28f9897ebfebf9989b5cb4a472cf1967 +Subproject commit 0ad52804301903664dfe8f84ef1666101c950cd2 From 3268946de53a56ef68dfb07eacca5b8e5543e6bb Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Wed, 21 Jun 2017 18:52:50 -0700 Subject: [PATCH 0627/1011] [BGPD]: add bgp dynamic neighbor configuration (#708) * add bgp dynamic neighbor configuration * [bgpd]: update as comments * update as comment * update to deployment_id_asn_map * minor change --- dockers/docker-fpm-quagga/bgpd.conf.j2 | 17 + dockers/docker-fpm-quagga/start.sh | 4 +- .../build_templates/sonic_debian_extension.j2 | 3 + .../asn/deployment_id_asn_map.yml | 2 + src/sonic-config-engine/minigraph.py | 26 +- .../tests/t0-sample-bgp-speaker.xml | 346 ++++++++++++++++++ src/sonic-config-engine/tests/test_cfggen.py | 11 + 7 files changed, 403 insertions(+), 6 deletions(-) create mode 100644 files/image_config/asn/deployment_id_asn_map.yml create mode 100644 src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index 0c848939df9d..e898ce72ae1f 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -19,6 +19,10 @@ log facility local4 ! ! bgp multiple-instance ! +route-map FROM_BGP_SPEAKER_V4 permit 10 +! +route-map TO_BGP_SPEAKER_V4 deny 10 +! router bgp {{ minigraph_bgp_asn }} bgp log-neighbor-changes bgp bestpath as-path multipath-relax @@ -65,6 +69,19 @@ router bgp {{ minigraph_bgp_asn }} {% endif %} {% endfor %} {% endblock bgp_sessions %} +{% block bgp_peers_with_range %} +{% for bgp_peer in minigraph_bgp_peers_with_range %} + neighbor {{ bgp_peer['name'] }} peer-group + neighbor {{ bgp_peer['name'] }} passive + neighbor {{ bgp_peer['name'] }} remote-as {{deployment_id_asn_map[deployment_id] }} + neighbor {{ bgp_peer['name'] }} ebgp-multihop 255 + neighbor {{ bgp_peer['name'] }} soft-reconfiguration inbound + neighbor {{ bgp_peer['name'] }} update-source Loopback0 + neighbor {{ bgp_peer['name'] }} route-map FROM_BGP_SPEAKER_V4 in + neighbor {{ bgp_peer['name'] }} route-map TO_BGP_SPEAKER_V4 out + bgp listen range {{ bgp_peer['ip_range'] }} peer-group {{ bgp_peer['name'] }} +{% endfor %} +{% endblock bgp_peers_with_range %} ! {% if minigraph_bgp_asn is not none %} maximum-paths 64 diff --git a/dockers/docker-fpm-quagga/start.sh b/dockers/docker-fpm-quagga/start.sh index bc3fbf4e907a..c7df6f20999d 100755 --- a/dockers/docker-fpm-quagga/start.sh +++ b/dockers/docker-fpm-quagga/start.sh @@ -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/deployment_id_asn_map.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 + sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/deployment_id_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 diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 00398654b12c..647a73b5ce1c 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -138,6 +138,9 @@ sudo bash -c "echo ' all: off' >> $FILESYSTEM_ROOT/etc/sonic/bgp_admin.yml" # Copy SNMP configuration files sudo cp $IMAGE_CONFIGS/snmp/snmp.yml $FILESYSTEM_ROOT/etc/sonic/ +# Copy ASN configuration files +sudo cp $IMAGE_CONFIGS/asn/deployment_id_asn_map.yml $FILESYSTEM_ROOT/etc/sonic/ + # Copy sudoers configuration file sudo cp $IMAGE_CONFIGS/sudoers/sudoers $FILESYSTEM_ROOT/etc/ diff --git a/files/image_config/asn/deployment_id_asn_map.yml b/files/image_config/asn/deployment_id_asn_map.yml new file mode 100644 index 000000000000..36168f828954 --- /dev/null +++ b/files/image_config/asn/deployment_id_asn_map.yml @@ -0,0 +1,2 @@ +deployment_id_asn_map: + "1" : 65432 diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 7dc060900886..d552eb906364 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -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 + ip_range = bgpPeer.find(str(QName(ns1, "PeersRange"))).text + bgp_peers_with_range.append({ + 'name': name, + 'ip_range': ip_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 = [] + deployment_id = None 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": + deployment_id = value + return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst, deployment_id 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 + deployment_id = 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, deployment_id) = 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['deployment_id'] = deployment_id return results diff --git a/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml b/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml new file mode 100644 index 000000000000..b5e373ddd868 --- /dev/null +++ b/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml @@ -0,0 +1,346 @@ + + + + + + false + switch-t0 + 10.0.0.56 + ARISTA01T1 + 10.0.0.57 + 1 + 180 + 60 + + + switch-t0 + FC00::71 + ARISTA01T1 + FC00::72 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.58 + ARISTA02T1 + 10.0.0.59 + 1 + 180 + 60 + + + switch-t0 + FC00::75 + ARISTA02T1 + FC00::76 + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.60 + ARISTA03T1 + 10.0.0.61 + 1 + 180 + 60 + + + switch-t0 + FC00::79 + ARISTA03T1 + FC00::7A + 1 + 180 + 60 + + + false + switch-t0 + 10.0.0.62 + ARISTA04T1 + 10.0.0.63 + 1 + 180 + 60 + + + switch-t0 + FC00::7D + ARISTA04T1 + FC00::7E + 1 + 180 + 60 + + + + + 65100 + switch-t0 + + +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ +
10.1.0.32
+ BGPSLBPassive + 10.10.10.10/26 +
+
+ +
+ + 64600 + ARISTA01T1 + + + + 64600 + ARISTA02T1 + + + + 64600 + ARISTA03T1 + + + + 64600 + ARISTA04T1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.0.0.100/24 + + 10.0.0.100/24 + + + + + + + switch-t0 + + + PortChannel01 + fortyGigE0/112 + + + + PortChannel02 + fortyGigE0/116 + + + + PortChannel03 + fortyGigE0/120 + + + + PortChannel04 + fortyGigE0/124 + + + + + + Vlan1000 + fortyGigE0/4;fortyGigE0/8;fortyGigE0/12;fortyGigE0/16;fortyGigE0/20;fortyGigE0/24;fortyGigE0/28;fortyGigE0/32;fortyGigE0/36;fortyGigE0/40;fortyGigE0/44;fortyGigE0/48;fortyGigE0/52;fortyGigE0/56;fortyGigE0/60;fortyGigE0/64;fortyGigE0/68;fortyGigE0/72;fortyGigE0/76;fortyGigE0/80;fortyGigE0/84;fortyGigE0/88;fortyGigE0/92;fortyGigE0/96 + False + 0.0.0.0/0 + + 1000 + 1000 + 192.168.0.0/27 + + + + + + PortChannel01 + 10.0.0.56/31 + + + + PortChannel01 + FC00::71/126 + + + + PortChannel02 + 10.0.0.58/31 + + + + PortChannel02 + FC00::75/126 + + + + PortChannel03 + 10.0.0.60/31 + + + + PortChannel03 + FC00::79/126 + + + + PortChannel04 + 10.0.0.62/31 + + + + PortChannel04 + FC00::7D/126 + + + + Vlan1000 + 192.168.0.1/27 + + + + + + + PortChannel01;PortChannel02;PortChannel03;PortChannel04 + + DataAcl + + + + + + + + + + DeviceInterfaceLink + ARISTA01T1 + Ethernet1/1 + switch-t0 + fortyGigE0/112 + + + DeviceInterfaceLink + ARISTA02T1 + Ethernet1/1 + switch-t0 + fortyGigE0/116 + + + DeviceInterfaceLink + ARISTA03T1 + Ethernet1/1 + switch-t0 + fortyGigE0/120 + + + DeviceInterfaceLink + ARISTA04T1 + Ethernet1/1 + switch-t0 + fortyGigE0/124 + + + + + switch-t0 + Force10-S6000 + + + ARISTA01T1 + Arista + + + ARISTA02T1 + Arista + + + ARISTA03T1 + Arista + + + ARISTA04T1 + Arista + + + + + + + switch-t0 + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + DeploymentId + 1 + + + + + + + switch-t0 + Force10-S6000 +
diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index a4ad6cb806fc..9a305fd72aac 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -11,6 +11,7 @@ def setUp(self): self.sample_graph_t0 = os.path.join(self.test_dir, 't0-sample-graph.xml') self.sample_graph_simple = os.path.join(self.test_dir, 'simple-sample-graph.xml') self.sample_graph_pc_test = os.path.join(self.test_dir, 'pc-test-graph.xml') + self.sample_graph_bgp_speaker = os.path.join(self.test_dir, 't0-sample-bgp-speaker.xml') self.port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') def run_script(self, argument): @@ -97,3 +98,13 @@ def test_minigraph_neighbors(self): argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v minigraph_neighbors' output = self.run_script(argument) self.assertEqual(output.strip(), "{'Ethernet116': {'name': 'ARISTA02T1', 'port': 'Ethernet1/1'}, 'Ethernet124': {'name': 'ARISTA04T1', 'port': 'Ethernet1/1'}, 'Ethernet112': {'name': 'ARISTA01T1', 'port': 'Ethernet1/1'}, 'Ethernet120': {'name': 'ARISTA03T1', 'port': 'Ethernet1/1'}}") + + def test_minigraph_peers_with_range(self): + argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v minigraph_bgp_peers_with_range' + output = self.run_script(argument) + self.assertEqual(output.strip(), "[{'name': 'BGPSLBPassive', 'ip_range': '10.10.10.10/26'}]") + + def test_minigraph_deployment_id(self): + argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v deployment_id' + output = self.run_script(argument) + self.assertEqual(output.strip(), "1") From 629362cad7b080fe738a4aafab6852a58e50160d Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 21 Jun 2017 18:53:28 -0700 Subject: [PATCH 0628/1011] [docker-syncd-brcm]: Sleep to allow syncd to create socket before calling bcmcmd (#733) * [docker-syncd-brcm]: Sleep to allow syncd to create socket before calling bcmcmd * Instead of fixed sleep interval, continually check for presence of socket --- platform/broadcom/docker-syncd-brcm/start.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/platform/broadcom/docker-syncd-brcm/start.sh b/platform/broadcom/docker-syncd-brcm/start.sh index 6f9b69ff8d40..742cf8223132 100755 --- a/platform/broadcom/docker-syncd-brcm/start.sh +++ b/platform/broadcom/docker-syncd-brcm/start.sh @@ -10,6 +10,14 @@ supervisorctl start syncd # If this platform has an initialization file for the Broadcom LED microprocessor, load it if [ -r ${PLATFORM_DIR}/led_proc_init.soc ]; then + # Wait until syncd has created the socket for bcmcmd to connect to + while true; do + if [ -e /var/run/sswsyncd/sswsyncd.socket ]; then + break + fi + sleep 1 + done + /usr/bin/bcmcmd -t 60 "rcload ${PLATFORM_DIR}/led_proc_init.soc" fi From a8e3d9745f31ea795e1b88e690364608e5462dd8 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 21 Jun 2017 23:49:15 -0700 Subject: [PATCH 0629/1011] [sonic-cfggen]: Support multiple input yaml files with -y option (#729) --- src/sonic-config-engine/sonic-cfggen | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 822f02d7fcc2..c0ce51d4bf80 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -49,7 +49,7 @@ def main(): parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") parser.add_argument("-m", "--minigraph", help="minigraph xml file") parser.add_argument("-p", "--port-config", help="port config file, used with -m") - parser.add_argument("-y", "--yaml", help="yaml file that contains addtional variables") + parser.add_argument("-y", "--yaml", help="yaml file that contains addtional variables", action='append', default=[]) parser.add_argument("-a", "--additional-data", help="addition data, in json string") group = parser.add_mutually_exclusive_group() group.add_argument("-t", "--template", help="render the data with the template file") @@ -79,8 +79,8 @@ def main(): else: data.update(parse_xml(minigraph)) - if args.yaml != None: - with open(args.yaml, 'r') as stream: + for yaml_file in args.yaml: + with open(yaml_file, 'r') as stream: additional_data = yaml.load(stream) data.update(additional_data) From 5c852704fea4e51f3bcc95999a23f9eb3d0b21cf Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 22 Jun 2017 14:34:15 -0700 Subject: [PATCH 0630/1011] [sonic-cfggen]: Fix minigraph.py when port_alias_map absent (#738) --- src/sonic-config-engine/minigraph.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index d552eb906364..8d3e82ea1233 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -127,10 +127,7 @@ def parse_dpg(dpg, hname): intfs = [] for ipintf in ipintfs.findall(str(QName(ns, "IPInterface"))): intfalias = ipintf.find(str(QName(ns, "AttachTo"))).text - if port_alias_map.has_key(intfalias): - intfname = port_alias_map[intfalias] - else: - intfname = intfalias + intfname = port_alias_map.get(intfalias, intfalias) ipprefix = ipintf.find(str(QName(ns, "Prefix"))).text ipn = ipaddress.IPNetwork(ipprefix) ipaddr = ipn.ip @@ -198,7 +195,7 @@ def parse_dpg(dpg, hname): pcintfmbr = pcintf.find(str(QName(ns, "AttachTo"))).text pcmbr_list = pcintfmbr.split(';') for i, member in enumerate(pcmbr_list): - pcmbr_list[i] = port_alias_map[member] + pcmbr_list[i] = port_alias_map.get(member, member) pcs[pcintfname] = {'name': pcintfname, 'members': pcmbr_list} vlanintfs = child.find(str(QName(ns, "VlanInterfaces"))) @@ -210,7 +207,7 @@ def parse_dpg(dpg, hname): vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text vmbr_list = vintfmbr.split(';') for i, member in enumerate(vmbr_list): - vmbr_list[i] = port_alias_map[member] + vmbr_list[i] = port_alias_map.get(member, member) vlan_attributes = {'name': vintfname, 'members': vmbr_list, 'vlanid': vlanid} sonic_vlan_name = "Vlan%s" % vlanid vlans[sonic_vlan_name] = vlan_attributes From 4bdcac8e4f12d92f3c70f45ee8e0ed6f4599ad93 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 22 Jun 2017 19:50:24 -0700 Subject: [PATCH 0631/1011] [bgp]: move allowas-in into ipv6 section to enable allowas-in for ipv6 (#741) --- dockers/docker-fpm-quagga/bgpd.conf.j2 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index e898ce72ae1f..5f53d9698b2e 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -57,11 +57,16 @@ router bgp {{ minigraph_bgp_asn }} {% 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 bgp_session['addr'] | ipv4 %} {% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} neighbor {{ bgp_session['addr'] }} allowas-in 1 {% endif %} +{% endif %} {% if bgp_session['addr'] | ipv6 %} address-family ipv6 +{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} + neighbor {{ bgp_session['addr'] }} allowas-in 1 +{% endif %} neighbor {{ bgp_session['addr'] }} activate maximum-paths 64 exit-address-family From d1b12dc0ca13728c279e0db4a2ba0cb92fbdfde0 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 22 Jun 2017 21:26:33 -0700 Subject: [PATCH 0632/1011] [swss]: Sleep 5 min regardless of arp_update return code (#743) - arp_update return code is not guaranteed to be true/false. When there is no VLAN, arp_update will return true. When there are VLANs, arp_update will return false because the command arping returns 1 due to the option '-w 0'. - This script should be run every 5 minutes regardless of the return code. --- dockers/docker-orchagent/supervisord.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-orchagent/supervisord.conf b/dockers/docker-orchagent/supervisord.conf index 770fda701029..a04238472c4c 100644 --- a/dockers/docker-orchagent/supervisord.conf +++ b/dockers/docker-orchagent/supervisord.conf @@ -60,7 +60,7 @@ stdout_logfile=syslog stderr_logfile=syslog [program:arp_update] -command=bash -c "/usr/bin/arp_update && sleep 300" +command=bash -c "/usr/bin/arp_update; sleep 300" priority=8 autostart=false autorestart=true From 350718ee77a4c7522ea0ddd649f67d19c2940c43 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Fri, 23 Jun 2017 07:27:50 +0300 Subject: [PATCH 0633/1011] [Mellanox]: Update SAI version (#740) - Initialize ECMP default hashing with IPv6 packets --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 67bc173ae8a6..8d3712cb1378 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = 161120 -MLNX_SAI_REVISION = 579c19acf3b9bed181ac713fcf92302f4ebae422 +MLNX_SAI_REVISION = b57b458ff060adb2b1df629e330431a391a3b83e export MLNX_SAI_VERSION MLNX_SAI_REVISION From 00c494f0235b0f73ce31a645d64cce792973a564 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 23 Jun 2017 01:08:25 -0700 Subject: [PATCH 0634/1011] [sonic-cfggen]: Add default IP deny rule in translate_acl (#734) - Add IPv4 implicit rule: deny ip any any This implicit rule has lowest priority and ensures that the device denies all unmatched IP traffic. --- .../tests/sample_output/rules_for_dataacl.json | 16 ++++++++++++---- .../tests/sample_output/rules_for_everflow.json | 2 +- src/sonic-config-engine/translate_acl | 15 +++++++++++++-- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json b/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json index 48fa240c9dc6..709468f9d945 100644 --- a/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json +++ b/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json @@ -1,6 +1,6 @@ [ { - "ACL_RULE_TABLE:dataacl:Rule_1":{ + "ACL_RULE_TABLE:DATAACL:RULE_1":{ "IP_PROTOCOL":17, "PACKET_ACTION":"FORWARD", "SRC_IP":"10.0.0.0/8", @@ -9,7 +9,7 @@ "OP":"SET" }, { - "ACL_RULE_TABLE:dataacl:Rule_3":{ + "ACL_RULE_TABLE:DATAACL:RULE_3":{ "IP_PROTOCOL":17, "PACKET_ACTION":"FORWARD", "SRC_IP":"25.0.0.0/8", @@ -18,7 +18,7 @@ "OP":"SET" }, { - "ACL_RULE_TABLE:dataacl:Rule_2":{ + "ACL_RULE_TABLE:DATAACL:RULE_2":{ "IP_PROTOCOL":17, "PACKET_ACTION":"FORWARD", "SRC_IP":"100.64.0.0/10", @@ -27,12 +27,20 @@ "OP":"SET" }, { - "ACL_RULE_TABLE:dataacl:Rule_4":{ + "ACL_RULE_TABLE:DATAACL:RULE_4":{ "IP_PROTOCOL":6, "PACKET_ACTION":"FORWARD", "TCP_FLAGS":"0x10/0x10", "priority":9996 }, "OP":"SET" + }, + { + "ACL_RULE_TABLE:DATAACL:DEFAULT_RULE":{ + "ETHER_TYPE":"0x0800", + "PACKET_ACTION":"DROP", + "priority":1 + }, + "OP":"SET" } ] \ No newline at end of file diff --git a/src/sonic-config-engine/tests/sample_output/rules_for_everflow.json b/src/sonic-config-engine/tests/sample_output/rules_for_everflow.json index c31965e31e27..2f39a0dcc4a3 100644 --- a/src/sonic-config-engine/tests/sample_output/rules_for_everflow.json +++ b/src/sonic-config-engine/tests/sample_output/rules_for_everflow.json @@ -1,6 +1,6 @@ [ { - "ACL_RULE_TABLE:everflow:Rule_1":{ + "ACL_RULE_TABLE:EVERFLOW:RULE_1":{ "DST_IP":"127.0.0.1/32", "IP_PROTOCOL":6, "L4_DST_PORT":0, diff --git a/src/sonic-config-engine/translate_acl b/src/sonic-config-engine/translate_acl index 584db7b64488..696a433730a9 100755 --- a/src/sonic-config-engine/translate_acl +++ b/src/sonic-config-engine/translate_acl @@ -13,11 +13,21 @@ def dump_json(filename, data): with open(filename, 'w') as outfile: json.dump(data, outfile, indent=4, sort_keys=True, separators=(',', ':')) +def default_deny_rule(table_name): + rule_props = {} + rule_data = {} + rule_data["ACL_RULE_TABLE:"+table_name.upper()+":DEFAULT_RULE"] = rule_props + rule_data["OP"] = "SET" + rule_props["priority"] = 1 + rule_props["ETHER_TYPE"] = "0x0800" + rule_props["PACKET_ACTION"] = "DROP" + return rule_data + def generate_rule_json(table_name, rule, max_priority, mirror): rule_idx = rule.config.sequence_id rule_props = {} rule_data = {} - rule_data["ACL_RULE_TABLE:"+table_name+":Rule_"+str(rule_idx)] = rule_props + rule_data["ACL_RULE_TABLE:"+table_name.upper()+":RULE_"+str(rule_idx)] = rule_props rule_data["OP"] = "SET" rule_props["priority"] = max_priority - rule_idx @@ -120,7 +130,8 @@ def generate_table_json(aclset, aclname, ports, mirror, max_priority, output_pat rule_props = generate_rule_json(table_name, aclentry, max_priority, mirror) if rule_props: rule_data.append(rule_props) - + if not mirror: + rule_data.append(default_deny_rule(table_name)) dump_json(os.path.join(output_path, "rules_for_"+table_name+".json"), rule_data) def translate_acl_fixed_port(filename, output_path, port, max_priority): From 22819d9983cdad5d331422c6dd12e151fe2b14ad Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 23 Jun 2017 15:23:00 -0700 Subject: [PATCH 0635/1011] [docker-platform-monitor]: Add fancontrol (#735) --- dockers/docker-platform-monitor/Dockerfile.j2 | 3 ++- dockers/docker-platform-monitor/start.sh | 22 ++++++++++++++----- .../docker-platform-monitor/supervisord.conf | 10 ++++++++- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 index 9b407bdef6bc..423181a3c589 100755 --- a/dockers/docker-platform-monitor/Dockerfile.j2 +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -6,7 +6,8 @@ ENV DEBIAN_FRONTEND=noninteractive # Update apt's package index files RUN apt-get update -RUN apt-get install -y python-pip sensord +# Install required packages +RUN apt-get install -y python-pip sensord fancontrol {% if docker_platform_monitor_debs.strip() %} # Copy built Debian packages diff --git a/dockers/docker-platform-monitor/start.sh b/dockers/docker-platform-monitor/start.sh index b550cc037a5d..cfcf17e4a192 100755 --- a/dockers/docker-platform-monitor/start.sh +++ b/dockers/docker-platform-monitor/start.sh @@ -1,16 +1,26 @@ #!/usr/bin/env bash -mkdir -p /etc/sensors.d -if [ -e /usr/share/sonic/platform/sensors.conf ]; then - /bin/cp -rf /usr/share/sonic/platform/sensors.conf /etc/sensors.d/ -fi - mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd -supervisorctl start lm-sensors + +# If this platform has an lm-sensors config file, copy it to it's proper place +# and start lm-sensors +if [ -e /usr/share/sonic/platform/sensors.conf ]; then + mkdir -p /etc/sensors.d + /bin/cp -f /usr/share/sonic/platform/sensors.conf /etc/sensors.d/ + supervisorctl start lm-sensors +fi + +# If this platform has a fancontrol config file, copy it to it's proper place +# and start fancontrol +if [ -e /usr/share/sonic/platform/fancontrol ]; then + /bin/cp -f /usr/share/sonic/platform/fancontrol /etc/ + supervisorctl start fancontrol +fi + supervisorctl start ledd diff --git a/dockers/docker-platform-monitor/supervisord.conf b/dockers/docker-platform-monitor/supervisord.conf index 051829eae65f..2753dceb652d 100644 --- a/dockers/docker-platform-monitor/supervisord.conf +++ b/dockers/docker-platform-monitor/supervisord.conf @@ -27,9 +27,17 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog +[program:fancontrol] +command=/usr/sbin/fancontrol +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + [program:ledd] command=/usr/bin/ledd -priority=6 +priority=5 autostart=false stdout_logfile=syslog stderr_logfile=syslog From 0cdad949e5d382a142f52629caf4420bb7d1c7d5 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 23 Jun 2017 22:53:15 -0700 Subject: [PATCH 0636/1011] Fix typo in README (#750) * Fix typo in README * Fix comment * Fix README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c2d30cf6bae..c3d58ae1b538 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ To build SONiC installer image and docker images, run the following commands: **NOTE**: We recommend reserving 50G free space to build one platform. -The SONIiC installer contains all docker images needed. SONiC use one image for all switches devices of a same ASIC vendor. The supported ASIC vendors are: +The SONiC installer contains all docker images needed. SONiC uses one image for all devices of a same ASIC vendor. The supported ASIC vendors are: - PLATFORM=broadcom - PLATFORM=marvell (*pending*) From 017eea8a874cee17b1eb08d9b46e7235b96cfcc1 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Sat, 24 Jun 2017 12:05:04 -0700 Subject: [PATCH 0637/1011] [DHCP Relay]: Add support for custom Option 82 circuit_id of the form ':' (#747) * Add docker-dhcp-relay/Dockerfile to .gitignore * Add isc-dhcp-relay .deb package to image build process, along with my Option 82 patch * Install custom isc-dhcp-relay in dhcp_relay docker * Install isc-dhcp-relay build dependencies in sonic-slave Docker container * Copy the built .deb package to the destination directory * Add dependencies for isc-dhcp-relay * Change Option 82 string to ':' * Install dependencies of .deb files implicitly in Dockerfile * Remove unused line * Remove unnecessary space --- .gitignore | 1 + .../{Dockerfile => Dockerfile.j2} | 13 +- dockers/docker-dhcp-relay/isc-dhcp-relay.j2 | 4 +- rules/docker-dhcp-relay.mk | 3 +- rules/isc-dhcp.mk | 13 + sonic-slave/Dockerfile | 3 + src/isc-dhcp/Makefile | 30 ++ ...d-remote_id-and-bridge-iface-support.patch | 289 ++++++++++++++++++ 8 files changed, 351 insertions(+), 5 deletions(-) rename dockers/docker-dhcp-relay/{Dockerfile => Dockerfile.j2} (51%) create mode 100644 rules/isc-dhcp.mk create mode 100644 src/isc-dhcp/Makefile create mode 100644 src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch diff --git a/.gitignore b/.gitignore index 2222458d1026..dd8befe10436 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ src/sonic-device-data/src/device/ dockers/docker-base/Dockerfile dockers/docker-config-engine/Dockerfile dockers/docker-database/Dockerfile +dockers/docker-dhcp-relay/Dockerfile dockers/docker-fpm-frr/Dockerfile dockers/docker-fpm-gobgp/Dockerfile dockers/docker-fpm-quagga/Dockerfile diff --git a/dockers/docker-dhcp-relay/Dockerfile b/dockers/docker-dhcp-relay/Dockerfile.j2 similarity index 51% rename from dockers/docker-dhcp-relay/Dockerfile rename to dockers/docker-dhcp-relay/Dockerfile.j2 index c3f9f298983e..1a7b7854d554 100644 --- a/dockers/docker-dhcp-relay/Dockerfile +++ b/dockers/docker-dhcp-relay/Dockerfile.j2 @@ -6,8 +6,17 @@ ENV DEBIAN_FRONTEND=noninteractive # Update apt's cache of available packages RUN apt-get update -# Install isc-dhcp-relay Debian package -RUN apt-get -y install isc-dhcp-relay +{% if docker_dhcp_relay_debs.strip() -%} +# Copy built Debian packages +{%- for deb in docker_dhcp_relay_debs.split(' ') %} +COPY debs/{{ deb }} debs/ +{%- endfor %} + +# Install built Debian packages and implicitly install their dependencies +{%- for deb in docker_dhcp_relay_debs.split(' ') %} +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt debs/{{ deb }} +{%- endfor %} +{%- endif %} # Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 index 05e633b7602f..0b8366d5844e 100644 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 @@ -24,6 +24,6 @@ INTERFACES=" {%- endif %} {%- endfor %}" -# '-a' option provides option 82 circuit id information -OPTIONS="-a" +# '-a' option provides option 82 circuit_id and remote_id information +OPTIONS="-a \"%h:%p\" \"\"" diff --git a/rules/docker-dhcp-relay.mk b/rules/docker-dhcp-relay.mk index 7a7a1afeb4db..44d3904d7394 100644 --- a/rules/docker-dhcp-relay.mk +++ b/rules/docker-dhcp-relay.mk @@ -2,8 +2,9 @@ DOCKER_DHCP_RELAY = docker-dhcp-relay.gz $(DOCKER_DHCP_RELAY)_PATH = $(DOCKERS_PATH)/docker-dhcp-relay +$(DOCKER_DHCP_RELAY)_DEPENDS += $(ISC_DHCP_COMMON) $(ISC_DHCP_RELAY) $(DOCKER_DHCP_RELAY)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE) -SONIC_SIMPLE_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) +SONIC_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DHCP_RELAY) diff --git a/rules/isc-dhcp.mk b/rules/isc-dhcp.mk new file mode 100644 index 000000000000..bfceb7676622 --- /dev/null +++ b/rules/isc-dhcp.mk @@ -0,0 +1,13 @@ +# isc-dhcp packages + +ISC_DHCP_VERSION = 4.3.1-6 + +export ISC_DHCP_VERSION + +ISC_DHCP_COMMON = isc-dhcp-common_$(ISC_DHCP_VERSION)_amd64.deb +$(ISC_DHCP_COMMON)_SRC_PATH = $(SRC_PATH)/isc-dhcp +SONIC_MAKE_DEBS += $(ISC_DHCP_COMMON) + +ISC_DHCP_RELAY = isc-dhcp-relay_$(ISC_DHCP_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(ISC_DHCP_COMMON),$(ISC_DHCP_RELAY))) + diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index ee37f57ee0b5..5757eb1d8693 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -216,6 +216,9 @@ RUN apt-get update && apt-get install -y \ # For sonic config engine testing pyangbind +# Install dependencies for building isc-dhcp-relay +RUN apt-get -y build-dep isc-dhcp + RUN cd /usr/src/gtest && cmake . && make -C /usr/src/gtest RUN mkdir /var/run/sshd diff --git a/src/isc-dhcp/Makefile b/src/isc-dhcp/Makefile new file mode 100644 index 000000000000..b043c0bb266c --- /dev/null +++ b/src/isc-dhcp/Makefile @@ -0,0 +1,30 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = isc-dhcp-common_$(ISC_DHCP_VERSION)_amd64.deb +DERIVED_TARGETS = isc-dhcp-relay_$(ISC_DHCP_VERSION)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Remove any stale files + rm -rf ./isc-dhcp + + # Clone isc-dhcp repo + git clone git://anonscm.debian.org/pkg-dhcp/isc-dhcp.git + pushd ./isc-dhcp + git checkout -f debian/4.3.1-6 + popd + + # Apply patch + patch -p1 < isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch + + # Build source and Debian packages + pushd ./isc-dhcp + dpkg-buildpackage -rfakeroot -b -us -uc + popd + + # Move the newly-built .deb packages to the destination directory + mv $* $(DERIVED_TARGETS) $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) + diff --git a/src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch b/src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch new file mode 100644 index 000000000000..8d28751da63c --- /dev/null +++ b/src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch @@ -0,0 +1,289 @@ +This patch adds the following functionality to dhcrelay in isc-dhcp v4.3.1-6: +* Add customizable Circuit ID and Remote ID fields +* Support for obtaining name of physical interface of interfaces that are part of a bridge interface + +diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c +--- a/isc-dhcp/relay/dhcrelay.c 2014-08-06 22:35:02.000000000 +0000 ++++ b/isc-dhcp/relay/dhcrelay.c 2017-06-08 21:39:53.856192546 +0000 +@@ -73,6 +73,8 @@ + did not match any known circuit ID. */ + int missing_circuit_id = 0; /* Circuit ID option in matching RAI option + was missing. */ ++const char *agent_circuit_id_fmt = NULL; /* Circuit ID custom format string. */ ++const char *agent_remote_id_fmt = NULL; /* Remote ID custom format string. */ + int max_hop_count = 10; /* Maximum hop count */ + + #ifdef DHCPv6 +@@ -140,9 +142,19 @@ + static const char url[] = + "For info, please visit https://www.isc.org/software/dhcp/"; + ++#define DHCRELAY_OPTION82_USAGE \ ++"circuit_id/remote_id interpreted sequences are:\n" \ ++"\n" \ ++" %%%% A single %%\n" \ ++" %%h Hostname of device\n" \ ++" %%p Name of interface that generated the request\n" \ ++" %%P Hardware address of interface that generated the request\n" \ ++" %%C Client hardware address\n" \ ++" %%I DHCP relay agent IP Address\n" \ ++ + #ifdef DHCPv6 + #define DHCRELAY_USAGE \ +-"Usage: dhcrelay [-4] [-d] [-q] [-a] [-D]\n"\ ++"Usage: dhcrelay [-4] [-d] [-q] [-a ] [-D]\n"\ + " [-A ] [-c ] [-p ]\n" \ + " [-pf ] [--no-pid]\n"\ + " [-m append|replace|forward|discard]\n" \ +@@ -154,14 +166,15 @@ + " -l lower0 [ ... -l lowerN]\n" \ + " -u upper0 [ ... -u upperN]\n" \ + " lower (client link): [address%%]interface[#index]\n" \ +-" upper (server link): [address%%]interface" ++" upper (server link): [address%%]interface\n\n" DHCRELAY_OPTION82_USAGE + #else + #define DHCRELAY_USAGE \ +-"Usage: dhcrelay [-d] [-q] [-a] [-D] [-A ] [-c ] [-p ]\n" \ +-" [-pf ] [--no-pid]\n" \ ++"Usage: dhcrelay [-d] [-q] [-a ] [-D]\n" \ ++" [-A ] [-c ] [-p ]\n" \ ++" [-pf ] [--no-pid]\n"\ + " [-m append|replace|forward|discard]\n" \ + " [-i interface0 [ ... -i interfaceN]\n" \ +-" server0 [ ... serverN]\n\n" ++" server0 [ ... serverN]\n\n" DHCRELAY_OPTION82_USAGE + #endif + + static void usage() { +@@ -287,6 +300,15 @@ + local_family_set = 1; + local_family = AF_INET; + #endif ++ if (++i == argc) ++ usage(); ++ ++ if (argv[i] != NULL && argv[i][0] != '-') ++ agent_circuit_id_fmt = argv[i++]; ++ ++ if (argv[i] != NULL && argv[i][0] != '-') ++ agent_remote_id_fmt = argv[i]; ++ + add_agent_options = 1; + } else if (!strcmp(argv[i], "-A")) { + #ifdef DHCPv6 +@@ -937,6 +959,166 @@ + return (-1); + } + ++static int ++_bridgefdbquery(const char *hwAddr, char *interface, int *vlanid) { ++ ++#define xstr(s) str(s) ++#define str(s) #s ++#define FDB_STRING_LEN 100 ++#define FDB_BUFFER_LEN (FDB_STRING_LEN + 1) ++ ++/* ++ * Format for sscanf() to read the 1st, 3th, and 5th ++ * space-delimited fields ++ * ++ * bridge fdb show output ++ * 6c:64:1a:00:06:13 dev swp35 vlan 0 master bridge permanent ++ */ ++#define FDB_LINE_FORMAT "%" xstr(FDB_STRING_LEN) "s %*s " \ ++ "%" xstr(FDB_STRING_LEN) "s %*s %d %*s" ++ ++ char cmdstr[FDB_BUFFER_LEN]; ++ char buf[FDB_BUFFER_LEN]; ++ char macAddr[FDB_BUFFER_LEN]; ++ ++ if ((interface == NULL) || (vlanid == NULL)) { ++ return 0; ++ } ++ sprintf(cmdstr, "bridge fdb show | grep -m 1 %s", hwAddr); ++ FILE *cmd = popen(cmdstr, "r"); ++ ++ if (cmd != NULL) { ++ while (fgets(buf, sizeof(buf), cmd)) { ++ sscanf(buf, FDB_LINE_FORMAT, macAddr, interface, vlanid); ++ log_debug ("bridgefdbquery: macAddr:%s interface: %s vlanid %d", ++ macAddr, ++ interface, *vlanid); ++ } ++ pclose(cmd); ++ return 0; ++ } ++ ++ return -1; ++} ++ ++/* ++ * Format the message that will be used by circuit_id and remote_id ++ */ ++static int ++format_relay_agent_rfc3046_msg(struct interface_info *ip, struct dhcp_packet *packet, ++ const char *format, char *msg, size_t msgn) { ++ size_t len = 0; ++ char hostname[HOST_NAME_MAX + 1] = { 0 }; ++ char ifname[IFNAMSIZ + 1] = { 0 }; ++ char *buf = msg; ++ ++ for ( ; format && *format && len < msgn; ++format) { ++ size_t strn = 0; ++ const char *str = NULL; ++ ++ if (*format == '%') { ++ switch (*++format) { ++ case '\0': ++ --format; ++ break; ++ ++ case '%': /* A literal '%' */ ++ str = "%"; ++ break; ++ ++ case 'h': /* Hostname */ ++ gethostname(hostname, HOST_NAME_MAX); ++ str = hostname; ++ break; ++ ++ case 'p': /* Name of interface that we received the request from */ ++ /* ++ * Query FDB to identify the exact physical interface only when source MAC address ++ * is present and '20: DHCP relay agent IP address' (giaddr) is not present ++ */ ++ if (packet->htype && !packet->giaddr.s_addr) { ++ int ret = 0, vlanid = 0; ++ ++ ret = _bridgefdbquery(print_hw_addr(packet->htype, packet->hlen, packet->chaddr), ++ ip->name, ++ &vlanid); ++ ++ if (ret < 0) { ++ log_debug("MAC Address: %s (interface:%s vlan:%d) not found in bridge fdb show", ++ print_hw_addr (packet->htype, packet->hlen, packet->chaddr), ++ ip->name, ++ vlanid); ++ strncpy(ifname, ip->name, IFNAMSIZ); ++ } ++ else if (strlen(ip->name) > 0) { ++ char cmdstr[256] = { 0 }; ++ char cmdout[256] = { 0 }; ++ ++ log_debug("Adding option 82 interface name for MAC Address: %s as %s", ++ print_hw_addr (packet->htype, packet->hlen, packet->chaddr), ++ ip->name); ++ ++ // Translate SONiC interface name to vendor alias ++ sprintf(cmdstr, "sonic-cfggen -m /etc/sonic/minigraph.xml -v \"minigraph_ports['%s'].alias\"", ip->name); ++ ++ FILE *cmd = popen(cmdstr, "r"); ++ ++ if (cmd != NULL) { ++ while (fgets(cmdout, sizeof(cmdout), cmd)) { ++ // Strip any trailing newline ++ if (cmdout[strlen(cmdout) - 1] == '\n') ++ cmdout[strlen(cmdout) - 1] = '\0'; ++ ++ log_debug ("Retrieved alias %s for interface %s", buf, ip->name); ++ } ++ ++ pclose(cmd); ++ } ++ ++ strncpy(ifname, cmdout, IFNAMSIZ); ++ } ++ ++ str = ifname; ++ } ++ break; ++ ++ case 'P': /* Physical address of interface that we received the request from */ ++ str = print_hw_addr(ip->hw_address.hbuf[0], ip->hw_address.hlen - 1, &ip->hw_address.hbuf[1]); ++ break; ++ ++ case 'C': /* 24: Client hardware address */ ++ str = print_hw_addr(packet->htype, packet->hlen, packet->chaddr); ++ break; ++ ++ case 'I': /* 20: DHCP relay agent IP address */ ++ str = inet_ntoa(packet->giaddr); ++ break; ++ ++ default: ++ log_error("Option %%%c is unrecognized and will not be formatted!", *format); ++ continue; ++ } ++ ++ if (str) ++ strn = strlen(str); ++ } else { ++ str = format; ++ strn += 1; ++ } ++ ++ // Do we have room? ++ if ((strn+len) > msgn) { ++ return 0; ++ } ++ ++ memcpy(buf+len, str, strn); ++ len += strn; ++ } ++ ++ return len; ++} ++ ++ + /* + * Examine a packet to see if it's a candidate to have a Relay + * Agent Information option tacked onto its tail. If it is, tack +@@ -948,6 +1130,8 @@ + int is_dhcp = 0, mms; + unsigned optlen; + u_int8_t *op, *nextop, *sp, *max, *end_pad = NULL; ++ char circuit_id_buf[255] = { '\0', }; ++ char remote_id_buf[255] = { '\0', }; + + /* If we're not adding agent options to packets, we can skip + this. */ +@@ -1077,6 +1261,38 @@ + op = sp; + #endif + ++ /* option82: custom string for circuit_id */ ++ if (agent_circuit_id_fmt) { ++ size_t len = 0; ++ ++ len = format_relay_agent_rfc3046_msg(ip, packet, agent_circuit_id_fmt, ++ circuit_id_buf, sizeof(circuit_id_buf)); ++ ++ if (len > 0) { ++ ip->circuit_id = (uint8_t *)circuit_id_buf; ++ ip->circuit_id_len = len; ++ ++ log_debug("sending on %s option82:circuit_id='%s'(%d)", ++ ip->name, (char *)ip->circuit_id, ip->circuit_id_len); ++ } ++ } ++ ++ /* option82: custom string for remote_id */ ++ if (agent_remote_id_fmt) { ++ size_t len = 0; ++ ++ len = format_relay_agent_rfc3046_msg(ip, packet, agent_remote_id_fmt, ++ remote_id_buf, sizeof(remote_id_buf)); ++ ++ if (len > 0) { ++ ip->remote_id = (uint8_t *)remote_id_buf; ++ ip->remote_id_len = len; ++ ++ log_debug("sending on %s option82:remote_id='%s'(%d)", ++ ip->name, (char *)ip->remote_id, ip->remote_id_len); ++ } ++ } ++ + /* Sanity check. Had better not ever happen. */ + if ((ip->circuit_id_len > 255) ||(ip->circuit_id_len < 1)) + log_fatal("Circuit ID length %d out of range [1-255] on " + From fbb2e410e9b87a2f8b04ca911052825b695aee05 Mon Sep 17 00:00:00 2001 From: Polly Hsu Date: Sun, 25 Jun 2017 05:07:15 +0800 Subject: [PATCH 0638/1011] [Accton]: Add a new supported device and platform AS7716-32X (#732) Switch Vendor: Edge-core Switch SKU: AS7716-32X ASIC Vendor: Broadcom Swich ASIC: Tomahawk Port Configuration: 32x100G SONiC Image: SONiC-ONIE-Broadcom Signed-off-by: polly_hsu@accton.com --- .../Accton-AS7716-32X/port_config.ini | 33 + .../Accton-AS7716-32X/sai.profile | 2 + .../installer.conf | 3 + .../x86_64-accton_as7716_32x-r0/minigraph.xml | 1074 +++++++++++++++++ 4 files changed, 1112 insertions(+) create mode 100644 device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/port_config.ini create mode 100644 device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile create mode 100644 device/accton/x86_64-accton_as7716_32x-r0/installer.conf create mode 100644 device/accton/x86_64-accton_as7716_32x-r0/minigraph.xml diff --git a/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/port_config.ini b/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/port_config.ini new file mode 100644 index 000000000000..1fa6d21d9609 --- /dev/null +++ b/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 49,50,51,52 hundredGigE1 +Ethernet4 53,54,55,56 hundredGigE2 +Ethernet8 57,58,59,60 hundredGigE3 +Ethernet12 61,62,63,64 hundredGigE4 +Ethernet16 65,66,67,68 hundredGigE5 +Ethernet20 69,70,71,72 hundredGigE6 +Ethernet24 73,74,75,76 hundredGigE7 +Ethernet28 77,78,79,80 hundredGigE8 +Ethernet32 33,34,35,36 hundredGigE9 +Ethernet36 37,38,39,40 hundredGigE10 +Ethernet40 41,42,43,44 hundredGigE11 +Ethernet44 45,46,47,48 hundredGigE12 +Ethernet48 81,82,83,84 hundredGigE13 +Ethernet52 85,86,87,88 hundredGigE14 +Ethernet56 89,90,91,92 hundredGigE15 +Ethernet60 93,94,95,96 hundredGigE16 +Ethernet64 97,98,99,100 hundredGigE17 +Ethernet68 101,102,103,104 hundredGigE18 +Ethernet72 105,106,107,108 hundredGigE19 +Ethernet76 109,110,111,112 hundredGigE20 +Ethernet80 17,18,19,20 hundredGigE21 +Ethernet84 21,22,23,24 hundredGigE22 +Ethernet88 25,26,27,28 hundredGigE23 +Ethernet92 29,30,31,32 hundredGigE24 +Ethernet96 113,114,115,116 hundredGigE25 +Ethernet100 117,118,119,120 hundredGigE26 +Ethernet104 121,122,123,124 hundredGigE27 +Ethernet108 125,126,127,128 hundredGigE28 +Ethernet112 1,2,3,4 hundredGigE29 +Ethernet116 5,6,7,8 hundredGigE30 +Ethernet120 9,10,11,12 hundredGigE31 +Ethernet124 13,14,15,16 hundredGigE32 diff --git a/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile b/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile new file mode 100644 index 000000000000..fb1105b47f7a --- /dev/null +++ b/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-as7716-32x100G.config.bcm + diff --git a/device/accton/x86_64-accton_as7716_32x-r0/installer.conf b/device/accton/x86_64-accton_as7716_32x-r0/installer.conf new file mode 100644 index 000000000000..925a32fc0c3a --- /dev/null +++ b/device/accton/x86_64-accton_as7716_32x-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/accton/x86_64-accton_as7716_32x-r0/minigraph.xml b/device/accton/x86_64-accton_as7716_32x-r0/minigraph.xml new file mode 100644 index 000000000000..e197d4cd7178 --- /dev/null +++ b/device/accton/x86_64-accton_as7716_32x-r0/minigraph.xml @@ -0,0 +1,1074 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet60 + 10.0.0.30/31 + + + + Ethernet64 + 10.0.0.32/31 + + + + Ethernet68 + 10.0.0.34/31 + + + + Ethernet72 + 10.0.0.36/31 + + + + Ethernet76 + 10.0.0.38/31 + + + + Ethernet80 + 10.0.0.40/31 + + + + Ethernet84 + 10.0.0.42/31 + + + + Ethernet88 + 10.0.0.44/31 + + + + Ethernet92 + 10.0.0.46/31 + + + + Ethernet96 + 10.0.0.48/31 + + + + Ethernet100 + 10.0.0.50/31 + + + + Ethernet104 + 10.0.0.52/31 + + + + Ethernet108 + 10.0.0.54/31 + + + + Ethernet112 + 10.0.0.56/31 + + + + Ethernet116 + 10.0.0.58/31 + + + + Ethernet120 + 10.0.0.60/31 + + + + Ethernet124 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet60 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet64 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet68 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet72 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet76 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet80 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet84 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet88 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet92 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet96 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet100 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet104 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet108 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet112 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet116 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet120 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet124 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Accton-AS7716-32X + + + + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + + switch1 + Accton-AS7716-32X +
From b92fc2a5c9c678cdbaa43f487ef394188322688f Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 26 Jun 2017 17:32:20 +0300 Subject: [PATCH 0639/1011] [.gitignore]: Update src, config engine (#754) Signed-off-by: marian-pritsak --- .gitignore | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.gitignore b/.gitignore index dd8befe10436..2ab113a44eff 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,13 @@ src/snmpd/* src/thrift/* !src/thrift/Makefile src/sonic-device-data/src/device/ +src/sonic-device-data/src/debian/ +src/igb/* +!src/igb/Makefile +src/mpdecimal/* +!src/mpdecimal/Makefile +src/python3/* +!src/python3/Makefile # Autogenerated Dockerfiles dockers/docker-base/Dockerfile @@ -43,3 +50,8 @@ platform/*/docker-syncd-*-rpc/Dockerfile # Installer-related files and directories installer/x86_64/platforms/ + +# Config engine +src/sonic-config-engine/**/*.pyc +src/sonic-config-engine/build +src/sonic-config-engine/sonic_config_engine.egg-info From fd730d803710414db218a658eefd3bef1ff4d380 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Mon, 26 Jun 2017 18:58:53 +0300 Subject: [PATCH 0640/1011] [submodule]: update sonic-swss (#755) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 316b33371dcb..179daacb2162 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 316b33371dcbccd3d81fa6987170be3e7a3a1536 +Subproject commit 179daacb2162bd769587070ae8ad4f9ded97d549 From 2d97c6a0a7dc6a67788b4b5ac5b88f2a24826c3e Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 26 Jun 2017 21:28:16 -0700 Subject: [PATCH 0641/1011] [sonic-swss-common]: Submodule update (#759) --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 345576ea38cc..4f917f2cc345 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 345576ea38cc511b265825b445c48dbfbf444792 +Subproject commit 4f917f2cc345c54d1bf9d9f01d96e4c01071ac9a From 5310e7a9d7f5be14e0e1304856e52567772fe7d8 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 26 Jun 2017 21:28:51 -0700 Subject: [PATCH 0642/1011] [mgmt slave] Install correct version of python-cffi (#760) --- sonic-mgmt/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sonic-mgmt/Dockerfile b/sonic-mgmt/Dockerfile index f462b99cdf45..69c29eb4c716 100644 --- a/sonic-mgmt/Dockerfile +++ b/sonic-mgmt/Dockerfile @@ -26,6 +26,9 @@ RUN apt-get install -y default-jre # For syslog test RUN apt-get install -y rsyslog psmisc +# Remove cffi 1.5.2, will install 1.10.0 by pip later +RUN apt-get remove -y python-cffi python-cffi-backend + RUN easy_install pip RUN pip install ipaddr \ @@ -37,6 +40,7 @@ RUN pip install ipaddr \ pyasn1==0.1.9 \ pysnmp==4.2.5 \ jinja2==2.7.2 \ + cffi==1.10.0 \ paramiko==2.1.2 RUN git clone https://github.com/ansible/ansible From 3798262c1a7d4bc983876ea45f2096a27f58ecf8 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 27 Jun 2017 17:59:36 -0700 Subject: [PATCH 0643/1011] [DHCP Relay]: Fix Option 82 string - Remove quotes; add MAC address of receiving port as remote_id (#763) --- dockers/docker-dhcp-relay/isc-dhcp-relay.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 index 0b8366d5844e..3b76073fa8c6 100644 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 @@ -25,5 +25,5 @@ INTERFACES=" {%- endfor %}" # '-a' option provides option 82 circuit_id and remote_id information -OPTIONS="-a \"%h:%p\" \"\"" +OPTIONS="-a %h:%p %P" From 15f245c1c92e91d6bc04dfc1cf8fee5f73d274ef Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 27 Jun 2017 20:34:34 -0700 Subject: [PATCH 0644/1011] [platform]: add front panel index in port_config.ini for s6100 (#752) * add front panel index in port_config.ini --- .../Force10-S6100/port_config.ini | 130 +++++++++--------- src/sonic-utilities | 2 +- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/port_config.ini b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/port_config.ini index dcdd6548c198..8b09a1e71f74 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/port_config.ini +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/port_config.ini @@ -1,65 +1,65 @@ -# name lanes alias -Ethernet0 101,102 fortyGigE1/1/1 -Ethernet1 103,104 fortyGigE1/1/2 -Ethernet2 97,98 fortyGigE1/1/3 -Ethernet3 99,100 fortyGigE1/1/4 -Ethernet4 69,70 fortyGigE1/1/5 -Ethernet5 71,72 fortyGigE1/1/6 -Ethernet6 65,66 fortyGigE1/1/7 -Ethernet7 67,68 fortyGigE1/1/8 -Ethernet8 53,54 fortyGigE1/1/9 -Ethernet9 55,56 fortyGigE1/1/10 -Ethernet10 49,50 fortyGigE1/1/11 -Ethernet11 51,52 fortyGigE1/1/12 -Ethernet12 21,22 fortyGigE1/1/13 -Ethernet13 23,24 fortyGigE1/1/14 -Ethernet14 17,18 fortyGigE1/1/15 -Ethernet15 19,20 fortyGigE1/1/16 -Ethernet16 25,26 fortyGigE1/2/1 -Ethernet17 27,28 fortyGigE1/2/2 -Ethernet18 29,30 fortyGigE1/2/3 -Ethernet19 31,32 fortyGigE1/2/4 -Ethernet20 57,58 fortyGigE1/2/5 -Ethernet21 59,60 fortyGigE1/2/6 -Ethernet22 61,62 fortyGigE1/2/7 -Ethernet23 63,64 fortyGigE1/2/8 -Ethernet24 73,74 fortyGigE1/2/9 -Ethernet25 75,76 fortyGigE1/2/10 -Ethernet26 77,78 fortyGigE1/2/11 -Ethernet27 79,80 fortyGigE1/2/12 -Ethernet28 105,106 fortyGigE1/2/13 -Ethernet29 107,108 fortyGigE1/2/14 -Ethernet30 109,110 fortyGigE1/2/15 -Ethernet31 111,112 fortyGigE1/2/16 -Ethernet32 13,14 fortyGigE1/3/1 -Ethernet33 15,16 fortyGigE1/3/2 -Ethernet34 9,10 fortyGigE1/3/3 -Ethernet35 11,12 fortyGigE1/3/4 -Ethernet36 125,126 fortyGigE1/3/5 -Ethernet37 127,128 fortyGigE1/3/6 -Ethernet38 121,122 fortyGigE1/3/7 -Ethernet39 123,124 fortyGigE1/3/8 -Ethernet40 93,94 fortyGigE1/3/9 -Ethernet41 95,96 fortyGigE1/3/10 -Ethernet42 89,90 fortyGigE1/3/11 -Ethernet43 91,92 fortyGigE1/3/12 -Ethernet44 45,46 fortyGigE1/3/13 -Ethernet45 47,48 fortyGigE1/3/14 -Ethernet46 41,42 fortyGigE1/3/15 -Ethernet47 43,44 fortyGigE1/3/16 -Ethernet48 113,114 fortyGigE1/4/1 -Ethernet49 115,116 fortyGigE1/4/2 -Ethernet50 117,118 fortyGigE1/4/3 -Ethernet51 119,120 fortyGigE1/4/4 -Ethernet52 1,2 fortyGigE1/4/5 -Ethernet53 3,4 fortyGigE1/4/6 -Ethernet54 5,6 fortyGigE1/4/7 -Ethernet55 7,8 fortyGigE1/4/8 -Ethernet56 33,34 fortyGigE1/4/9 -Ethernet57 35,36 fortyGigE1/4/10 -Ethernet58 37,38 fortyGigE1/4/11 -Ethernet59 39,40 fortyGigE1/4/12 -Ethernet60 81,82 fortyGigE1/4/13 -Ethernet61 83,84 fortyGigE1/4/14 -Ethernet62 85,86 fortyGigE1/4/15 -Ethernet63 87,88 fortyGigE1/4/16 +# name lanes alias index +Ethernet0 101,102 fortyGigE1/1/1 0 +Ethernet1 103,104 fortyGigE1/1/2 1 +Ethernet2 97,98 fortyGigE1/1/3 2 +Ethernet3 99,100 fortyGigE1/1/4 3 +Ethernet4 69,70 fortyGigE1/1/5 4 +Ethernet5 71,72 fortyGigE1/1/6 5 +Ethernet6 65,66 fortyGigE1/1/7 6 +Ethernet7 67,68 fortyGigE1/1/8 7 +Ethernet8 53,54 fortyGigE1/1/9 8 +Ethernet9 55,56 fortyGigE1/1/10 9 +Ethernet10 49,50 fortyGigE1/1/11 10 +Ethernet11 51,52 fortyGigE1/1/12 11 +Ethernet12 21,22 fortyGigE1/1/13 12 +Ethernet13 23,24 fortyGigE1/1/14 13 +Ethernet14 17,18 fortyGigE1/1/15 14 +Ethernet15 19,20 fortyGigE1/1/16 15 +Ethernet16 25,26 fortyGigE1/2/1 16 +Ethernet17 27,28 fortyGigE1/2/2 17 +Ethernet18 29,30 fortyGigE1/2/3 18 +Ethernet19 31,32 fortyGigE1/2/4 19 +Ethernet20 57,58 fortyGigE1/2/5 20 +Ethernet21 59,60 fortyGigE1/2/6 21 +Ethernet22 61,62 fortyGigE1/2/7 22 +Ethernet23 63,64 fortyGigE1/2/8 23 +Ethernet24 73,74 fortyGigE1/2/9 24 +Ethernet25 75,76 fortyGigE1/2/10 25 +Ethernet26 77,78 fortyGigE1/2/11 26 +Ethernet27 79,80 fortyGigE1/2/12 27 +Ethernet28 105,106 fortyGigE1/2/13 28 +Ethernet29 107,108 fortyGigE1/2/14 29 +Ethernet30 109,110 fortyGigE1/2/15 30 +Ethernet31 111,112 fortyGigE1/2/16 31 +Ethernet32 13,14 fortyGigE1/3/1 32 +Ethernet33 15,16 fortyGigE1/3/2 33 +Ethernet34 9,10 fortyGigE1/3/3 34 +Ethernet35 11,12 fortyGigE1/3/4 35 +Ethernet36 125,126 fortyGigE1/3/5 36 +Ethernet37 127,128 fortyGigE1/3/6 37 +Ethernet38 121,122 fortyGigE1/3/7 38 +Ethernet39 123,124 fortyGigE1/3/8 39 +Ethernet40 93,94 fortyGigE1/3/9 40 +Ethernet41 95,96 fortyGigE1/3/10 41 +Ethernet42 89,90 fortyGigE1/3/11 42 +Ethernet43 91,92 fortyGigE1/3/12 43 +Ethernet44 45,46 fortyGigE1/3/13 44 +Ethernet45 47,48 fortyGigE1/3/14 45 +Ethernet46 41,42 fortyGigE1/3/15 46 +Ethernet47 43,44 fortyGigE1/3/16 47 +Ethernet48 113,114 fortyGigE1/4/1 48 +Ethernet49 115,116 fortyGigE1/4/2 49 +Ethernet50 117,118 fortyGigE1/4/3 50 +Ethernet51 119,120 fortyGigE1/4/4 51 +Ethernet52 1,2 fortyGigE1/4/5 52 +Ethernet53 3,4 fortyGigE1/4/6 53 +Ethernet54 5,6 fortyGigE1/4/7 54 +Ethernet55 7,8 fortyGigE1/4/8 55 +Ethernet56 33,34 fortyGigE1/4/9 56 +Ethernet57 35,36 fortyGigE1/4/10 57 +Ethernet58 37,38 fortyGigE1/4/11 58 +Ethernet59 39,40 fortyGigE1/4/12 59 +Ethernet60 81,82 fortyGigE1/4/13 60 +Ethernet61 83,84 fortyGigE1/4/14 61 +Ethernet62 85,86 fortyGigE1/4/15 62 +Ethernet63 87,88 fortyGigE1/4/16 63 diff --git a/src/sonic-utilities b/src/sonic-utilities index 0ad528043019..5d8f98eeae60 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 0ad52804301903664dfe8f84ef1666101c950cd2 +Subproject commit 5d8f98eeae60f1b5c6c5d6ad7cb4c31019558efd From e68d9a2a5968ff170ecf4b1dc3217563a307ec64 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 29 Jun 2017 01:38:05 -0700 Subject: [PATCH 0645/1011] [igb]: change download url to azure storage url (#770) --- src/igb/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/igb/Makefile b/src/igb/Makefile index afa7a676748b..e814ce0a7db7 100644 --- a/src/igb/Makefile +++ b/src/igb/Makefile @@ -6,7 +6,7 @@ MAIN_TARGET = igb.ko $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : rm -rf ./igb-$(IGB_DRIVER_VERSION) - wget -O igb-$(IGB_DRIVER_VERSION).tar.gz "https://downloadmirror.intel.com/13663/eng/igb-$(IGB_DRIVER_VERSION).tar.gz" + wget -O igb-$(IGB_DRIVER_VERSION).tar.gz "https://sonicstorage.blob.core.windows.net/packages/igb-5.3.5.4.tar.gz?sv=2015-04-05&sr=b&sig=Y7pO2Y%2FLTdQe1XucyRhMZdbHV5duAdvRYOqgJ5D7l4c%3D&se=2031-03-08T08%3A31%3A39Z&sp=r" tar xzf igb-$(IGB_DRIVER_VERSION).tar.gz # Patch From 3ac724ecb030786462308c2d53ba66d65a8ea184 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 29 Jun 2017 01:40:22 -0700 Subject: [PATCH 0646/1011] [baseimage]: Increase net.core.rmem_max to 2097152 (#767) * Increase net.core.rmem_max to 2097152 --- build_debian.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build_debian.sh b/build_debian.sh index 71f849151a94..1e18ec45afbc 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -265,6 +265,8 @@ set /files/etc/sysctl.conf/net.ipv6.conf.default.accept_dad 0 set /files/etc/sysctl.conf/net.ipv6.conf.all.accept_dad 0 set /files/etc/sysctl.conf/net.ipv6.conf.eth0.accept_ra_defrtr 0 + +set /files/etc/sysctl.conf/net.core.rmem_max 2097152 " -r $FILESYSTEM_ROOT ## docker-py is needed by Ansible docker module From 3f570a4cbf050389d5106373b7746e4443b54913 Mon Sep 17 00:00:00 2001 From: wadelnn Date: Thu, 29 Jun 2017 16:41:12 +0800 Subject: [PATCH 0647/1011] Update Ingrasys platform submodule (#764) * Remove specific fancontrol service. Signed-off-by: Wade He --- platform/broadcom/sonic-platform-modules-ingrasys | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-ingrasys b/platform/broadcom/sonic-platform-modules-ingrasys index 8d0229c94865..50471fdaaa48 160000 --- a/platform/broadcom/sonic-platform-modules-ingrasys +++ b/platform/broadcom/sonic-platform-modules-ingrasys @@ -1 +1 @@ -Subproject commit 8d0229c94865228eff63c0d79396d0b924d7c6b1 +Subproject commit 50471fdaaa4849c19a97d8623971450f09903d5d From 39bd495ea93351a5e71444c86f3f4d1cfff07deb Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 29 Jun 2017 10:50:53 -0700 Subject: [PATCH 0648/1011] [Broadcom]: Update SAI package to support Celestica Seastone DX010 and Accton AS7716 (#768) --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 130520298120..fc2503fa41b4 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-12-20170607194342.44_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-12-20170607194342.44_amd64.deb?sv=2015-04-05&sr=b&sig=gJJVxVT2o%2Bm14%2BwCBYFmBfcrDCzBA4b4iSmDKxnS13o%3D&se=2031-02-26T17%3A39%3A50Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-14-20170627090913.47_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-14-20170627090913.47_amd64.deb?sv=2015-04-05&sr=b&sig=MqrcsnIaaFfekaAqcjgbi0mDl94BJ9eRsslLJrp23q8%3D&se=2031-03-06T22%3A29%3A19Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-12-20170607194342.44_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-14-20170627090913.47_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-12-20170607194342.44_amd64.deb?sv=2015-04-05&sr=b&sig=AfYK3Qz%2FTV61E89u0kASm7wF3LEiqaZb%2Fde2jvbw9yk%3D&se=2031-02-26T17%3A40%3A14Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-14-20170627090913.47_amd64.deb?sv=2015-04-05&sr=b&sig=GyAwaEdgSFGXbbFq%2FN2RgSKQ5%2Fc73NgxKMMKq3RVZw0%3D&se=2031-03-06T22%3A29%3A48Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From bce5446dc4098af2b5d45a7b721509a42e47a89d Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 29 Jun 2017 16:37:37 -0700 Subject: [PATCH 0649/1011] [LLDP]: Port description (TLV 4) now contains ':' (#772) --- dockers/docker-lldp-sv2/lldpd.conf.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-lldp-sv2/lldpd.conf.j2 b/dockers/docker-lldp-sv2/lldpd.conf.j2 index 1943c04ed73f..e3d37d091150 100644 --- a/dockers/docker-lldp-sv2/lldpd.conf.j2 +++ b/dockers/docker-lldp-sv2/lldpd.conf.j2 @@ -1,3 +1,3 @@ {% for member in minigraph_ports.keys() %} -configure ports {{member}} lldp portidsubtype local {{minigraph_ports[member]['alias']}} +configure ports {{ member }} lldp portidsubtype local {{ minigraph_ports[member]['alias'] }} description {{ minigraph_neighbors[member]['name'] }}:{{ minigraph_neighbors[member]['port'] }} {% endfor %} From e31e1f77779e960874d193e310f2a38d84d422b3 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 29 Jun 2017 22:21:12 -0700 Subject: [PATCH 0650/1011] [sonic-slave]: install docker-ce 17.03.02 stable version (#774) --- sonic-slave/Dockerfile | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 5757eb1d8693..20a7fbad89eb 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -228,8 +228,21 @@ EXPOSE 22 RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /usr/share/depot_tools ENV PATH /usr/share/depot_tools:$PATH -# Install docker engine 1.13.0 inside docker and enable experimental feature -RUN curl -sSL https://get.docker.com/ | sh && apt-get install -y --force-yes -q docker-engine=1.13.0-0~debian-jessie +# Install docker engine 17.03.2~ce-0 inside docker and enable experimental feature +RUN apt-get update +RUN apt-get install -y \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg2 \ + software-properties-common +RUN curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - +RUN add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/debian \ + $(lsb_release -cs) \ + stable" +RUN apt-get update +RUN apt-get install -y docker-ce=17.03.2~ce-0~debian-jessie RUN echo "DOCKER_OPTS=\"--experimental\"" >> /etc/default/docker # Add user From e904b3bf46bd34c86b46889f9f9c644c8ba6cc48 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 30 Jun 2017 10:28:39 -0700 Subject: [PATCH 0651/1011] [device]: add minigraph and LED support for Arista 7050 QX32S (#773) --- .../port_config.ini | 0 .../sai.profile | 0 .../x86_64-arista_7050_qx32s/minigraph.xml | 1079 +++++++++++++++++ .../plugins/led_control.py | 84 ++ 4 files changed, 1163 insertions(+) rename device/arista/x86_64-arista_7050_qx32s/{Arista-7050-QX32S => Arista-7050-QX-32S}/port_config.ini (100%) rename device/arista/x86_64-arista_7050_qx32s/{Arista-7050-QX32S => Arista-7050-QX-32S}/sai.profile (100%) create mode 100644 device/arista/x86_64-arista_7050_qx32s/minigraph.xml create mode 100644 device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/port_config.ini b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini similarity index 100% rename from device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/port_config.ini rename to device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/sai.profile b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/sai.profile similarity index 100% rename from device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX32S/sai.profile rename to device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/sai.profile diff --git a/device/arista/x86_64-arista_7050_qx32s/minigraph.xml b/device/arista/x86_64-arista_7050_qx32s/minigraph.xml new file mode 100644 index 000000000000..efd30582947a --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/minigraph.xml @@ -0,0 +1,1079 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + Ethernet1/1 + 10.0.0.0/31 + + + + Ethernet2/1 + 10.0.0.2/31 + + + + Ethernet3/1 + 10.0.0.4/31 + + + + Ethernet4/1 + 10.0.0.6/31 + + + + Ethernet5/1 + 10.0.0.8/31 + + + + Ethernet6/1 + 10.0.0.10/31 + + + + Ethernet7/1 + 10.0.0.12/31 + + + + Ethernet8/1 + 10.0.0.14/31 + + + + Ethernet9/1 + 10.0.0.16/31 + + + + Ethernet10/1 + 10.0.0.18/31 + + + + Ethernet11/1 + 10.0.0.20/31 + + + + Ethernet12/1 + 10.0.0.22/31 + + + + Ethernet13/1 + 10.0.0.24/31 + + + + Ethernet14/1 + 10.0.0.26/31 + + + + Ethernet15/1 + 10.0.0.28/31 + + + + Ethernet16/1 + 10.0.0.30/31 + + + + Ethernet17/1 + 10.0.0.32/31 + + + + Ethernet18/1 + 10.0.0.34/31 + + + + Ethernet19/1 + 10.0.0.36/31 + + + + Ethernet20/1 + 10.0.0.38/31 + + + + Ethernet21/1 + 10.0.0.40/31 + + + + Ethernet22/1 + 10.0.0.42/31 + + + + Ethernet23/1 + 10.0.0.44/31 + + + + Ethernet24/1 + 10.0.0.46/31 + + + + Ethernet25 + 10.0.0.48/31 + + + + Ethernet26 + 10.0.0.50/31 + + + + Ethernet27 + 10.0.0.52/31 + + + + Ethernet28 + 10.0.0.54/31 + + + + Ethernet29 + 10.0.0.56/31 + + + + Ethernet30 + 10.0.0.58/31 + + + + Ethernet31 + 10.0.0.60/31 + + + + Ethernet32 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + Ethernet1/1 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet2/1 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet3/1 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet4/1 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet5/1 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet6/1 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet7/1 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet8/1 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet9/1 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet10/1 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet11/1 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet12/1 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet13/1 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet14/1 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet15/1 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet16/1 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet17/1 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet18/1 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet19/1 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet20/1 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet21/1 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet22/1 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet23/1 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet24/1 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet25 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet26 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet27 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet28 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet29 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet30 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet31 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet32 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Arista-7050-QX-32S + + + + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + switch1 + Arista-7050-QX-32S +
diff --git a/device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py b/device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py new file mode 100644 index 000000000000..582eaacbf918 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python +# +# led_control.py +# +# Platform-specific LED control functionality for SONiC +# + +try: + from sonic_led.led_control_base import LedControlBase +except ImportError, e: + raise ImportError (str(e) + " - required module not found") + + +class LedControl(LedControlBase): + """Platform specific LED control class""" + + SONIC_PORT_NAME_PREFIX = "Ethernet" + + LED_SYSFS_PATH_BREAKOUT_CAPABLE = "/sys/class/leds/qsfp{0}_{1}/brightness" + LED_SYSFS_PATH_NO_BREAKOUT = "/sys/class/leds/qsfp{0}/brightness" + + QSFP_BREAKOUT_START_IDX = 1 + QSFP_BREAKOUT_END_IDX = 24 + QSFP_NO_BREAKOUT_START_IDX = 25 + QSFP_NO_BREAKOUT_END_IDX = 32 + + LED_QSFP_OFFSET = 4 + + LED_COLOR_OFF = 0 + LED_COLOR_GREEN = 1 + LED_COLOR_YELLOW = 2 + + # Helper method to map SONiC port name to Arista QSFP index + def _port_name_to_qsfp_index(self, port_name): + # Strip "Ethernet" off port name + if not port_name.startswith(self.SONIC_PORT_NAME_PREFIX): + return -1 + + sonic_port_num = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):]) + + # SONiC port nums are 0-based and increment by 4 + # Arista QSFP indices are 1-based and increment by 1 + return ((sonic_port_num/4) + 1) + + # Concrete implementation of port_link_state_change() method + def port_link_state_change(self, port, state): + qsfp_index = self._port_name_to_qsfp_index(port) + + # Ignore invalid QSFP indices + if qsfp_index <= 0: + return + + # QSFP indices 1-24 are breakout-capable and have four LEDs, and each LED indicate one lane. + # whereas indices 25-32 are not breakout-capable, and only have one + if qsfp_index <= self.QSFP_BREAKOUT_END_IDX: + # assuming 40G, then we need to control four lanes + led_sysfs_paths = [ self.LED_SYSFS_PATH_BREAKOUT_CAPABLE.format(qsfp_index + self.LED_QSFP_OFFSET, i) for i in range(1, 5) ] + else: + led_sysfs_paths = [ self.LED_SYSFS_PATH_NO_BREAKOUT.format(qsfp_index + self.LED_QSFP_OFFSET) ] + + for led_sysfs_path in led_sysfs_paths: + led_file = open(led_sysfs_path, "w") + + if state == "up": + led_file.write("%d" % self.LED_COLOR_GREEN) + else: + led_file.write("%d" % self.LED_COLOR_OFF) + + led_file.close() + + # Constructor + def __init__(self): + # Initialize: Turn all front panel QSFP LEDs off + for qsfp_index in range(self.QSFP_BREAKOUT_START_IDX, self.QSFP_BREAKOUT_END_IDX + 1): + for lane in range(1, 5): + led_sysfs_path = self.LED_SYSFS_PATH_BREAKOUT_CAPABLE.format(qsfp_index + self.LED_QSFP_OFFSET, lane) + with open(led_sysfs_path, 'w') as led_file: + led_file.write("%d" % self.LED_COLOR_OFF) + + for qsfp_index in range(self.QSFP_NO_BREAKOUT_START_IDX, self.QSFP_NO_BREAKOUT_END_IDX + 1): + led_sysfs_path = self.LED_SYSFS_PATH_NO_BREAKOUT.format(qsfp_index + self.LED_QSFP_OFFSET) + with open(led_sysfs_path, 'w') as led_file: + led_file.write("%d" % self.LED_COLOR_OFF) + From d715a74466348f0bfdf9329628260cc393855fab Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 4 Jul 2017 00:43:34 -0700 Subject: [PATCH 0652/1011] [sonic-mgmt]: install adal package via pip (#782) --- sonic-mgmt/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sonic-mgmt/Dockerfile b/sonic-mgmt/Dockerfile index 69c29eb4c716..b30db8251f28 100644 --- a/sonic-mgmt/Dockerfile +++ b/sonic-mgmt/Dockerfile @@ -41,7 +41,8 @@ RUN pip install ipaddr \ pysnmp==4.2.5 \ jinja2==2.7.2 \ cffi==1.10.0 \ - paramiko==2.1.2 + paramiko==2.1.2 \ + adal RUN git clone https://github.com/ansible/ansible RUN cd ansible && git checkout v2.0.0.2-1 -b v2.0.0.2-1 && git submodule update --init --recursive && make && make install From a78d3b1a9fe5591f7f35fadd141790b0c9fc6979 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 5 Jul 2017 13:50:21 -0700 Subject: [PATCH 0653/1011] [base]: allow-hotplug is enough in /etc/network/ifaces. auto is not required (#781) --- files/image_config/interfaces/interfaces.j2 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 7e07c4365171..425badf7f21f 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -46,7 +46,6 @@ iface eth0 inet dhcp {% block front_panel_interfaces %} # The switch front panel interfaces {% for interface in minigraph_interfaces %} -auto {{ interface['attachto'] }} allow-hotplug {{ interface['attachto'] }} iface {{ interface['attachto'] }} {{ 'inet' if interface['addr'] | ipv4 else 'inet6' }} static mtu 9216 @@ -59,7 +58,6 @@ iface {{ interface['attachto'] }} {{ 'inet' if interface['addr'] | ipv4 else 'in {% endif %} {% for vlan in minigraph_vlans.keys()|sort %} {% for member in minigraph_vlans[vlan]['members'] %} -auto {{ member }} allow-hotplug {{ member }} iface {{ member }} inet manual pre-up ifconfig {{ member }} up mtu 9216 @@ -74,7 +72,6 @@ iface {{ member }} inet manual {% endif %} {% for pc in minigraph_portchannels.keys()|sort %} {% for member in minigraph_portchannels[pc]['members'] %} -auto {{ member }} allow-hotplug {{ member }} iface {{ member }} inet manual pre-up teamdctl {{ pc }} port add {{ member }} || true @@ -101,7 +98,6 @@ iface {{ vlan_interface['attachto'] }} {{ 'inet' if vlan_interface['addr'] | ipv {% block pc_interfaces %} # Portchannel interfaces {% for pc_interface in minigraph_portchannel_interfaces %} -auto {{ pc_interface['attachto'] }} allow-hotplug {{ pc_interface['attachto'] }} iface {{ pc_interface['attachto'] }} {{ 'inet' if pc_interface['addr'] | ipv4 else 'inet6' }} static mtu 9216 From 7792f09437245806c6d36ad7fda1cd0172ecd9ee Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 6 Jul 2017 02:27:05 -0700 Subject: [PATCH 0654/1011] [docker-ptf]: Install python modules from pypi (#788) --- dockers/docker-ptf/Dockerfile.j2 | 34 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 59360ee4fa2e..3304ff643bb8 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -20,11 +20,7 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / && apt-get install -y \ openssh-server \ vim \ - python \ - python-scapy \ net-tools \ - python-setuptools \ - supervisor \ traceroute \ lsof \ tcpdump \ @@ -32,34 +28,43 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / pkg-config \ binutils \ net-tools \ - python-pip \ build-essential \ libssl-dev \ libffi-dev \ - python-dev \ wget \ cmake \ libqt5core5a \ libqt5network5 \ less \ - ipython \ git \ iputils-ping \ hping3 \ - curl - -## Reinstall scapy by version from p4lang -RUN git clone https://github.com/p4lang/scapy-vxlan.git && cd scapy-vxlan && python setup.py install + curl \ + python \ + python-dev \ + python-scapy RUN dpkg -i \ {% for deb in docker_ptf_debs.split(' ') -%} debs/{{ deb }}{{' '}} {%- endfor %} +# Install all python modules from pypi. python-scapy is exception, ptf debian package requires python-scapy RUN rm -rf /debs \ && apt-get -y autoclean \ && apt-get -y autoremove \ && rm -rf /var/lib/apt/lists/* \ + && wget --https-only https://bootstrap.pypa.io/get-pip.py \ + && python get-pip.py \ + && rm -f get-pip.py \ + && pip install setuptools \ + && pip install supervisor \ + && pip install ipython==5.4.1 \ + && git clone https://github.com/p4lang/scapy-vxlan.git \ + && cd scapy-vxlan \ + && python setup.py install \ + && cd .. \ + && rm -fr scapy-vxlan \ && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ && tar xvfz 1.0.0.tar.gz \ && cd nanomsg-1.0.0 \ @@ -71,14 +76,12 @@ RUN rm -rf /debs \ && cd ../.. \ && rm -fr nanomsg-1.0.0 \ && rm -f 1.0.0.tar.gz \ - && pip install cffi==1.7.0 \ - && pip install --upgrade cffi==1.7.0 \ + && pip install cffi \ && pip install nnpy \ && pip install dpkt \ && pip install ipaddress \ && pip install pysubnettree \ && pip install paramiko \ - && pip install parallel-ssh \ && pip install flask \ && pip install exabgp==3.4.17\ && mkdir -p /opt \ @@ -90,8 +93,7 @@ RUN mkdir /var/run/sshd \ && echo 'root:root' | chpasswd \ && sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config \ && sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config \ - && sed -i '$aUseDNS no' /etc/ssh/sshd_config \ - && mkdir /root/deps + && sed -i '$aUseDNS no' /etc/ssh/sshd_config COPY ["supervisord.conf", "sshd.conf", "ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] From 12ce4ca4ea1b8e8591836b64aa796f1b17c09886 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 6 Jul 2017 02:27:25 -0700 Subject: [PATCH 0655/1011] [Arista]: Update Arista-7050-QX-32S port_config.ini (#789) --- .../Arista-7050-QX-32S/port_config.ini | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini index 5f29d189f352..b56d958499d4 100644 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini @@ -1,33 +1,33 @@ # name lanes alias -Ethernet0 9,10,11,12 Ethernet1/1 -Ethernet4 13,14,15,16 Ethernet2/1 -Ethernet8 17,18,19,20 Ethernet3/1 -Ethernet12 21,22,23,24 Ethernet4/1 -Ethernet16 29,30,31,32 Ethernet5/1 -Ethernet20 25,26,27,28 Ethernet6/1 -Ethernet24 33,34,35,36 Ethernet7/1 -Ethernet28 37,38,39,40 Ethernet8/1 -Ethernet32 45,46,47,48 Ethernet9/1 -Ethernet36 41,42,43,44 Ethernet10/1 -Ethernet40 49,50,51,52 Ethernet11/1 -Ethernet44 53,54,55,56 Ethernet12/1 -Ethernet48 69,70,71,72 Ethernet13/1 -Ethernet52 65,66,67,68 Ethernet14/1 -Ethernet56 73,74,75,76 Ethernet15/1 -Ethernet60 77,78,79,80 Ethernet16/1 -Ethernet64 93,94,95,96 Ethernet17/1 -Ethernet68 89,90,91,92 Ethernet18/1 -Ethernet72 97,98,99,100 Ethernet19/1 -Ethernet76 101,102,103,104 Ethernet20/1 -Ethernet80 109,110,111,112 Ethernet21/1 -Ethernet84 105,106,107,108 Ethernet22/1 -Ethernet88 121,122,123,124 Ethernet23/1 -Ethernet92 125,126,127,128 Ethernet24/1 -Ethernet96 61,62,63,64 Ethernet25 -Ethernet100 57,58,59,60 Ethernet26 -Ethernet104 81,82,83,84 Ethernet27 -Ethernet108 85,86,87,88 Ethernet28 -Ethernet112 117,118,119,120 Ethernet29 -Ethernet116 113,114,115,116 Ethernet30 -Ethernet120 1,2,3,4 Ethernet31 -Ethernet124 5,6,7,8 Ethernet32 +Ethernet0 9,10,11,12 Ethernet5/1 +Ethernet4 13,14,15,16 Ethernet6/1 +Ethernet8 17,18,19,20 Ethernet7/1 +Ethernet12 21,22,23,24 Ethernet8/1 +Ethernet16 29,30,31,32 Ethernet9/1 +Ethernet20 25,26,27,28 Ethernet10/1 +Ethernet24 33,34,35,36 Ethernet11/1 +Ethernet28 37,38,39,40 Ethernet12/1 +Ethernet32 45,46,47,48 Ethernet13/1 +Ethernet36 41,42,43,44 Ethernet14/1 +Ethernet40 49,50,51,52 Ethernet15/1 +Ethernet44 53,54,55,56 Ethernet16/1 +Ethernet48 69,70,71,72 Ethernet17/1 +Ethernet52 65,66,67,68 Ethernet18/1 +Ethernet56 73,74,75,76 Ethernet19/1 +Ethernet60 77,78,79,80 Ethernet20/1 +Ethernet64 93,94,95,96 Ethernet21/1 +Ethernet68 89,90,91,92 Ethernet22/1 +Ethernet72 97,98,99,100 Ethernet23/1 +Ethernet76 101,102,103,104 Ethernet24/1 +Ethernet80 109,110,111,112 Ethernet25/1 +Ethernet84 105,106,107,108 Ethernet26/1 +Ethernet88 121,122,123,124 Ethernet27/1 +Ethernet92 125,126,127,128 Ethernet28/1 +Ethernet96 61,62,63,64 Ethernet29 +Ethernet100 57,58,59,60 Ethernet30 +Ethernet104 81,82,83,84 Ethernet31 +Ethernet108 85,86,87,88 Ethernet32 +Ethernet112 117,118,119,120 Ethernet33 +Ethernet116 113,114,115,116 Ethernet34 +Ethernet120 1,2,3,4 Ethernet35 +Ethernet124 5,6,7,8 Ethernet36 From b195b0737d53b6739f8f4073b67218344d1151dc Mon Sep 17 00:00:00 2001 From: kaiyu22 Date: Thu, 6 Jul 2017 17:30:56 +0800 Subject: [PATCH 0656/1011] [platform]: Update LED support for Ingrasys S9100 C32 (#783) * Adding file 'led_proc_init.soc' Signed-off-by: Sam Yang --- .../led_proc_init.soc | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 device/ingrasys/x86_64-ingrasys_s9100-r0/led_proc_init.soc diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/led_proc_init.soc b/device/ingrasys/x86_64-ingrasys_s9100-r0/led_proc_init.soc new file mode 100644 index 000000000000..f3afa2c61899 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/led_proc_init.soc @@ -0,0 +1,43 @@ +# LED microprocessor initialization for Ingrasys S9100 C32 + +led 0 stop +led 0 prog 02 04 D2 01 74 0A 12 40 77 0C 12 00 02 04 D2 01 74 14 EA 03 29 61 F1 67 35 74 1F 67 54 67 7C 02 04 D2 01 74 2C 91 DA 00 74 0C 77 31 81 DA 40 74 0C 86 F0 77 CF 06 FD D2 00 70 51 D2 01 74 43 67 A6 77 51 D2 03 74 4B 67 AD 77 51 D2 02 74 51 67 B4 D2 00 57 02 A0 F1 04 D2 01 70 5E 77 68 01 C2 FC 77 69 01 C2 FE 77 69 01 28 32 00 32 01 B7 97 75 77 02 01 60 FE 57 02 00 60 FE 57 02 A0 F1 04 D2 01 70 96 77 A6 06 FE D2 01 70 8E 77 AD 06 F0 C2 08 74 A6 77 AD 06 FE D2 01 70 9E 77 B4 06 F0 C2 08 74 A6 77 B4 22 0E 87 22 0E 87 57 22 0F 87 22 0E 87 57 22 0E 87 22 0F 87 22 0E 87 22 0F 87 22 0E 87 22 0F 87 22 0E 87 22 0F 87 FA 03 57 02 04 D2 01 70 D9 02 80 77 DB 02 20 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=0x1f REMAP_PORT_1=0x1e REMAP_PORT_2=0x1d REMAP_PORT_3=0x1c +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=0x1b REMAP_PORT_5=0x1a REMAP_PORT_6=0x19 REMAP_PORT_7=0x18 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=0x17 REMAP_PORT_9=0x16 REMAP_PORT_10=0x15 REMAP_PORT_11=0x14 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=0x13 REMAP_PORT_13=0x12 REMAP_PORT_14=0x11 REMAP_PORT_15=0x10 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=0xf REMAP_PORT_17=0xe REMAP_PORT_18=0xd REMAP_PORT_19=0xc +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=0xb REMAP_PORT_21=0xa REMAP_PORT_22=0x9 REMAP_PORT_23=0x8 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=0x7 REMAP_PORT_25=0x6 REMAP_PORT_26=0x5 REMAP_PORT_27=0x4 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=0x3 REMAP_PORT_29=0x2 REMAP_PORT_30=0x1 REMAP_PORT_31=0x0 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=0x3f REMAP_PORT_33=0x3e REMAP_PORT_34=0x3d REMAP_PORT_35=0x3c +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=0x3b REMAP_PORT_37=0x3a REMAP_PORT_38=0x39 REMAP_PORT_39=0x38 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=0x37 REMAP_PORT_41=0x36 REMAP_PORT_42=0x35 REMAP_PORT_43=0x34 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=0x33 REMAP_PORT_45=0x32 REMAP_PORT_46=0x31 REMAP_PORT_47=0x30 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=0x2f REMAP_PORT_49=0x2e REMAP_PORT_50=0x2d REMAP_PORT_51=0x2c +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=0x2b REMAP_PORT_53=0x2a REMAP_PORT_54=0x29 REMAP_PORT_55=0x28 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=0x27 REMAP_PORT_57=0x26 REMAP_PORT_58=0x25 REMAP_PORT_59=0x24 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=0x23 REMAP_PORT_61=0x22 REMAP_PORT_62=0x21 REMAP_PORT_63=0x20 +led 0 auto on +led 0 start + +led 1 stop +led 1 prog 02 04 D2 01 74 0A 12 40 77 0C 12 00 02 04 D2 01 74 14 EA 03 29 61 F1 67 35 74 1F 67 54 67 7E 02 04 D2 01 74 2C 91 DA 00 74 0C 77 31 81 DA 40 74 0C 86 F0 77 D1 06 FD D2 00 70 51 D2 01 74 43 67 A8 77 51 D2 03 74 4B 67 AF 77 51 D2 02 74 51 67 B6 D2 00 57 02 A0 F1 04 D2 01 70 5E 77 68 01 C2 FC 77 69 01 C2 FE 77 69 01 F2 03 28 32 00 32 01 B7 97 75 79 02 01 60 FE 57 02 00 60 FE 57 02 A0 F1 04 D2 01 70 98 77 A8 06 FE D2 01 70 90 77 AF 06 F0 C2 08 74 A8 77 AF 06 FE D2 01 70 A0 77 B6 06 F0 C2 08 74 A8 77 B6 22 0E 87 22 0E 87 57 22 0F 87 22 0E 87 57 22 0E 87 22 0F 87 22 0E 87 22 0F 87 22 0E 87 22 0F 87 22 0E 87 22 0F 87 FA 03 57 02 04 D2 01 70 DB 02 80 77 DD 02 20 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=0x0 REMAP_PORT_1=0x1 REMAP_PORT_2=0x2 REMAP_PORT_3=0x3 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=0x4 REMAP_PORT_5=0x5 REMAP_PORT_6=0x6 REMAP_PORT_7=0x7 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=0x8 REMAP_PORT_9=0x9 REMAP_PORT_10=0xa REMAP_PORT_11=0xb +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=0xc REMAP_PORT_13=0xd REMAP_PORT_14=0xe REMAP_PORT_15=0xf +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=0x10 REMAP_PORT_17=0x11 REMAP_PORT_18=0x12 REMAP_PORT_19=0x13 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=0x14 REMAP_PORT_21=0x15 REMAP_PORT_22=0x16 REMAP_PORT_23=0x17 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=0x18 REMAP_PORT_25=0x19 REMAP_PORT_26=0x1a REMAP_PORT_27=0x1b +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=0x1c REMAP_PORT_29=0x1d REMAP_PORT_30=0x1e REMAP_PORT_31=0x1f +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=0x20 REMAP_PORT_33=0x21 REMAP_PORT_34=0x22 REMAP_PORT_35=0x23 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=0x24 REMAP_PORT_37=0x25 REMAP_PORT_38=0x26 REMAP_PORT_39=0x27 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=0x28 REMAP_PORT_41=0x29 REMAP_PORT_42=0x2a REMAP_PORT_43=0x2b +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=0x2c REMAP_PORT_45=0x2d REMAP_PORT_46=0x2e REMAP_PORT_47=0x2f +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=0x30 REMAP_PORT_49=0x31 REMAP_PORT_50=0x32 REMAP_PORT_51=0x33 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=0x34 REMAP_PORT_53=0x35 REMAP_PORT_54=0x36 REMAP_PORT_55=0x37 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=0x38 REMAP_PORT_57=0x39 REMAP_PORT_58=0x3a REMAP_PORT_59=0x3b +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=0x3c REMAP_PORT_61=0x3d REMAP_PORT_62=0x3e REMAP_PORT_63=0x3f +led 1 auto on +led 1 start From a697e8efcfd734f45a2a824b3a6907ab0e17c7b1 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 6 Jul 2017 10:32:27 -0700 Subject: [PATCH 0657/1011] [docker-base]: Build supervisor package from source in order to update to v3.3.2 (#777) - Resolves issue #762 --- .gitignore | 2 + dockers/docker-base/Dockerfile.j2 | 54 +++++++++++++------ .../etc/supervisor/supervisord.conf | 28 ++++++++++ rules/docker-base.mk | 1 + rules/supervisor.mk | 5 ++ sonic-slave/Dockerfile | 26 +++++---- src/supervisor/Makefile | 22 ++++++++ 7 files changed, 112 insertions(+), 26 deletions(-) create mode 100644 dockers/docker-base/etc/supervisor/supervisord.conf create mode 100644 rules/supervisor.mk create mode 100644 src/supervisor/Makefile diff --git a/.gitignore b/.gitignore index 2ab113a44eff..bf9967b04aca 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,8 @@ src/mpdecimal/* !src/mpdecimal/Makefile src/python3/* !src/python3/Makefile +src/supervisor/* +!src/supervisor/Makefile # Autogenerated Dockerfiles dockers/docker-base/Dockerfile diff --git a/dockers/docker-base/Dockerfile.j2 b/dockers/docker-base/Dockerfile.j2 index b8b1e23a1c2d..18761f3caacd 100644 --- a/dockers/docker-base/Dockerfile.j2 +++ b/dockers/docker-base/Dockerfile.j2 @@ -1,8 +1,9 @@ FROM debian:jessie -## Clean documentation in FROM image +# Clean documentation in FROM image RUN find /usr/share/doc -depth \( -type f -o -type l \) ! -name copyright | xargs rm || true -## Clean doc directories that are empty or only contain empty directories + +# Clean doc directories that are empty or only contain empty directories RUN while [ -n "$(find /usr/share/doc -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done RUN rm -rf \ /usr/share/man/* \ @@ -13,18 +14,17 @@ RUN rm -rf \ /var/cache/man/* \ /usr/share/locale/* -## Make apt-get non-interactive +# Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive -## Configure data sources for apt/dpkg +# Configure data sources for apt/dpkg COPY ["sources.list", "/etc/apt/sources.list"] COPY ["dpkg_01_drop", "/etc/dpkg/dpkg.cfg.d/01_drop"] RUN apt-get update -## Pre-install fundamental packages +# Pre-install fundamental packages RUN apt-get -y install \ rsyslog \ - supervisor \ vim-tiny \ perl \ python \ @@ -34,25 +34,45 @@ COPY ["etc/rsyslog.conf", "/etc/rsyslog.conf"] COPY ["etc/rsyslog.d/*", "/etc/rsyslog.d/"] COPY ["root/.vimrc", "/root/.vimrc"] +# Install dependencies of supervisor +RUN apt-get -y install python-pkg-resources python-meld3 + +RUN mkdir -p /etc/supervisor +RUN mkdir -p /var/log/supervisor + +COPY ["etc/supervisor/supervisord.conf", "/etc/supervisor/"] + RUN apt-get -y purge \ exim4 \ exim4-base \ exim4-config \ exim4-daemon-light -{% if docker_base_dbgs %} -## Install common debug-packages -RUN apt-get -y install \ -{% for dbg_pkg in docker_base_dbgs.split(' ') -%} - {{ dbg_pkg }}{{' '}} +{% if docker_base_debs.strip() -%} +# Copy built Debian packages +{%- for deb in docker_base_debs.split(' ') %} +COPY debs/{{ deb }} debs/ +{%- endfor %} + +# Install built Debian packages and implicitly install their dependencies +{%- for deb in docker_base_debs.split(' ') %} +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt debs/{{ deb }} +{%- endfor %} +{%- endif %} + +{% if docker_base_dbgs.strip() -%} +# Install common debug-packages +{%- for dbg_pkg in docker_base_dbgs.split(' ') %} +RUN apt-get -y install {{ dbg_pkg }} {%- endfor %} {% else %} RUN ln /usr/bin/vim.tiny /usr/bin/vim -{% endif %} +{%- endif %} + +# Clean up apt +# Remove /var/lib/apt/lists/*, could be obsoleted for derived images +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /var/lib/apt/lists/* -## Clean up apt -## Remove /var/lib/apt/lists/*, could be obsoleted for derived images -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y; \ - rm -rf /var/lib/apt/lists/*; \ - rm -rf /tmp/*; +RUN rm -rf /tmp/* diff --git a/dockers/docker-base/etc/supervisor/supervisord.conf b/dockers/docker-base/etc/supervisor/supervisord.conf new file mode 100644 index 000000000000..afead15524bf --- /dev/null +++ b/dockers/docker-base/etc/supervisor/supervisord.conf @@ -0,0 +1,28 @@ +; supervisor config file + +[unix_http_server] +file=/var/run/supervisor.sock ; (the path to the socket file) +chmod=0700 ; sockef file mode (default 0700) + +[supervisord] +logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) +pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) +childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP) + +; the below section must remain in the config file for RPC +; (supervisorctl/web interface) to work, additional interfaces may be +; added by defining them in separate rpcinterface: sections +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket + +; The [include] section can just contain the "files" setting. This +; setting can list multiple files (separated by whitespace or +; newlines). It can also contain wildcards. The filenames are +; interpreted as relative to this file. Included files *cannot* +; include files themselves. + +[include] +files = /etc/supervisor/conf.d/*.conf diff --git a/rules/docker-base.mk b/rules/docker-base.mk index 1580c357cddf..100b858fffa2 100644 --- a/rules/docker-base.mk +++ b/rules/docker-base.mk @@ -2,6 +2,7 @@ DOCKER_BASE = docker-base.gz $(DOCKER_BASE)_PATH = $(DOCKERS_PATH)/docker-base +$(DOCKER_BASE)_DEPENDS += $(SUPERVISOR) ifeq ($(SONIC_CONFIG_DEBUG),y) GDB = gdb diff --git a/rules/supervisor.mk b/rules/supervisor.mk new file mode 100644 index 000000000000..cedacd96373e --- /dev/null +++ b/rules/supervisor.mk @@ -0,0 +1,5 @@ +# supervisor package + +SUPERVISOR = python-supervisor_3.3.2-1_all.deb +$(SUPERVISOR)_SRC_PATH = $(SRC_PATH)/supervisor +SONIC_MAKE_DEBS += $(SUPERVISOR) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 20a7fbad89eb..6f1aea5e071e 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -200,23 +200,31 @@ RUN apt-get update && apt-get install -y \ procmail \ # For gtest libgtest-dev \ - cmake \ + cmake + # For linux build - && apt-get -y build-dep linux \ +RUN apt-get -y build-dep linux + # For gobgp build - && apt-get -yt jessie-backports install \ +RUN apt-get -yt jessie-backports install \ golang-go \ - golang-github-golang-mock-dev \ + golang-github-golang-mock-dev + # For p4 build - && pip install \ +RUN pip install \ ctypesgen \ - crc16 \ + crc16 + # For templating - j2cli \ +RUN pip install j2cli + # For sonic config engine testing - pyangbind +RUN pip install pyangbind + +# For supervisor build +RUN pip install meld3 mock -# Install dependencies for building isc-dhcp-relay +# Install dependencies for isc-dhcp-relay build RUN apt-get -y build-dep isc-dhcp RUN cd /usr/src/gtest && cmake . && make -C /usr/src/gtest diff --git a/src/supervisor/Makefile b/src/supervisor/Makefile new file mode 100644 index 000000000000..e9f1c65210a8 --- /dev/null +++ b/src/supervisor/Makefile @@ -0,0 +1,22 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = python-supervisor_3.3.2-1_all.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Remove any stale files + rm -rf ./supervisor + + # Clone isc-dhcp repo + git clone git://github.com/Supervisor/supervisor.git + pushd ./supervisor + git checkout -f 3.3.2 + + # Build Python and Debian package + python setup.py --command-packages=stdeb.command bdist_deb + popd + + # Move the newly-built .deb packages to the destination directory + mv ./supervisor/deb_dist/$* $(DEST)/ + From 90f21d403cc9fdb08d599aad4e29cdc4e96f6461 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 6 Jul 2017 15:28:23 -0700 Subject: [PATCH 0658/1011] [cfg engine] Add support to read device description xml (#775) [cfg engine] Add support to read device description xml --- src/sonic-config-engine/minigraph.py | 86 ++++++++++++++------ src/sonic-config-engine/sonic-cfggen | 8 +- src/sonic-config-engine/tests/device.xml | 17 ++++ src/sonic-config-engine/tests/test_cfggen.py | 11 +++ 4 files changed, 96 insertions(+), 26 deletions(-) create mode 100644 src/sonic-config-engine/tests/device.xml diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 8d3e82ea1233..0344ad0f04e6 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -42,11 +42,33 @@ class minigraph_encoder(json.JSONEncoder): def default(self, obj): - if isinstance(obj, - (ipaddress.IPv4Network, ipaddress.IPv6Network, ipaddress.IPv4Address, ipaddress.IPv6Address)): + if isinstance(obj, ( + ipaddress.IPv4Network, ipaddress.IPv6Network, + ipaddress.IPv4Address, ipaddress.IPv6Address + )): return str(obj) return json.JSONEncoder.default(self, obj) +def parse_device(device): + lo_prefix = None + mgmt_prefix = None + d_type = None # don't shadow type() + hwsku = None + name = None + if str(QName(ns3, "type")) in device.attrib: + d_type = device.attrib[str(QName(ns3, "type"))] + + for node in device: + if node.tag == str(QName(ns, "Address")): + lo_prefix = node.find(str(QName(ns2, "IPPrefix"))).text + elif node.tag == str(QName(ns, "ManagementAddress")): + mgmt_prefix = node.find(str(QName(ns2, "IPPrefix"))).text + elif node.tag == str(QName(ns, "Hostname")): + name = node.text + elif node.tag == str(QName(ns, "HwSku")): + hwsku = node.text + return (lo_prefix, mgmt_prefix, name, hwsku, d_type) + def parse_png(png, hname): neighbors = {} devices = {} @@ -77,24 +99,9 @@ def parse_png(png, hname): if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): - lo_addr = None - # don't shadow type() - d_type = None - mgmt_addr = None - hwsku = None - if str(QName(ns3, "type")) in device.attrib: - d_type = device.attrib[str(QName(ns3, "type"))] - - for node in device: - if node.tag == str(QName(ns, "Address")): - lo_addr = node.find(str(QName(ns2, "IPPrefix"))).text.split('/')[0] - elif node.tag == str(QName(ns, "ManagementAddress")): - mgmt_addr = node.find(str(QName(ns2, "IPPrefix"))).text.split('/')[0] - elif node.tag == str(QName(ns, "Hostname")): - name = node.text - elif node.tag == str(QName(ns, "HwSku")): - hwsku = node.text - + (lo_prefix, mgmt_prefix, name, hwsku, d_type) = parse_device(device) + lo_addr = None if not lo_prefix else lo_prefix.split('/')[0] + mgmt_addr = None if not mgmt_prefix else mgmt_prefix.split('/')[0] devices[name] = {'lo_addr': lo_addr, 'type': d_type, 'mgmt_addr': mgmt_addr, 'hwsku': hwsku} if child.tag == str(QName(ns, "DeviceInterfaceLinks")): @@ -270,7 +277,7 @@ def parse_cpg(cpg, 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 + 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 ip_range = bgpPeer.find(str(QName(ns1, "PeersRange"))).text @@ -382,7 +389,6 @@ def parse_port_config(hwsku, platform=None, port_config_file=None): port_alias_map[alias] = name return ports - def parse_xml(filename, platform=None, port_config_file=None): root = ET.parse(filename).getroot() mini_graph_path = filename @@ -432,9 +438,7 @@ def parse_xml(filename, platform=None, port_config_file=None): elif child.tag == str(QName(ns, "MetadataDeclaration")): (syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst, deployment_id) = parse_meta(child, hostname) - Tree = lambda: defaultdict(Tree) - - results = Tree() + results = {} results['minigraph_hwsku'] = hwsku # sorting by lambdas are not easily done without custom filters. # TODO: add jinja2 filter to accept a lambda to sort a list of dictionaries by attribute. @@ -484,6 +488,38 @@ def parse_xml(filename, platform=None, port_config_file=None): return results +def parse_device_desc_xml(filename): + root = ET.parse(filename).getroot() + (lo_prefix, mgmt_prefix, hostname, hwsku, d_type) = parse_device(root) + + results = {} + results['minigraph_hwsku'] = hwsku + results['minigraph_hostname'] = hostname + results['inventory_hostname'] = hostname + + lo_intfs = [] + ipn = ipaddress.IPNetwork(lo_prefix) + ipaddr = ipn.ip + prefix_len = ipn.prefixlen + ipmask = ipn.netmask + lo_intf = {'name': None, 'addr': ipaddr, 'prefixlen': prefix_len} + if isinstance(ipn, ipaddress.IPv4Network): + lo_intf['mask'] = ipmask + else: + lo_intf['mask'] = str(prefix_len) + lo_intfs.append(lo_intf) + results['minigraph_lo_interfaces'] = lo_intfs + + mgmt_intf = None + mgmt_ipn = ipaddress.IPNetwork(mgmt_prefix) + ipaddr = mgmt_ipn.ip + prefix_len = str(mgmt_ipn.prefixlen) + ipmask = mgmt_ipn.netmask + gwaddr = ipaddress.IPAddress(int(mgmt_ipn.network) + 1) + mgmt_intf = {'addr': ipaddr, 'prefixlen': prefix_len, 'mask': ipmask, 'gwaddr': gwaddr} + results['minigraph_mgmt_interface'] = mgmt_intf + return results + port_alias_map = {} def print_parse_xml(filename): diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index c0ce51d4bf80..8f5b78ac66c1 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -9,6 +9,7 @@ import netaddr import json from minigraph import minigraph_encoder from minigraph import parse_xml +from minigraph import parse_device_desc_xml from sonic_platform import get_machine_info from sonic_platform import get_platform_info @@ -47,7 +48,9 @@ def unique_name(l): def main(): parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") - parser.add_argument("-m", "--minigraph", help="minigraph xml file") + group = parser.add_mutually_exclusive_group() + group.add_argument("-m", "--minigraph", help="minigraph xml file") + group.add_argument("-M", "--device-description", help="device description xml file") parser.add_argument("-p", "--port-config", help="port config file, used with -m") parser.add_argument("-y", "--yaml", help="yaml file that contains addtional variables", action='append', default=[]) parser.add_argument("-a", "--additional-data", help="addition data, in json string") @@ -79,6 +82,9 @@ def main(): else: data.update(parse_xml(minigraph)) + if args.device_description != None: + data.update(parse_device_desc_xml(args.device_description)) + for yaml_file in args.yaml: with open(yaml_file, 'r') as stream: additional_data = yaml.load(stream) diff --git a/src/sonic-config-engine/tests/device.xml b/src/sonic-config-engine/tests/device.xml new file mode 100644 index 000000000000..2995c4dde133 --- /dev/null +++ b/src/sonic-config-engine/tests/device.xml @@ -0,0 +1,17 @@ + + ToRRouter +
+ 10.10.0.12/32 +
+ + ::/0 + + + 10.0.1.5/28 + + + ::/0 + + switch1 + ACS-MSN2700 +
diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 9a305fd72aac..eae4cb74fa42 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -12,6 +12,7 @@ def setUp(self): self.sample_graph_simple = os.path.join(self.test_dir, 'simple-sample-graph.xml') self.sample_graph_pc_test = os.path.join(self.test_dir, 'pc-test-graph.xml') self.sample_graph_bgp_speaker = os.path.join(self.test_dir, 't0-sample-bgp-speaker.xml') + self.sample_device_desc = os.path.join(self.test_dir, 'device.xml') self.port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') def run_script(self, argument): @@ -29,6 +30,16 @@ def test_dummy_run(self): output = self.run_script(argument) self.assertEqual(output, '') + def test_device_desc(self): + argument = '-v minigraph_hwsku -M "' + self.sample_device_desc + '"' + output = self.run_script(argument) + self.assertEqual(output.strip(), 'ACS-MSN2700') + + def test_device_desc_mgmt_ip(self): + argument = '-v "minigraph_mgmt_interface[\'addr\']" -M "' + self.sample_device_desc + '"' + output = self.run_script(argument) + self.assertEqual(output.strip(), '10.0.1.5') + def test_minigraph_sku(self): argument = '-v minigraph_hwsku -m "' + self.sample_graph + '"' output = self.run_script(argument) From a74b3a1eb7ce4760e9b4375551690f645b5e941d Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 6 Jul 2017 16:33:24 -0700 Subject: [PATCH 0659/1011] [teamd]: Fix Jinja2 template for calculating min_ports (#791) In Jinja2, '|' cannot be treated directly as piping operator. The operator precedence of '|' is higher than '*'. The filter only applies to the value just before it. Group the expression to make sure that the filter is applied to the outcome of the expression. Update the unit test to add such case. --- dockers/docker-teamd/teamd.j2 | 4 +-- .../pc_sample_output/PortChannel01.conf | 20 ++++++++++++ .../{ => t0_sample_output}/PortChannel01.conf | 0 .../{ => t0_sample_output}/PortChannel02.conf | 0 .../{ => t0_sample_output}/PortChannel03.conf | 0 .../{ => t0_sample_output}/PortChannel04.conf | 0 src/sonic-config-engine/tests/test_j2files.py | 31 +++++++++++++------ 7 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample_output/pc_sample_output/PortChannel01.conf rename src/sonic-config-engine/tests/sample_output/{ => t0_sample_output}/PortChannel01.conf (100%) rename src/sonic-config-engine/tests/sample_output/{ => t0_sample_output}/PortChannel02.conf (100%) rename src/sonic-config-engine/tests/sample_output/{ => t0_sample_output}/PortChannel03.conf (100%) rename src/sonic-config-engine/tests/sample_output/{ => t0_sample_output}/PortChannel04.conf (100%) diff --git a/dockers/docker-teamd/teamd.j2 b/dockers/docker-teamd/teamd.j2 index 08a3415f5188..d6693719f1ad 100644 --- a/dockers/docker-teamd/teamd.j2 +++ b/dockers/docker-teamd/teamd.j2 @@ -5,7 +5,7 @@ "name": "lacp", "active": true, {# Use 75% links upperbound as min-links #} - "min_ports": {{ minigraph_portchannels[pc]['members'] | length * 0.75 | round(0, 'ceil') | int}}, + "min_ports": {{ (minigraph_portchannels[pc]['members'] | length * 0.75) | round(0, 'ceil') | int }}, "tx_hash": ["eth", "ipv4", "ipv6"] }, "link_watch": { @@ -13,7 +13,7 @@ }, "ports": { {% for member in minigraph_portchannels[pc]['members'] %} - "{{member}}": {}{% if not loop.last %},{% endif %} + "{{ member }}": {}{% if not loop.last %},{% endif %} {% endfor %} } diff --git a/src/sonic-config-engine/tests/sample_output/pc_sample_output/PortChannel01.conf b/src/sonic-config-engine/tests/sample_output/pc_sample_output/PortChannel01.conf new file mode 100644 index 000000000000..618e9baad6a7 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/pc_sample_output/PortChannel01.conf @@ -0,0 +1,20 @@ +{ + "device": "PortChannel01", + "hwaddr": "e4:1d:2d:a5:f3:ad", + "runner": { + "name": "lacp", + "active": true, + "min_ports": 3, + "tx_hash": ["eth", "ipv4", "ipv6"] + }, + "link_watch": { + "name": "ethtool" + }, + "ports": { + "Ethernet112": {}, + "Ethernet116": {}, + "Ethernet120": {}, + "Ethernet124": {} + } +} + diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel01.conf b/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel01.conf similarity index 100% rename from src/sonic-config-engine/tests/sample_output/PortChannel01.conf rename to src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel01.conf diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel02.conf b/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel02.conf similarity index 100% rename from src/sonic-config-engine/tests/sample_output/PortChannel02.conf rename to src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel02.conf diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel03.conf b/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel03.conf similarity index 100% rename from src/sonic-config-engine/tests/sample_output/PortChannel03.conf rename to src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel03.conf diff --git a/src/sonic-config-engine/tests/sample_output/PortChannel04.conf b/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel04.conf similarity index 100% rename from src/sonic-config-engine/tests/sample_output/PortChannel04.conf rename to src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel04.conf diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 2a8c7a35688f..238d8c815514 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -10,6 +10,7 @@ def setUp(self): self.test_dir = os.path.dirname(os.path.realpath(__file__)) self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfggen') self.t0_minigraph = os.path.join(self.test_dir, 't0-sample-graph.xml') + self.pc_minigraph = os.path.join(self.test_dir, 'pc-test-graph.xml') self.t0_port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') self.output_file = os.path.join(self.test_dir, 'output') @@ -30,21 +31,33 @@ def test_alias_map(self): self.assertEqual(data["Ethernet4"], "fortyGigE0/4") def test_teamd(self): - argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -v "minigraph_portchannels.keys() | join(\' \')"' - output = self.run_script(argument) # Mock the output via config.sh in docker-teamd - pc_list = output.split() - def test_render_teamd(self, pc): + def test_render_teamd(self, pc, minigraph, sample_output): teamd_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-teamd', 'teamd.j2') - sample_output_file = os.path.join(self.test_dir, 'sample_output',pc + '.conf') - argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -a \'{\"pc\":\"' + pc + '\",\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + teamd_file + ' > ' + self.output_file + argument = '-m ' + minigraph + ' -p ' + self.t0_port_config + ' -a \'{\"pc\":\"' + pc + '\",\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + teamd_file + ' > ' + self.output_file self.run_script(argument) - assert filecmp.cmp(sample_output_file, self.output_file) + self.assertTrue(filecmp.cmp(sample_output, self.output_file)) + + # Test T0 minigraph + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -v "minigraph_portchannels.keys() | join(\' \')"' + output = self.run_script(argument) # Mock the output via config.sh in docker-teamd + pc_list = output.split() for i in range(1, 5): pc_name = 'PortChannel0' + str(i) - assert pc_name in pc_list - test_render_teamd(self, pc_name) + self.assertTrue(pc_name in pc_list) + sample_output = os.path.join(self.test_dir, 'sample_output', 't0_sample_output', pc_name + '.conf') + test_render_teamd(self, pc_name, self.t0_minigraph, sample_output) + + # Test port channel test minigraph + argument = '-m ' + self.pc_minigraph + ' -p ' + self.t0_port_config + ' -v "minigraph_portchannels.keys() | join(\' \')"' + output = self.run_script(argument) # Mock the output via config.sh in docker-teamd + pc_list = output.split() + + pc_name = 'PortChannel01' + self.assertTrue(pc_name in pc_list) + sample_output = os.path.join(self.test_dir, 'sample_output', 'pc_sample_output', pc_name + '.conf') + test_render_teamd(self, pc_name, self.pc_minigraph, sample_output) def test_ipinip(self): ipinip_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ipinip.json.j2') From 96fe12026545979fa7cfb0d3271b9aa59a4c5d90 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Fri, 7 Jul 2017 14:26:53 +0300 Subject: [PATCH 0660/1011] [mlnx]: Add support of Mellanox SN2740 platform. (#786) - Update SAI (added support of SN2740 profile). - Update SDK to version 4.2.3130. - Update FW to version 13.1224.0140. - Update HW MGMT to version 1.0.0160. --- .../ACS-MSN2740/port_config.ini | 33 + .../ACS-MSN2740/sai.profile | 1 + .../x86_64-mlnx_msn2740-r0/hw-management | 1 + .../x86_64-mlnx_msn2740-r0/installer.conf | 1 + .../x86_64-mlnx_msn2740-r0/minigraph.xml | 1079 +++++++++++++++++ .../x86_64-mlnx_msn2740-r0/plugins/eeprom.py | 33 + .../x86_64-mlnx_msn2740-r0/plugins/sfputil.py | 28 + dockers/docker-orchagent/ipinip.json.j2 | 2 +- dockers/docker-orchagent/mirror.json.j2 | 2 +- dockers/docker-orchagent/swssconfig.sh | 2 + .../mellanox/docker-syncd-mlnx/Dockerfile.j2 | 2 +- .../docker-syncd-mlnx/mlnx-fw-upgrade.sh | 2 +- platform/mellanox/fw.mk | 2 +- platform/mellanox/hw-management.mk | 2 +- platform/mellanox/mlnx-sai.mk | 2 +- platform/mellanox/sdk.mk | 4 +- 16 files changed, 1187 insertions(+), 9 deletions(-) create mode 100644 device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/port_config.ini create mode 100644 device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/sai.profile create mode 120000 device/mellanox/x86_64-mlnx_msn2740-r0/hw-management create mode 100644 device/mellanox/x86_64-mlnx_msn2740-r0/installer.conf create mode 100644 device/mellanox/x86_64-mlnx_msn2740-r0/minigraph.xml create mode 100644 device/mellanox/x86_64-mlnx_msn2740-r0/plugins/eeprom.py create mode 100644 device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/port_config.ini b/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/port_config.ini new file mode 100644 index 000000000000..816bb0e94a70 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/port_config.ini @@ -0,0 +1,33 @@ +# name lanes +Ethernet0 0,1,2,3 +Ethernet4 4,5,6,7 +Ethernet8 8,9,10,11 +Ethernet12 12,13,14,15 +Ethernet16 16,17,18,19 +Ethernet20 20,21,22,23 +Ethernet24 24,25,26,27 +Ethernet28 28,29,30,31 +Ethernet32 32,33,34,35 +Ethernet36 36,37,38,39 +Ethernet40 40,41,42,43 +Ethernet44 44,45,46,47 +Ethernet48 48,49,50,51 +Ethernet52 52,53,54,55 +Ethernet56 56,57,58,59 +Ethernet60 60,61,62,63 +Ethernet64 64,65,66,67 +Ethernet68 68,69,70,71 +Ethernet72 72,73,74,75 +Ethernet76 76,77,78,79 +Ethernet80 80,81,82,83 +Ethernet84 84,85,86,87 +Ethernet88 88,89,90,91 +Ethernet92 92,93,94,95 +Ethernet96 96,97,98,99 +Ethernet100 100,101,102,103 +Ethernet104 104,105,106,107 +Ethernet108 108,109,110,111 +Ethernet112 112,113,114,115 +Ethernet116 116,117,118,119 +Ethernet120 120,121,122,123 +Ethernet124 124,125,126,127 diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/sai.profile b/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/sai.profile new file mode 100644 index 000000000000..79c24358c359 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sai_2740.xml diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/hw-management b/device/mellanox/x86_64-mlnx_msn2740-r0/hw-management new file mode 120000 index 000000000000..b231cbeea1bf --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/hw-management @@ -0,0 +1 @@ +/etc/mlnx/msn2740 \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/installer.conf b/device/mellanox/x86_64-mlnx_msn2740-r0/installer.conf new file mode 100644 index 000000000000..c9c9493a5404 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/installer.conf @@ -0,0 +1 @@ +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="acpi_enforce_resources=lax acpi=noirq" diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/minigraph.xml b/device/mellanox/x86_64-mlnx_msn2740-r0/minigraph.xml new file mode 100644 index 000000000000..81deffca3ae3 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/minigraph.xml @@ -0,0 +1,1079 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch2 + 10.0.0.32 + 1 + 180 + 60 + + + switch2 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch2 + 10.0.0.34 + 1 + 180 + 60 + + + switch2 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch2 + 10.0.0.36 + 1 + 180 + 60 + + + switch2 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch2 + 10.0.0.38 + 1 + 180 + 60 + + + switch2 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch2 + 10.0.0.40 + 1 + 180 + 60 + + + switch2 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch2 + 10.0.0.42 + 1 + 180 + 60 + + + switch2 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch2 + 10.0.0.44 + 1 + 180 + 60 + + + switch2 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch2 + 10.0.0.46 + 1 + 180 + 60 + + + switch2 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch2 + 10.0.0.48 + 1 + 180 + 60 + + + switch2 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch2 + 10.0.0.50 + 1 + 180 + 60 + + + switch2 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch2 + 10.0.0.52 + 1 + 180 + 60 + + + switch2 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch2 + 10.0.0.54 + 1 + 180 + 60 + + + switch2 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch2 + 10.0.0.56 + 1 + 180 + 60 + + + switch2 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch2 + 10.0.0.58 + 1 + 180 + 60 + + + switch2 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch2 + 10.0.0.60 + 1 + 180 + 60 + + + switch2 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch2 + 10.0.0.62 + 1 + 180 + 60 + + + switch2 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch2 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch2 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet60 + 10.0.0.30/31 + + + + Ethernet64 + 10.0.0.32/31 + + + + Ethernet68 + 10.0.0.34/31 + + + + Ethernet72 + 10.0.0.36/31 + + + + Ethernet76 + 10.0.0.38/31 + + + + Ethernet80 + 10.0.0.40/31 + + + + Ethernet84 + 10.0.0.42/31 + + + + Ethernet88 + 10.0.0.44/31 + + + + Ethernet92 + 10.0.0.46/31 + + + + Ethernet96 + 10.0.0.48/31 + + + + Ethernet100 + 10.0.0.50/31 + + + + Ethernet104 + 10.0.0.52/31 + + + + Ethernet108 + 10.0.0.54/31 + + + + Ethernet112 + 10.0.0.56/31 + + + + Ethernet116 + 10.0.0.58/31 + + + + Ethernet120 + 10.0.0.60/31 + + + + Ethernet124 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch2 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet60 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet64 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet68 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet72 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet76 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet80 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet84 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet88 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet92 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet96 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet100 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet104 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet108 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet112 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet116 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet120 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet124 + ARISTA16T0 + Ethernet1 + + + + + switch2 + ACS-MSN2740 + + ` + + + + + switch2 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + switch2 + ACS-MSN2740 +
diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/eeprom.py new file mode 100644 index 000000000000..d792d1770367 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/eeprom.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + _TLV_INFO_MAX_LEN = 256 + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/bsp/eeprom/sys_eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py new file mode 100644 index 000000000000..04e9a4eff85e --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py @@ -0,0 +1,28 @@ +#! /usr/bin/python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + eeprom_offset = 1 + + port_to_eeprom_mapping = {} + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/bsp/qsfp/qsfp{0}' + for x in range(0, self.port_end + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) + sfputilbase.__init__(self, port_num) + diff --git a/dockers/docker-orchagent/ipinip.json.j2 b/dockers/docker-orchagent/ipinip.json.j2 index 19e98a41295c..6ffafd297496 100644 --- a/dockers/docker-orchagent/ipinip.json.j2 +++ b/dockers/docker-orchagent/ipinip.json.j2 @@ -4,7 +4,7 @@ "tunnel_type":"IPINIP", "src_ip":"{{ minigraph_lo_interfaces[0]['addr'] }}", "dst_ip":"{{ minigraph_lo_interfaces[0]['addr'] }}", -{% if minigraph_hwsku in [ 'ACS-MSN2700', 'ACS-MSN2410', 'ACS-MSN2100' ] %} +{% if onie_switch_asic == "mlnx" %} "dscp_mode":"uniform", "ecn_mode":"standard", {% else %} diff --git a/dockers/docker-orchagent/mirror.json.j2 b/dockers/docker-orchagent/mirror.json.j2 index 7a3a9250d7dc..4aa710cfcb71 100644 --- a/dockers/docker-orchagent/mirror.json.j2 +++ b/dockers/docker-orchagent/mirror.json.j2 @@ -4,7 +4,7 @@ "MIRROR_SESSION_TABLE:everflow": { "src_ip": "{{ minigraph_lo_interfaces[0]['addr'] }}", "dst_ip": "{{ erspan_dst[0] }}", -{% if minigraph_hwsku in [ 'ACS-MSN2700', 'ACS-MSN2410', 'ACS-MSN2100' ] %} +{% if onie_switch_asic == "mlnx" %} "gre_type": "0x6558", "queue": "1", {% else %} diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index ab6c39403b59..301a0ff4f351 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -48,6 +48,8 @@ elif [ "$HWSKU" == "Arista-7050-QX32" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [ "$HWSKU" == "ACS-MSN2700" ]; then SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json " +elif [ "$HWSKU" == "ACS-MSN2740" ]; then + SWSSCONFIG_ARGS+="msn2740.32ports.buffers.json msn2740.32ports.qos.json " fi for file in $SWSSCONFIG_ARGS; do diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index 0736df044162..9d42c48b49e3 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -20,7 +20,7 @@ debs/{{ deb }}{{' '}} COPY ["start.sh", "mlnx-fw-upgrade.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] -COPY ["/debs/fw-SPC.mfa", "/etc/mlnx/"] +COPY ["/debs/fw-SPC-*-EVB.mfa", "/etc/mlnx/fw-SPC.mfa"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y diff --git a/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh b/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh index eee5d5a45ef8..0efb3ce9ecdd 100755 --- a/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh +++ b/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh @@ -1,7 +1,7 @@ #!/bin/bash query_retry_count_max="10" -required_fw_version="13.1220.0130" +required_fw_version="13.1224.0140" fw_file=/etc/mlnx/fw-SPC.mfa run_or_fail() { diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index 6f03c0fca221..8260b9d566d4 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -1,5 +1,5 @@ # mellanox firmware -MLNX_FW = fw-SPC.mfa +MLNX_FW = fw-SPC-rel-13_1224_0140-EVB.mfa $(MLNX_FW)_URL = $(MLNX_SDK_BASE_URL)/$(MLNX_FW) SONIC_ONLINE_FILES += $(MLNX_FW) diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk index 762bb6e53fe3..dcbce4564ee8 100644 --- a/platform/mellanox/hw-management.mk +++ b/platform/mellanox/hw-management.mk @@ -1,6 +1,6 @@ # Mellanox HW Management -MLNX_HW_MANAGEMENT_VERSION = V1.0.0100 +MLNX_HW_MANAGEMENT_VERSION = V1.0.0160 export MLNX_HW_MANAGEMENT_VERSION diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 8d3712cb1378..332d496e76d0 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = 161120 -MLNX_SAI_REVISION = b57b458ff060adb2b1df629e330431a391a3b83e +MLNX_SAI_REVISION = ba3ccd6de8e5b82fa2cdfc30f9b8b1f1882bfede export MLNX_SAI_VERSION MLNX_SAI_REVISION diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index 71b3d218418b..bb576aaabee5 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,5 +1,5 @@ -MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/35e5e8739bec80c19053b7bb9cf6d083b8144fb5/sdk -MLNX_SDK_VERSION = 4.2.3102 +MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/ba3ccd6de8e5b82fa2cdfc30f9b8b1f1882bfede/sdk +MLNX_SDK_VERSION = 4.2.3130 MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2) $(SX_ACL_RM) $(SX_COMPLIB) \ $(SX_EXAMPLES) $(SX_GEN_UTILS) $(SX_SCEW) $(SX_SDN_HAL) \ $(SXD_LIBS) $(TESTX) From 51cab5d4ed1e3be9fd6565a42a5ebd5754c03c2c Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Fri, 7 Jul 2017 15:32:50 +0300 Subject: [PATCH 0661/1011] [config]: Add SONIC_CONFIG_MAKE_JOBS (#784) * [config]: Add SONIC_CONFIG_MAKE_JOBS This config option allows user to specify -j value that will be passed to each package build. Signed-off-by: marian-pritsak --- rules/config | 5 +++++ slave.mk | 3 ++- src/hiredis/Makefile | 2 +- src/initramfs-tools/Makefile | 2 +- src/isc-dhcp/Makefile | 2 +- src/libnl3/Makefile | 2 +- src/libteam/Makefile | 2 +- src/mpdecimal/Makefile | 2 +- src/python3/Makefile | 2 +- src/redis/Makefile | 2 +- src/snmpd/Makefile | 2 +- src/thrift/Makefile | 2 +- 12 files changed, 17 insertions(+), 11 deletions(-) diff --git a/rules/config b/rules/config index e813cd7ef1cb..66f936c1fa03 100644 --- a/rules/config +++ b/rules/config @@ -16,6 +16,11 @@ # container. SONIC_CONFIG_BUILD_JOBS = 1 +# SONIC_CONFIG_BUILD_JOBS - set number of jobs for number of jobs per package. +# Corresponding -j argument will be passed to make/dpkg commands that build separate packages +# container. +SONIC_CONFIG_MAKE_JOBS = $(shell nproc) + # SONIC_CONFIG_LOG_TO_FILES - print output from execution of rule for each # target into separate log file under target/log/. # Useful when executing parallel build diff --git a/slave.mk b/slave.mk index c8ffbd8086f0..40e28d6d67ab 100644 --- a/slave.mk +++ b/slave.mk @@ -71,6 +71,7 @@ override PASSWORD := $(DEFAULT_PASSWORD) endif MAKEFLAGS += -j $(SONIC_CONFIG_BUILD_JOBS) +export SONIC_CONFIG_MAKE_JOBS ############################################################################### ## Dumping key config attributes associated to current building exercise @@ -178,7 +179,7 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) : $(DEBS_PATH)/% : .platform $$(a if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi pushd $($*_SRC_PATH) $(LOG) [ ! -f ./autogen.sh ] || ./autogen.sh $(LOG) - dpkg-buildpackage -rfakeroot -b -us -uc $(LOG) + dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) $(LOG) popd $(LOG) # clean up if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt pop -a -f; popd; fi diff --git a/src/hiredis/Makefile b/src/hiredis/Makefile index f8d9db431483..d302b327d312 100644 --- a/src/hiredis/Makefile +++ b/src/hiredis/Makefile @@ -14,7 +14,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : dpkg-source -x hiredis_$(HIREDIS_VERSION_FULL).dsc pushd hiredis-$(HIREDIS_VERSION) - fakeroot debian/rules binary + fakeroot debian/rules -j$(SONIC_CONFIG_MAKE_JOBS) binary popd mv $* $(DERIVED_TARGETS) $(DEST)/ diff --git a/src/initramfs-tools/Makefile b/src/initramfs-tools/Makefile index c7522aa3f66a..95d5c24d1185 100644 --- a/src/initramfs-tools/Makefile +++ b/src/initramfs-tools/Makefile @@ -15,7 +15,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Build the package rm -f debian/*.debhelper.log - dpkg-buildpackage -rfakeroot -b -us -uc + dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) popd mv $* $(DEST)/ diff --git a/src/isc-dhcp/Makefile b/src/isc-dhcp/Makefile index b043c0bb266c..44e77cdd9b43 100644 --- a/src/isc-dhcp/Makefile +++ b/src/isc-dhcp/Makefile @@ -20,7 +20,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Build source and Debian packages pushd ./isc-dhcp - dpkg-buildpackage -rfakeroot -b -us -uc + dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) popd # Move the newly-built .deb packages to the destination directory diff --git a/src/libnl3/Makefile b/src/libnl3/Makefile index 97beb746454c..efd234424dff 100644 --- a/src/libnl3/Makefile +++ b/src/libnl3/Makefile @@ -27,7 +27,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : quilt push quilt push quilt push - dpkg-buildpackage -rfakeroot -b -us -uc + dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/libteam/Makefile b/src/libteam/Makefile index c2b8a09cff6f..283a6b56fbec 100644 --- a/src/libteam/Makefile +++ b/src/libteam/Makefile @@ -28,7 +28,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : mv tmp/debian libteam/ rm -rf tmp pushd ./libteam - dpkg-buildpackage -rfakeroot -b -us -uc + dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/mpdecimal/Makefile b/src/mpdecimal/Makefile index c7f94203f472..5603c44b445f 100644 --- a/src/mpdecimal/Makefile +++ b/src/mpdecimal/Makefile @@ -14,7 +14,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : dpkg-source -x mpdecimal_$(MPDECIMAL_VERSION_FULL).dsc pushd mpdecimal-$(MPDECIMAL_VERSION) - dpkg-buildpackage -us -uc -b + dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) popd mv $* $(DERIVED_TARGETS) $(DEST)/ diff --git a/src/python3/Makefile b/src/python3/Makefile index 80f977ff579d..d7718cbeccf6 100644 --- a/src/python3/Makefile +++ b/src/python3/Makefile @@ -32,7 +32,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : fi done - dpkg-buildpackage -rfakeroot -us -uc -b + dpkg-buildpackage -rfakeroot -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) popd cp $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/redis/Makefile b/src/redis/Makefile index ddc952ff75ad..8cd4458b4339 100644 --- a/src/redis/Makefile +++ b/src/redis/Makefile @@ -16,7 +16,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : dpkg-source -x redis_$(REDIS_VERSION_FULL).dsc pushd redis-$(REDIS_VERSION) - DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -us -uc -b + DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/snmpd/Makefile b/src/snmpd/Makefile index ace9fa6d4b87..457cd2ef05da 100644 --- a/src/snmpd/Makefile +++ b/src/snmpd/Makefile @@ -23,7 +23,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : dpkg-source -x net-snmp_$(SNMPD_VERSION_FULL).dsc pushd net-snmp-$(SNMPD_VERSION) - fakeroot debian/rules binary + fakeroot debian/rules -j$(SONIC_CONFIG_MAKE_JOBS) binary popd mv $(DERIVED_TARGETS) $* $(DEST)/ diff --git a/src/thrift/Makefile b/src/thrift/Makefile index 2a4f67b9175b..786a10641e60 100644 --- a/src/thrift/Makefile +++ b/src/thrift/Makefile @@ -20,7 +20,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : dpkg-source -x thrift_$(THRIFT_VERSION_FULL).dsc pushd thrift-$(THRIFT_VERSION) patch -p1 < ../patch/THRIFT-3577-assertion-failed.patch - DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -d -rfakeroot -b -us -uc + DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -d -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) popd mv $(DERIVED_TARGETS) $* $(DEST)/ From ca8fa7a32e753cf50aae32fa6b6e2c719c92d067 Mon Sep 17 00:00:00 2001 From: Nadiya Date: Fri, 7 Jul 2017 20:24:06 +0300 Subject: [PATCH 0662/1011] Update cavium libsai (#793) Signed-off-by: Nadiya.Stetskovych --- platform/cavium/cavm-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/cavium/cavm-sai.mk b/platform/cavium/cavm-sai.mk index 82e67035b07b..c52c4960b9d6 100644 --- a/platform/cavium/cavm-sai.mk +++ b/platform/cavium/cavm-sai.mk @@ -1,6 +1,6 @@ # Cavium SAI -CAVM_SAI_GITHUB = https://github.com/XPliant/OpenXPS/raw/509de965cf8cc7fcea677b9b4b793612bce40510/SAI/cavm-sai/ +CAVM_SAI_GITHUB = https://github.com/XPliant/OpenXPS/raw/eedd0b8bb7e7a09602a24418a462a5c10792a145/SAI/cavm-sai/ CAVM_LIBSAI = libsai.deb CAVM_SAI = sai.deb From 18627bcf3695004064c00894d2e558bdc4daff46 Mon Sep 17 00:00:00 2001 From: Nadiya Date: Fri, 7 Jul 2017 20:24:20 +0300 Subject: [PATCH 0663/1011] Update cavium xpnet driver (#792) Signed-off-by: Nadiya.Stetskovych --- platform/cavium/cavm-xpnet.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/cavium/cavm-xpnet.mk b/platform/cavium/cavm-xpnet.mk index 0ae3c147039f..613fa9433564 100644 --- a/platform/cavium/cavm-xpnet.mk +++ b/platform/cavium/cavm-xpnet.mk @@ -1,4 +1,4 @@ -CAVM_SAI_URL = https://github.com/XPliant/OpenXPS/raw/18cd5fb556b6262943c0af70375e2631ac3fe08d/SAI +CAVM_SAI_URL = https://github.com/XPliant/OpenXPS/raw/092461a1cf57a11132fbf8e74fa79bab3ab00f2a/SAI CAVM_XPNET_DEB = xp80-Pcie-Endpoint.deb $(CAVM_XPNET_DEB)_URL = $(CAVM_SAI_URL)/netdev/$(CAVM_XPNET_DEB) From 1248cc80e7c438413fe585c88abe02491643efa1 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Fri, 7 Jul 2017 21:40:35 +0300 Subject: [PATCH 0664/1011] Fix ACL json translation (#794) * Fix ACL json translation * Fix json translation tests --- src/sonic-config-engine/tests/sample_output/table_dataacl.json | 2 +- src/sonic-config-engine/tests/sample_output/table_everflow.json | 2 +- src/sonic-config-engine/translate_acl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-config-engine/tests/sample_output/table_dataacl.json b/src/sonic-config-engine/tests/sample_output/table_dataacl.json index ed10f3195636..a099680821d4 100644 --- a/src/sonic-config-engine/tests/sample_output/table_dataacl.json +++ b/src/sonic-config-engine/tests/sample_output/table_dataacl.json @@ -1,6 +1,6 @@ [ { - "ACL_TABLE:dataacl":{ + "ACL_TABLE:DATAACL":{ "policy_desc":"dataacl", "ports":"Ethernet112,Ethernet116,Ethernet120,Ethernet124", "type":"L3" diff --git a/src/sonic-config-engine/tests/sample_output/table_everflow.json b/src/sonic-config-engine/tests/sample_output/table_everflow.json index 4f3411ed8874..9686f8e3890d 100644 --- a/src/sonic-config-engine/tests/sample_output/table_everflow.json +++ b/src/sonic-config-engine/tests/sample_output/table_everflow.json @@ -1,6 +1,6 @@ [ { - "ACL_TABLE:everflow":{ + "ACL_TABLE:EVERFLOW":{ "policy_desc":"everflow", "ports":"Ethernet24,Ethernet40,Ethernet20,Ethernet44,Ethernet48,Ethernet28,Ethernet96,Ethernet92,Ethernet76,Ethernet116,Ethernet72,Ethernet112,Ethernet52,Ethernet108,Ethernet56,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet120,Ethernet8,Ethernet4,Ethernet0,Ethernet124,Ethernet68,Ethernet84,Ethernet100,Ethernet80,Ethernet60,Ethernet104,Ethernet64,Ethernet88", "type":"mirror" diff --git a/src/sonic-config-engine/translate_acl b/src/sonic-config-engine/translate_acl index 696a433730a9..5525eff96774 100755 --- a/src/sonic-config-engine/translate_acl +++ b/src/sonic-config-engine/translate_acl @@ -120,7 +120,7 @@ def generate_table_json(aclset, aclname, ports, mirror, max_priority, output_pat table_props["ports"] = ports table_data = [{}] - table_data[0]["ACL_TABLE:"+table_name] = table_props + table_data[0]["ACL_TABLE:"+table_name.upper()] = table_props table_data[0]["OP"] = "SET" dump_json(os.path.join(output_path, "table_"+table_name+".json"), table_data) From 552b57d61e8b3edce8310ba19178ab2307a1d88a Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Fri, 7 Jul 2017 14:26:51 -0700 Subject: [PATCH 0665/1011] Update submodule sonic-snmpagent (#795) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index f66288d50821..649b0588cc66 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit f66288d50821d7b70ee7dc3321bdc626b3eb34cf +Subproject commit 649b0588cc662df5c56716c5f1f4e552437df266 From a5184d23d9e524b8a962d17274d20271773eba79 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 11 Jul 2017 11:15:48 -0700 Subject: [PATCH 0666/1011] [Broadcom]: Update OpenNSL to 3.2.2.2-10 (#796) Implement ACL redirect SET API RCU soft lockup issue fix for Dell S6100 --- platform/broadcom/sdk.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 143d4e5e27c7..5280fa2c9c1b 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,7 @@ -BRCM_OPENNSL = libopennsl_3.2.2.2-8-20170515203732.42_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-8-20170515203732.42_amd64.deb?sv=2015-04-05&sr=b&sig=70Ae7gJ9tCEwOiOX4N%2BxJ65uc9W55KmatvW7Yyx2mr8%3D&se=2031-01-23T00%3A01%3A52Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.2.2-10-20170707181826.44_amd64.deb +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-10-20170707181826.44_amd64.deb?sv=2015-04-05&sr=b&sig=hc4PbMQvfOu7p7E0MR1kn0OA6vu%2BPIdYOLeDU9hPJMY%3D&se=2031-03-19T21%3A20%3A15Z&sp=r" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-8-20170515203732.42_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-8-20170515203732.42_amd64.deb?sv=2015-04-05&sr=b&sig=K4emi7bcH6UGBukvJJFHo8lgCbK6omuBM16DK4yhRbo%3D&se=2031-01-23T00%3A02%3A19Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-10-20170707181826.44_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-10-20170707181826.44_amd64.deb?sv=2015-04-05&sr=b&sig=xtGLlxX5SspadCxaObMGGVMQliPGrTkuN0T6A4wLETA%3D&se=2031-03-19T21%3A21%3A43Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From ecd0b29533c03ff5f8ae6af1076deda1b344e43b Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 11 Jul 2017 13:01:45 -0700 Subject: [PATCH 0667/1011] [Broadcom]: Update SAI to 2.1.5.1-15 (#799) Add Arista-7050-Q16S64 config.bcm file --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index fc2503fa41b4..d8fe452dc85c 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-14-20170627090913.47_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-14-20170627090913.47_amd64.deb?sv=2015-04-05&sr=b&sig=MqrcsnIaaFfekaAqcjgbi0mDl94BJ9eRsslLJrp23q8%3D&se=2031-03-06T22%3A29%3A19Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-15-20170711181855.48_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-15-20170711181855.48_amd64.deb?sv=2015-04-05&sr=b&sig=shAVuRyM%2ByENjVs9QSEDt%2FALvITRS5GoTvC69MJ4G8M%3D&se=2031-03-20T18%3A21%3A43Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-14-20170627090913.47_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-15-20170711181855.48_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-14-20170627090913.47_amd64.deb?sv=2015-04-05&sr=b&sig=GyAwaEdgSFGXbbFq%2FN2RgSKQ5%2Fc73NgxKMMKq3RVZw0%3D&se=2031-03-06T22%3A29%3A48Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-15-20170711181855.48_amd64.deb?sv=2015-04-05&sr=b&sig=oksLplSCyP58%2BYap4JWi%2FgNz2%2BeJtVDbLui1IUDZSbw%3D&se=2031-03-20T18%3A21%3A16Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From c95d4e9cebf9e9cb71f5455ee31e7bffd5dbef12 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 11 Jul 2017 16:53:30 -0700 Subject: [PATCH 0668/1011] Update submodule sonic-snmpagent (#797) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 649b0588cc66..186a4f65fbdd 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 649b0588cc662df5c56716c5f1f4e552437df266 +Subproject commit 186a4f65fbdde9d277d0aeef562e1fc196266fdb From 1b5255d58308732e9b764427987d5b3e4936fff9 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 12 Jul 2017 01:27:53 -0700 Subject: [PATCH 0669/1011] add support for Arista-7050-Q16S64 (#798) --- .../Arista-7050-Q16S64/port_config.ini | 57 +++++++++++++++++++ .../Arista-7050-Q16S64/sai.profile | 2 + .../plugins/led_control.py | 15 +++-- 3 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini create mode 100644 device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/sai.profile diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini b/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini new file mode 100644 index 000000000000..28edbeccf224 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini @@ -0,0 +1,57 @@ +# name lanes alias +Ethernet0 125,126,127,128 Ethernet1/1 +Ethernet4 121,122,123,124 Ethernet2/1 +Ethernet8 13,14,15,16 Ethernet3/1 +Ethernet12 9,10,11,12 Ethernet4/1 +Ethernet16 17,18,19,20 Ethernet5/1 +Ethernet20 21,22,23,24 Ethernet6/1 +Ethernet24 25,26,27,28 Ethernet7/1 +Ethernet28 29,30,31,32 Ethernet8/1 +Ethernet32 37,38,39,40 Ethernet9/1 +Ethernet36 33,34,35,36 Ethernet10/1 +Ethernet40 45,46,47,48 Ethernet11/1 +Ethernet44 41,42,43,44 Ethernet12/1 +Ethernet48 53,54,55,56 Ethernet13/1 +Ethernet52 49,50,51,52 Ethernet14/1 +Ethernet56 69,70,71,72 Ethernet15/1 +Ethernet60 65,66,67,68 Ethernet16/1 +Ethernet64 77 Ethernet17/1 +Ethernet65 78 Ethernet17/2 +Ethernet66 79 Ethernet17/3 +Ethernet67 80 Ethernet17/4 +Ethernet68 73 Ethernet18/1 +Ethernet69 74 Ethernet18/2 +Ethernet70 75 Ethernet18/3 +Ethernet71 76 Ethernet18/4 +Ethernet72 93 Ethernet19/1 +Ethernet73 94 Ethernet19/2 +Ethernet74 95 Ethernet19/3 +Ethernet75 96 Ethernet19/4 +Ethernet76 89 Ethernet20/1 +Ethernet77 90 Ethernet20/2 +Ethernet78 91 Ethernet20/3 +Ethernet79 92 Ethernet20/4 +Ethernet80 101 Ethernet21/1 +Ethernet81 102 Ethernet21/2 +Ethernet82 103 Ethernet21/3 +Ethernet83 104 Ethernet21/4 +Ethernet84 97 Ethernet22/1 +Ethernet85 98 Ethernet22/2 +Ethernet86 99 Ethernet22/3 +Ethernet87 100 Ethernet22/4 +Ethernet88 109 Ethernet23/1 +Ethernet89 110 Ethernet23/2 +Ethernet90 111 Ethernet23/3 +Ethernet91 112 Ethernet23/4 +Ethernet92 105 Ethernet24/1 +Ethernet93 106 Ethernet24/2 +Ethernet94 107 Ethernet24/3 +Ethernet95 108 Ethernet24/4 +Ethernet96 61,62,63,64 Ethernet25 +Ethernet100 57,58,59,60 Ethernet26 +Ethernet104 81,82,83,84 Ethernet27 +Ethernet108 85,86,87,88 Ethernet28 +Ethernet112 117,118,119,120 Ethernet29 +Ethernet116 113,114,115,116 Ethernet30 +Ethernet120 5,6,7,8 Ethernet31 +Ethernet124 1,2,3,4 Ethernet32 diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/sai.profile b/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/sai.profile new file mode 100644 index 000000000000..0175b59a5da3 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/td2-a7050-qx32-16x40G+32x10G+8x40G.config.bcm +SAI_NUM_ECMP_MEMBERS=32 diff --git a/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py b/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py index 9b8fd2f79186..b7eac3796723 100644 --- a/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py +++ b/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py @@ -7,12 +7,14 @@ try: from sonic_led.led_control_base import LedControlBase + import swsssdk except ImportError, e: raise ImportError (str(e) + " - required module not found") class LedControl(LedControlBase): """Platform specific LED control class""" + PORT_TABLE_PREFIX = "PORT_TABLE:" SONIC_PORT_NAME_PREFIX = "Ethernet" @@ -36,23 +38,28 @@ def _port_name_to_qsfp_index(self, port_name): sonic_port_num = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):]) + swss = swsssdk.SonicV2Connector() + swss.connect(swss.APPL_DB) + + lanes = swss.get(swss.APPL_DB, self.PORT_TABLE_PREFIX + port_name, 'lanes') + # SONiC port nums are 0-based and increment by 4 # Arista QSFP indices are 1-based and increment by 1 - return ((sonic_port_num/4) + 1) + return (((sonic_port_num/4) + 1), sonic_port_num%4, len(lanes.split(','))) # Concrete implementation of port_link_state_change() method def port_link_state_change(self, port, state): - qsfp_index = self._port_name_to_qsfp_index(port) + qsfp_index, lane_index, lanes = self._port_name_to_qsfp_index(port) # Ignore invalid QSFP indices - if qsfp_index <= 0: + if qsfp_index <= 0 or lanes <= 0 or lanes > 4: return # QSFP indices 1-24 are breakout-capable and have four LEDs, and each LED indicate one lane. # whereas indices 25-32 are not breakout-capable, and only have one if qsfp_index <= self.QSFP_BREAKOUT_END_IDX: # assuming 40G, then we need to control four lanes - led_sysfs_paths = [ self.LED_SYSFS_PATH_BREAKOUT_CAPABLE.format(qsfp_index, i) for i in range(1, 5) ] + led_sysfs_paths = [ self.LED_SYSFS_PATH_BREAKOUT_CAPABLE.format(qsfp_index, i) for i in range(lane_index + 1, lane_index + 1 + lanes) ] else: led_sysfs_paths = [ self.LED_SYSFS_PATH_NO_BREAKOUT.format(qsfp_index) ] From 9925aab2e6675dd3aa2a1d30585882f2c9ea198b Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 12 Jul 2017 01:28:36 -0700 Subject: [PATCH 0670/1011] Ignore return value of umount (#801) * Ignore return value of umount * Refine the umount process, more diagnostic info output --- build_debian.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 1e18ec45afbc..ff86cb22de45 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -316,8 +316,13 @@ sudo LANG=C chroot $FILESYSTEM_ROOT bash -c 'rm -rf /usr/share/doc/* /usr/share/ ## Umount all echo '[INFO] Umount all' +## Display all process details access /proc +sudo LANG=C chroot $FILESYSTEM_ROOT fuser -vm /proc +## Kill the processes sudo LANG=C chroot $FILESYSTEM_ROOT fuser -km /proc || true -sudo LANG=C chroot $FILESYSTEM_ROOT umount /proc +## Wait fuser fully kill the processes +sleep 15 +sudo umount $FILESYSTEM_ROOT/proc || true ## Prepare empty directory to trigger mount move in initramfs-tools/mount_loop_root, implemented by patching sudo mkdir $FILESYSTEM_ROOT/host @@ -325,7 +330,8 @@ sudo mkdir $FILESYSTEM_ROOT/host ## Compress most file system into squashfs file sudo rm -f $ONIE_INSTALLER_PAYLOAD $FILESYSTEM_SQUASHFS ## Output the file system total size for diag purpose -sudo du -hs $FILESYSTEM_ROOT +## Note: -x to skip directories on different file systems, such as /proc +sudo du -hsx $FILESYSTEM_ROOT sudo mksquashfs $FILESYSTEM_ROOT $FILESYSTEM_SQUASHFS -e boot -e var/lib/docker -e $PLATFORM_DIR ## Compress docker files From 2090cd341ff48f202205d4c12d5c753195e74995 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 12 Jul 2017 18:15:35 -0700 Subject: [PATCH 0671/1011] [Broadcom]: Update SAI to 2.1.5.1-16 (#803) Add Inventec-D7032Q28B-C32 config.bcm file --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index d8fe452dc85c..ec7a34253075 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-15-20170711181855.48_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-15-20170711181855.48_amd64.deb?sv=2015-04-05&sr=b&sig=shAVuRyM%2ByENjVs9QSEDt%2FALvITRS5GoTvC69MJ4G8M%3D&se=2031-03-20T18%3A21%3A43Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-16-20170712202323.49_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-16-20170712202323.49_amd64.deb?sv=2015-04-05&sr=b&sig=jsPXiAoSyKqZ1SmiyeEj73W8tRlri8ysExnWvc%2BWSi4%3D&se=2031-03-21T22%3A49%3A32Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-15-20170711181855.48_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-16-20170712202323.49_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-15-20170711181855.48_amd64.deb?sv=2015-04-05&sr=b&sig=oksLplSCyP58%2BYap4JWi%2FgNz2%2BeJtVDbLui1IUDZSbw%3D&se=2031-03-20T18%3A21%3A16Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-16-20170712202323.49_amd64.deb?sv=2015-04-05&sr=b&sig=azYZkCi%2FFGS4eELKhIozOok3qimfH%2FjdXlz%2BS2MRBco%3D&se=2031-03-21T22%3A49%3A57Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From f49cac086f8421bf5d76a4798c4906700a322a50 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 12 Jul 2017 20:54:37 -0700 Subject: [PATCH 0672/1011] Remove extra trailing newlines at EOF (#804) Files now end with a single newline --- device/accton/x86_64-accton_as7512_32x-r0/plugins/eeprom.py | 1 - .../x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile | 1 - .../x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile | 1 - device/arista/x86_64-arista_7050_qx32/plugins/led_control.py | 1 - device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py | 1 - device/arista/x86_64-arista_7050_qx32s/sensors.conf | 1 - device/arista/x86_64-arista_7060_cx32s/sensors.conf | 1 - device/dell/x86_64-dell_z9100_c2538-r0/plugins/eeprom.py | 1 - device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol | 1 - device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/eeprom.py | 1 - device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol | 1 - device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/eeprom.py | 1 - device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/sensors.conf | 1 - device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol | 1 - device/mellanox/x86_64-mlnx_msn2100-r0/plugins/eeprom.py | 1 - device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py | 1 - device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py | 1 - device/mellanox/x86_64-mlnx_msn2740-r0/plugins/eeprom.py | 1 - dockers/docker-base/Dockerfile.j2 | 1 - dockers/docker-base/LICENSE | 1 - dockers/docker-base/etc/rsyslog.conf | 1 - dockers/docker-basic_router/Dockerfile | 1 - dockers/docker-basic_router/start.sh | 1 - dockers/docker-basic_router/supervisord.conf | 1 - dockers/docker-database/Dockerfile.j2 | 1 - dockers/docker-database/base_image_files/redis-cli | 1 - dockers/docker-database/supervisord.conf | 1 - dockers/docker-dhcp-relay/Dockerfile.j2 | 1 - dockers/docker-dhcp-relay/isc-dhcp-relay.j2 | 1 - dockers/docker-dhcp-relay/isc-dhcp-relay.sh | 1 - dockers/docker-dhcp-relay/start.sh | 1 - dockers/docker-dhcp-relay/supervisord.conf | 1 - dockers/docker-fpm-frr/config.sh | 1 - dockers/docker-fpm-gobgp/Dockerfile.j2 | 1 - dockers/docker-fpm-gobgp/start.sh | 1 - dockers/docker-fpm-gobgp/supervisord.conf | 1 - dockers/docker-fpm-quagga/Dockerfile.j2 | 1 - dockers/docker-fpm-quagga/start.sh | 1 - dockers/docker-fpm-quagga/supervisord.conf | 1 - dockers/docker-lldp-sv2/Dockerfile.j2 | 1 - dockers/docker-lldp-sv2/start.sh | 1 - dockers/docker-lldp-sv2/supervisord.conf | 1 - dockers/docker-orchagent/Dockerfile.j2 | 1 - dockers/docker-orchagent/orchagent.sh | 1 - dockers/docker-orchagent/swssconfig.sh | 1 - dockers/docker-platform-monitor/Dockerfile.j2 | 1 - dockers/docker-platform-monitor/lm-sensors.sh | 1 - dockers/docker-platform-monitor/start.sh | 1 - dockers/docker-platform-monitor/supervisord.conf | 1 - dockers/docker-saiserver-brcm/Dockerfile | 1 - dockers/docker-saiserver-brcm/start.sh | 1 - dockers/docker-saiserver-brcm/supervisord.conf | 1 - dockers/docker-saiserver-cavm/Dockerfile | 1 - dockers/docker-saiserver-cavm/start.sh | 1 - dockers/docker-saiserver-cavm/supervisord.conf | 1 - dockers/docker-saiserver-mlnx/Dockerfile | 1 - dockers/docker-saiserver-mlnx/start.sh | 1 - dockers/docker-saiserver-mlnx/supervisord.conf | 1 - dockers/docker-snmp-sv2/Dockerfile.j2 | 1 - dockers/docker-snmp-sv2/start.sh | 1 - dockers/docker-snmp-sv2/supervisord.conf | 1 - dockers/docker-teamd/Dockerfile.j2 | 1 - dockers/docker-teamd/base_image_files/teamdctl | 1 - dockers/docker-teamd/start.sh | 1 - dockers/docker-teamd/supervisord.conf | 1 - dockers/docker-teamd/teamd.sh | 1 - files/build_templates/docker_image_ctl.j2 | 1 - files/build_templates/sonic_debian_extension.j2 | 1 - files/dhcp/dhclient.conf | 1 - files/dhcp/sethostname | 1 - files/image_config/bash/bash.bashrc | 2 -- files/image_config/cron.d/logrotate | 1 - files/image_config/interfaces/init_interfaces | 1 - files/image_config/interfaces/interfaces-config.service | 1 - files/image_config/logrotate.d/rsyslog | 1 - files/image_config/ntp/ntp-config.service | 1 - files/image_config/rsyslog/rsyslog-config.service | 1 - files/image_config/rsyslog/rsyslog.conf.j2 | 1 - files/image_config/rsyslog/rsyslog.d/00-sonic.conf | 1 - files/image_config/rsyslog/rsyslog.d/99-default.conf | 1 - files/image_config/snmp/snmp.yml | 1 - files/image_config/sudoers/sudoers | 1 - files/image_config/systemd/journald.conf | 1 - files/image_config/updategraph/updategraph | 1 - platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 | 1 - platform/broadcom/docker-syncd-brcm.mk | 1 - platform/broadcom/docker-syncd-brcm/Dockerfile.j2 | 1 - platform/broadcom/docker-syncd-brcm/base_image_files/bcmcmd | 1 - platform/broadcom/docker-syncd-brcm/start.sh | 1 - platform/broadcom/docker-syncd-brcm/supervisord.conf | 1 - platform/cavium/cavm-platform-modules.mk | 1 - platform/cavium/cavm_platform_modules/Makefile | 1 - platform/cavium/docker-syncd-cavm/profile.ini | 1 - platform/cavium/docker-syncd-cavm/start.sh | 1 - platform/cavium/docker-syncd-cavm/supervisord.conf | 1 - platform/cavium/rules.mk | 1 - platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 | 1 - platform/centec/docker-syncd-centec/Dockerfile.j2 | 1 - platform/centec/docker-syncd-centec/start.sh | 1 - platform/centec/docker-syncd-centec/supervisord.conf | 1 - platform/generic/aboot-image.mk | 1 - platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 | 1 - platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 | 1 - platform/mellanox/docker-syncd-mlnx/supervisord.conf | 1 - platform/p4/docker-sonic-p4/rsyslog.conf | 1 - rules/docker-fpm-frr.mk | 1 - rules/isc-dhcp.mk | 1 - rules/python3.mk | 1 - src/isc-dhcp/Makefile | 1 - src/sonic-config-engine/openconfig_acl.py | 2 -- src/sonic-config-engine/sonic-cfggen | 1 - src/sonic-config-engine/sonic_platform.py | 1 - src/sonic-device-data/src/debian/rules | 1 - src/supervisor/Makefile | 1 - 114 files changed, 116 deletions(-) diff --git a/device/accton/x86_64-accton_as7512_32x-r0/plugins/eeprom.py b/device/accton/x86_64-accton_as7512_32x-r0/plugins/eeprom.py index 26990541231f..6e2c0c8bb96f 100644 --- a/device/accton/x86_64-accton_as7512_32x-r0/plugins/eeprom.py +++ b/device/accton/x86_64-accton_as7512_32x-r0/plugins/eeprom.py @@ -30,4 +30,3 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self, name, path, cpld_root, ro): self.eeprom_path = "/sys/bus/i2c/devices/1-0057/eeprom" super(board, self).__init__(self.eeprom_path, 0, '', True) - diff --git a/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile b/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile index 5ed350f24d7f..dc74eef4d54b 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile +++ b/device/accton/x86_64-accton_as7712_32x-r0/Accton-AS7712-32X/sai.profile @@ -1,2 +1 @@ SAI_INIT_CONFIG_FILE=/etc/bcm/th-as7712-32x100G.config.bcm - diff --git a/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile b/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile index fb1105b47f7a..de1e16b49544 100644 --- a/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile +++ b/device/accton/x86_64-accton_as7716_32x-r0/Accton-AS7716-32X/sai.profile @@ -1,2 +1 @@ SAI_INIT_CONFIG_FILE=/etc/bcm/th-as7716-32x100G.config.bcm - diff --git a/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py b/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py index b7eac3796723..1c69d8109f57 100644 --- a/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py +++ b/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py @@ -86,4 +86,3 @@ def __init__(self): led_sysfs_path = self.LED_SYSFS_PATH_NO_BREAKOUT.format(qsfp_index) with open(led_sysfs_path, 'w') as led_file: led_file.write("%d" % self.LED_COLOR_OFF) - diff --git a/device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py b/device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py index 582eaacbf918..839092ee1d4b 100644 --- a/device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py +++ b/device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py @@ -81,4 +81,3 @@ def __init__(self): led_sysfs_path = self.LED_SYSFS_PATH_NO_BREAKOUT.format(qsfp_index + self.LED_QSFP_OFFSET) with open(led_sysfs_path, 'w') as led_file: led_file.write("%d" % self.LED_COLOR_OFF) - diff --git a/device/arista/x86_64-arista_7050_qx32s/sensors.conf b/device/arista/x86_64-arista_7050_qx32s/sensors.conf index fc5f5c8c3e8e..cf4977f1cc12 100644 --- a/device/arista/x86_64-arista_7050_qx32s/sensors.conf +++ b/device/arista/x86_64-arista_7050_qx32s/sensors.conf @@ -46,4 +46,3 @@ chip "pmbus-i2c-5-58" label temp1 "Power supply 2 hotspot sensor" label temp2 "Power supply 2 inlet temp sensor" label temp3 "Power supply 2 sensor" - diff --git a/device/arista/x86_64-arista_7060_cx32s/sensors.conf b/device/arista/x86_64-arista_7060_cx32s/sensors.conf index 3b4dd2385322..20ebbeb5bbc7 100644 --- a/device/arista/x86_64-arista_7060_cx32s/sensors.conf +++ b/device/arista/x86_64-arista_7060_cx32s/sensors.conf @@ -44,4 +44,3 @@ chip "pmbus-i2c-5-58" label temp1 "Power supply 2 hotspot sensor" label temp2 "Power supply 2 inlet temp sensor" label temp3 "Power supply 2 sensor" - diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/plugins/eeprom.py b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/eeprom.py index 0e6b1bcfafcb..8d1d13f4b7cc 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/plugins/eeprom.py +++ b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/eeprom.py @@ -20,4 +20,3 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self, name, path, cpld_root, ro): self.eeprom_path = "/sys/class/i2c-adapter/i2c-2/2-0050/eeprom" super(board, self).__init__(self.eeprom_path, 0, '', True) - diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol index 05a71e8d999c..827b0539546f 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol @@ -9,4 +9,3 @@ MINTEMP=hwmon2/device/pwm2=20 hwmon2/device/pwm1=20 MAXTEMP=hwmon2/device/pwm2=60 hwmon2/device/pwm1=60 MINSTART=hwmon2/device/pwm2=75 hwmon2/device/pwm1=75 MINSTOP=hwmon2/device/pwm2=22 hwmon2/device/pwm1=22 - diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/eeprom.py b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/eeprom.py index 2013aeddddb4..414ff38221bf 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/eeprom.py +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/eeprom.py @@ -20,4 +20,3 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self, name, path, cpld_root, ro): self.eeprom_path = "/sys/class/i2c-adapter/i2c-17/17-0054/eeprom" super(board, self).__init__(self.eeprom_path, 0, '', True) - diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol index d5d5fa82b2d2..cb07a7a07f4a 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol @@ -8,4 +8,3 @@ MINTEMP=hwmon2/device/pwm1=20 hwmon2/device/pwm2=20 MAXTEMP=hwmon2/device/pwm1=60 hwmon2/device/pwm2=60 MINSTART=hwmon2/device/pwm1=150 hwmon2/device/pwm2=150 MINSTOP=hwmon2/device/pwm1=0 hwmon2/device/pwm2=0 - diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/eeprom.py b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/eeprom.py index c23edf5e772e..1b8de3f16bca 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/eeprom.py +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/eeprom.py @@ -20,4 +20,3 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self, name, path, cpld_root, ro): self.eeprom_path = "/sys/class/i2c-adapter/i2c-7/7-0054/eeprom" super(board, self).__init__(self.eeprom_path, 0, '', True) - diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/sensors.conf index d4b5a7bd0c8a..374bd3a64f04 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/sensors.conf +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/sensors.conf @@ -53,4 +53,3 @@ chip "tmp75-i2c-*-49" label temp1 "FAN Temp2" set temp1_max 50 set temp1_crit 70 - diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol index 05a71e8d999c..827b0539546f 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol @@ -9,4 +9,3 @@ MINTEMP=hwmon2/device/pwm2=20 hwmon2/device/pwm1=20 MAXTEMP=hwmon2/device/pwm2=60 hwmon2/device/pwm1=60 MINSTART=hwmon2/device/pwm2=75 hwmon2/device/pwm1=75 MINSTOP=hwmon2/device/pwm2=22 hwmon2/device/pwm1=22 - diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/eeprom.py index d792d1770367..3650d9c8b70b 100644 --- a/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/eeprom.py +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/eeprom.py @@ -30,4 +30,3 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self, name, path, cpld_root, ro): self.eeprom_path = "/bsp/eeprom/sys_eeprom" super(board, self).__init__(self.eeprom_path, 0, '', True) - diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py index d792d1770367..3650d9c8b70b 100644 --- a/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/eeprom.py @@ -30,4 +30,3 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self, name, path, cpld_root, ro): self.eeprom_path = "/bsp/eeprom/sys_eeprom" super(board, self).__init__(self.eeprom_path, 0, '', True) - diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py index d792d1770367..3650d9c8b70b 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/eeprom.py @@ -30,4 +30,3 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self, name, path, cpld_root, ro): self.eeprom_path = "/bsp/eeprom/sys_eeprom" super(board, self).__init__(self.eeprom_path, 0, '', True) - diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/eeprom.py b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/eeprom.py index d792d1770367..3650d9c8b70b 100644 --- a/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/eeprom.py +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/eeprom.py @@ -30,4 +30,3 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self, name, path, cpld_root, ro): self.eeprom_path = "/bsp/eeprom/sys_eeprom" super(board, self).__init__(self.eeprom_path, 0, '', True) - diff --git a/dockers/docker-base/Dockerfile.j2 b/dockers/docker-base/Dockerfile.j2 index 18761f3caacd..ff52cf88e7d3 100644 --- a/dockers/docker-base/Dockerfile.j2 +++ b/dockers/docker-base/Dockerfile.j2 @@ -75,4 +75,3 @@ RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /var/lib/apt/lists/* RUN rm -rf /tmp/* - diff --git a/dockers/docker-base/LICENSE b/dockers/docker-base/LICENSE index 1d7131f729e9..03d8f31e513c 100644 --- a/dockers/docker-base/LICENSE +++ b/dockers/docker-base/LICENSE @@ -11,4 +11,3 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - diff --git a/dockers/docker-base/etc/rsyslog.conf b/dockers/docker-base/etc/rsyslog.conf index 1132ad55ec3c..8cd8928e2b14 100644 --- a/dockers/docker-base/etc/rsyslog.conf +++ b/dockers/docker-base/etc/rsyslog.conf @@ -65,4 +65,3 @@ $IncludeConfig /etc/rsyslog.d/*.conf ############### #### RULES #### ############### - diff --git a/dockers/docker-basic_router/Dockerfile b/dockers/docker-basic_router/Dockerfile index fa8fbd496172..7d7c724920c2 100644 --- a/dockers/docker-basic_router/Dockerfile +++ b/dockers/docker-basic_router/Dockerfile @@ -20,4 +20,3 @@ COPY ["start.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-basic_router/start.sh b/dockers/docker-basic_router/start.sh index 925076231ccf..a4d378ef77d9 100755 --- a/dockers/docker-basic_router/start.sh +++ b/dockers/docker-basic_router/start.sh @@ -3,4 +3,3 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd - diff --git a/dockers/docker-basic_router/supervisord.conf b/dockers/docker-basic_router/supervisord.conf index 76f9a1968786..bfa84fdcdfb5 100644 --- a/dockers/docker-basic_router/supervisord.conf +++ b/dockers/docker-basic_router/supervisord.conf @@ -18,4 +18,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index 1049f5bf1bfe..8397a3acfd22 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -35,4 +35,3 @@ RUN sed -ri 's/^(save .*$)/# \1/g; COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-database/base_image_files/redis-cli b/dockers/docker-database/base_image_files/redis-cli index 646992f65abd..103dd9e02536 100755 --- a/dockers/docker-database/base_image_files/redis-cli +++ b/dockers/docker-database/base_image_files/redis-cli @@ -1,4 +1,3 @@ #!/bin/bash docker exec -it database redis-cli "$@" - diff --git a/dockers/docker-database/supervisord.conf b/dockers/docker-database/supervisord.conf index 2c78d9c39311..8f90e1ed6285 100644 --- a/dockers/docker-database/supervisord.conf +++ b/dockers/docker-database/supervisord.conf @@ -10,4 +10,3 @@ autostart=true autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-dhcp-relay/Dockerfile.j2 b/dockers/docker-dhcp-relay/Dockerfile.j2 index 1a7b7854d554..a7e1a1cffb9d 100644 --- a/dockers/docker-dhcp-relay/Dockerfile.j2 +++ b/dockers/docker-dhcp-relay/Dockerfile.j2 @@ -27,4 +27,3 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["isc-dhcp-relay.j2", "/usr/share/sonic/templates/"] ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 index 3b76073fa8c6..1c50b685ebda 100644 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 @@ -26,4 +26,3 @@ INTERFACES=" # '-a' option provides option 82 circuit_id and remote_id information OPTIONS="-a %h:%p %P" - diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.sh b/dockers/docker-dhcp-relay/isc-dhcp-relay.sh index 07efa351578f..2224b8a0fe00 100755 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay.sh +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay.sh @@ -16,4 +16,3 @@ if test "$INTERFACES" != ""; then fi exec /usr/sbin/dhcrelay -d -q ${OPTIONS} ${IFCMD} ${SERVERS} - diff --git a/dockers/docker-dhcp-relay/start.sh b/dockers/docker-dhcp-relay/start.sh index a847428ffba6..5c2e9de09703 100755 --- a/dockers/docker-dhcp-relay/start.sh +++ b/dockers/docker-dhcp-relay/start.sh @@ -40,4 +40,3 @@ done # Start the DHCP relay supervisorctl start isc-dhcp-relay - diff --git a/dockers/docker-dhcp-relay/supervisord.conf b/dockers/docker-dhcp-relay/supervisord.conf index 512762f2a5b4..ed1f75d1aed6 100644 --- a/dockers/docker-dhcp-relay/supervisord.conf +++ b/dockers/docker-dhcp-relay/supervisord.conf @@ -26,4 +26,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-fpm-frr/config.sh b/dockers/docker-fpm-frr/config.sh index a57cba3cb46a..d795bcefa701 100755 --- a/dockers/docker-fpm-frr/config.sh +++ b/dockers/docker-fpm-frr/config.sh @@ -14,4 +14,3 @@ chmod 0755 /usr/sbin/bgp-unisolate mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status - diff --git a/dockers/docker-fpm-gobgp/Dockerfile.j2 b/dockers/docker-fpm-gobgp/Dockerfile.j2 index 64877ee9286d..1e333d9026c0 100644 --- a/dockers/docker-fpm-gobgp/Dockerfile.j2 +++ b/dockers/docker-fpm-gobgp/Dockerfile.j2 @@ -26,4 +26,3 @@ COPY ["*.j2", "/usr/share/sonic/templates/"] COPY ["daemons", "/etc/quagga/"] ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-fpm-gobgp/start.sh b/dockers/docker-fpm-gobgp/start.sh index 25b26179bb58..636fceea0cbd 100755 --- a/dockers/docker-fpm-gobgp/start.sh +++ b/dockers/docker-fpm-gobgp/start.sh @@ -23,4 +23,3 @@ supervisorctl start rsyslogd service quagga start supervisorctl start fpmsyncd - diff --git a/dockers/docker-fpm-gobgp/supervisord.conf b/dockers/docker-fpm-gobgp/supervisord.conf index 34fca6756821..4e635f4093d4 100644 --- a/dockers/docker-fpm-gobgp/supervisord.conf +++ b/dockers/docker-fpm-gobgp/supervisord.conf @@ -34,4 +34,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-fpm-quagga/Dockerfile.j2 b/dockers/docker-fpm-quagga/Dockerfile.j2 index 2a7268a0019e..ffced8161a5b 100644 --- a/dockers/docker-fpm-quagga/Dockerfile.j2 +++ b/dockers/docker-fpm-quagga/Dockerfile.j2 @@ -28,4 +28,3 @@ COPY ["*.j2", "/usr/share/sonic/templates/"] COPY ["daemons", "/etc/quagga/"] ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-fpm-quagga/start.sh b/dockers/docker-fpm-quagga/start.sh index c7df6f20999d..a72a96425f66 100755 --- a/dockers/docker-fpm-quagga/start.sh +++ b/dockers/docker-fpm-quagga/start.sh @@ -27,4 +27,3 @@ supervisorctl start rsyslogd service quagga start supervisorctl start fpmsyncd - diff --git a/dockers/docker-fpm-quagga/supervisord.conf b/dockers/docker-fpm-quagga/supervisord.conf index db069bd93787..f2c9bdce7e6d 100644 --- a/dockers/docker-fpm-quagga/supervisord.conf +++ b/dockers/docker-fpm-quagga/supervisord.conf @@ -26,4 +26,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-lldp-sv2/Dockerfile.j2 b/dockers/docker-lldp-sv2/Dockerfile.j2 index 84002f37e7ee..158d5b52ffe7 100644 --- a/dockers/docker-lldp-sv2/Dockerfile.j2 +++ b/dockers/docker-lldp-sv2/Dockerfile.j2 @@ -35,4 +35,3 @@ COPY ["lldpd.conf.j2", "/usr/share/sonic/templates/"] COPY ["lldpd", "/etc/default/"] ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-lldp-sv2/start.sh b/dockers/docker-lldp-sv2/start.sh index ea3b7f45175c..63c8d32c34e6 100755 --- a/dockers/docker-lldp-sv2/start.sh +++ b/dockers/docker-lldp-sv2/start.sh @@ -11,4 +11,3 @@ supervisorctl start rsyslogd supervisorctl start lldpd supervisorctl start lldpd-conf-reload supervisorctl start lldp-syncd - diff --git a/dockers/docker-lldp-sv2/supervisord.conf b/dockers/docker-lldp-sv2/supervisord.conf index dcac7a8645f5..505b72d18227 100644 --- a/dockers/docker-lldp-sv2/supervisord.conf +++ b/dockers/docker-lldp-sv2/supervisord.conf @@ -47,4 +47,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index e4e155163076..73fb087401ab 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -32,4 +32,3 @@ COPY ["ipinip.json.j2", "/usr/share/sonic/templates/"] COPY ["mirror.json.j2", "/usr/share/sonic/templates/"] ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index 01b980b99c1a..8dc1b859ee25 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -19,4 +19,3 @@ elif [ "$ASIC" == "cavium" ]; then fi exec /usr/bin/orchagent ${ORCHAGENT_ARGS} - diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index 301a0ff4f351..768417779e2d 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -58,4 +58,3 @@ for file in $SWSSCONFIG_ARGS; do done config_acl - diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 index 423181a3c589..b6406b3e3a6a 100755 --- a/dockers/docker-platform-monitor/Dockerfile.j2 +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -59,4 +59,3 @@ COPY ["start.sh", "lm-sensors.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-platform-monitor/lm-sensors.sh b/dockers/docker-platform-monitor/lm-sensors.sh index 1eafc81eeb63..61e90c09a8e3 100755 --- a/dockers/docker-platform-monitor/lm-sensors.sh +++ b/dockers/docker-platform-monitor/lm-sensors.sh @@ -9,4 +9,3 @@ # Currently, there is no way to run sensord in the foreground, so we # can't use supervisord. Instead, we just start the service for now. service sensord start - diff --git a/dockers/docker-platform-monitor/start.sh b/dockers/docker-platform-monitor/start.sh index cfcf17e4a192..fb87083f5cc6 100755 --- a/dockers/docker-platform-monitor/start.sh +++ b/dockers/docker-platform-monitor/start.sh @@ -23,4 +23,3 @@ if [ -e /usr/share/sonic/platform/fancontrol ]; then fi supervisorctl start ledd - diff --git a/dockers/docker-platform-monitor/supervisord.conf b/dockers/docker-platform-monitor/supervisord.conf index 2753dceb652d..6fb73450afec 100644 --- a/dockers/docker-platform-monitor/supervisord.conf +++ b/dockers/docker-platform-monitor/supervisord.conf @@ -41,4 +41,3 @@ priority=5 autostart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-saiserver-brcm/Dockerfile b/dockers/docker-saiserver-brcm/Dockerfile index 3a839a7a6df0..a3088e7ffabd 100755 --- a/dockers/docker-saiserver-brcm/Dockerfile +++ b/dockers/docker-saiserver-brcm/Dockerfile @@ -25,4 +25,3 @@ COPY ["profile.ini", "portmap.ini", "/etc/sai/"] RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y; rm -rf /deps ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-saiserver-brcm/start.sh b/dockers/docker-saiserver-brcm/start.sh index f023775f0674..494c0e9126c2 100755 --- a/dockers/docker-saiserver-brcm/start.sh +++ b/dockers/docker-saiserver-brcm/start.sh @@ -15,4 +15,3 @@ supervisorctl start rsyslogd start_bcm supervisorctl start saiserver - diff --git a/dockers/docker-saiserver-brcm/supervisord.conf b/dockers/docker-saiserver-brcm/supervisord.conf index e09ac3cbb449..cb67a0fc9a47 100644 --- a/dockers/docker-saiserver-brcm/supervisord.conf +++ b/dockers/docker-saiserver-brcm/supervisord.conf @@ -26,4 +26,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-saiserver-cavm/Dockerfile b/dockers/docker-saiserver-cavm/Dockerfile index 9203690ad02a..2f667c8038ed 100644 --- a/dockers/docker-saiserver-cavm/Dockerfile +++ b/dockers/docker-saiserver-cavm/Dockerfile @@ -28,4 +28,3 @@ RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf deps ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-saiserver-cavm/start.sh b/dockers/docker-saiserver-cavm/start.sh index 16457d13e03a..09cc0ddb5416 100755 --- a/dockers/docker-saiserver-cavm/start.sh +++ b/dockers/docker-saiserver-cavm/start.sh @@ -5,4 +5,3 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd supervisorctl start saiserver - diff --git a/dockers/docker-saiserver-cavm/supervisord.conf b/dockers/docker-saiserver-cavm/supervisord.conf index e09ac3cbb449..cb67a0fc9a47 100644 --- a/dockers/docker-saiserver-cavm/supervisord.conf +++ b/dockers/docker-saiserver-cavm/supervisord.conf @@ -26,4 +26,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-saiserver-mlnx/Dockerfile b/dockers/docker-saiserver-mlnx/Dockerfile index 39d0fa176987..f908c05742e3 100755 --- a/dockers/docker-saiserver-mlnx/Dockerfile +++ b/dockers/docker-saiserver-mlnx/Dockerfile @@ -36,4 +36,3 @@ RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /deps ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-saiserver-mlnx/start.sh b/dockers/docker-saiserver-mlnx/start.sh index 57ee5036ded3..58a0c316add3 100755 --- a/dockers/docker-saiserver-mlnx/start.sh +++ b/dockers/docker-saiserver-mlnx/start.sh @@ -13,4 +13,3 @@ supervisorctl start rsyslogd start_mlnx supervisorctl start saiserver - diff --git a/dockers/docker-saiserver-mlnx/supervisord.conf b/dockers/docker-saiserver-mlnx/supervisord.conf index e09ac3cbb449..cb67a0fc9a47 100644 --- a/dockers/docker-saiserver-mlnx/supervisord.conf +++ b/dockers/docker-saiserver-mlnx/supervisord.conf @@ -26,4 +26,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index 73f5c257a5c4..2ab867031874 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -47,4 +47,3 @@ COPY ["*.j2", "/usr/share/sonic/templates/"] EXPOSE 161/udp 162/udp ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-snmp-sv2/start.sh b/dockers/docker-snmp-sv2/start.sh index 7e178351b159..ffbe8f196722 100755 --- a/dockers/docker-snmp-sv2/start.sh +++ b/dockers/docker-snmp-sv2/start.sh @@ -15,4 +15,3 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd supervisorctl start snmpd supervisorctl start snmp-subagent - diff --git a/dockers/docker-snmp-sv2/supervisord.conf b/dockers/docker-snmp-sv2/supervisord.conf index 6c3685b32cdb..60313c57f813 100644 --- a/dockers/docker-snmp-sv2/supervisord.conf +++ b/dockers/docker-snmp-sv2/supervisord.conf @@ -34,4 +34,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index 73de6bd47a78..f604433a6c3f 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -30,4 +30,3 @@ RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/dockers/docker-teamd/base_image_files/teamdctl b/dockers/docker-teamd/base_image_files/teamdctl index c7f59d321454..9dd188d18cba 100755 --- a/dockers/docker-teamd/base_image_files/teamdctl +++ b/dockers/docker-teamd/base_image_files/teamdctl @@ -1,4 +1,3 @@ #!/bin/bash docker exec -i teamd teamdctl "$@" - diff --git a/dockers/docker-teamd/start.sh b/dockers/docker-teamd/start.sh index 0f6a8c9f9ceb..fe4bfe1c584f 100755 --- a/dockers/docker-teamd/start.sh +++ b/dockers/docker-teamd/start.sh @@ -27,4 +27,3 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd supervisorctl start teamd - diff --git a/dockers/docker-teamd/supervisord.conf b/dockers/docker-teamd/supervisord.conf index 2db52ebd073f..48ef0ca9f29e 100644 --- a/dockers/docker-teamd/supervisord.conf +++ b/dockers/docker-teamd/supervisord.conf @@ -26,4 +26,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/dockers/docker-teamd/teamd.sh b/dockers/docker-teamd/teamd.sh index 2c7c716b00b7..37b617150a04 100755 --- a/dockers/docker-teamd/teamd.sh +++ b/dockers/docker-teamd/teamd.sh @@ -36,4 +36,3 @@ while true; do fi sleep 1 done - diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 9a1f79c4ed5a..3ae3acaed33b 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -38,4 +38,3 @@ case "$1" in exit 1 ;; esac - diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 647a73b5ce1c..77c5457327cc 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -221,4 +221,3 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get autor sudo cp {{src}} $FILESYSTEM_ROOT/{{dst}} {% endif -%} {% endfor -%} - diff --git a/files/dhcp/dhclient.conf b/files/dhcp/dhclient.conf index 363a67b50f9e..6a542e069fab 100644 --- a/files/dhcp/dhclient.conf +++ b/files/dhcp/dhclient.conf @@ -22,4 +22,3 @@ request subnet-mask, broadcast-address, time-offset, routers, dhcp6.name-servers, dhcp6.domain-search, interface-mtu, rfc3442-classless-static-routes, ntp-servers, snmp-community, minigraph-url, acl-url; - diff --git a/files/dhcp/sethostname b/files/dhcp/sethostname index 57f96ce63612..8cef73239455 100644 --- a/files/dhcp/sethostname +++ b/files/dhcp/sethostname @@ -10,4 +10,3 @@ case $reason in fi ;; esac - diff --git a/files/image_config/bash/bash.bashrc b/files/image_config/bash/bash.bashrc index b531c88a0601..f59cc1bf6470 100644 --- a/files/image_config/bash/bash.bashrc +++ b/files/image_config/bash/bash.bashrc @@ -53,5 +53,3 @@ if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-no fi } fi - - diff --git a/files/image_config/cron.d/logrotate b/files/image_config/cron.d/logrotate index 877e0cb6d5d7..9e1335cbd43e 100644 --- a/files/image_config/cron.d/logrotate +++ b/files/image_config/cron.d/logrotate @@ -1,3 +1,2 @@ # Attempt to rotate system logs once per minute * * * * * root /usr/sbin/logrotate /etc/logrotate.d/rsyslog - diff --git a/files/image_config/interfaces/init_interfaces b/files/image_config/interfaces/init_interfaces index b13a36df47f8..e0bbad746a4a 100644 --- a/files/image_config/interfaces/init_interfaces +++ b/files/image_config/interfaces/init_interfaces @@ -8,4 +8,3 @@ iface lo inet loopback # The management network interface auto eth0 iface eth0 inet dhcp - diff --git a/files/image_config/interfaces/interfaces-config.service b/files/image_config/interfaces/interfaces-config.service index 92a82aeee0b8..0cc7f2981505 100644 --- a/files/image_config/interfaces/interfaces-config.service +++ b/files/image_config/interfaces/interfaces-config.service @@ -8,4 +8,3 @@ ExecStart=/usr/bin/interfaces-config.sh [Install] WantedBy=multi-user.target - diff --git a/files/image_config/logrotate.d/rsyslog b/files/image_config/logrotate.d/rsyslog index 4693288f18cc..5101b0e41fd2 100644 --- a/files/image_config/logrotate.d/rsyslog +++ b/files/image_config/logrotate.d/rsyslog @@ -60,4 +60,3 @@ kill -HUP $(cat /var/run/rsyslogd.pid) endscript } - diff --git a/files/image_config/ntp/ntp-config.service b/files/image_config/ntp/ntp-config.service index 5cfcc72f328d..948e7f4953c8 100644 --- a/files/image_config/ntp/ntp-config.service +++ b/files/image_config/ntp/ntp-config.service @@ -8,4 +8,3 @@ ExecStart=/usr/bin/ntp-config.sh [Install] WantedBy=multi-user.target - diff --git a/files/image_config/rsyslog/rsyslog-config.service b/files/image_config/rsyslog/rsyslog-config.service index 37f7bc04c650..ad72e9c2ea9a 100644 --- a/files/image_config/rsyslog/rsyslog-config.service +++ b/files/image_config/rsyslog/rsyslog-config.service @@ -8,4 +8,3 @@ ExecStart=/usr/bin/rsyslog-config.sh [Install] WantedBy=multi-user.target - diff --git a/files/image_config/rsyslog/rsyslog.conf.j2 b/files/image_config/rsyslog/rsyslog.conf.j2 index 008f9f10e6f0..54e2eec3f999 100644 --- a/files/image_config/rsyslog/rsyslog.conf.j2 +++ b/files/image_config/rsyslog/rsyslog.conf.j2 @@ -68,4 +68,3 @@ $IncludeConfig /etc/rsyslog.d/*.conf ############### #### RULES #### ############### - diff --git a/files/image_config/rsyslog/rsyslog.d/00-sonic.conf b/files/image_config/rsyslog/rsyslog.d/00-sonic.conf index 20d18e5d226d..bc0bbbaf1e61 100644 --- a/files/image_config/rsyslog/rsyslog.d/00-sonic.conf +++ b/files/image_config/rsyslog/rsyslog.d/00-sonic.conf @@ -19,4 +19,3 @@ if $programname contains "teamd_" then { /var/log/teamd.log stop } - diff --git a/files/image_config/rsyslog/rsyslog.d/99-default.conf b/files/image_config/rsyslog/rsyslog.d/99-default.conf index cfb1e1d3b881..51049e7473a8 100644 --- a/files/image_config/rsyslog/rsyslog.d/99-default.conf +++ b/files/image_config/rsyslog/rsyslog.d/99-default.conf @@ -68,4 +68,3 @@ daemon.*;mail.*;\ news.err;\ *.=debug;*.=info;\ *.=notice;*.=warn |/dev/xconsole - diff --git a/files/image_config/snmp/snmp.yml b/files/image_config/snmp/snmp.yml index 86f76c3a5cc3..117619975fbb 100644 --- a/files/image_config/snmp/snmp.yml +++ b/files/image_config/snmp/snmp.yml @@ -1,3 +1,2 @@ snmp_rocommunity: public snmp_location: public - diff --git a/files/image_config/sudoers/sudoers b/files/image_config/sudoers/sudoers index de62c7dd446b..cfff38b5027d 100644 --- a/files/image_config/sudoers/sudoers +++ b/files/image_config/sudoers/sudoers @@ -40,4 +40,3 @@ root ALL=(ALL:ALL) ALL # See sudoers(5) for more information on "#include" directives: #includedir /etc/sudoers.d - diff --git a/files/image_config/systemd/journald.conf b/files/image_config/systemd/journald.conf index c32fbae57051..0f3d1b5ec25b 100644 --- a/files/image_config/systemd/journald.conf +++ b/files/image_config/systemd/journald.conf @@ -33,4 +33,3 @@ RuntimeMaxUse=50M #MaxLevelKMsg=notice #MaxLevelConsole=info #MaxLevelWall=emerg - diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index a46a5f73a0cf..7240d913c76d 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -86,4 +86,3 @@ if [ -n "$ACL_URL" ]; then else echo "Skip ACL config download." fi - diff --git a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 index ebe3dda1c14d..c8f0590023ed 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm-rpc/Dockerfile.j2 @@ -49,4 +49,3 @@ RUN apt-get update \ COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/platform/broadcom/docker-syncd-brcm.mk b/platform/broadcom/docker-syncd-brcm.mk index aeee6479a84f..6ef1587adecd 100644 --- a/platform/broadcom/docker-syncd-brcm.mk +++ b/platform/broadcom/docker-syncd-brcm.mk @@ -17,4 +17,3 @@ $(DOCKER_SYNCD_BRCM)_RUN_OPT += -v /var/run/docker-syncd:/var/run/sswsyncd $(DOCKER_SYNCD_BRCM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_SYNCD_BRCM)_BASE_IMAGE_FILES += bcmcmd:/usr/bin/bcmcmd - diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index 2b5fc8c87d0b..76af952cef18 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -29,4 +29,3 @@ RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/platform/broadcom/docker-syncd-brcm/base_image_files/bcmcmd b/platform/broadcom/docker-syncd-brcm/base_image_files/bcmcmd index ee87a93cdf6e..7903db6ed6a3 100755 --- a/platform/broadcom/docker-syncd-brcm/base_image_files/bcmcmd +++ b/platform/broadcom/docker-syncd-brcm/base_image_files/bcmcmd @@ -1,4 +1,3 @@ #!/bin/bash docker exec -i syncd bcmcmd "$@" - diff --git a/platform/broadcom/docker-syncd-brcm/start.sh b/platform/broadcom/docker-syncd-brcm/start.sh index 742cf8223132..930609a1958d 100755 --- a/platform/broadcom/docker-syncd-brcm/start.sh +++ b/platform/broadcom/docker-syncd-brcm/start.sh @@ -20,4 +20,3 @@ if [ -r ${PLATFORM_DIR}/led_proc_init.soc ]; then /usr/bin/bcmcmd -t 60 "rcload ${PLATFORM_DIR}/led_proc_init.soc" fi - diff --git a/platform/broadcom/docker-syncd-brcm/supervisord.conf b/platform/broadcom/docker-syncd-brcm/supervisord.conf index 1e015fef931f..1af5d70a1d0c 100644 --- a/platform/broadcom/docker-syncd-brcm/supervisord.conf +++ b/platform/broadcom/docker-syncd-brcm/supervisord.conf @@ -26,4 +26,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/platform/cavium/cavm-platform-modules.mk b/platform/cavium/cavm-platform-modules.mk index 8ed10a6b9289..4ac72a4c4aab 100644 --- a/platform/cavium/cavm-platform-modules.mk +++ b/platform/cavium/cavm-platform-modules.mk @@ -1,4 +1,3 @@ CAVM_PLATFORM_DEB = cavm_platform_modules.deb $(CAVM_PLATFORM_DEB)_SRC_PATH = $(PLATFORM_PATH)/cavm_platform_modules SONIC_MAKE_DEBS += $(CAVM_PLATFORM_DEB) - diff --git a/platform/cavium/cavm_platform_modules/Makefile b/platform/cavium/cavm_platform_modules/Makefile index 13ab41926e38..aeb274aa5a42 100644 --- a/platform/cavium/cavm_platform_modules/Makefile +++ b/platform/cavium/cavm_platform_modules/Makefile @@ -31,4 +31,3 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : mv $(MAIN_TARGET) $(DEST)/ rm -rf $(DEB_BUILD_DIR) - diff --git a/platform/cavium/docker-syncd-cavm/profile.ini b/platform/cavium/docker-syncd-cavm/profile.ini index 1e5fc5f0fc0a..017996f7d7cc 100644 --- a/platform/cavium/docker-syncd-cavm/profile.ini +++ b/platform/cavium/docker-syncd-cavm/profile.ini @@ -1,3 +1,2 @@ mode=1 hwId=as7512 - diff --git a/platform/cavium/docker-syncd-cavm/start.sh b/platform/cavium/docker-syncd-cavm/start.sh index 96e2a9128081..623316050475 100755 --- a/platform/cavium/docker-syncd-cavm/start.sh +++ b/platform/cavium/docker-syncd-cavm/start.sh @@ -5,4 +5,3 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd supervisorctl start syncd - diff --git a/platform/cavium/docker-syncd-cavm/supervisord.conf b/platform/cavium/docker-syncd-cavm/supervisord.conf index 1e015fef931f..1af5d70a1d0c 100644 --- a/platform/cavium/docker-syncd-cavm/supervisord.conf +++ b/platform/cavium/docker-syncd-cavm/supervisord.conf @@ -26,4 +26,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/platform/cavium/rules.mk b/platform/cavium/rules.mk index 67a69168e035..37a9bd7c994b 100644 --- a/platform/cavium/rules.mk +++ b/platform/cavium/rules.mk @@ -19,4 +19,3 @@ $(LIBSAIREDIS)_DEPENDS += $(CAVM_SAI) $(CAVM_LIBSAI) $(LIBSAITHRIFT_DEV_CAVM) # Runtime dependency on cavium sai is set only for syncd $(SYNCD)_RDEPENDS += $(CAVM_SAI) - diff --git a/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 index ac402d1f6eae..db58e7731be8 100644 --- a/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 +++ b/platform/centec/docker-syncd-centec-rpc/Dockerfile.j2 @@ -49,4 +49,3 @@ RUN apt-get update \ COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/platform/centec/docker-syncd-centec/Dockerfile.j2 b/platform/centec/docker-syncd-centec/Dockerfile.j2 index 302afbc0cd4e..d9b12bb426e4 100755 --- a/platform/centec/docker-syncd-centec/Dockerfile.j2 +++ b/platform/centec/docker-syncd-centec/Dockerfile.j2 @@ -27,4 +27,3 @@ RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/platform/centec/docker-syncd-centec/start.sh b/platform/centec/docker-syncd-centec/start.sh index 96e2a9128081..623316050475 100755 --- a/platform/centec/docker-syncd-centec/start.sh +++ b/platform/centec/docker-syncd-centec/start.sh @@ -5,4 +5,3 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd supervisorctl start syncd - diff --git a/platform/centec/docker-syncd-centec/supervisord.conf b/platform/centec/docker-syncd-centec/supervisord.conf index 1e015fef931f..1af5d70a1d0c 100644 --- a/platform/centec/docker-syncd-centec/supervisord.conf +++ b/platform/centec/docker-syncd-centec/supervisord.conf @@ -26,4 +26,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/platform/generic/aboot-image.mk b/platform/generic/aboot-image.mk index 64b841f856ea..7f5b4639e4e9 100644 --- a/platform/generic/aboot-image.mk +++ b/platform/generic/aboot-image.mk @@ -6,4 +6,3 @@ $(SONIC_GENERIC_ABOOT_IMAGE)_IMAGE_TYPE = aboot $(SONIC_GENERIC_ABOOT_IMAGE)_DEPENDS = $(SONIC_GENERIC_ABOOT_IMAGE)_DOCKERS = SONIC_INSTALLERS += $(SONIC_GENERIC_ABOOT_IMAGE) - diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 index 66eab2013ba6..0a2010dcbbc1 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx-rpc/Dockerfile.j2 @@ -49,4 +49,3 @@ RUN apt-get update \ COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index 9d42c48b49e3..79661e0ef7fa 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -27,4 +27,3 @@ RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs ENTRYPOINT ["/usr/bin/supervisord"] - diff --git a/platform/mellanox/docker-syncd-mlnx/supervisord.conf b/platform/mellanox/docker-syncd-mlnx/supervisord.conf index 1e015fef931f..1af5d70a1d0c 100644 --- a/platform/mellanox/docker-syncd-mlnx/supervisord.conf +++ b/platform/mellanox/docker-syncd-mlnx/supervisord.conf @@ -26,4 +26,3 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - diff --git a/platform/p4/docker-sonic-p4/rsyslog.conf b/platform/p4/docker-sonic-p4/rsyslog.conf index e8f42bdabe50..3480e18f9998 100644 --- a/platform/p4/docker-sonic-p4/rsyslog.conf +++ b/platform/p4/docker-sonic-p4/rsyslog.conf @@ -65,4 +65,3 @@ $IncludeConfig /etc/rsyslog.d/*.conf ############### #### RULES #### ############### - diff --git a/rules/docker-fpm-frr.mk b/rules/docker-fpm-frr.mk index d246d093dced..eedbc13c4e6c 100644 --- a/rules/docker-fpm-frr.mk +++ b/rules/docker-fpm-frr.mk @@ -11,4 +11,3 @@ $(DOCKER_FPM_FRR)_RUN_OPT += --net=host --privileged -t $(DOCKER_FPM_FRR)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_FPM_FRR)_BASE_IMAGE_FILES += vtysh:/usr/bin/vtysh - diff --git a/rules/isc-dhcp.mk b/rules/isc-dhcp.mk index bfceb7676622..82f5c3844c6f 100644 --- a/rules/isc-dhcp.mk +++ b/rules/isc-dhcp.mk @@ -10,4 +10,3 @@ SONIC_MAKE_DEBS += $(ISC_DHCP_COMMON) ISC_DHCP_RELAY = isc-dhcp-relay_$(ISC_DHCP_VERSION)_amd64.deb $(eval $(call add_derived_package,$(ISC_DHCP_COMMON),$(ISC_DHCP_RELAY))) - diff --git a/rules/python3.mk b/rules/python3.mk index 8fa02a26a462..2473c9aeb498 100644 --- a/rules/python3.mk +++ b/rules/python3.mk @@ -33,4 +33,3 @@ LIBPY3_DEV = lib$(PYTHON_PNAME)-dev_$(PYTHON_VER)_amd64.deb $(eval $(call add_derived_package,$(LIBPY3_MIN),$(LIBPY3_DEV))) $(LIBPY3_DEV)_DEPENDS += $(LIBPY3) $($(LIBPY3)_DEPENDS) $(LIBPY3_DEV)_RDEPENDS += $(LIBPY3) $($(LIBPY3)_RDEPENDS) - diff --git a/src/isc-dhcp/Makefile b/src/isc-dhcp/Makefile index 44e77cdd9b43..9cacd6cfe5e7 100644 --- a/src/isc-dhcp/Makefile +++ b/src/isc-dhcp/Makefile @@ -27,4 +27,3 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : mv $* $(DERIVED_TARGETS) $(DEST)/ $(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) - diff --git a/src/sonic-config-engine/openconfig_acl.py b/src/sonic-config-engine/openconfig_acl.py index 92ff414ed23e..cb29183652e7 100644 --- a/src/sonic-config-engine/openconfig_acl.py +++ b/src/sonic-config-engine/openconfig_acl.py @@ -7540,5 +7540,3 @@ def _unset_acl(self): _pyangbind_elements = {'acl': acl, } - - diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 8f5b78ac66c1..864513f577e0 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -114,4 +114,3 @@ def main(): if __name__ == "__main__": main() - diff --git a/src/sonic-config-engine/sonic_platform.py b/src/sonic-config-engine/sonic_platform.py index fdc192d09d0a..1eca1487a76a 100644 --- a/src/sonic-config-engine/sonic_platform.py +++ b/src/sonic-config-engine/sonic_platform.py @@ -29,4 +29,3 @@ def get_platform_info(machine_info): elif machine_info.has_key('aboot_platform'): return machine_info['aboot_platform'] return None - diff --git a/src/sonic-device-data/src/debian/rules b/src/sonic-device-data/src/debian/rules index e91562ccbb5a..a5e2f5acfc1f 100755 --- a/src/sonic-device-data/src/debian/rules +++ b/src/sonic-device-data/src/debian/rules @@ -4,4 +4,3 @@ build: %: dh $@ - diff --git a/src/supervisor/Makefile b/src/supervisor/Makefile index e9f1c65210a8..5f06325960b1 100644 --- a/src/supervisor/Makefile +++ b/src/supervisor/Makefile @@ -19,4 +19,3 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Move the newly-built .deb packages to the destination directory mv ./supervisor/deb_dist/$* $(DEST)/ - From 117650885811c3aac16d3549ff44d4fa3cb8d73c Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Thu, 13 Jul 2017 15:03:10 -0700 Subject: [PATCH 0673/1011] [bgpd]: support multiple peer range in single peer group (#807) --- dockers/docker-fpm-quagga/bgpd.conf.j2 | 4 +++- src/sonic-config-engine/minigraph.py | 3 ++- src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml | 2 +- src/sonic-config-engine/tests/test_cfggen.py | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index 5f53d9698b2e..ceb866edd02d 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -84,7 +84,9 @@ router bgp {{ minigraph_bgp_asn }} neighbor {{ bgp_peer['name'] }} update-source Loopback0 neighbor {{ bgp_peer['name'] }} route-map FROM_BGP_SPEAKER_V4 in neighbor {{ bgp_peer['name'] }} route-map TO_BGP_SPEAKER_V4 out - bgp listen range {{ bgp_peer['ip_range'] }} peer-group {{ bgp_peer['name'] }} +{% for ip_range in bgp_peer['ip_range'] %} + bgp listen range {{ip_range}} peer-group {{ bgp_peer['name'] }} +{% endfor %} {% endfor %} {% endblock bgp_peers_with_range %} ! diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 0344ad0f04e6..1fd16f376fab 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -281,9 +281,10 @@ def parse_cpg(cpg, hname): if bgpPeer.find(str(QName(ns1, "PeersRange"))) is not None: name = bgpPeer.find(str(QName(ns1, "Name"))).text ip_range = bgpPeer.find(str(QName(ns1, "PeersRange"))).text + ip_range_group = ip_range.split(';') if ip_range and ip_range != "" else [] bgp_peers_with_range.append({ 'name': name, - 'ip_range': ip_range + 'ip_range': ip_range_group }) else: for bgp_session in bgp_sessions: diff --git a/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml b/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml index b5e373ddd868..8a21c041c80e 100644 --- a/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml +++ b/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml @@ -111,7 +111,7 @@
10.1.0.32
BGPSLBPassive - 10.10.10.10/26 + 10.10.10.10/26;100.100.100.100/26
diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index eae4cb74fa42..6835c60e27fd 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -113,7 +113,7 @@ def test_minigraph_neighbors(self): def test_minigraph_peers_with_range(self): argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v minigraph_bgp_peers_with_range' output = self.run_script(argument) - self.assertEqual(output.strip(), "[{'name': 'BGPSLBPassive', 'ip_range': '10.10.10.10/26'}]") + self.assertEqual(output.strip(), "[{'name': 'BGPSLBPassive', 'ip_range': ['10.10.10.10/26', '100.100.100.100/26']}]") def test_minigraph_deployment_id(self): argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v deployment_id' From 6f0722322c9bbdd43db634c268d8de7d48e6cf61 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 14 Jul 2017 23:53:44 -0700 Subject: [PATCH 0674/1011] [sonic-slave]: Update golang version to 1.8.3 (#810) * Update golang version to latest 1.8.3 --- sonic-slave/Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 6f1aea5e071e..38fe431a044d 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -206,9 +206,11 @@ RUN apt-get update && apt-get install -y \ RUN apt-get -y build-dep linux # For gobgp build -RUN apt-get -yt jessie-backports install \ - golang-go \ - golang-github-golang-mock-dev +RUN export VERSION=1.8.3 \ + && wget https://storage.googleapis.com/golang/go$VERSION.linux-amd64.tar.gz \ + && tar -C /usr/local -xzf go$VERSION.linux-amd64.tar.gz \ + && echo 'export GOROOT=/usr/local/go' >> /etc/bash.bashrc \ + && echo 'export PATH=$PATH:$GOROOT/bin' >> /etc/bash.bashrc # For p4 build RUN pip install \ From 481bd6b46badce4ba729f978bc2fd72a2282f179 Mon Sep 17 00:00:00 2001 From: JipanYanga Date: Mon, 17 Jul 2017 23:19:16 -0700 Subject: [PATCH 0675/1011] Update sonic-linux-kernel submodule (#812) --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 0d56999ccfcc..a97c5e416f8d 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 0d56999ccfccdc054178388f65c9442aa350caec +Subproject commit a97c5e416f8d4c8d6ddd69a7bb6b983527b3c627 From 8ffe0b0d35a2cbafff28f1f2a87cc715e86f76da Mon Sep 17 00:00:00 2001 From: Balaselvi Date: Tue, 18 Jul 2017 11:21:24 -0700 Subject: [PATCH 0676/1011] Inventec platform support (#811) --- .../INVENTEC-D7032Q28B-C32/port_config.ini | 33 + .../INVENTEC-D7032Q28B-C32/sai.profile | 2 + .../installer.conf | 4 + .../minigraph.xml | 146 +++ .../plugins/eeprom.py | 22 + .../plugins/sfputil.py | 60 + platform/broadcom/one-image.mk | 3 +- .../broadcom/platform-modules-inventec.mk | 12 + platform/broadcom/rules.mk | 1 + .../sonic-platform-modules-inventec/LICENSE | 674 +++++++++++ .../d7032q28b/conf/d7032q28b-modules.conf | 10 + .../d7032q28b/modules/Makefile | 3 + .../d7032q28b/modules/inv_cpld.c | 456 ++++++++ .../d7032q28b/modules/inv_platform.c | 197 ++++ .../d7032q28b/modules/inv_psoc.c | 1024 +++++++++++++++++ .../d7032q28b/utils/onie-syseeprom | Bin 0 -> 921685 bytes .../debian/changelog | 5 + .../debian/compat | 1 + .../debian/control | 12 + .../debian/platform-modules-d7032q28b.init | 69 ++ .../debian/platform-modules-d7032q28b.install | 1 + .../debian/rules | 46 + 22 files changed, 2780 insertions(+), 1 deletion(-) create mode 100644 device/inventec/x86_64-inventec_d7032q28b-r0/INVENTEC-D7032Q28B-C32/port_config.ini create mode 100644 device/inventec/x86_64-inventec_d7032q28b-r0/INVENTEC-D7032Q28B-C32/sai.profile create mode 100644 device/inventec/x86_64-inventec_d7032q28b-r0/installer.conf create mode 100644 device/inventec/x86_64-inventec_d7032q28b-r0/minigraph.xml create mode 100644 device/inventec/x86_64-inventec_d7032q28b-r0/plugins/eeprom.py create mode 100644 device/inventec/x86_64-inventec_d7032q28b-r0/plugins/sfputil.py create mode 100755 platform/broadcom/platform-modules-inventec.mk create mode 100644 platform/broadcom/sonic-platform-modules-inventec/LICENSE create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/conf/d7032q28b-modules.conf create mode 100755 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_cpld.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_platform.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_psoc.c create mode 100755 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/utils/onie-syseeprom create mode 100644 platform/broadcom/sonic-platform-modules-inventec/debian/changelog create mode 100644 platform/broadcom/sonic-platform-modules-inventec/debian/compat create mode 100644 platform/broadcom/sonic-platform-modules-inventec/debian/control create mode 100644 platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.init create mode 100644 platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.install create mode 100755 platform/broadcom/sonic-platform-modules-inventec/debian/rules diff --git a/device/inventec/x86_64-inventec_d7032q28b-r0/INVENTEC-D7032Q28B-C32/port_config.ini b/device/inventec/x86_64-inventec_d7032q28b-r0/INVENTEC-D7032Q28B-C32/port_config.ini new file mode 100644 index 000000000000..9b41dd7f6015 --- /dev/null +++ b/device/inventec/x86_64-inventec_d7032q28b-r0/INVENTEC-D7032Q28B-C32/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 1,2,3,4 Ethernet0 +Ethernet4 5,6,7,8 Ethernet4 +Ethernet8 9,10,11,12 Ethernet8 +Ethernet12 13,14,15,16 Ethernet12 +Ethernet16 17,18,19,20 Ethernet16 +Ethernet20 21,22,23,24 Ethernet20 +Ethernet24 25,26,27,28 Ethernet24 +Ethernet28 29,30,31,32 Ethernet28 +Ethernet32 33,34,35,36 Ethernet32 +Ethernet36 37,38,39,40 Ethernet36 +Ethernet40 41,42,43,44 Ethernet40 +Ethernet44 45,46,47,48 Ethernet44 +Ethernet48 49,50,51,52 Ethernet48 +Ethernet52 53,54,55,56 Ethernet52 +Ethernet56 57,58,59,60 Ethernet56 +Ethernet60 61,62,63,64 Ethernet60 +Ethernet64 65,66,67,68 Ethernet64 +Ethernet68 69,70,71,72 Ethernet68 +Ethernet72 73,74,75,76 Ethernet72 +Ethernet76 77,78,79,80 Ethernet76 +Ethernet80 81,82,83,84 Ethernet80 +Ethernet84 85,86,87,88 Ethernet84 +Ethernet88 89,90,91,92 Ethernet88 +Ethernet92 93,94,95,96 Ethernet92 +Ethernet96 97,98,99,100 Ethernet96 +Ethernet100 101,102,103,104 Ethernet100 +Ethernet104 105,106,107,108 Ethernet104 +Ethernet108 109,110,111,112 Ethernet108 +Ethernet112 113,114,115,116 Ethernet112 +Ethernet116 117,118,119,120 Ethernet116 +Ethernet120 121,122,123,124 Ethernet120 +Ethernet124 125,126,127,128 Ethernet124 diff --git a/device/inventec/x86_64-inventec_d7032q28b-r0/INVENTEC-D7032Q28B-C32/sai.profile b/device/inventec/x86_64-inventec_d7032q28b-r0/INVENTEC-D7032Q28B-C32/sai.profile new file mode 100644 index 000000000000..5312a779bbc3 --- /dev/null +++ b/device/inventec/x86_64-inventec_d7032q28b-r0/INVENTEC-D7032Q28B-C32/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-d7032q28b-32x100g.config.bcm +SAI_NUM_ECMP_MEMBERS=32 diff --git a/device/inventec/x86_64-inventec_d7032q28b-r0/installer.conf b/device/inventec/x86_64-inventec_d7032q28b-r0/installer.conf new file mode 100644 index 000000000000..6b489db6e16f --- /dev/null +++ b/device/inventec/x86_64-inventec_d7032q28b-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x2f8 +CONSOLE_DEV=1 +CONSOLE_SPEED=115200 +VAR_LOG_SIZE=1024 diff --git a/device/inventec/x86_64-inventec_d7032q28b-r0/minigraph.xml b/device/inventec/x86_64-inventec_d7032q28b-r0/minigraph.xml new file mode 100644 index 000000000000..a582bfa49a21 --- /dev/null +++ b/device/inventec/x86_64-inventec_d7032q28b-r0/minigraph.xml @@ -0,0 +1,146 @@ + + + + + + OCPSCH0104001MS + 10.10.1.26 + SONiC-Inventec-d7032-100 + 10.10.1.25 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.26 + SONiC-Inventec-d7032-100 + 10.10.2.25 + 1 + 10 + 3 + + + + + 64536 + SONiC-Inventec-d7032-100 + + +
10.10.1.26
+ + +
+ +
10.10.2.26
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.9/32 + + 100.0.0.9/32 + + + + + + + + SONiC-Inventec-d7032-100 + + + + + + Ethernet0 + 10.10.1.25/30 + + + + Ethernet4 + 10.10.2.25/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet24 + SONiC-Inventec-d7032-100 + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104002MS + Ethernet24 + SONiC-Inventec-d7032-100 + Ethernet4 + + + + + SONiC-Inventec-d7032-100 + INVENTEC-D7032Q28B-C32 + + + + + + + SONiC-Inventec-d7032-100 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + + SONiC-Inventec-d7032-100 + INVENTEC-D7032Q28B-C32 +
diff --git a/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/eeprom.py b/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/eeprom.py new file mode 100644 index 000000000000..ad70e584bb2a --- /dev/null +++ b/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/eeprom.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +############################################################################# +# Inventec d7032q28b +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/tmp/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/sfputil.py b/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/sfputil.py new file mode 100644 index 000000000000..020faab9db58 --- /dev/null +++ b/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/sfputil.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 0: 22, + 1: 23, + 2: 24, + 3: 25, + 4: 26, + 5: 27, + 6: 28, + 7: 29, + 8: 30, + 9: 31, + 10: 32, + 11: 33, + 12: 34, + 13: 35, + 14: 36, + 15: 37, + 16: 6, + 17: 7, + 18: 8, + 19: 9, + 20: 10, + 21: 11, + 22: 12, + 23: 13, + 24: 14, + 25: 15, + 26: 16, + 27: 17, + 28: 18, + 29: 19, + 30: 20, + 31: 21 + } + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + for x in range(self.port_start, self.port_end + 1): + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + sfputilbase.__init__(self, port_num) diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 600e1159b400..0a48a32bd600 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -10,6 +10,7 @@ $(SONIC_ONE_IMAGE)_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(INGRASYS_S8900_54XC_PLATFORM_MODULE) \ $(INGRASYS_S8900_64XC_PLATFORM_MODULE) \ $(INGRASYS_S9100_PLATFORM_MODULE) \ - $(ACCTON_AS7712_32X_PLATFORM_MODULE) + $(ACCTON_AS7712_32X_PLATFORM_MODULE) \ + $(INVENTEC_D7032Q28B_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/broadcom/platform-modules-inventec.mk b/platform/broadcom/platform-modules-inventec.mk new file mode 100755 index 000000000000..0d00fe1f7368 --- /dev/null +++ b/platform/broadcom/platform-modules-inventec.mk @@ -0,0 +1,12 @@ +# Inventec d7032q28b Platform modules + +INVENTEC_D7032Q28B_PLATFORM_MODULE_VERSION = 1.0.0 + +export INVENTEC_D7032Q28B_PLATFORM_MODULE_VERSION + +INVENTEC_D7032Q28B_PLATFORM_MODULE = platform-modules-d7032q28b_$(INVENTEC_D7032Q28B_PLATFORM_MODULE_VERSION)_amd64.deb +$(INVENTEC_D7032Q28B_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-inventec +$(INVENTEC_D7032Q28B_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(INVENTEC_D7032Q28B_PLATFORM_MODULE)_PLATFORM = x86_64-inventec_d7032q28b-r0 +SONIC_DPKG_DEBS += $(INVENTEC_D7032Q28B_PLATFORM_MODULE) +$(eval $(call add_extra_package,$(INVENTEC_D7032Q28B_PLATFORM_MODULE))) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 3f0d523d4204..3823dcc4b83e 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -5,6 +5,7 @@ include $(PLATFORM_PATH)/platform-modules-dell.mk include $(PLATFORM_PATH)/platform-modules-arista.mk include $(PLATFORM_PATH)/platform-modules-ingrasys.mk include $(PLATFORM_PATH)/platform-modules-accton.mk +include $(PLATFORM_PATH)/platform-modules-inventec.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm-rpc.mk diff --git a/platform/broadcom/sonic-platform-modules-inventec/LICENSE b/platform/broadcom/sonic-platform-modules-inventec/LICENSE new file mode 100644 index 000000000000..9cecc1d4669e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/conf/d7032q28b-modules.conf b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/conf/d7032q28b-modules.conf new file mode 100644 index 000000000000..29d4d50a4f9a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/conf/d7032q28b-modules.conf @@ -0,0 +1,10 @@ +# /etc/modules: kernel modules to load at boot time. +# +# This file contains the names of kernel modules that should be loaded +# at boot time, one per line. Lines beginning with "#" are ignored. + +lpc_ich +i2c-i801 +i2c-mux +i2c-mux-pca954x +i2c-dev diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/Makefile b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/Makefile new file mode 100755 index 000000000000..cdabd612a66d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/Makefile @@ -0,0 +1,3 @@ +obj-m += inv_cpld.o inv_psoc.o +obj-m += inv_platform.o + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_cpld.c b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_cpld.c new file mode 100644 index 000000000000..028e24b9eb86 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_cpld.c @@ -0,0 +1,456 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include "I2CHostCommunication.h" + +#define USE_SMBUS 1 + +/* definition */ +#define CPLD_INFO_OFFSET 0x00 +#define CPLD_RESET_OFFSET 0x08 +#define CPLD_PSU_OFFSET 0x09 +#define CPLD_LED_OFFSET 0x0E +#define CPLD_LED_STATU_OFFSET 0x0D +#define CPLD_CTL_OFFSET 0x0C + + + +/* Each client has this additional data */ +struct cpld_data { + struct device *hwmon_dev; + struct mutex update_lock; +}; + +/*-----------------------------------------------------------------------*/ + +static ssize_t cpld_i2c_read(struct i2c_client *client, u8 *buf, u8 offset, size_t count) +{ +#if USE_SMBUS + int i; + + for(i=0; iaddr; + msg[0].buf = msgbuf; + msg[0].len = 1; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = buf; + msg[1].len = count; + + status = i2c_transfer(client->adapter, msg, 2); + + if(status == 2) + status = count; + + return status; +#endif +} + +static ssize_t cpld_i2c_write(struct i2c_client *client, char *buf, unsigned offset, size_t count) +{ +#if USE_SMBUS + int i; + + for(i=0; iaddr; + msg.flags = 0; + + /* msg.buf is u8 and casts will mask the values */ + msg.buf = writebuf; + + msg.buf[i++] = offset; + memcpy(&msg.buf[i], buf, count); + msg.len = i + count; + + status = i2c_transfer(client->adapter, &msg, 1); + if (status == 1) + status = count; + + return status; +#endif +} + +/*-----------------------------------------------------------------------*/ + +/* sysfs attributes for hwmon */ + +static ssize_t show_info(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + //struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 b[4]; + + memset(b, 0, 4); + + mutex_lock(&data->update_lock); + status = cpld_i2c_read(client, b, CPLD_INFO_OFFSET, 4); + mutex_unlock(&data->update_lock); + + if(status != 4) return sprintf(buf, "read cpld info fail\n"); + + status = sprintf (buf, "The CPLD release date is %02d/%02d/%d.\n", b[2] & 0xf, (b[3] & 0x1f), 2014+(b[2] >> 4)); /* mm/dd/yyyy*/ + status = sprintf (buf, "%sThe PCB version is %X%X\n", buf, b[0]>>4, b[0]&0xf); + status = sprintf (buf, "%sThe CPLD version is %d.%d\n", buf, b[1]>>4, b[1]&0xf); + + return strlen(buf); +} + +static ssize_t show_reset(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + //struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 b[1]; + + mutex_lock(&data->update_lock); + + status = cpld_i2c_read(client, b, CPLD_RESET_OFFSET, 1); + + mutex_unlock(&data->update_lock); + + if(status != 1) return sprintf(buf, "read cpld reset fail\n"); + + + status = sprintf (buf, "The CPLD 1 cpld_reset = %d\n", b[0]); + + return strlen(buf); +} + +static ssize_t set_reset(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + //struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + + u8 temp = simple_strtol(buf, NULL, 10); + + mutex_lock(&data->update_lock); + cpld_i2c_write(client, &temp, CPLD_RESET_OFFSET, 1); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_ctl(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + //struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 b[1]; + + mutex_lock(&data->update_lock); + + status = cpld_i2c_read(client, b, CPLD_CTL_OFFSET, 1); + + mutex_unlock(&data->update_lock); + + if(status != 1) return sprintf(buf, "read cpld ctl fail\n"); + + + status = sprintf (buf, "0x%X\n", b[0]); + + return strlen(buf); +} + +static ssize_t set_ctl(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + //struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte; + + u8 temp = simple_strtol(buf, NULL, 10); + + mutex_lock(&data->update_lock); + cpld_i2c_read(client, &byte, CPLD_CTL_OFFSET, 1); + if(temp) byte |= (1<<0); + else byte &= ~(1<<0); + cpld_i2c_write(client, &byte, CPLD_CTL_OFFSET, 1); + mutex_unlock(&data->update_lock); + + return count; +} + +static char* led_str[] = { + "OFF", //000 + "0.5 Hz", //001 + "1 Hz", //010 + "2 Hz", //011 + "NA", //100 + "NA", //101 + "NA", //110 + "ON", //111 +}; + +static ssize_t show_led(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte; + int shift = (attr->index == 0)?3:0; + + mutex_lock(&data->update_lock); + status = cpld_i2c_read(client, &byte, CPLD_LED_OFFSET, 1); + mutex_unlock(&data->update_lock); + + if(status != 1) return sprintf(buf, "read cpld offset 0x%x\n", CPLD_LED_OFFSET); + + byte = (byte >> shift) & 0x7; + + /* + 0: off + 1: 0.5hz + 2: 1 hz + 3: 2 hz + 4~6: not define + 7: on + */ + + status = sprintf (buf, "%d: %s\n", byte, led_str[byte]); + + return strlen(buf); +} + +static ssize_t set_led(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + + u8 temp = simple_strtol(buf, NULL, 16); + u8 byte; + int shift = (attr->index == 0)?3:0; + + temp &= 0x7; + //validate temp value: 0,1,2,3,7, TBD + + mutex_lock(&data->update_lock); + cpld_i2c_read(client, &byte, CPLD_LED_OFFSET, 1); + byte &= ~(0x7<update_lock); + + return count; +} + +/* +CPLD report the PSU0 status +000 = PSU normal operation +100 = PSU fault +010 = PSU unpowered +111 = PSU not installed + +7 6 | 5 4 3 | 2 1 0 +---------------------- + | psu0 | psu1 +*/ +static char* psu_str[] = { + "normal", //000 + "NA", //001 + "unpowered", //010 + "NA", //011 + "fault", //100 + "NA", //101 + "NA", //110 + "not installed", //111 +}; + +static ssize_t show_psu(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte; + int shift = (attr->index == 1)?0:3; + + mutex_lock(&data->update_lock); + status = cpld_i2c_read(client, &byte, CPLD_PSU_OFFSET, 1); + mutex_unlock(&data->update_lock); + + byte = (byte >> shift) & 0x7; + + status = sprintf (buf, "%d : %s\n", byte, psu_str[byte]); + + return strlen(buf); +} + + +static SENSOR_DEVICE_ATTR(info, S_IRUGO, show_info, 0, 0); +static SENSOR_DEVICE_ATTR(reset, S_IWUSR|S_IRUGO, show_reset, set_reset, 0); +static SENSOR_DEVICE_ATTR(ctl, S_IWUSR|S_IRUGO, show_ctl, set_ctl, 0); + +static SENSOR_DEVICE_ATTR(grn_led, S_IWUSR|S_IRUGO, show_led, set_led, 0); +static SENSOR_DEVICE_ATTR(red_led, S_IWUSR|S_IRUGO, show_led, set_led, 1); + +static SENSOR_DEVICE_ATTR(psu0, S_IRUGO, show_psu, 0, 0); +static SENSOR_DEVICE_ATTR(psu1, S_IRUGO, show_psu, 0, 1); + +static struct attribute *cpld_attributes[] = { + //info + &sensor_dev_attr_info.dev_attr.attr, + &sensor_dev_attr_reset.dev_attr.attr, + &sensor_dev_attr_ctl.dev_attr.attr, + + &sensor_dev_attr_grn_led.dev_attr.attr, + &sensor_dev_attr_red_led.dev_attr.attr, + + &sensor_dev_attr_psu0.dev_attr.attr, + &sensor_dev_attr_psu1.dev_attr.attr, + + NULL +}; + +static const struct attribute_group cpld_group = { + .attrs = cpld_attributes, +}; + +/*-----------------------------------------------------------------------*/ + +/* device probe and removal */ + +static int +cpld_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct cpld_data *data; + int status; + + printk("+%s\n", __func__); + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) + return -EIO; + + data = kzalloc(sizeof(struct cpld_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &cpld_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: sensor '%s'\n", + dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &cpld_group); +exit_free: + i2c_set_clientdata(client, NULL); + kfree(data); + return status; +} + +static int cpld_remove(struct i2c_client *client) +{ + struct cpld_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &cpld_group); + i2c_set_clientdata(client, NULL); + kfree(data); + return 0; +} + +static const struct i2c_device_id cpld_ids[] = { + { "inv_cpld", 0, }, + { /* LIST END */ } +}; +MODULE_DEVICE_TABLE(i2c, cpld_ids); + +static struct i2c_driver cpld_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "inv_cpld", + }, + .probe = cpld_probe, + .remove = cpld_remove, + .id_table = cpld_ids, +}; + +/*-----------------------------------------------------------------------*/ + +/* module glue */ + +static int __init inv_cpld_init(void) +{ + return i2c_add_driver(&cpld_driver); +} + +static void __exit inv_cpld_exit(void) +{ + i2c_del_driver(&cpld_driver); +} + +MODULE_AUTHOR("eddie.lan "); +MODULE_DESCRIPTION("inv cpld driver"); +MODULE_LICENSE("GPL"); + +module_init(inv_cpld_init); +module_exit(inv_cpld_exit); diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_platform.c b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_platform.c new file mode 100644 index 000000000000..71dda75b252f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_platform.c @@ -0,0 +1,197 @@ +#include +//#include +#include +#include +#include +#include +#include + +#include +#include +#include + +//#include +#define IO_EXPAND_BASE 64 +#define IO_EXPAND_NGPIO 16 + +struct inv_i2c_board_info { + int ch; + int size; + struct i2c_board_info *board_info; +}; + +#define bus_id(id) (id) +static struct pca954x_platform_mode mux_modes_0[] = { + {.adap_id = bus_id(2),}, {.adap_id = bus_id(3),}, + {.adap_id = bus_id(4),}, {.adap_id = bus_id(5),}, +}; +static struct pca954x_platform_mode mux_modes_0_0[] = { + {.adap_id = bus_id(6),}, {.adap_id = bus_id(7),}, + {.adap_id = bus_id(8),}, {.adap_id = bus_id(9),}, + {.adap_id = bus_id(10),}, {.adap_id = bus_id(11),}, + {.adap_id = bus_id(12),}, {.adap_id = bus_id(13),}, +}; + +static struct pca954x_platform_mode mux_modes_0_1[] = { + {.adap_id = bus_id(14),}, {.adap_id = bus_id(15),}, + {.adap_id = bus_id(16),}, {.adap_id = bus_id(17),}, + {.adap_id = bus_id(18),}, {.adap_id = bus_id(19),}, + {.adap_id = bus_id(20),}, {.adap_id = bus_id(21),}, +}; + +static struct pca954x_platform_mode mux_modes_0_2[] = { + {.adap_id = bus_id(22),}, {.adap_id = bus_id(23),}, + {.adap_id = bus_id(24),}, {.adap_id = bus_id(25),}, + {.adap_id = bus_id(26),}, {.adap_id = bus_id(27),}, + {.adap_id = bus_id(28),}, {.adap_id = bus_id(29),}, +}; + +static struct pca954x_platform_mode mux_modes_0_3[] = { + {.adap_id = bus_id(30),}, {.adap_id = bus_id(31),}, + {.adap_id = bus_id(32),}, {.adap_id = bus_id(33),}, + {.adap_id = bus_id(34),}, {.adap_id = bus_id(35),}, + {.adap_id = bus_id(36),}, {.adap_id = bus_id(37),}, +}; + +static struct pca954x_platform_data mux_data_0 = { + .modes = mux_modes_0, + .num_modes = 4, +}; +static struct pca954x_platform_data mux_data_0_0 = { + .modes = mux_modes_0_0, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_1 = { + .modes = mux_modes_0_1, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_2 = { + .modes = mux_modes_0_2, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_3 = { + .modes = mux_modes_0_3, + .num_modes = 8, +}; + +static struct i2c_board_info i2c_device_info0[] __initdata = { + {"inv_psoc", 0, 0x66, 0, 0, 0},//psoc + {"inv_cpld", 0, 0x55, 0, 0, 0},//cpld + {"pca9545", 0, 0x70, &mux_data_0, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info1[] __initdata = { + {"pca9545", 0, 0x70, &mux_data_0, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info2[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_0, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info3[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_1, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info4[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_2, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info5[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_3, 0, 0}, +}; + + +static struct inv_i2c_board_info i2cdev_list[] = { + {0, ARRAY_SIZE(i2c_device_info0), i2c_device_info0 }, //smbus 0 + {1, ARRAY_SIZE(i2c_device_info1), i2c_device_info1 }, //smbus 1 or gpio11+12 + + {bus_id(2), ARRAY_SIZE(i2c_device_info2), i2c_device_info2 }, //mux 0 + {bus_id(3), ARRAY_SIZE(i2c_device_info3), i2c_device_info3 }, //mux 1 + {bus_id(4), ARRAY_SIZE(i2c_device_info4), i2c_device_info4 }, //mux 2 + {bus_id(5), ARRAY_SIZE(i2c_device_info5), i2c_device_info5 }, //mux 3 +}; + +///////////////////////////////////////////////////////////////////////////////////////// +static struct i2c_gpio_platform_data i2c_gpio_platdata0 = { + .scl_pin = 8, + .sda_pin = 9, + + .udelay = 5, //5:100kHz + .sda_is_open_drain = 0, + .scl_is_open_drain = 0, + .scl_is_output_only = 0 +}; + +static struct i2c_gpio_platform_data i2c_gpio_platdata1 = { + .scl_pin = 12, + .sda_pin = 11, + + .udelay = 5, //5:100kHz + .sda_is_open_drain = 0, + .scl_is_open_drain = 0, + .scl_is_output_only = 0 +}; + +static struct platform_device device_i2c_gpio0 = { + .name = "i2c-gpio", + .id = 0, // adapter number + .dev.platform_data = &i2c_gpio_platdata0, +}; + +static struct platform_device device_i2c_gpio1 = { + .name = "i2c-gpio", + .id = 1, // adapter number + .dev.platform_data = &i2c_gpio_platdata1, +}; + +static int __init plat_redwood_x86_init(void) +{ + struct i2c_adapter *adap = NULL; + struct i2c_client *e = NULL; + int ret = 0; + int i,j; + + printk("el6661 plat_redwood_x86_init \n"); + +#if 0 //disable for ICOS + //use i2c-gpio + //register i2c gpio + //config gpio8,9 to gpio function + outl( inl(0x500) | (1<<8 | 1<<9), 0x500); + + ret = platform_device_register(&device_i2c_gpio0); + if (ret) { + printk(KERN_ERR "i2c-gpio: device_i2c_gpio0 register fail %d\n", ret); + } + + outl( inl(0x500) | (1<<11 | 1<<12), 0x500); + ret = platform_device_register(&device_i2c_gpio1); + if (ret) { + printk(KERN_ERR "i2c-gpio: device_i2c_gpio1 register fail %d\n", ret); + } +#endif + + for(i=0; i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include "I2CHostCommunication.h" + +#define USE_SMBUS 1 + +//#define offsetof(st, m) ((size_t)(&((st *)0)->m)) +#define FAN_NUM 5 +#define PSU_NUM 2 + +struct __attribute__ ((__packed__)) psoc_psu_layout { + u16 psu1_iin; + u16 psu2_iin; + u16 psu1_iout; + u16 psu2_iout; + + u16 psu1_pin; + u16 psu2_pin; + u16 psu1_pout; + u16 psu2_pout; + + u16 psu1_vin; + u16 psu2_vin; + u16 psu1_vout; + u16 psu2_vout; +}; + +struct __attribute__ ((__packed__)) psoc_layout { + u8 ctl; //offset: 0 + u16 switch_temp; //offset: 1 + u8 reserve1; //offset: 3 + + u8 fw_upgrade; //offset: 4 + + //i2c bridge + u8 i2c_st; //offset: 5 + u8 i2c_ctl; //offset: 6 + u8 i2c_addr; //offset: 7 + u8 i2c_data[0x20]; //offset: 8 + + //gpo + u8 led_grn; //offset: 28 + u8 led_red; //offset: 29 + + //pwm duty + u8 pwm[FAN_NUM]; //offset: 2a + u8 pwm_psu[PSU_NUM]; //offset: 2f + + //fan rpm + u16 fan[FAN_NUM*2]; //offset: 31 + //u16 fan_psu[PSU_NUM]; + + //gpi + u8 gpi_fan; //offset: 45 + + //psu state + u8 psu_state; //offset: 46 + + //temperature + u16 temp[5]; //offset: 47 + u16 temp_psu[PSU_NUM]; //offset: 51 + + //version + u8 version[2]; //offset: 55 + + u8 reserve2[3]; //offset: 57 + struct psoc_psu_layout psu_info; //offset: 5a +}; + + +/* definition */ +#define PSOC_OFF(m) offsetof(struct psoc_layout, m) +#define PSOC_PSU_OFF(m) offsetof(struct psoc_psu_layout, m) + +#define SWITCH_TMP_OFFSET PSOC_OFF(switch_temp) //0x01 +#define PWM_OFFSET PSOC_OFF(pwm) +#define PWM_PSU_OFFSET PSOC_OFF(pwm_psu) +#define THERMAL_OFFSET PSOC_OFF(temp) +#define RPM_OFFSET PSOC_OFF(fan) +//#define RPM_PSU_OFFSET PSOC_OFF(fan_psu) +#define DIAG_FLAG_OFFSET PSOC_OFF(ctl) +#define FAN_LED_OFFSET PSOC_OFF(led_grn) +#define FAN_GPI_OFFSET PSOC_OFF(gpi_fan) +#define PSOC_PSU_OFFSET PSOC_OFF(psu_state) +#define VERSION_OFFSET PSOC_OFF(version) +#define PSU_INFO_OFFSET PSOC_OFF(psu_info) + + +/* Each client has this additional data */ +struct psoc_data { + struct device *hwmon_dev; + struct mutex update_lock; + u32 diag; +}; + +/*-----------------------------------------------------------------------*/ + +static ssize_t psoc_i2c_read(struct i2c_client *client, u8 *buf, u8 offset, size_t count) +{ +#if USE_SMBUS + int i; + + for(i=0; iaddr; + msg[0].buf = msgbuf; + msg[0].len = 1; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = buf; + msg[1].len = count; + + status = i2c_transfer(client->adapter, msg, 2); + + if(status == 2) + status = count; + + return status; +#endif +} + +static ssize_t psoc_i2c_write(struct i2c_client *client, char *buf, unsigned offset, size_t count) +{ +#if USE_SMBUS + int i; + + for(i=0; iaddr; + msg.flags = 0; + + /* msg.buf is u8 and casts will mask the values */ + msg.buf = writebuf; + + msg.buf[i++] = offset; + memcpy(&msg.buf[i], buf, count); + msg.len = i + count; + + status = i2c_transfer(client->adapter, &msg, 1); + if (status == 1) + status = count; + + return status; +#endif +} + +static u32 psoc_read32(struct i2c_client *client, u8 offset) +{ + u32 value = 0; + u8 buf[4]; + + if( psoc_i2c_read(client, buf, offset, 4) == 4) + value = (buf[0]<<24 | buf[1]<<16 | buf[2]<<8 | buf[3]); + + return value; +} + +static u16 psoc_read16(struct i2c_client *client, u8 offset) +{ + u16 value = 0; + u8 buf[2]; + + if(psoc_i2c_read(client, buf, offset, 2) == 2) + value = (buf[0]<<8 | buf[1]<<0); + + return value; +} + +static u8 psoc_read8(struct i2c_client *client, u8 offset) +{ + u8 value = 0; + u8 buf = 0; + + if(psoc_i2c_read(client, &buf, offset, 1) == 1) + value = buf; + + return value; +} + +static int psoc_write_value(struct i2c_client *client, unsigned offset, u16 value) +{ + //TBD + return 0; +} + + +//PSOC i2c bridge regsters +#define PSOC_I2C_STATUS PSOC_OFF(i2c_st) +#define PSOC_I2C_CNTRL PSOC_OFF(i2c_ctl) +#define PSOC_I2C_ADDR PSOC_OFF(i2c_addr) +#define PSOC_I2C_DATA PSOC_OFF(i2c_data) + +//status bit definition +#define PSOC_I2C_START (1 << 0) +#define PSOC_PMB_SEL (1 << 7) + +//addr bits definition +#define PSOC_I2C_READ (1 << 0) + +//PMBUS registers definition +#define PMBUS_READ_VIN (0x88) +#define PMBUS_READ_IIN (0x89) +#define PMBUS_READ_VOUT (0x8B) +#define PMBUS_READ_IOUT (0x8C) +#define PMBUS_READ_POUT (0x96) +#define PMBUS_READ_PIN (0x97) + +#define PMBUS_MFR_ID (0x99) +#define PMBUS_MFR_MODEL (0x9A) +#define PMBUS_MFR_REVISION (0x9B) +#define PMBUS_MFR_DATE (0x9D) +#define PMBUS_MFR_SERIAL (0x9E) + +static int psoc_i2c_bridge_read(struct i2c_client *client, + unsigned char bus, + unsigned char chip, + char *addr, int alen, + unsigned char *data, int len ) +{ + unsigned char txdata[28], rxdata[28]; + int index, timeout; + + txdata[PSOC_I2C_STATUS] = 0; /* the status */ + txdata[PSOC_I2C_CNTRL] = ((alen & 3) << 5) | (len & 0x1f); /* the sizes */ + txdata[PSOC_I2C_ADDR] = (chip << 1) | PSOC_I2C_READ; /* read address */ + for(index = 0; index < alen; index++) + txdata[PSOC_I2C_DATA + index] = addr[index]; /* the chip address */ + for(; index < alen+len; index++) + txdata[PSOC_I2C_DATA + index] = 0; /* clear the chip data */ + + psoc_i2c_write(client, &txdata[PSOC_I2C_CNTRL], PSOC_I2C_CNTRL, 2 + alen + len); + + //delay a while ??? + //--------------------------------------------------------------------- + //start write + txdata[PSOC_I2C_STATUS] = PSOC_I2C_START; /* the start bit*/ + if(bus) + txdata[PSOC_I2C_STATUS] |= PSOC_PMB_SEL;/* bus id */ + psoc_i2c_write(client, &txdata[PSOC_I2C_STATUS], PSOC_I2C_STATUS, 1); + + //delay a while + timeout = 40; //40*20==>800 ms + do { + psoc_i2c_read(client, &rxdata[PSOC_I2C_STATUS], PSOC_I2C_STATUS, 1); + + //check rxdata[5] error bit(1) and complete bit(0) ,TBD + if((rxdata[PSOC_I2C_STATUS] & 0x2) == 0x2) { + //printk("i2c bridge fail!!!\n"); + timeout = 0; + break; + } + if((rxdata[PSOC_I2C_STATUS] & PSOC_I2C_START) == 0) { + /* comand complete */ + psoc_i2c_read(client, &rxdata[PSOC_I2C_DATA+alen], PSOC_I2C_DATA+alen, len); + break; + } + + //delay + msleep(20); + } while(timeout--); + + if(timeout <= 0) { + return -1; + } + + //--------------------------------------------------------------------- + + for(index=0; index < len; index++) { + data[index] = rxdata[PSOC_I2C_DATA + alen + index]; + } + + return 0; +} + + +/* +CPLD report the PSU0 status +000 = PSU normal operation +100 = PSU fault +010 = PSU unpowered +111 = PSU not installed + +7 6 | 5 4 3 | 2 1 0 +---------------------- + | psu1 | psu0 +*/ +static char* psu_str[] = { + "normal", //000 + "NA", //001 + "unpowered", //010 + "NA", //011 + "fault", //100 + "NA", //101 + "NA", //110 + "not installed", //111 +}; + +static ssize_t show_psu_st(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 byte; + int shift = (attr->index == 0)?3:0; + + mutex_lock(&data->update_lock); + status = psoc_i2c_read(client, &byte, PSOC_PSU_OFFSET, 1); + mutex_unlock(&data->update_lock); + + byte = (byte >> shift) & 0x7; + + status = sprintf (buf, "%d : %s\n", byte, psu_str[byte]); + + return strlen(buf); +} + +/*-----------------------------------------------------------------------*/ + +/* sysfs attributes for hwmon */ + +static ssize_t show_thermal(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index * 2 + THERMAL_OFFSET; + + mutex_lock(&data->update_lock); + + status = psoc_read16(client, offset); + status = __swab16(status); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", + (s8)(status>>8) * 1000 ); +} + + +static ssize_t show_pwm(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index; + + mutex_lock(&data->update_lock); + + status = psoc_read8(client, offset); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", + status); +} + +static ssize_t set_pwm(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index; + + u8 pwm = simple_strtol(buf, NULL, 10); + if(pwm > 255) pwm = 255; + + if(data->diag) { + mutex_lock(&data->update_lock); + psoc_i2c_write(client, &pwm, offset, 1); + mutex_unlock(&data->update_lock); + } + + return count; +} + + +static ssize_t show_rpm(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index; + + mutex_lock(&data->update_lock); + + status = psoc_read16(client, offset); + status = __swab16(status); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", + status); +} +static ssize_t show_fan_type(struct device *dev, struct device_attribute *da, + char *buf) +{ + u8 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 index = attr->index; + int type = -1; + + mutex_lock(&data->update_lock); + status = psoc_read8(client, FAN_GPI_OFFSET); + mutex_unlock(&data->update_lock); + + if( (status & 1<update_lock); + status = psoc_i2c_read(client, (u8*)&temp, SWITCH_TMP_OFFSET, 2); + status = __swab16(status); + mutex_unlock(&data->update_lock); + + status = sprintf (buf, "%d\n", (s8)(temp>>8) * 1000 ); + + return strlen(buf); +} + +static ssize_t set_switch_tmp(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + //struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + + long temp = simple_strtol(buf, NULL, 10); + u16 temp2 = ( (temp/1000) <<8 ) & 0xFF00 ; + + //printk("set_switch_tmp temp=%d, temp2=0x%x (%x,%x)\n", temp, temp2, ( ( (temp/1000) <<8 ) & 0xFF00 ), (( (temp%1000) / 10 ) & 0xFF)); + + mutex_lock(&data->update_lock); + psoc_i2c_write(client, (u8*)&temp2, SWITCH_TMP_OFFSET, 2); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_diag(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status; + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 diag_flag = 0; + + mutex_lock(&data->update_lock); + status = psoc_i2c_read(client, (u8*)&diag_flag, DIAG_FLAG_OFFSET, 1); + mutex_unlock(&data->update_lock); + + data->diag = (diag_flag & 0x80)?1:0; + status = sprintf (buf, "%d\n", data->diag); + + return strlen(buf); +} + +static ssize_t set_diag(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + //struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 value = 0; + u8 diag = simple_strtol(buf, NULL, 10); + + diag = diag?1:0; + data->diag = diag; + + mutex_lock(&data->update_lock); + psoc_i2c_read(client, (u8*)&value, DIAG_FLAG_OFFSET, 1); + if(diag) value |= (1<<7); + else value &= ~(1<<7); + psoc_i2c_write(client, (u8*)&value, DIAG_FLAG_OFFSET, 1); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_version(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status; + //struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->update_lock); + + status = psoc_read16(client, VERSION_OFFSET); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "ver: %x.%x\n", (status & 0xFF00)>>8, (status & 0xFF) ); +} + + +static ssize_t show_fan_led(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 bit = attr->index; + + mutex_lock(&data->update_lock); + + status = psoc_read8(client, FAN_LED_OFFSET); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", + (status & (1<index; + u8 led_state = 0; + + u8 v = simple_strtol(buf, NULL, 10); + + if(data->diag) { + mutex_lock(&data->update_lock); + led_state = psoc_read8(client, FAN_LED_OFFSET); + if(v) led_state |= (1<update_lock); + } + + return count; +} + +static ssize_t show_value8(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index; + + mutex_lock(&data->update_lock); + + status = psoc_read8(client, offset); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "0x%02X\n", status ); +} + +static long pmbus_reg2data_linear(int data, int linear16) +{ + s16 exponent; + s32 mantissa; + long val; + + if (linear16) { /* LINEAR16 */ + exponent = -9; + mantissa = (u16) data; + } else { /* LINEAR11 */ + exponent = ((s16)data) >> 11; + exponent = ((s16)( data & 0xF800) ) >> 11; + mantissa = ((s32)((data & 0x7ff) << 5)) >> 5; + } + + //printk("data=%d, m=%d, e=%d\n", data, exponent, mantissa); + val = mantissa; + + /* scale result to micro-units for power sensors */ + val = val * 1000L; + + if (exponent >= 0) + val <<= exponent; + else + val >>= -exponent; + + return val; +} + +static ssize_t show_psu(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 reg = attr->index & 0xFF; + u8 len = ((attr->index & 0xFF00) >> 8); + u8 chip = (attr->index >> 16)? 0x59:0x58; + u8 bus = 1; + unsigned char value[2] = {0,0};; + + if (len == 2) + { + mutex_lock(&data->update_lock); + psoc_i2c_bridge_read(client, bus, chip, ®, 1, value, 2); + mutex_unlock(&data->update_lock); + + status = value[1]<<8 | value[0]; + //status1 = value[1]<<8 | value[0]; + + return sprintf(buf, "%ld\n", pmbus_reg2data_linear(status, (reg==PMBUS_READ_VOUT)?1:0) ); + } + else + { //len is not defined. + u8 tmpbuf[32]; + mutex_lock(&data->update_lock); + //length of block read + psoc_i2c_bridge_read(client, bus, chip, ®, 1, &len, 1); + //data included length + psoc_i2c_bridge_read(client, bus, chip, ®, 1, tmpbuf, len+1); + mutex_unlock(&data->update_lock); + + memcpy(buf, tmpbuf+1, len); + buf[len]='\n'; + + return len+1; + } +} + +static ssize_t show_psu_psoc(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index + PSU_INFO_OFFSET; + + mutex_lock(&data->update_lock); + status = psoc_read16(client, offset); + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%ld \n", pmbus_reg2data_linear(status, strstr(attr->dev_attr.attr.name, "vout")? 1:0 )); +} + + +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_thermal, 0, 0); +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_thermal, 0, 1); +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_thermal, 0, 2); +static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_thermal, 0, 3); +static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_thermal, 0, 4); +static SENSOR_DEVICE_ATTR(thermal_psu1, S_IRUGO, show_thermal, 0, 5); +static SENSOR_DEVICE_ATTR(thermal_psu2, S_IRUGO, show_thermal, 0, 6); + +static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR|S_IRUGO, show_pwm, set_pwm, PWM_OFFSET+0); +static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR|S_IRUGO, show_pwm, set_pwm, PWM_OFFSET+1); +static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR|S_IRUGO, show_pwm, set_pwm, PWM_OFFSET+2); +static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR|S_IRUGO, show_pwm, set_pwm, PWM_OFFSET+3); +#if (FAN_NUM >= 5) +static SENSOR_DEVICE_ATTR(pwm5, S_IWUSR|S_IRUGO, show_pwm, set_pwm, PWM_OFFSET+4); +#endif +static SENSOR_DEVICE_ATTR(pwm_psu1, S_IWUSR|S_IRUGO, show_pwm, set_pwm, PWM_PSU_OFFSET+0); +static SENSOR_DEVICE_ATTR(pwm_psu2, S_IWUSR|S_IRUGO, show_pwm, set_pwm, PWM_PSU_OFFSET+1); + +static SENSOR_DEVICE_ATTR(psu0, S_IRUGO, show_psu_st, 0, 0); +static SENSOR_DEVICE_ATTR(psu1, S_IRUGO, show_psu_st, 0, 1); + +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_rpm, 0, 0*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_rpm, 0, 1*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_rpm, 0, 2*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_rpm, 0, 3*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_rpm, 0, 4*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_rpm, 0, 5*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_rpm, 0, 6*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_rpm, 0, 7*2 + RPM_OFFSET); +#if (FAN_NUM >= 5) +static SENSOR_DEVICE_ATTR(fan9_input, S_IRUGO, show_rpm, 0, 8*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(fan10_input, S_IRUGO, show_rpm, 0, 9*2 + RPM_OFFSET); +#endif +static SENSOR_DEVICE_ATTR(rpm_psu1, S_IRUGO, show_rpm, 0, 8*2 + RPM_OFFSET); +static SENSOR_DEVICE_ATTR(rpm_psu2, S_IRUGO, show_rpm, 0, 9*2 + RPM_OFFSET); + +static SENSOR_DEVICE_ATTR(switch_tmp, S_IWUSR|S_IRUGO, show_switch_tmp, set_switch_tmp, 0); + +static SENSOR_DEVICE_ATTR(diag, S_IWUSR|S_IRUGO, show_diag, set_diag, 0); +static SENSOR_DEVICE_ATTR(version, S_IRUGO, show_version, 0, 0); + +static SENSOR_DEVICE_ATTR(fan_led_grn1, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 0); +static SENSOR_DEVICE_ATTR(fan_led_grn2, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 1); +static SENSOR_DEVICE_ATTR(fan_led_grn3, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 2); +static SENSOR_DEVICE_ATTR(fan_led_grn4, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 3); +static SENSOR_DEVICE_ATTR(fan_led_red1, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 4); +static SENSOR_DEVICE_ATTR(fan_led_red2, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 5); +static SENSOR_DEVICE_ATTR(fan_led_red3, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 6); +static SENSOR_DEVICE_ATTR(fan_led_red4, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 7); + +static SENSOR_DEVICE_ATTR(fan_gpi, S_IRUGO, show_value8, 0, FAN_GPI_OFFSET); +static SENSOR_DEVICE_ATTR(fan1_type, S_IRUGO, show_fan_type, 0, 0); +static SENSOR_DEVICE_ATTR(fan2_type, S_IRUGO, show_fan_type, 0, 1); +static SENSOR_DEVICE_ATTR(fan3_type, S_IRUGO, show_fan_type, 0, 2); +static SENSOR_DEVICE_ATTR(fan4_type, S_IRUGO, show_fan_type, 0, 3); + +static SENSOR_DEVICE_ATTR(psu1_vin, S_IRUGO, show_psu, 0, (0<<16) | (2<<8) | PMBUS_READ_VIN); +static SENSOR_DEVICE_ATTR(psu1_vout, S_IRUGO, show_psu, 0, (0<<16) | (2<<8) | PMBUS_READ_VOUT); +static SENSOR_DEVICE_ATTR(psu1_iin, S_IRUGO, show_psu, 0, (0<<16) | (2<<8) | PMBUS_READ_IIN); +static SENSOR_DEVICE_ATTR(psu1_iout, S_IRUGO, show_psu, 0, (0<<16) | (2<<8) | PMBUS_READ_IOUT); +static SENSOR_DEVICE_ATTR(psu1_pin, S_IRUGO, show_psu, 0, (0<<16) | (2<<8) | PMBUS_READ_PIN); +static SENSOR_DEVICE_ATTR(psu1_pout, S_IRUGO, show_psu, 0, (0<<16) | (2<<8) | PMBUS_READ_POUT); + +static SENSOR_DEVICE_ATTR(psu1_vendor, S_IRUGO, show_psu, 0, (0<<16) | (0<<8) | PMBUS_MFR_ID); +static SENSOR_DEVICE_ATTR(psu1_model, S_IRUGO, show_psu, 0, (0<<16) | (0<<8) | PMBUS_MFR_MODEL); +static SENSOR_DEVICE_ATTR(psu1_version, S_IRUGO, show_psu, 0, (0<<16) | (0<<8) | PMBUS_MFR_REVISION); +static SENSOR_DEVICE_ATTR(psu1_date, S_IRUGO, show_psu, 0, (0<<16) | (0<<8) | PMBUS_MFR_DATE); +static SENSOR_DEVICE_ATTR(psu1_sn, S_IRUGO, show_psu, 0, (0<<16) | (0<<8) | PMBUS_MFR_SERIAL); + +static SENSOR_DEVICE_ATTR(psu2_vin, S_IRUGO, show_psu, 0, (1<<16) | (2<<8) | PMBUS_READ_VIN); +static SENSOR_DEVICE_ATTR(psu2_vout, S_IRUGO, show_psu, 0, (1<<16) | (2<<8) | PMBUS_READ_VOUT); +static SENSOR_DEVICE_ATTR(psu2_iin, S_IRUGO, show_psu, 0, (1<<16) | (2<<8) | PMBUS_READ_IIN); +static SENSOR_DEVICE_ATTR(psu2_iout, S_IRUGO, show_psu, 0, (1<<16) | (2<<8) | PMBUS_READ_IOUT); +static SENSOR_DEVICE_ATTR(psu2_pin, S_IRUGO, show_psu, 0, (1<<16) | (2<<8) | PMBUS_READ_PIN); +static SENSOR_DEVICE_ATTR(psu2_pout, S_IRUGO, show_psu, 0, (1<<16) | (2<<8) | PMBUS_READ_POUT); + +static SENSOR_DEVICE_ATTR(psu2_vendor, S_IRUGO, show_psu, 0, (1<<16) | (0<<8) | PMBUS_MFR_ID); +static SENSOR_DEVICE_ATTR(psu2_model, S_IRUGO, show_psu, 0, (1<<16) | (0<<8) | PMBUS_MFR_MODEL); +static SENSOR_DEVICE_ATTR(psu2_version, S_IRUGO, show_psu, 0, (1<<16) | (0<<8) | PMBUS_MFR_REVISION); +static SENSOR_DEVICE_ATTR(psu2_date, S_IRUGO, show_psu, 0, (1<<16) | (0<<8) | PMBUS_MFR_DATE); +static SENSOR_DEVICE_ATTR(psu2_sn, S_IRUGO, show_psu, 0, (1<<16) | (0<<8) | PMBUS_MFR_SERIAL); + +static SENSOR_DEVICE_ATTR(psoc_psu1_vin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_vin)); +static SENSOR_DEVICE_ATTR(psoc_psu1_vout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_vout)); +static SENSOR_DEVICE_ATTR(psoc_psu1_iin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_iin)); +static SENSOR_DEVICE_ATTR(psoc_psu1_iout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_iout)); +static SENSOR_DEVICE_ATTR(psoc_psu1_pin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_pin)); +static SENSOR_DEVICE_ATTR(psoc_psu1_pout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_pout)); + + +static SENSOR_DEVICE_ATTR(psoc_psu2_vin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_vin)); +static SENSOR_DEVICE_ATTR(psoc_psu2_vout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_vout)); +static SENSOR_DEVICE_ATTR(psoc_psu2_iin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_iin)); +static SENSOR_DEVICE_ATTR(psoc_psu2_iout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_iout)); +static SENSOR_DEVICE_ATTR(psoc_psu2_pin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_pin)); +static SENSOR_DEVICE_ATTR(psoc_psu2_pout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_pout)); + +static struct attribute *psoc_attributes[] = { + //thermal + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp2_input.dev_attr.attr, + &sensor_dev_attr_temp3_input.dev_attr.attr, + &sensor_dev_attr_temp4_input.dev_attr.attr, + &sensor_dev_attr_temp5_input.dev_attr.attr, + + &sensor_dev_attr_thermal_psu1.dev_attr.attr, + &sensor_dev_attr_thermal_psu2.dev_attr.attr, + + + //pwm + &sensor_dev_attr_pwm1.dev_attr.attr, + &sensor_dev_attr_pwm2.dev_attr.attr, + &sensor_dev_attr_pwm3.dev_attr.attr, + &sensor_dev_attr_pwm4.dev_attr.attr, +#if (FAN_NUM >= 5) + //&sensor_dev_attr_pwm5.dev_attr.attr, +#endif + &sensor_dev_attr_pwm_psu1.dev_attr.attr, + &sensor_dev_attr_pwm_psu2.dev_attr.attr, + + //rpm + &sensor_dev_attr_fan1_input.dev_attr.attr, + &sensor_dev_attr_fan2_input.dev_attr.attr, + &sensor_dev_attr_fan3_input.dev_attr.attr, + &sensor_dev_attr_fan4_input.dev_attr.attr, + &sensor_dev_attr_fan5_input.dev_attr.attr, + &sensor_dev_attr_fan6_input.dev_attr.attr, + &sensor_dev_attr_fan7_input.dev_attr.attr, + &sensor_dev_attr_fan8_input.dev_attr.attr, +#if (FAN_NUM >= 5) + //&sensor_dev_attr_fan9_input.dev_attr.attr, + //&sensor_dev_attr_fan10_input.dev_attr.attr, +#endif + + &sensor_dev_attr_rpm_psu1.dev_attr.attr, + &sensor_dev_attr_rpm_psu2.dev_attr.attr, + + //switch temperature + &sensor_dev_attr_switch_tmp.dev_attr.attr, + + //diag flag + &sensor_dev_attr_diag.dev_attr.attr, + + //version + &sensor_dev_attr_version.dev_attr.attr, + + //fan led + &sensor_dev_attr_fan_led_grn1.dev_attr.attr, + &sensor_dev_attr_fan_led_grn2.dev_attr.attr, + &sensor_dev_attr_fan_led_grn3.dev_attr.attr, + &sensor_dev_attr_fan_led_grn4.dev_attr.attr, + &sensor_dev_attr_fan_led_red1.dev_attr.attr, + &sensor_dev_attr_fan_led_red2.dev_attr.attr, + &sensor_dev_attr_fan_led_red3.dev_attr.attr, + &sensor_dev_attr_fan_led_red4.dev_attr.attr, + + //fan GPI + &sensor_dev_attr_fan_gpi.dev_attr.attr, + + //fan type + &sensor_dev_attr_fan1_type.dev_attr.attr, + &sensor_dev_attr_fan2_type.dev_attr.attr, + &sensor_dev_attr_fan3_type.dev_attr.attr, + &sensor_dev_attr_fan4_type.dev_attr.attr, + + //psu + &sensor_dev_attr_psu1_vin.dev_attr.attr, + &sensor_dev_attr_psu1_vout.dev_attr.attr, + &sensor_dev_attr_psu1_iin.dev_attr.attr, + &sensor_dev_attr_psu1_iout.dev_attr.attr, + &sensor_dev_attr_psu1_pin.dev_attr.attr, + &sensor_dev_attr_psu1_pout.dev_attr.attr, + &sensor_dev_attr_psu2_vin.dev_attr.attr, + &sensor_dev_attr_psu2_vout.dev_attr.attr, + &sensor_dev_attr_psu2_iin.dev_attr.attr, + &sensor_dev_attr_psu2_iout.dev_attr.attr, + &sensor_dev_attr_psu2_pin.dev_attr.attr, + &sensor_dev_attr_psu2_pout.dev_attr.attr, + + &sensor_dev_attr_psu1_vendor.dev_attr.attr, + &sensor_dev_attr_psu1_model.dev_attr.attr, + &sensor_dev_attr_psu1_version.dev_attr.attr, + &sensor_dev_attr_psu1_date.dev_attr.attr, + &sensor_dev_attr_psu1_sn.dev_attr.attr, + &sensor_dev_attr_psu2_vendor.dev_attr.attr, + &sensor_dev_attr_psu2_model.dev_attr.attr, + &sensor_dev_attr_psu2_version.dev_attr.attr, + &sensor_dev_attr_psu2_date.dev_attr.attr, + &sensor_dev_attr_psu2_sn.dev_attr.attr, + + &sensor_dev_attr_psu0.dev_attr.attr, + &sensor_dev_attr_psu1.dev_attr.attr, + + //psu_psoc, new added on psoc 1.9 + &sensor_dev_attr_psoc_psu1_vin.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_vout.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_iin.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_iout.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_pin.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_pout.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_vin.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_vout.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_iin.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_iout.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_pin.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_pout.dev_attr.attr, + + NULL +}; + +static const struct attribute_group psoc_group = { + .attrs = psoc_attributes, +}; + +/*-----------------------------------------------------------------------*/ + +/* device probe and removal */ + +static int +psoc_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct psoc_data *data; + int status; + + printk("+%s\n", __func__); + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) + return -EIO; + + data = kzalloc(sizeof(struct psoc_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + data->diag = 0; + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &psoc_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: sensor '%s'\n", + dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &psoc_group); +exit_free: + i2c_set_clientdata(client, NULL); + kfree(data); + return status; +} + +static int psoc_remove(struct i2c_client *client) +{ + struct psoc_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &psoc_group); + i2c_set_clientdata(client, NULL); + kfree(data); + return 0; +} + +static const struct i2c_device_id psoc_ids[] = { + { "inv_psoc", 0, }, + { /* LIST END */ } +}; +MODULE_DEVICE_TABLE(i2c, psoc_ids); + +static struct i2c_driver psoc_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "inv_psoc", + }, + .probe = psoc_probe, + .remove = psoc_remove, + .id_table = psoc_ids, +}; + +/*-----------------------------------------------------------------------*/ + +/* module glue */ + +static int __init inv_psoc_init(void) +{ + return i2c_add_driver(&psoc_driver); +} + +static void __exit inv_psoc_exit(void) +{ + i2c_del_driver(&psoc_driver); +} + +MODULE_AUTHOR("eddie.lan "); +MODULE_DESCRIPTION("inv psoc driver"); +MODULE_LICENSE("GPL"); + +module_init(inv_psoc_init); +module_exit(inv_psoc_exit); diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/utils/onie-syseeprom b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/utils/onie-syseeprom new file mode 100755 index 0000000000000000000000000000000000000000..b8e3ba26a5d24bc70f970c24364a61cbfa0abf10 GIT binary patch literal 921685 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

UCM}yocoz1wzq-Y3g~I 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

3ldnE1ZCNQfUc~ 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%0DnGRQI4{ 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 literal 0 HcmV?d00001 diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/changelog b/platform/broadcom/sonic-platform-modules-inventec/debian/changelog new file mode 100644 index 000000000000..3598fc1d40d1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/changelog @@ -0,0 +1,5 @@ +sonic-inventec-platform-modules (1.0.0) unstable; urgency=low + + * Add support for Inventec d7032 + + -- developer Wed, 05 Oct 2016 16:30:45 +0800 diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/compat b/platform/broadcom/sonic-platform-modules-inventec/debian/compat new file mode 100644 index 000000000000..ec635144f600 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/compat @@ -0,0 +1 @@ +9 diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/control b/platform/broadcom/sonic-platform-modules-inventec/debian/control new file mode 100644 index 000000000000..328de48c097b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/control @@ -0,0 +1,12 @@ +Source: sonic-inventec-platform-modules +Section: main +Priority: extra +Maintainer: Inventec +Build-Depends: debhelper (>= 8.0.0), bzip2 +Standards-Version: 3.9.3 + +Package: platform-modules-d7032q28b +Architecture: amd64 +Depends: linux-image-3.16.0-4-amd64 +Description: kernel modules for platform devices such as fan, led + diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.init b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.init new file mode 100644 index 000000000000..9b9683a4eb2a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.init @@ -0,0 +1,69 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: setup-board +# Required-Start: +# Required-Stop: +# Should-Start: +# Should-Stop: +# Default-Start: S +# Default-Stop: 0 6 +# Short-Description: Setup Inventec d7032q28b board. +### END INIT INFO + +case "$1" in +start) + echo -n "Setting up board... " + + depmod -a + modprobe inv_platform + modprobe inv_psoc + modprobe inv_cpld + + /usr/local/bin/onie-syseeprom -S /tmp/eeprom + # Attach 32 instances of EEPROM driver QSFP ports on IO module 1 + #eeprom can dump data using below command + for ((i=22;i<=29;i++)); + do + echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-4/i2c-$i/new_device + done + + for ((i=30;i<=37;i++)); + do + echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-5/i2c-$i/new_device + done + + for ((i=6;i<=13;i++)); + do + echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-2/i2c-$i/new_device + done + + for ((i=14;i<=21;i++)); + do + echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-3/i2c-$i/new_device + done + + echo "done." + ;; + +stop) + + rmmod inv_cpld + rmmod inv_psoc + rmmod inv_platform + + echo "done." + + ;; + +force-reload|restart) + echo "Not supported" + ;; + +*) + echo "Usage: /etc/init.d/platform-modules-d7032q28b.init {start|stop}" + exit 1 + ;; +esac + +exit 0 diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.install b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.install new file mode 100644 index 000000000000..996d5e36b781 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.install @@ -0,0 +1 @@ +d7032q28b/conf/d7032q28b-modules.conf etc/modules-load.d diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/rules b/platform/broadcom/sonic-platform-modules-inventec/debian/rules new file mode 100755 index 000000000000..166a3426b2ba --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/rules @@ -0,0 +1,46 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +export INSTALL_MOD_DIR:=extra + +KVERSION ?= $(shell uname -r) +KERNEL_SRC := /lib/modules/$(KVERSION) +MOD_SRC_DIR:= $(shell pwd) +MODULE_DIRS:= d7032q28b + +%: + dh $@ + +override_dh_auto_build: + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ + done) + +override_dh_auto_install: + (for mod in $(MODULE_DIRS); do \ + dh_installdirs -pplatform-modules-$${mod} \ + $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + cp $(MOD_SRC_DIR)/$${mod}/modules/*.ko \ + debian/platform-modules-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + dh_installdirs -pplatform-modules-$${mod} usr/local/bin; \ + cp -r $(MOD_SRC_DIR)/$${mod}/utils/onie-syseeprom debian/platform-modules-$${mod}/usr/local/bin/; \ + done) + +override_dh_usrlocal: + +override_dh_pysupport: + +override_dh_clean: + dh_clean + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ + done) + From c075033bb600398ec875dbbc0c69863bd7729571 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 19 Jul 2017 01:14:03 -0700 Subject: [PATCH 0677/1011] [submodule] update sonic-swss submodule (#817) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 179daacb2162..456cb1e62033 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 179daacb2162bd769587070ae8ad4f9ded97d549 +Subproject commit 456cb1e620335ac88efddafc256a3a21b518fa7a From 3fd2014e93ab75dec4396eebbaead23d208046fe Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 19 Jul 2017 08:10:45 -0700 Subject: [PATCH 0678/1011] [sonic-mgmt]: move sonic-mgmt docker build into sonic-slave (#819) need to install sonic-device-data into sonic-mgmt docker --- .gitignore | 1 + Makefile | 19 +------------------ .../docker-sonic-mgmt/Dockerfile.j2 | 15 ++++++++++++++- .../docker-sonic-mgmt}/sonic-jenkins.pub | 0 rules/docker-sonic-mgmt.mk | 5 +++++ slave.mk | 7 +++++-- 6 files changed, 26 insertions(+), 21 deletions(-) rename sonic-mgmt/Dockerfile => dockers/docker-sonic-mgmt/Dockerfile.j2 (86%) rename {sonic-mgmt => dockers/docker-sonic-mgmt}/sonic-jenkins.pub (100%) create mode 100644 rules/docker-sonic-mgmt.mk diff --git a/.gitignore b/.gitignore index bf9967b04aca..16d7b53f60af 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ dockers/docker-orchagent/Dockerfile dockers/docker-platform-monitor/Dockerfile dockers/docker-snmp-sv2/Dockerfile dockers/docker-teamd/Dockerfile +dockers/docker-sonic-mgmt/Dockerfile platform/*/docker-syncd-*/Dockerfile platform/*/docker-syncd-*-rpc/Dockerfile diff --git a/Makefile b/Makefile index b2938221b240..5cf5f53ac3ce 100644 --- a/Makefile +++ b/Makefile @@ -25,21 +25,7 @@ DOCKER_BUILD = docker build --no-cache \ sonic-slave && \ docker tag $(SLAVE_IMAGE):latest $(SLAVE_IMAGE):$(SLAVE_TAG) - -MGMT_TAG = $(shell shasum sonic-mgmt/Dockerfile | awk '{print substr($$1,0,11);}') -MGMT_IMAGE = sonic-mgmt-$(USER) - -DOCKER_MGMT_BUILD = docker build --no-cache \ - --build-arg user=$(USER) \ - --build-arg uid=$(shell id -u) \ - --build-arg guid=$(shell id -g) \ - --build-arg hostname=$(shell echo $$HOSTNAME) \ - -t $(MGMT_IMAGE) \ - sonic-mgmt && \ - docker tag $(MGMT_IMAGE):latest $(MGMT_IMAGE):$(MGMT_TAG) - - -.PHONY: sonic-slave-build sonic-slave-bash sonic-mgmt-build +.PHONY: sonic-slave-build sonic-slave-bash .DEFAULT_GOAL := all @@ -67,6 +53,3 @@ sonic-slave-bash : { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ $(DOCKER_BUILD) ; } @$(DOCKER_RUN) -t $(SLAVE_IMAGE):$(SLAVE_TAG) bash - -sonic-mgmt-build : - @$(DOCKER_MGMT_BUILD) diff --git a/sonic-mgmt/Dockerfile b/dockers/docker-sonic-mgmt/Dockerfile.j2 similarity index 86% rename from sonic-mgmt/Dockerfile rename to dockers/docker-sonic-mgmt/Dockerfile.j2 index b30db8251f28..6cfe28603894 100644 --- a/sonic-mgmt/Dockerfile +++ b/dockers/docker-sonic-mgmt/Dockerfile.j2 @@ -20,7 +20,7 @@ RUN apt-get install -y \ libxslt1-dev \ python-setuptools -# For JNLP launcher +# For JNLP launcher RUN apt-get install -y default-jre # For syslog test @@ -44,6 +44,19 @@ RUN pip install ipaddr \ paramiko==2.1.2 \ adal + +## Copy and install sonic-mgmt docker dependencies +COPY \ +{% for deb in docker_sonic_mgmt_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -i \ +{% for deb in docker_sonic_mgmt_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + RUN git clone https://github.com/ansible/ansible RUN cd ansible && git checkout v2.0.0.2-1 -b v2.0.0.2-1 && git submodule update --init --recursive && make && make install diff --git a/sonic-mgmt/sonic-jenkins.pub b/dockers/docker-sonic-mgmt/sonic-jenkins.pub similarity index 100% rename from sonic-mgmt/sonic-jenkins.pub rename to dockers/docker-sonic-mgmt/sonic-jenkins.pub diff --git a/rules/docker-sonic-mgmt.mk b/rules/docker-sonic-mgmt.mk new file mode 100644 index 000000000000..2f4908e43d73 --- /dev/null +++ b/rules/docker-sonic-mgmt.mk @@ -0,0 +1,5 @@ +# docker image for sonic-mgmt +DOCKER_SONIC_MGMT = docker-sonic-mgmt.gz +$(DOCKER_SONIC_MGMT)_PATH = $(DOCKERS_PATH)/docker-sonic-mgmt +$(DOCKER_SONIC_MGMT)_DEPENDS += $(SONIC_DEVICE_DATA) +SONIC_DOCKER_IMAGES += $(DOCKER_SONIC_MGMT) diff --git a/slave.mk b/slave.mk index 40e28d6d67ab..0d953d52c924 100644 --- a/slave.mk +++ b/slave.mk @@ -6,6 +6,9 @@ .ONESHELL: SHELL = /bin/bash .SHELLFLAGS += -e +USER = $(shell id -un) +UID = $(shell id -u) +GUID = $(shell id -g) .SECONDEXPANSION: @@ -297,7 +300,7 @@ docker-start : # targets for building simple docker images that do not depend on any debian packages $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) $(HEADER) - docker build --squash --no-cache -t $* $($*.gz_PATH) $(LOG) + docker build --squash --no-cache --build-arg user=$(USER) --build-arg uid=$(UID) --build-arg guid=$(GUID) -t $* $($*.gz_PATH) $(LOG) docker save $* | gzip -c > $@ $(FOOTER) @@ -313,7 +316,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .pl $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_whls=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_PYTHON_WHEELS)))\n" | awk '!a[$$0]++')) $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_dbgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DBG_PACKAGES)))\n" | awk '!a[$$0]++')) j2 $($*.gz_PATH)/Dockerfile.j2 > $($*.gz_PATH)/Dockerfile - docker build --squash --no-cache -t $* $($*.gz_PATH) $(LOG) + docker build --squash --no-cache --build-arg user=$(USER) --build-arg uid=$(UID) --build-arg guid=$(GUID) -t $* $($*.gz_PATH) $(LOG) docker save $* | gzip -c > $@ $(FOOTER) From 12e5e22572ab143848422963f6bee255db186806 Mon Sep 17 00:00:00 2001 From: celestica-abhisit Date: Thu, 20 Jul 2017 00:29:46 +0700 Subject: [PATCH 0679/1011] [platform/Seastone] Add a new supported platform, Celestica Seastone-DX010 (#816) * [platform/Seastone] Add a new supported platform, Celestica Seastone-DX010. Switch Vendor: Celestica Switch SKU : Seastone-DX010 ASIC Vendor: Broadcom Swich ASIC: Tomahawk Port Configuration: 32x100G, 64x50G and 96x10G+16x50G. SONiC Image: SONiC-ONIE-Broadcom Signed-off-by: asang@celestica.com * Help to convert tab to white space for Inventec-D7032Q28B platform. --- .gitmodules | 3 +++ platform/broadcom/one-image.mk | 3 ++- platform/broadcom/platform-modules-cel.mk | 11 +++++++++++ platform/broadcom/rules.mk | 1 + platform/broadcom/sonic-platform-modules-cel | 1 + 5 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 platform/broadcom/platform-modules-cel.mk create mode 160000 platform/broadcom/sonic-platform-modules-cel diff --git a/.gitmodules b/.gitmodules index 454019f9ebdd..5bf6fb5b4a61 100644 --- a/.gitmodules +++ b/.gitmodules @@ -66,3 +66,6 @@ [submodule "platform/broadcom/sonic-platform-modules-accton"] path = platform/broadcom/sonic-platform-modules-accton url = https://github.com/edge-core/sonic-platform-modules-accton.git +[submodule "platform/broadcom/sonic-platform-modules-cel"] + path = platform/broadcom/sonic-platform-modules-cel + url = https://github.com/celestica-Inc/sonic-platform-modules-cel.git diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 0a48a32bd600..912c3ea3961d 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -11,6 +11,7 @@ $(SONIC_ONE_IMAGE)_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(INGRASYS_S8900_64XC_PLATFORM_MODULE) \ $(INGRASYS_S9100_PLATFORM_MODULE) \ $(ACCTON_AS7712_32X_PLATFORM_MODULE) \ - $(INVENTEC_D7032Q28B_PLATFORM_MODULE) + $(INVENTEC_D7032Q28B_PLATFORM_MODULE) \ + $(CEL_DX010_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/broadcom/platform-modules-cel.mk b/platform/broadcom/platform-modules-cel.mk new file mode 100644 index 000000000000..37dce948d3d5 --- /dev/null +++ b/platform/broadcom/platform-modules-cel.mk @@ -0,0 +1,11 @@ +# Celestica DX010 Platform modules + +CEL_DX010_PLATFORM_MODULE_VERSION = 0.5 + +export CEL_DX010_PLATFORM_MODULE_VERSION + +CEL_DX010_PLATFORM_MODULE = platform-modules-dx010_$(CEL_DX010_PLATFORM_MODULE_VERSION)_amd64.deb +$(CEL_DX010_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-cel +$(CEL_DX010_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(CEL_DX010_PLATFORM_MODULE)_PLATFORM = x86_64-cel_seastone-r0 +SONIC_DPKG_DEBS += $(CEL_DX010_PLATFORM_MODULE) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 3823dcc4b83e..253593b30f2a 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -6,6 +6,7 @@ include $(PLATFORM_PATH)/platform-modules-arista.mk include $(PLATFORM_PATH)/platform-modules-ingrasys.mk include $(PLATFORM_PATH)/platform-modules-accton.mk include $(PLATFORM_PATH)/platform-modules-inventec.mk +include $(PLATFORM_PATH)/platform-modules-cel.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm-rpc.mk diff --git a/platform/broadcom/sonic-platform-modules-cel b/platform/broadcom/sonic-platform-modules-cel new file mode 160000 index 000000000000..983b298ef65f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel @@ -0,0 +1 @@ +Subproject commit 983b298ef65f994728e250ab5744914b6f27b454 From ccb71cd4d6060fb29b51d2e0da0698f6e3f16c09 Mon Sep 17 00:00:00 2001 From: zhenggen-xu Date: Wed, 19 Jul 2017 17:13:18 -0700 Subject: [PATCH 0680/1011] ASIC part support for Celestica DX010 platform(Three port breakout configurations) (#818) * ASIC part support for Celestica DX010 platform. It includes: *Three different configurations: 32x100G, 64x50G, 96x10G+16x50G.(Script to be includd in the platform directory). *Data port LED Also from vendor: *fancontrol configuration *eeprom.py/sfpulti.py plugins *sensor configuration * Typo fix * Add the port configuration change script * move the script to sonic-utilities repo --- .../Seastone-DX010-10-50/minigraph.xml | 1479 +++++++++++++++++ .../Seastone-DX010-10-50/port_config.ini | 113 ++ .../Seastone-DX010-10-50/sai.profile | 1 + .../Seastone-DX010-50/minigraph.xml | 1239 ++++++++++++++ .../Seastone-DX010-50/port_config.ini | 65 + .../Seastone-DX010-50/sai.profile | 1 + .../Seastone-DX010/minigraph.xml | 1079 ++++++++++++ .../Seastone-DX010/port_config.ini | 33 + .../Seastone-DX010/sai.profile | 1 + .../x86_64-cel_seastone-r0/fancontrol | 12 + .../x86_64-cel_seastone-r0/installer.conf | 3 + .../x86_64-cel_seastone-r0/led-code/ledcode0 | 13 + .../x86_64-cel_seastone-r0/led-code/ledcode1 | 13 + .../x86_64-cel_seastone-r0/led-code/ledcode2 | 8 + .../x86_64-cel_seastone-r0/led_proc_init.soc | 11 + .../x86_64-cel_seastone-r0/minigraph.xml | 1079 ++++++++++++ .../x86_64-cel_seastone-r0/plugins/eeprom.py | 23 + .../x86_64-cel_seastone-r0/plugins/sfputil.py | 25 + .../x86_64-cel_seastone-r0/sensors.conf | 12 + 19 files changed, 5210 insertions(+) create mode 100644 device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/minigraph.xml create mode 100644 device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/port_config.ini create mode 100644 device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/sai.profile create mode 100644 device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/minigraph.xml create mode 100644 device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/port_config.ini create mode 100644 device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/sai.profile create mode 100644 device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/minigraph.xml create mode 100644 device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/port_config.ini create mode 100644 device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/sai.profile create mode 100644 device/celestica/x86_64-cel_seastone-r0/fancontrol create mode 100644 device/celestica/x86_64-cel_seastone-r0/installer.conf create mode 100755 device/celestica/x86_64-cel_seastone-r0/led-code/ledcode0 create mode 100755 device/celestica/x86_64-cel_seastone-r0/led-code/ledcode1 create mode 100755 device/celestica/x86_64-cel_seastone-r0/led-code/ledcode2 create mode 100755 device/celestica/x86_64-cel_seastone-r0/led_proc_init.soc create mode 100644 device/celestica/x86_64-cel_seastone-r0/minigraph.xml create mode 100644 device/celestica/x86_64-cel_seastone-r0/plugins/eeprom.py create mode 100644 device/celestica/x86_64-cel_seastone-r0/plugins/sfputil.py create mode 100644 device/celestica/x86_64-cel_seastone-r0/sensors.conf diff --git a/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/minigraph.xml b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/minigraph.xml new file mode 100644 index 000000000000..7b918a5414c4 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/minigraph.xml @@ -0,0 +1,1479 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +

10.0.0.33
+ + + + +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+ + +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+ + + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + tenGigE1/1 + 10.0.0.0/31 + + + + tenGigE1/2 + 10.0.0.2/31 + + + + tenGigE1/3 + 10.0.0.4/31 + + + + tenGigE1/4 + 10.0.0.6/31 + + + + tenGigE1/5 + 10.0.0.8/31 + + + + tenGigE1/6 + 10.0.0.10/31 + + + + tenGigE1/7 + 10.0.0.12/31 + + + + tenGigE1/8 + 10.0.0.14/31 + + + + tenGigE1/9 + 10.0.0.16/31 + + + + tenGigE1/10 + 10.0.0.18/31 + + + + tenGigE1/11 + 10.0.0.20/31 + + + + tenGigE1/12 + 10.0.0.22/31 + + + + tenGigE1/13 + 10.0.0.24/31 + + + + tenGigE1/14 + 10.0.0.26/31 + + + + tenGigE1/15 + 10.0.0.28/31 + + + + tenGigE1/16 + 10.0.0.30/31 + + + + tenGigE1/17 + 10.0.0.32/31 + + + + tenGigE1/18 + 10.0.0.34/31 + + + + tenGigE1/19 + 10.0.0.36/31 + + + + tenGigE1/20 + 10.0.0.38/31 + + + + tenGigE1/21 + 10.0.0.40/31 + + + + tenGigE1/22 + 10.0.0.42/31 + + + + tenGigE1/23 + 10.0.0.44/31 + + + + tenGigE1/24 + 10.0.0.46/31 + + + + tenGigE1/25 + 10.0.0.48/31 + + + + tenGigE1/26 + 10.0.0.50/31 + + + + tenGigE1/27 + 10.0.0.52/31 + + + + tenGigE1/28 + 10.0.0.54/31 + + + + tenGigE1/29 + 10.0.0.56/31 + + + + tenGigE1/30 + 10.0.0.58/31 + + + + tenGigE1/31 + 10.0.0.60/31 + + + + tenGigE1/32 + 10.0.0.62/31 + + + + tenGigE1/33 + 10.0.0.64/31 + + + + tenGigE1/34 + 10.0.0.66/31 + + + + tenGigE1/35 + 10.0.0.68/31 + + + + tenGigE1/36 + 10.0.0.70/31 + + + + tenGigE1/37 + 10.0.0.72/31 + + + + tenGigE1/38 + 10.0.0.74/31 + + + + tenGigE1/39 + 10.0.0.76/31 + + + + tenGigE1/40 + 10.0.0.78/31 + + + + tenGigE1/41 + 10.0.0.80/31 + + + + tenGigE1/42 + 10.0.0.82/31 + + + + tenGigE1/43 + 10.0.0.84/31 + + + + tenGigE1/44 + 10.0.0.86/31 + + + + tenGigE1/45 + 10.0.0.88/31 + + + + tenGigE1/46 + 10.0.0.90/31 + + + + tenGigE1/47 + 10.0.0.92/31 + + + + tenGigE1/48 + 10.0.0.94/31 + + + + tenGigE1/49 + 10.0.0.96/31 + + + + tenGigE1/50 + 10.0.0.98/31 + + + + tenGigE1/51 + 10.0.0.100/31 + + + + tenGigE1/52 + 10.0.0.102/31 + + + + tenGigE1/53 + 10.0.0.104/31 + + + + tenGigE1/54 + 10.0.0.106/31 + + + + tenGigE1/55 + 10.0.0.108/31 + + + + tenGigE1/56 + 10.0.0.110/31 + + + + tenGigE1/57 + 10.0.0.112/31 + + + + tenGigE1/58 + 10.0.0.114/31 + + + + tenGigE1/59 + 10.0.0.116/31 + + + + tenGigE1/60 + 10.0.0.118/31 + + + + tenGigE1/61 + 10.0.0.120/31 + + + + tenGigE1/62 + 10.0.0.122/31 + + + + tenGigE1/63 + 10.0.0.124/31 + + + + tenGigE1/64 + 10.0.0.126/31 + + + + tenGigE1/65 + 10.0.0.128/31 + + + + tenGigE1/66 + 10.0.0.130/31 + + + + tenGigE1/67 + 10.0.0.132/31 + + + + tenGigE1/68 + 10.0.0.134/31 + + + + tenGigE1/69 + 10.0.0.136/31 + + + + tenGigE1/70 + 10.0.0.138/31 + + + + tenGigE1/71 + 10.0.0.140/31 + + + + tenGigE1/72 + 10.0.0.142/31 + + + + tenGigE1/73 + 10.0.0.144/31 + + + + tenGigE1/74 + 10.0.0.146/31 + + + + tenGigE1/75 + 10.0.0.148/31 + + + + tenGigE1/76 + 10.0.0.150/31 + + + + tenGigE1/77 + 10.0.0.152/31 + + + + tenGigE1/78 + 10.0.0.154/31 + + + + tenGigE1/79 + 10.0.0.156/31 + + + + tenGigE1/80 + 10.0.0.158/31 + + + + tenGigE1/81 + 10.0.0.160/31 + + + + tenGigE1/82 + 10.0.0.162/31 + + + + tenGigE1/83 + 10.0.0.164/31 + + + + tenGigE1/84 + 10.0.0.166/31 + + + + tenGigE1/85 + 10.0.0.168/31 + + + + tenGigE1/86 + 10.0.0.170/31 + + + + tenGigE1/87 + 10.0.0.172/31 + + + + tenGigE1/88 + 10.0.0.174/31 + + + + tenGigE1/89 + 10.0.0.176/31 + + + + tenGigE1/90 + 10.0.0.178/31 + + + + tenGigE1/91 + 10.0.0.180/31 + + + + tenGigE1/92 + 10.0.0.182/31 + + + + tenGigE1/93 + 10.0.0.184/31 + + + + tenGigE1/94 + 10.0.0.186/31 + + + + tenGigE1/95 + 10.0.0.188/31 + + + + tenGigE1/96 + 10.0.0.190/31 + + + + fiftyGigE1/1 + 10.0.1.0/31 + + + + fiftyGigE1/2 + 10.0.1.2/31 + + + + fiftyGigE1/3 + 10.0.1.4/31 + + + + fiftyGigE1/4 + 10.0.1.6/31 + + + + fiftyGigE1/5 + 10.0.1.8/31 + + + + fiftyGigE1/6 + 10.0.1.10/31 + + + + fiftyGigE1/7 + 10.0.1.12/31 + + + + fiftyGigE1/8 + 10.0.1.14/31 + + + + fiftyGigE1/9 + 10.0.1.16/31 + + + + fiftyGigE1/10 + 10.0.1.18/31 + + + + fiftyGigE1/11 + 10.0.1.20/31 + + + + fiftyGigE1/12 + 10.0.1.22/31 + + + + fiftyGigE1/13 + 10.0.1.24/31 + + + + fiftyGigE1/14 + 10.0.1.26/31 + + + + fiftyGigE1/15 + 10.0.1.28/31 + + + + fiftyGigE1/16 + 10.0.1.30/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + tenGigE1/1 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/2 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/3 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/4 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/5 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/6 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/7 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/8 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/9 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/10 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/11 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/12 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/13 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/14 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/15 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/16 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/17 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/18 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/19 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/20 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/21 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/22 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/23 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/24 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/25 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/26 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/27 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/28 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/29 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/30 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/31 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + tenGigE1/32 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Seastone-DX010-10-50 + + + + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + switch1 + Seastone-DX010-10-50 + diff --git a/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/port_config.ini b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/port_config.ini new file mode 100644 index 000000000000..8ffb58f2aef0 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/port_config.ini @@ -0,0 +1,113 @@ +# name lanes alias +Ethernet0 65 tenGigE1/1 +Ethernet1 66 tenGigE1/2 +Ethernet2 67 tenGigE1/3 +Ethernet3 68 tenGigE1/4 +Ethernet4 69 tenGigE1/5 +Ethernet5 70 tenGigE1/6 +Ethernet6 71 tenGigE1/7 +Ethernet7 72 tenGigE1/8 +Ethernet8 73 tenGigE1/9 +Ethernet9 74 tenGigE1/10 +Ethernet10 75 tenGigE1/11 +Ethernet11 76 tenGigE1/12 +Ethernet12 77 tenGigE1/13 +Ethernet13 78 tenGigE1/14 +Ethernet14 79 tenGigE1/15 +Ethernet15 80 tenGigE1/16 +Ethernet16 33 tenGigE1/17 +Ethernet17 34 tenGigE1/18 +Ethernet18 35 tenGigE1/19 +Ethernet19 36 tenGigE1/20 +Ethernet20 37 tenGigE1/21 +Ethernet21 38 tenGigE1/22 +Ethernet22 39 tenGigE1/23 +Ethernet23 40 tenGigE1/24 +Ethernet24 41 tenGigE1/25 +Ethernet25 42 tenGigE1/26 +Ethernet26 43 tenGigE1/27 +Ethernet27 44 tenGigE1/28 +Ethernet28 45 tenGigE1/29 +Ethernet29 46 tenGigE1/30 +Ethernet30 47 tenGigE1/31 +Ethernet31 48 tenGigE1/32 +Ethernet32 49 tenGigE1/33 +Ethernet33 50 tenGigE1/34 +Ethernet34 51 tenGigE1/35 +Ethernet35 52 tenGigE1/36 +Ethernet36 53 tenGigE1/37 +Ethernet37 54 tenGigE1/38 +Ethernet38 55 tenGigE1/39 +Ethernet39 56 tenGigE1/40 +Ethernet40 57 tenGigE1/41 +Ethernet41 58 tenGigE1/42 +Ethernet42 59 tenGigE1/43 +Ethernet43 60 tenGigE1/44 +Ethernet44 61 tenGigE1/45 +Ethernet45 62 tenGigE1/46 +Ethernet46 63 tenGigE1/47 +Ethernet47 64 tenGigE1/48 +Ethernet48 81 tenGigE1/49 +Ethernet49 82 tenGigE1/50 +Ethernet50 83 tenGigE1/51 +Ethernet51 84 tenGigE1/52 +Ethernet52 85 tenGigE1/53 +Ethernet53 86 tenGigE1/54 +Ethernet54 87 tenGigE1/55 +Ethernet55 88 tenGigE1/56 +Ethernet56 89 tenGigE1/57 +Ethernet57 90 tenGigE1/58 +Ethernet58 91 tenGigE1/59 +Ethernet59 92 tenGigE1/60 +Ethernet60 93 tenGigE1/61 +Ethernet61 94 tenGigE1/62 +Ethernet62 95 tenGigE1/63 +Ethernet63 96 tenGigE1/64 +Ethernet64 97 tenGigE1/65 +Ethernet65 98 tenGigE1/66 +Ethernet66 99 tenGigE1/67 +Ethernet67 100 tenGigE1/68 +Ethernet68 101 tenGigE1/69 +Ethernet69 102 tenGigE1/70 +Ethernet70 103 tenGigE1/71 +Ethernet71 104 tenGigE1/72 +Ethernet72 105 tenGigE1/73 +Ethernet73 106 tenGigE1/74 +Ethernet74 107 tenGigE1/75 +Ethernet75 108 tenGigE1/76 +Ethernet76 109 tenGigE1/77 +Ethernet77 110 tenGigE1/78 +Ethernet78 111 tenGigE1/79 +Ethernet79 112 tenGigE1/80 +Ethernet80 1 tenGigE1/81 +Ethernet81 2 tenGigE1/82 +Ethernet82 3 tenGigE1/83 +Ethernet83 4 tenGigE1/84 +Ethernet84 5 tenGigE1/85 +Ethernet85 6 tenGigE1/86 +Ethernet86 7 tenGigE1/87 +Ethernet87 8 tenGigE1/88 +Ethernet88 9 tenGigE1/89 +Ethernet89 10 tenGigE1/90 +Ethernet90 11 tenGigE1/91 +Ethernet91 12 tenGigE1/92 +Ethernet92 13 tenGigE1/93 +Ethernet93 14 tenGigE1/94 +Ethernet94 15 tenGigE1/95 +Ethernet95 16 tenGigE1/96 +Ethernet96 17,18 fiftyGigE1/1 +Ethernet98 19,20 fiftyGigE1/2 +Ethernet100 21,22 fiftyGigE1/3 +Ethernet102 23,24 fiftyGigE1/4 +Ethernet104 25,26 fiftyGigE1/5 +Ethernet106 27,28 fiftyGigE1/6 +Ethernet108 29,30 fiftyGigE1/7 +Ethernet110 31,32 fiftyGigE1/8 +Ethernet112 113,114 fiftyGigE1/9 +Ethernet114 115,116 fiftyGigE1/10 +Ethernet116 117,118 fiftyGigE1/11 +Ethernet118 119,120 fiftyGigE1/12 +Ethernet120 121,122 fiftyGigE1/13 +Ethernet122 123,124 fiftyGigE1/14 +Ethernet124 125,126 fiftyGigE1/15 +Ethernet126 127,128 fiftyGigE1/16 diff --git a/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/sai.profile b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/sai.profile new file mode 100644 index 000000000000..b8652e10e4d9 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-10-50/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-seastone-dx010-96x10G-16x50G.config.bcm diff --git a/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/minigraph.xml b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/minigraph.xml new file mode 100644 index 000000000000..47dc749df6f5 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/minigraph.xml @@ -0,0 +1,1239 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + fiftyGigE1/1 + 10.0.0.0/31 + + + + fiftyGigE1/2 + 10.0.0.2/31 + + + + fiftyGigE1/3 + 10.0.0.4/31 + + + + fiftyGigE1/4 + 10.0.0.6/31 + + + + fiftyGigE1/5 + 10.0.0.8/31 + + + + fiftyGigE1/6 + 10.0.0.10/31 + + + + fiftyGigE1/7 + 10.0.0.12/31 + + + + fiftyGigE1/8 + 10.0.0.14/31 + + + + fiftyGigE1/9 + 10.0.0.16/31 + + + + fiftyGigE1/10 + 10.0.0.18/31 + + + + fiftyGigE1/11 + 10.0.0.20/31 + + + + fiftyGigE1/12 + 10.0.0.22/31 + + + + fiftyGigE1/13 + 10.0.0.24/31 + + + + fiftyGigE1/14 + 10.0.0.26/31 + + + + fiftyGigE1/15 + 10.0.0.28/31 + + + + fiftyGigE1/16 + 10.0.0.30/31 + + + + fiftyGigE1/17 + 10.0.0.32/31 + + + + fiftyGigE1/18 + 10.0.0.34/31 + + + + fiftyGigE1/19 + 10.0.0.36/31 + + + + fiftyGigE1/20 + 10.0.0.38/31 + + + + fiftyGigE1/21 + 10.0.0.40/31 + + + + fiftyGigE1/22 + 10.0.0.42/31 + + + + fiftyGigE1/23 + 10.0.0.44/31 + + + + fiftyGigE1/24 + 10.0.0.46/31 + + + + fiftyGigE1/25 + 10.0.0.48/31 + + + + fiftyGigE1/26 + 10.0.0.50/31 + + + + fiftyGigE1/27 + 10.0.0.52/31 + + + + fiftyGigE1/28 + 10.0.0.54/31 + + + + fiftyGigE1/29 + 10.0.0.56/31 + + + + fiftyGigE1/30 + 10.0.0.58/31 + + + + fiftyGigE1/31 + 10.0.0.60/31 + + + + fiftyGigE1/32 + 10.0.0.62/31 + + + + fiftyGigE1/33 + 10.0.0.64/31 + + + + fiftyGigE1/34 + 10.0.0.66/31 + + + + fiftyGigE1/35 + 10.0.0.68/31 + + + + fiftyGigE1/36 + 10.0.0.70/31 + + + + fiftyGigE1/37 + 10.0.0.72/31 + + + + fiftyGigE1/38 + 10.0.0.74/31 + + + + fiftyGigE1/39 + 10.0.0.76/31 + + + + fiftyGigE1/40 + 10.0.0.78/31 + + + + fiftyGigE1/41 + 10.0.0.80/31 + + + + fiftyGigE1/42 + 10.0.0.82/31 + + + + fiftyGigE1/43 + 10.0.0.84/31 + + + + fiftyGigE1/44 + 10.0.0.86/31 + + + + fiftyGigE1/45 + 10.0.0.88/31 + + + + fiftyGigE1/46 + 10.0.0.90/31 + + + + fiftyGigE1/47 + 10.0.0.92/31 + + + + fiftyGigE1/48 + 10.0.0.94/31 + + + + fiftyGigE1/49 + 10.0.0.96/31 + + + + fiftyGigE1/50 + 10.0.0.98/31 + + + + fiftyGigE1/51 + 10.0.0.100/31 + + + + fiftyGigE1/52 + 10.0.0.102/31 + + + + fiftyGigE1/53 + 10.0.0.104/31 + + + + fiftyGigE1/54 + 10.0.0.106/31 + + + + fiftyGigE1/55 + 10.0.0.108/31 + + + + fiftyGigE1/56 + 10.0.0.110/31 + + + + fiftyGigE1/57 + 10.0.0.112/31 + + + + fiftyGigE1/58 + 10.0.0.114/31 + + + + fiftyGigE1/59 + 10.0.0.116/31 + + + + fiftyGigE1/60 + 10.0.0.118/31 + + + + fiftyGigE1/61 + 10.0.0.120/31 + + + + fiftyGigE1/62 + 10.0.0.122/31 + + + + fiftyGigE1/63 + 10.0.0.124/31 + + + + fiftyGigE1/64 + 10.0.0.126/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + fiftyGigE1/1 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/2 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/3 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/4 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/5 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/6 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/7 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/8 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/9 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/10 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/11 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/12 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/13 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/14 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/15 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/16 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/17 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/18 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/19 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/20 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/21 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/22 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/23 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/24 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/25 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/26 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/27 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/28 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/29 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/30 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/31 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + fiftyGigE1/32 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Seastone-DX010-50 + + + + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + switch1 + Seastone-DX010-50 +
diff --git a/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/port_config.ini b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/port_config.ini new file mode 100644 index 000000000000..10ed3a14827e --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/port_config.ini @@ -0,0 +1,65 @@ +# name lanes alias +Ethernet0 65,66 fiftyGigE1/1 +Ethernet2 67,68 fiftyGigE1/2 +Ethernet4 69,70 fiftyGigE1/3 +Ethernet6 71,72 fiftyGigE1/4 +Ethernet8 73,74 fiftyGigE1/5 +Ethernet10 75,76 fiftyGigE1/6 +Ethernet12 77,78 fiftyGigE1/7 +Ethernet14 79,80 fiftyGigE1/8 +Ethernet16 33,34 fiftyGigE1/9 +Ethernet18 35,36 fiftyGigE1/10 +Ethernet20 37,38 fiftyGigE1/11 +Ethernet22 39,40 fiftyGigE1/12 +Ethernet24 41,42 fiftyGigE1/13 +Ethernet26 43,44 fiftyGigE1/14 +Ethernet28 45,46 fiftyGigE1/15 +Ethernet30 47,48 fiftyGigE1/16 +Ethernet32 49,50 fiftyGigE1/17 +Ethernet34 51,52 fiftyGigE1/18 +Ethernet36 53,54 fiftyGigE1/19 +Ethernet38 55,56 fiftyGigE1/20 +Ethernet40 57,58 fiftyGigE1/21 +Ethernet42 59,60 fiftyGigE1/22 +Ethernet44 61,62 fiftyGigE1/23 +Ethernet46 63,64 fiftyGigE1/24 +Ethernet48 81,82 fiftyGigE1/25 +Ethernet50 83,84 fiftyGigE1/26 +Ethernet52 85,86 fiftyGigE1/27 +Ethernet54 87,88 fiftyGigE1/28 +Ethernet56 89,90 fiftyGigE1/29 +Ethernet58 91,92 fiftyGigE1/30 +Ethernet60 93,94 fiftyGigE1/31 +Ethernet62 95,96 fiftyGigE1/32 +Ethernet64 97,98 fiftyGigE1/33 +Ethernet66 99,100 fiftyGigE1/34 +Ethernet68 101,102 fiftyGigE1/35 +Ethernet70 103,104 fiftyGigE1/36 +Ethernet72 105,106 fiftyGigE1/37 +Ethernet74 107,108 fiftyGigE1/38 +Ethernet76 109,110 fiftyGigE1/39 +Ethernet78 111,112 fiftyGigE1/40 +Ethernet80 1,2 fiftyGigE1/41 +Ethernet82 3,4 fiftyGigE1/42 +Ethernet84 5,6 fiftyGigE1/43 +Ethernet86 7,8 fiftyGigE1/44 +Ethernet88 9,10 fiftyGigE1/45 +Ethernet90 11,12 fiftyGigE1/46 +Ethernet92 13,14 fiftyGigE1/47 +Ethernet94 15,16 fiftyGigE1/48 +Ethernet96 17,18 fiftyGigE1/49 +Ethernet98 19,20 fiftyGigE1/50 +Ethernet100 21,22 fiftyGigE1/51 +Ethernet102 23,24 fiftyGigE1/52 +Ethernet104 25,26 fiftyGigE1/53 +Ethernet106 27,28 fiftyGigE1/54 +Ethernet108 29,30 fiftyGigE1/55 +Ethernet110 31,32 fiftyGigE1/56 +Ethernet112 113,114 fiftyGigE1/57 +Ethernet114 115,116 fiftyGigE1/58 +Ethernet116 117,118 fiftyGigE1/59 +Ethernet118 119,120 fiftyGigE1/60 +Ethernet120 121,122 fiftyGigE1/61 +Ethernet122 123,124 fiftyGigE1/62 +Ethernet124 125,126 fiftyGigE1/63 +Ethernet126 127,128 fiftyGigE1/64 diff --git a/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/sai.profile b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/sai.profile new file mode 100644 index 000000000000..ced857611967 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010-50/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-seastone-dx010-64x50G.config.bcm diff --git a/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/minigraph.xml b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/minigraph.xml new file mode 100644 index 000000000000..921839b0d72d --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/minigraph.xml @@ -0,0 +1,1079 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + hundredGigE1/1 + 10.0.0.0/31 + + + + hundredGigE1/2 + 10.0.0.2/31 + + + + hundredGigE1/3 + 10.0.0.4/31 + + + + hundredGigE1/4 + 10.0.0.6/31 + + + + hundredGigE1/5 + 10.0.0.8/31 + + + + hundredGigE1/6 + 10.0.0.10/31 + + + + hundredGigE1/7 + 10.0.0.12/31 + + + + hundredGigE1/8 + 10.0.0.14/31 + + + + hundredGigE1/9 + 10.0.0.16/31 + + + + hundredGigE1/10 + 10.0.0.18/31 + + + + hundredGigE1/11 + 10.0.0.20/31 + + + + hundredGigE1/12 + 10.0.0.22/31 + + + + hundredGigE1/13 + 10.0.0.24/31 + + + + hundredGigE1/14 + 10.0.0.26/31 + + + + hundredGigE1/15 + 10.0.0.28/31 + + + + hundredGigE1/16 + 10.0.0.30/31 + + + + hundredGigE1/17 + 10.0.0.32/31 + + + + hundredGigE1/18 + 10.0.0.34/31 + + + + hundredGigE1/19 + 10.0.0.36/31 + + + + hundredGigE1/20 + 10.0.0.38/31 + + + + hundredGigE1/21 + 10.0.0.40/31 + + + + hundredGigE1/22 + 10.0.0.42/31 + + + + hundredGigE1/23 + 10.0.0.44/31 + + + + hundredGigE1/24 + 10.0.0.46/31 + + + + hundredGigE1/25 + 10.0.0.48/31 + + + + hundredGigE1/26 + 10.0.0.50/31 + + + + hundredGigE1/27 + 10.0.0.52/31 + + + + hundredGigE1/28 + 10.0.0.54/31 + + + + hundredGigE1/29 + 10.0.0.56/31 + + + + hundredGigE1/30 + 10.0.0.58/31 + + + + hundredGigE1/31 + 10.0.0.60/31 + + + + hundredGigE1/32 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + hundredGigE1/1 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/2 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/3 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/4 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/5 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/6 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/7 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/8 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/9 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/10 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/11 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/12 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/13 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/14 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/15 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/16 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/17 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/18 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/19 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/20 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/21 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/22 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/23 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/24 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/25 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/26 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/27 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/28 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/29 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/30 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/31 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/32 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Seastone-DX010 + + + + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + switch1 + Seastone-DX010 +
diff --git a/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/port_config.ini b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/port_config.ini new file mode 100644 index 000000000000..5336dbdb5509 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 65,66,67,68 hundredGigE1/1 +Ethernet4 69,70,71,72 hundredGigE1/2 +Ethernet8 73,74,75,76 hundredGigE1/3 +Ethernet12 77,78,79,80 hundredGigE1/4 +Ethernet16 33,34,35,36 hundredGigE1/5 +Ethernet20 37,38,39,40 hundredGigE1/6 +Ethernet24 41,42,43,44 hundredGigE1/7 +Ethernet28 45,46,47,48 hundredGigE1/8 +Ethernet32 49,50,51,52 hundredGigE1/9 +Ethernet36 53,54,55,56 hundredGigE1/10 +Ethernet40 57,58,59,60 hundredGigE1/11 +Ethernet44 61,62,63,64 hundredGigE1/12 +Ethernet48 81,82,83,84 hundredGigE1/13 +Ethernet52 85,86,87,88 hundredGigE1/14 +Ethernet56 89,90,91,92 hundredGigE1/15 +Ethernet60 93,94,95,96 hundredGigE1/16 +Ethernet64 97,98,99,100 hundredGigE1/17 +Ethernet68 101,102,103,104 hundredGigE1/18 +Ethernet72 105,106,107,108 hundredGigE1/19 +Ethernet76 109,110,111,112 hundredGigE1/20 +Ethernet80 1,2,3,4 hundredGigE1/21 +Ethernet84 5,6,7,8 hundredGigE1/22 +Ethernet88 9,10,11,12 hundredGigE1/23 +Ethernet92 13,14,15,16 hundredGigE1/24 +Ethernet96 17,18,19,20 hundredGigE1/25 +Ethernet100 21,22,23,24 hundredGigE1/26 +Ethernet104 25,26,27,28 hundredGigE1/27 +Ethernet108 29,30,31,32 hundredGigE1/28 +Ethernet112 113,114,115,116 hundredGigE1/29 +Ethernet116 117,118,119,120 hundredGigE1/30 +Ethernet120 121,122,123,124 hundredGigE1/31 +Ethernet124 125,126,127,128 hundredGigE1/32 diff --git a/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/sai.profile b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/sai.profile new file mode 100644 index 000000000000..8db218c89a52 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/Seastone-DX010/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-seastone-dx010-32x100G.config.bcm diff --git a/device/celestica/x86_64-cel_seastone-r0/fancontrol b/device/celestica/x86_64-cel_seastone-r0/fancontrol new file mode 100644 index 000000000000..ba3010c7c9cc --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/fancontrol @@ -0,0 +1,12 @@ +# Configuration file generated by pwmconfig, changes will be lost +INTERVAL=10 +DEVPATH=hwmon6=devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-002e hwmon7=devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-004d +DEVNAME=hwmon6=emc2305 hwmon7=emc2305 +FCTEMPS=hwmon6/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-5/5-0048/hwmon/hwmon1/temp1_input hwmon6/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-5/5-0048/hwmon/hwmon1/temp1_input hwmon6/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-5/5-0048/hwmon/hwmon1/temp1_input hwmon6/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-5/5-0048/hwmon/hwmon1/temp1_input hwmon6/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-5/5-0048/hwmon/hwmon1/temp1_input hwmon6/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-6/6-0049/hwmon/hwmon2/temp1_input hwmon6/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-6/6-0049/hwmon/hwmon2/temp1_input hwmon6/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-6/6-0049/hwmon/hwmon2/temp1_input hwmon6/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-6/6-0049/hwmon/hwmon2/temp1_input hwmon6/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-6/6-0049/hwmon/hwmon2/temp1_input hwmon6/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-7/7-004a/hwmon/hwmon3/temp1_input hwmon6/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-7/7-004a/hwmon/hwmon3/temp1_input hwmon6/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-7/7-004a/hwmon/hwmon3/temp1_input hwmon6/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-7/7-004a/hwmon/hwmon3/temp1_input hwmon6/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-7/7-004a/hwmon/hwmon3/temp1_input hwmon6/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-14/14-0048/hwmon/hwmon4/temp1_input hwmon6/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-14/14-0048/hwmon/hwmon4/temp1_input hwmon6/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-14/14-0048/hwmon/hwmon4/temp1_input hwmon6/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-14/14-0048/hwmon/hwmon4/temp1_input hwmon6/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-14/14-0048/hwmon/hwmon4/temp1_input hwmon6/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-15/15-004e/hwmon/hwmon5/temp1_input hwmon6/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-15/15-004e/hwmon/hwmon5/temp1_input hwmon6/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-15/15-004e/hwmon/hwmon5/temp1_input hwmon6/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-15/15-004e/hwmon/hwmon5/temp1_input hwmon6/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-15/15-004e/hwmon/hwmon5/temp1_input hwmon7/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-5/5-0048/hwmon/hwmon1/temp1_input hwmon7/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-5/5-0048/hwmon/hwmon1/temp1_input hwmon7/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-5/5-0048/hwmon/hwmon1/temp1_input hwmon7/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-5/5-0048/hwmon/hwmon1/temp1_input hwmon7/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-5/5-0048/hwmon/hwmon1/temp1_input hwmon7/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-6/6-0049/hwmon/hwmon2/temp1_input hwmon7/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-6/6-0049/hwmon/hwmon2/temp1_input hwmon7/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-6/6-0049/hwmon/hwmon2/temp1_input hwmon7/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-6/6-0049/hwmon/hwmon2/temp1_input hwmon7/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-6/6-0049/hwmon/hwmon2/temp1_input hwmon7/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-7/7-004a/hwmon/hwmon3/temp1_input hwmon7/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-7/7-004a/hwmon/hwmon3/temp1_input hwmon7/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-7/7-004a/hwmon/hwmon3/temp1_input hwmon7/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-7/7-004a/hwmon/hwmon3/temp1_input hwmon7/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-7/7-004a/hwmon/hwmon3/temp1_input hwmon7/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-14/14-0048/hwmon/hwmon4/temp1_input hwmon7/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-14/14-0048/hwmon/hwmon4/temp1_input hwmon7/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-14/14-0048/hwmon/hwmon4/temp1_input hwmon7/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-14/14-0048/hwmon/hwmon4/temp1_input hwmon7/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-14/14-0048/hwmon/hwmon4/temp1_input hwmon7/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-15/15-004e/hwmon/hwmon5/temp1_input hwmon7/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-15/15-004e/hwmon/hwmon5/temp1_input hwmon7/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-15/15-004e/hwmon/hwmon5/temp1_input hwmon7/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-15/15-004e/hwmon/hwmon5/temp1_input hwmon7/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-15/15-004e/hwmon/hwmon5/temp1_input +FCFANS= hwmon7/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-004d/pwm5 hwmon7/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-004d/pwm4 hwmon7/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-004d/pwm3 hwmon7/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-004d/pwm2 hwmon7/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-004d/pwm1 hwmon6/device/pwm5=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-002e/pwm5 hwmon6/device/pwm4=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-002e/pwm4 hwmon6/device/pwm3=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-002e/pwm3 hwmon6/device/pwm2=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-002e/pwm2 hwmon6/device/pwm1=/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-13/13-002e/pwm1 +MINTEMP=hwmon6/device/pwm1=25 hwmon6/device/pwm2=25 hwmon6/device/pwm3=25 hwmon6/device/pwm4=25 hwmon6/device/pwm5=25 hwmon7/device/pwm1=25 hwmon7/device/pwm2=25 hwmon7/device/pwm3=25 hwmon7/device/pwm4=25 hwmon7/device/pwm5=25 +MAXTEMP=hwmon6/device/pwm1=40 hwmon6/device/pwm2=40 hwmon6/device/pwm3=40 hwmon6/device/pwm4=40 hwmon6/device/pwm5=40 hwmon7/device/pwm1=40 hwmon7/device/pwm2=40 hwmon7/device/pwm3=40 hwmon7/device/pwm4=40 hwmon7/device/pwm5=40 +MINSTART=hwmon6/device/pwm1=75 hwmon6/device/pwm2=75 hwmon6/device/pwm3=75 hwmon6/device/pwm4=75 hwmon6/device/pwm5=75 hwmon7/device/pwm1=75 hwmon7/device/pwm2=75 hwmon7/device/pwm3=75 hwmon7/device/pwm4=75 hwmon7/device/pwm5=75 +MINSTOP=hwmon6/device/pwm1=50 hwmon6/device/pwm2=50 hwmon6/device/pwm3=50 hwmon6/device/pwm4=50 hwmon6/device/pwm5=50 hwmon7/device/pwm1=50 hwmon7/device/pwm2=50 hwmon7/device/pwm3=50 hwmon7/device/pwm4=50 hwmon7/device/pwm5=50 +MINPWM=hwmon6/device/pwm1=50 hwmon6/device/pwm2=50 hwmon6/device/pwm3=50 hwmon6/device/pwm4=50 hwmon6/device/pwm5=50 hwmon7/device/pwm1=50 hwmon7/device/pwm2=50 hwmon7/device/pwm3=50 hwmon7/device/pwm4=50 hwmon7/device/pwm5=50 +MAXPWM=hwmon6/device/pwm1=255 hwmon6/device/pwm2=255 hwmon6/device/pwm3=255 hwmon6/device/pwm4=255 hwmon6/device/pwm5=255 hwmon7/device/pwm1=255 hwmon7/device/pwm2=255 hwmon7/device/pwm3=255 hwmon7/device/pwm4=255 hwmon7/device/pwm5=255 diff --git a/device/celestica/x86_64-cel_seastone-r0/installer.conf b/device/celestica/x86_64-cel_seastone-r0/installer.conf new file mode 100644 index 000000000000..925a32fc0c3a --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/celestica/x86_64-cel_seastone-r0/led-code/ledcode0 b/device/celestica/x86_64-cel_seastone-r0/led-code/ledcode0 new file mode 100755 index 000000000000..df26e4abd679 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/led-code/ledcode0 @@ -0,0 +1,13 @@ +02 20 28 67 72 12 30 80 D1 74 02 02 00 28 67 72 +12 20 80 D1 74 0D 02 30 28 67 72 02 31 28 67 72 +02 32 28 67 72 02 33 28 67 72 02 34 28 67 72 02 +35 28 67 72 02 36 28 67 72 02 37 28 67 72 02 38 +28 67 72 02 39 28 67 72 02 3A 28 67 72 02 3B 28 +67 72 02 3C 28 67 72 02 3D 28 67 72 02 3E 28 67 +72 02 3F 28 67 72 12 E0 85 05 D2 05 71 70 52 00 +3A 80 67 98 75 B0 77 78 67 9F 75 7E 77 8B 28 67 +A6 75 B6 16 E0 DA 04 74 B0 77 B6 28 67 A6 75 B3 +16 E0 DA 04 74 B0 77 B3 12 A0 F8 15 1A 00 57 12 +A0 F8 15 1A 01 57 28 32 00 32 01 B7 97 77 AF 57 +67 B9 57 67 C7 57 67 C0 57 32 0F 87 32 0F 87 57 +32 0F 87 32 0E 87 57 32 0E 87 32 0E 87 57 00 00 diff --git a/device/celestica/x86_64-cel_seastone-r0/led-code/ledcode1 b/device/celestica/x86_64-cel_seastone-r0/led-code/ledcode1 new file mode 100755 index 000000000000..df26e4abd679 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/led-code/ledcode1 @@ -0,0 +1,13 @@ +02 20 28 67 72 12 30 80 D1 74 02 02 00 28 67 72 +12 20 80 D1 74 0D 02 30 28 67 72 02 31 28 67 72 +02 32 28 67 72 02 33 28 67 72 02 34 28 67 72 02 +35 28 67 72 02 36 28 67 72 02 37 28 67 72 02 38 +28 67 72 02 39 28 67 72 02 3A 28 67 72 02 3B 28 +67 72 02 3C 28 67 72 02 3D 28 67 72 02 3E 28 67 +72 02 3F 28 67 72 12 E0 85 05 D2 05 71 70 52 00 +3A 80 67 98 75 B0 77 78 67 9F 75 7E 77 8B 28 67 +A6 75 B6 16 E0 DA 04 74 B0 77 B6 28 67 A6 75 B3 +16 E0 DA 04 74 B0 77 B3 12 A0 F8 15 1A 00 57 12 +A0 F8 15 1A 01 57 28 32 00 32 01 B7 97 77 AF 57 +67 B9 57 67 C7 57 67 C0 57 32 0F 87 32 0F 87 57 +32 0F 87 32 0E 87 57 32 0E 87 32 0E 87 57 00 00 diff --git a/device/celestica/x86_64-cel_seastone-r0/led-code/ledcode2 b/device/celestica/x86_64-cel_seastone-r0/led-code/ledcode2 new file mode 100755 index 000000000000..9e30d9d28fb6 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/led-code/ledcode2 @@ -0,0 +1,8 @@ +02 01 28 67 16 02 01 28 67 16 12 E0 85 05 D2 05 +71 14 52 00 3A 04 67 3C 75 54 77 1C 67 43 75 22 +77 2F 28 67 4A 75 57 16 E0 DA 04 74 54 77 57 28 +67 4A 75 57 16 E0 DA 04 74 54 77 57 12 A0 F8 15 +1A 00 57 12 A0 F8 15 1A 01 57 28 32 00 32 01 B7 +97 77 53 57 67 5D 57 67 6B 57 67 64 57 32 0F 87 +32 0F 87 57 32 0E 87 32 0F 87 57 32 0E 87 32 0E +87 57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 diff --git a/device/celestica/x86_64-cel_seastone-r0/led_proc_init.soc b/device/celestica/x86_64-cel_seastone-r0/led_proc_init.soc new file mode 100755 index 000000000000..fb898fcadfc1 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/led_proc_init.soc @@ -0,0 +1,11 @@ + +# Download LED code into LED processor and enable (if applicable). + +led 0 load /usr/share/sonic/platform/led-code/ledcode0; +led 0 auto on; led 0 start; +led 1 load /usr/share/sonic/platform/led-code/ledcode1; +led 1 auto on; led 1 start; +led 2 load /usr/share/sonic/platform/led-code/ledcode2; +led 2 auto on; led 2 start + + diff --git a/device/celestica/x86_64-cel_seastone-r0/minigraph.xml b/device/celestica/x86_64-cel_seastone-r0/minigraph.xml new file mode 100644 index 000000000000..921839b0d72d --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/minigraph.xml @@ -0,0 +1,1079 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + hundredGigE1/1 + 10.0.0.0/31 + + + + hundredGigE1/2 + 10.0.0.2/31 + + + + hundredGigE1/3 + 10.0.0.4/31 + + + + hundredGigE1/4 + 10.0.0.6/31 + + + + hundredGigE1/5 + 10.0.0.8/31 + + + + hundredGigE1/6 + 10.0.0.10/31 + + + + hundredGigE1/7 + 10.0.0.12/31 + + + + hundredGigE1/8 + 10.0.0.14/31 + + + + hundredGigE1/9 + 10.0.0.16/31 + + + + hundredGigE1/10 + 10.0.0.18/31 + + + + hundredGigE1/11 + 10.0.0.20/31 + + + + hundredGigE1/12 + 10.0.0.22/31 + + + + hundredGigE1/13 + 10.0.0.24/31 + + + + hundredGigE1/14 + 10.0.0.26/31 + + + + hundredGigE1/15 + 10.0.0.28/31 + + + + hundredGigE1/16 + 10.0.0.30/31 + + + + hundredGigE1/17 + 10.0.0.32/31 + + + + hundredGigE1/18 + 10.0.0.34/31 + + + + hundredGigE1/19 + 10.0.0.36/31 + + + + hundredGigE1/20 + 10.0.0.38/31 + + + + hundredGigE1/21 + 10.0.0.40/31 + + + + hundredGigE1/22 + 10.0.0.42/31 + + + + hundredGigE1/23 + 10.0.0.44/31 + + + + hundredGigE1/24 + 10.0.0.46/31 + + + + hundredGigE1/25 + 10.0.0.48/31 + + + + hundredGigE1/26 + 10.0.0.50/31 + + + + hundredGigE1/27 + 10.0.0.52/31 + + + + hundredGigE1/28 + 10.0.0.54/31 + + + + hundredGigE1/29 + 10.0.0.56/31 + + + + hundredGigE1/30 + 10.0.0.58/31 + + + + hundredGigE1/31 + 10.0.0.60/31 + + + + hundredGigE1/32 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + hundredGigE1/1 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/2 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/3 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/4 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/5 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/6 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/7 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/8 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/9 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/10 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/11 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/12 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/13 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/14 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/15 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/16 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/17 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/18 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/19 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/20 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/21 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/22 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/23 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/24 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/25 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/26 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/27 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/28 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/29 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/30 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/31 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/32 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Seastone-DX010 + + + + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + switch1 + Seastone-DX010 +
diff --git a/device/celestica/x86_64-cel_seastone-r0/plugins/eeprom.py b/device/celestica/x86_64-cel_seastone-r0/plugins/eeprom.py new file mode 100644 index 000000000000..29f01a07fc73 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/plugins/eeprom.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica DX010 +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-12/12-0050/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/celestica/x86_64-cel_seastone-r0/plugins/sfputil.py b/device/celestica/x86_64-cel_seastone-r0/plugins/sfputil.py new file mode 100644 index 000000000000..f3943e734b58 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/plugins/sfputil.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + port_to_eeprom_mapping = {} + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' + for x in range(self.port_start, self.port_end + 1): + self.port_to_eeprom_mapping[x] = eeprom_path.format( x + 26 ) + sfputilbase.__init__(self, port_num) diff --git a/device/celestica/x86_64-cel_seastone-r0/sensors.conf b/device/celestica/x86_64-cel_seastone-r0/sensors.conf new file mode 100644 index 000000000000..eaaeeacfc44c --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/sensors.conf @@ -0,0 +1,12 @@ +# libsensors configuration file +chip "dps460-*" + ignore fan2 + ignore fan3 + +chip "dx010_lm75b-*" + set temp1_max 43 + set temp1_max_hyst 28 + +chip "lm75b-*" + set temp1_max 43 + set temp1_max_hyst 28 From 2201bf3496d4a848585d4dad25f19282d5b6e64e Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 19 Jul 2017 23:21:03 -0700 Subject: [PATCH 0681/1011] [docker-ptf]: Install yaml module for python (#821) * Install yaml python module in docker-ptf container --- dockers/docker-ptf/Dockerfile.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 3304ff643bb8..899bba45c47f 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -84,6 +84,7 @@ RUN rm -rf /debs \ && pip install paramiko \ && pip install flask \ && pip install exabgp==3.4.17\ + && pip install pyaml \ && mkdir -p /opt \ && cd /opt \ && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py From 0805f2f42ee90b7d2d88d1a40198d889565b8ed1 Mon Sep 17 00:00:00 2001 From: celestica-abhisit Date: Fri, 21 Jul 2017 22:02:20 +0700 Subject: [PATCH 0682/1011] [platform/Seastone]: Update sonic-platform-modules-cel git-submodule. (#825) --- platform/broadcom/sonic-platform-modules-cel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-cel b/platform/broadcom/sonic-platform-modules-cel index 983b298ef65f..514e76c2296f 160000 --- a/platform/broadcom/sonic-platform-modules-cel +++ b/platform/broadcom/sonic-platform-modules-cel @@ -1 +1 @@ -Subproject commit 983b298ef65f994728e250ab5744914b6f27b454 +Subproject commit 514e76c2296fa3c7736f6cabbe429f1070b3bcac From b1f5f83bf8f51343fc462369d0e8d24d822e5b1b Mon Sep 17 00:00:00 2001 From: Pradchaya P Date: Fri, 21 Jul 2017 22:47:06 +0700 Subject: [PATCH 0683/1011] Update label of temperature sensors. (#823) --- .../x86_64-cel_seastone-r0/sensors.conf | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/device/celestica/x86_64-cel_seastone-r0/sensors.conf b/device/celestica/x86_64-cel_seastone-r0/sensors.conf index eaaeeacfc44c..f7e89e58cd2e 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sensors.conf +++ b/device/celestica/x86_64-cel_seastone-r0/sensors.conf @@ -3,10 +3,27 @@ chip "dps460-*" ignore fan2 ignore fan3 -chip "dx010_lm75b-*" +chip "dx010_lm75b-i2c-5-48" + label temp1 "CPU Board Temp" set temp1_max 43 set temp1_max_hyst 28 -chip "lm75b-*" +chip "dx010_lm75b-i2c-15-4e" + label temp1 "CPU Board Temp" + set temp1_max 43 + set temp1_max_hyst 28 + +chip "dx010_lm75b-i2c-6-49" + label temp1 "Main Board Temp" + set temp1_max 43 + set temp1_max_hyst 28 + +chip "dx010_lm75b-i2c-7-4a" + label temp1 "Main Board Temp" + set temp1_max 43 + set temp1_max_hyst 28 + +chip "dx010_lm75b-i2c-14-48" + label temp1 "Main Board Temp" set temp1_max 43 set temp1_max_hyst 28 From cd601650bfab12edee4887826d5cd611ed6f207c Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Fri, 21 Jul 2017 19:05:21 +0300 Subject: [PATCH 0684/1011] [slave.mk]: Use host timestamp for online targets. (#826) By default, wget tries to use timestamp received from the server. This behavior messes up make dependencies which are also based on last modification time. In order to avoid this, we use the current time as a timestamp to keep dependencies in correct order. Signed-off-by: marian-pritsak --- slave.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slave.mk b/slave.mk index 0d953d52c924..4bd158da7187 100644 --- a/slave.mk +++ b/slave.mk @@ -130,7 +130,7 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_COPY_FILES)) : $(DEBS_PATH)/% : .platform $(addprefix $(DEBS_PATH)/, $(SONIC_ONLINE_DEBS)) : $(DEBS_PATH)/% : .platform $(HEADER) $(foreach deb,$* $($*_DERIVED_DEBS), \ - { wget -O $(DEBS_PATH)/$(deb) $($(deb)_URL) $(LOG) || exit 1 ; } ; ) + { wget --no-use-server-timestamps -O $(DEBS_PATH)/$(deb) $($(deb)_URL) $(LOG) || exit 1 ; } ; ) $(FOOTER) # Download regular files from online location @@ -141,7 +141,7 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_ONLINE_DEBS)) : $(DEBS_PATH)/% : .platform # SONIC_ONLINE_FILES += $(SOME_NEW_FILE) $(addprefix $(DEBS_PATH)/, $(SONIC_ONLINE_FILES)) : $(DEBS_PATH)/% : .platform $(HEADER) - wget -O $@ $($*_URL) $(LOG) + wget --no-use-server-timestamps -O $@ $($*_URL) $(LOG) $(FOOTER) ############################################################################### From bc4ee143405378cedcdc8f6d7c9a1308f53e7f5e Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 24 Jul 2017 10:52:51 +0300 Subject: [PATCH 0685/1011] [Makefile]: Automatically deduce pseudo-TTY option (#830) Signed-off-by: marian-pritsak --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5cf5f53ac3ce..33f2df19e520 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ SLAVE_IMAGE = sonic-slave-$(USER) DOCKER_RUN := docker run --rm=true --privileged \ -v $(PWD):/sonic \ - -i$(SONIC_SLAVE_TTY) + -i$(if $(TERM),t,) DOCKER_BUILD = docker build --no-cache \ --build-arg user=$(USER) \ From 7cf84791820fcce666ae3f5ebe76360911a72b35 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Mon, 24 Jul 2017 12:29:36 +0300 Subject: [PATCH 0686/1011] [Makefile]: Set build directory as docker workdir (#832) Signed-off-by: marian-pritsak --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 33f2df19e520..8742e329f07c 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,7 @@ SLAVE_IMAGE = sonic-slave-$(USER) DOCKER_RUN := docker run --rm=true --privileged \ -v $(PWD):/sonic \ + -w /sonic \ -i$(if $(TERM),t,) DOCKER_BUILD = docker build --no-cache \ @@ -34,7 +35,6 @@ DOCKER_BUILD = docker build --no-cache \ { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ $(DOCKER_BUILD) ; } @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) make \ - -C sonic \ -f slave.mk \ PLATFORM=$(PLATFORM) \ BUILD_NUMBER=$(BUILD_NUMBER) \ From 7ba0230088243e4929e593fad50dafe112e89c6a Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Mon, 24 Jul 2017 12:48:19 +0300 Subject: [PATCH 0687/1011] [submodule] update sonic-swss submodule (#833) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 456cb1e62033..27c49a0bf3a7 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 456cb1e620335ac88efddafc256a3a21b518fa7a +Subproject commit 27c49a0bf3a71556b553aa30fe2a7c1cdb996142 From 40f1e53fd0d7044e7b725eb16faca078191b5a38 Mon Sep 17 00:00:00 2001 From: Pradchaya P Date: Mon, 24 Jul 2017 23:42:28 +0700 Subject: [PATCH 0688/1011] [device/celestica] Label more chip sensors in DX010 model. (#834) --- .../x86_64-cel_seastone-r0/sensors.conf | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/device/celestica/x86_64-cel_seastone-r0/sensors.conf b/device/celestica/x86_64-cel_seastone-r0/sensors.conf index f7e89e58cd2e..93a0fd6db762 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sensors.conf +++ b/device/celestica/x86_64-cel_seastone-r0/sensors.conf @@ -1,29 +1,44 @@ -# libsensors configuration file -chip "dps460-*" +# libsensors configuration file for Celestica DX010. +# The i2c bus portion is omit because adapter name +# changes every time when system boot up. + +chip "dps460-i2c-*-5a" + label temp1 "Power Supply 1 temp sensor 1" + label temp2 "Power Supply 1 temp sensor 2" + label temp3 "Power Supply 1 temp sensor 3" ignore fan2 ignore fan3 -chip "dx010_lm75b-i2c-5-48" - label temp1 "CPU Board Temp" +chip "dps460-i2c-*-5b" + label temp1 "Power Supply 2 temp sensor 1" + label temp2 "Power Supply 2 temp sensor 2" + label temp3 "Power Supply 2 temp sensor 3" + ignore fan2 + ignore fan3 + +# These sensors located on Main Switch Board. +chip "dx010_lm75b-i2c-*-48" + label temp1 "Front-panel temp sensor 1" set temp1_max 43 set temp1_max_hyst 28 -chip "dx010_lm75b-i2c-15-4e" - label temp1 "CPU Board Temp" +chip "dx010_lm75b-i2c-*-49" + label temp1 "Front-panel temp sensor 2" set temp1_max 43 set temp1_max_hyst 28 -chip "dx010_lm75b-i2c-6-49" - label temp1 "Main Board Temp" +chip "dx010_lm75b-i2c-*-4a" + label temp1 "ASIC temp sensor" set temp1_max 43 set temp1_max_hyst 28 -chip "dx010_lm75b-i2c-7-4a" - label temp1 "Main Board Temp" +# These sensors located on CPU Board. +chip "dx010_lm75b-i2c-*-48" + label temp1 "Rear-panel temp sensor 1" set temp1_max 43 set temp1_max_hyst 28 -chip "dx010_lm75b-i2c-14-48" - label temp1 "Main Board Temp" +chip "dx010_lm75b-i2c-*-4e" + label temp1 "Rear-panel temp sensor 2" set temp1_max 43 - set temp1_max_hyst 28 + set temp1_max_hyst 28 \ No newline at end of file From d898011b2ec9eb5fb16ff13d40b73f1b4c31d4e4 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 24 Jul 2017 13:36:40 -0700 Subject: [PATCH 0689/1011] [docker-ptf]: Update entrypoint entry for docker-ptf (#836) * Updated entrypoint for docker-ptf container * Add main supervisord.conf file under /etc/supervisor. Run supervisord with option -c --- dockers/docker-ptf/Dockerfile.j2 | 7 +++-- .../docker-ptf/{ => conf.d}/ptf_nn_agent.conf | 0 dockers/docker-ptf/{ => conf.d}/sshd.conf | 0 dockers/docker-ptf/conf.d/supervisord.conf | 2 ++ dockers/docker-ptf/supervisord.conf | 28 ++++++++++++++++++- 5 files changed, 34 insertions(+), 3 deletions(-) rename dockers/docker-ptf/{ => conf.d}/ptf_nn_agent.conf (100%) rename dockers/docker-ptf/{ => conf.d}/sshd.conf (100%) create mode 100644 dockers/docker-ptf/conf.d/supervisord.conf diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 899bba45c47f..1d1231d9418e 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -96,8 +96,11 @@ RUN mkdir /var/run/sshd \ && sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config \ && sed -i '$aUseDNS no' /etc/ssh/sshd_config -COPY ["supervisord.conf", "sshd.conf", "ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] +COPY ["supervisord.conf", "/etc/supervisor/"] +COPY ["conf.d/supervisord.conf", "conf.d/sshd.conf", "conf.d/ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] + +RUN mkdir -p /var/log/supervisor EXPOSE 22 -ENTRYPOINT ["/usr/bin/supervisord"] +ENTRYPOINT ["/usr/local/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] diff --git a/dockers/docker-ptf/ptf_nn_agent.conf b/dockers/docker-ptf/conf.d/ptf_nn_agent.conf similarity index 100% rename from dockers/docker-ptf/ptf_nn_agent.conf rename to dockers/docker-ptf/conf.d/ptf_nn_agent.conf diff --git a/dockers/docker-ptf/sshd.conf b/dockers/docker-ptf/conf.d/sshd.conf similarity index 100% rename from dockers/docker-ptf/sshd.conf rename to dockers/docker-ptf/conf.d/sshd.conf diff --git a/dockers/docker-ptf/conf.d/supervisord.conf b/dockers/docker-ptf/conf.d/supervisord.conf new file mode 100644 index 000000000000..54296b8b254e --- /dev/null +++ b/dockers/docker-ptf/conf.d/supervisord.conf @@ -0,0 +1,2 @@ +[supervisord] +nodaemon=true diff --git a/dockers/docker-ptf/supervisord.conf b/dockers/docker-ptf/supervisord.conf index 54296b8b254e..9c236612d25c 100644 --- a/dockers/docker-ptf/supervisord.conf +++ b/dockers/docker-ptf/supervisord.conf @@ -1,2 +1,28 @@ +; supervisor config file + +[unix_http_server] +file=/var/run/supervisor.sock ; (the path to the socket file) +chmod=0700 ; sockef file mode (default 0700) + [supervisord] -nodaemon=true +logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) +pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) +childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP) + +; the below section must remain in the config file for RPC +; (supervisorctl/web interface) to work, additional interfaces may be +; added by defining them in separate rpcinterface: sections +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket + +; The [include] section can just contain the "files" setting. This +; setting can list multiple files (separated by whitespace or +; newlines). It can also contain wildcards. The filenames are +; interpreted as relative to this file. Included files *cannot* +; include files themselves. + +[include] +files = /etc/supervisor/conf.d/*.conf From f136334c7250df6b4ce2d9acf3a7124b92c5dfa7 Mon Sep 17 00:00:00 2001 From: kaiyu22 Date: Tue, 25 Jul 2017 08:56:48 +0800 Subject: [PATCH 0690/1011] [platform]: Update LED for Ingrasys platforms (#831) * Update LED for S9100-32X * Add LED for S8900-54XC and S8900-64XC Signed-off-by: Sam Yang --- .../led_proc_init.soc | 43 ++++++++++++ .../led_proc_init.soc | 43 ++++++++++++ .../led_proc_init.soc | 70 +++++++++---------- 3 files changed, 121 insertions(+), 35 deletions(-) create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/led_proc_init.soc create mode 100644 device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/led_proc_init.soc diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/led_proc_init.soc b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/led_proc_init.soc new file mode 100644 index 000000000000..8eef1389abc8 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/led_proc_init.soc @@ -0,0 +1,43 @@ +# LED microprocessor initialization for Ingrasys S8900-54XC + +led 0 stop +led 0 prog 12 00 61 F1 12 10 61 F2 12 01 61 F3 12 01 61 F4 67 28 12 10 61 F1 12 05 61 F2 12 04 61 F3 12 04 61 F4 67 28 86 F0 77 86 96 F2 2E F1 67 3D 67 51 16 F3 FE F1 61 F1 12 00 DE F2 74 28 57 2E F1 32 00 32 01 B7 97 75 4C 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 6A 77 5A 06 FE D2 01 70 62 77 78 06 F0 C2 08 74 6A 77 78 16 F4 91 22 0E 87 22 0E 87 DA 00 74 6C 57 16 F4 91 22 0E 87 22 0F 87 DA 00 74 7A 57 02 48 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=36 REMAP_PORT_2=37 REMAP_PORT_1=38 REMAP_PORT_0=39 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=40 REMAP_PORT_6=41 REMAP_PORT_5=42 REMAP_PORT_4=43 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=12 REMAP_PORT_10=13 REMAP_PORT_9=14 REMAP_PORT_8=15 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=44 REMAP_PORT_14=45 REMAP_PORT_13=46 REMAP_PORT_12=47 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=48 REMAP_PORT_18=49 REMAP_PORT_17=50 REMAP_PORT_16=51 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=8 REMAP_PORT_22=9 REMAP_PORT_21=10 REMAP_PORT_20=11 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=4 REMAP_PORT_26=5 REMAP_PORT_25=6 REMAP_PORT_24=7 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=0 REMAP_PORT_30=1 REMAP_PORT_29=2 REMAP_PORT_28=3 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=52 REMAP_PORT_34=53 REMAP_PORT_33=54 REMAP_PORT_32=55 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=56 REMAP_PORT_38=57 REMAP_PORT_37=58 REMAP_PORT_36=59 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=32 REMAP_PORT_42=33 REMAP_PORT_41=34 REMAP_PORT_40=35 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=59 REMAP_PORT_46=60 REMAP_PORT_45=61 REMAP_PORT_44=62 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=28 REMAP_PORT_50=29 REMAP_PORT_49=30 REMAP_PORT_48=31 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=24 REMAP_PORT_54=25 REMAP_PORT_53=26 REMAP_PORT_52=27 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=20 REMAP_PORT_58=21 REMAP_PORT_57=22 REMAP_PORT_56=23 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=16 REMAP_PORT_62=17 REMAP_PORT_61=18 REMAP_PORT_60=19 +led 0 auto on +led 0 start + +led 1 stop +led 1 prog 12 00 61 F1 12 20 61 F2 12 01 61 F3 12 01 61 F4 67 28 12 20 61 F1 12 01 61 F2 12 04 61 F3 12 04 61 F4 67 28 86 F0 77 86 96 F2 2E F1 67 3D 67 51 16 F3 FE F1 61 F1 12 00 DE F2 74 28 57 2E F1 32 00 32 01 B7 97 75 4C 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 6A 77 5A 06 FE D2 01 70 62 77 78 06 F0 C2 08 74 6A 77 78 16 F4 91 22 0E 87 22 0E 87 DA 00 74 6C 57 16 F4 91 22 0E 87 22 0F 87 DA 00 74 7A 57 02 48 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=0 REMAP_PORT_2=1 REMAP_PORT_1=2 REMAP_PORT_0=3 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=4 REMAP_PORT_6=5 REMAP_PORT_5=6 REMAP_PORT_4=7 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=8 REMAP_PORT_10=9 REMAP_PORT_9=10 REMAP_PORT_8=11 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=36 REMAP_PORT_14=37 REMAP_PORT_13=38 REMAP_PORT_12=39 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=12 REMAP_PORT_18=13 REMAP_PORT_17=14 REMAP_PORT_16=15 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=16 REMAP_PORT_22=17 REMAP_PORT_21=18 REMAP_PORT_20=19 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=40 REMAP_PORT_26=41 REMAP_PORT_25=42 REMAP_PORT_24=43 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=44 REMAP_PORT_30=45 REMAP_PORT_29=46 REMAP_PORT_28=47 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=20 REMAP_PORT_34=21 REMAP_PORT_33=22 REMAP_PORT_32=23 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=24 REMAP_PORT_38=25 REMAP_PORT_37=26 REMAP_PORT_36=27 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=48 REMAP_PORT_42=49 REMAP_PORT_41=50 REMAP_PORT_40=51 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=52 REMAP_PORT_46=53 REMAP_PORT_45=54 REMAP_PORT_44=55 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=28 REMAP_PORT_50=29 REMAP_PORT_49=30 REMAP_PORT_48=31 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=32 REMAP_PORT_54=33 REMAP_PORT_53=34 REMAP_PORT_52=35 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=56 REMAP_PORT_58=57 REMAP_PORT_57=58 REMAP_PORT_56=59 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=60 REMAP_PORT_62=61 REMAP_PORT_61=62 REMAP_PORT_60=63 +led 1 auto on +led 1 start diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/led_proc_init.soc b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/led_proc_init.soc new file mode 100644 index 000000000000..6a1f4f2c1ea6 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/led_proc_init.soc @@ -0,0 +1,43 @@ +# LED microprocessor initialization for Ingrasys S8900-64XC + +led 0 stop +led 0 prog 12 00 61 F1 12 20 61 F2 12 01 61 F3 12 01 61 F4 67 28 12 20 61 F1 12 04 61 F2 12 04 61 F3 12 01 61 F4 67 28 86 F0 77 86 96 F2 2E F1 67 3D 67 51 16 F3 FE F1 61 F1 12 00 DE F2 74 28 57 2E F1 32 00 32 01 B7 97 75 4C 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 6A 77 5A 06 FE D2 01 70 62 77 78 06 F0 C2 08 74 6A 77 78 16 F4 91 22 0E 87 22 0E 87 DA 00 74 6C 57 16 F4 91 22 0E 87 22 0F 87 DA 00 74 7A 57 02 48 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=28 REMAP_PORT_2=29 REMAP_PORT_1=30 REMAP_PORT_0=31 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=24 REMAP_PORT_6=25 REMAP_PORT_5=26 REMAP_PORT_4=27 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=20 REMAP_PORT_10=21 REMAP_PORT_9=22 REMAP_PORT_8=19 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=16 REMAP_PORT_14=17 REMAP_PORT_13=18 REMAP_PORT_12=23 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=12 REMAP_PORT_18=13 REMAP_PORT_17=14 REMAP_PORT_16=15 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=8 REMAP_PORT_22=9 REMAP_PORT_21=10 REMAP_PORT_20=11 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=4 REMAP_PORT_26=5 REMAP_PORT_25=6 REMAP_PORT_24=7 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=0 REMAP_PORT_30=1 REMAP_PORT_29=2 REMAP_PORT_28=3 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=60 REMAP_PORT_34=61 REMAP_PORT_33=62 REMAP_PORT_32=63 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=56 REMAP_PORT_38=57 REMAP_PORT_37=58 REMAP_PORT_36=59 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=52 REMAP_PORT_42=53 REMAP_PORT_41=54 REMAP_PORT_40=55 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=48 REMAP_PORT_46=49 REMAP_PORT_45=50 REMAP_PORT_44=51 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=44 REMAP_PORT_50=45 REMAP_PORT_49=46 REMAP_PORT_48=47 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=40 REMAP_PORT_54=41 REMAP_PORT_53=42 REMAP_PORT_52=43 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=36 REMAP_PORT_58=37 REMAP_PORT_57=38 REMAP_PORT_56=39 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=32 REMAP_PORT_62=33 REMAP_PORT_61=34 REMAP_PORT_60=35 +led 0 auto on +led 0 start + +led 1 stop +led 1 prog 12 00 61 F1 12 10 61 F2 12 01 61 F3 12 01 61 F4 67 28 12 10 61 F1 12 0C 61 F2 12 04 61 F3 12 01 61 F4 67 28 86 F0 77 86 96 F2 2E F1 67 3D 67 51 16 F3 FE F1 61 F1 12 00 DE F2 74 28 57 2E F1 32 00 32 01 B7 97 75 4C 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 6A 77 5A 06 FE D2 01 70 62 77 78 06 F0 C2 08 74 6A 77 78 16 F4 91 22 0E 87 22 0E 87 DA 00 74 6C 57 16 F4 91 22 0E 87 22 0F 87 DA 00 74 7A 57 02 38 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=0 REMAP_PORT_2=1 REMAP_PORT_1=2 REMAP_PORT_0=3 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=4 REMAP_PORT_6=5 REMAP_PORT_5=6 REMAP_PORT_4=7 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=8 REMAP_PORT_10=9 REMAP_PORT_9=10 REMAP_PORT_8=11 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=12 REMAP_PORT_14=13 REMAP_PORT_13=14 REMAP_PORT_12=15 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=16 REMAP_PORT_18=17 REMAP_PORT_17=18 REMAP_PORT_16=19 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=20 REMAP_PORT_22=21 REMAP_PORT_21=22 REMAP_PORT_20=23 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=24 REMAP_PORT_26=25 REMAP_PORT_25=26 REMAP_PORT_24=27 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=28 REMAP_PORT_30=29 REMAP_PORT_29=30 REMAP_PORT_28=31 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=32 REMAP_PORT_34=33 REMAP_PORT_33=34 REMAP_PORT_32=35 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=36 REMAP_PORT_38=37 REMAP_PORT_37=38 REMAP_PORT_36=39 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=40 REMAP_PORT_42=41 REMAP_PORT_41=42 REMAP_PORT_40=43 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=44 REMAP_PORT_46=45 REMAP_PORT_45=46 REMAP_PORT_44=47 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=48 REMAP_PORT_50=49 REMAP_PORT_49=50 REMAP_PORT_48=51 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=52 REMAP_PORT_54=53 REMAP_PORT_53=54 REMAP_PORT_52=55 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=56 REMAP_PORT_58=57 REMAP_PORT_57=58 REMAP_PORT_56=59 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=60 REMAP_PORT_62=61 REMAP_PORT_61=62 REMAP_PORT_60=63 +led 1 auto on +led 1 start diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/led_proc_init.soc b/device/ingrasys/x86_64-ingrasys_s9100-r0/led_proc_init.soc index f3afa2c61899..492d3b897851 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/led_proc_init.soc +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/led_proc_init.soc @@ -1,43 +1,43 @@ -# LED microprocessor initialization for Ingrasys S9100 C32 +# LED microprocessor initialization for Ingrasys S9100-32X led 0 stop -led 0 prog 02 04 D2 01 74 0A 12 40 77 0C 12 00 02 04 D2 01 74 14 EA 03 29 61 F1 67 35 74 1F 67 54 67 7C 02 04 D2 01 74 2C 91 DA 00 74 0C 77 31 81 DA 40 74 0C 86 F0 77 CF 06 FD D2 00 70 51 D2 01 74 43 67 A6 77 51 D2 03 74 4B 67 AD 77 51 D2 02 74 51 67 B4 D2 00 57 02 A0 F1 04 D2 01 70 5E 77 68 01 C2 FC 77 69 01 C2 FE 77 69 01 28 32 00 32 01 B7 97 75 77 02 01 60 FE 57 02 00 60 FE 57 02 A0 F1 04 D2 01 70 96 77 A6 06 FE D2 01 70 8E 77 AD 06 F0 C2 08 74 A6 77 AD 06 FE D2 01 70 9E 77 B4 06 F0 C2 08 74 A6 77 B4 22 0E 87 22 0E 87 57 22 0F 87 22 0E 87 57 22 0E 87 22 0F 87 22 0E 87 22 0F 87 22 0E 87 22 0F 87 22 0E 87 22 0F 87 FA 03 57 02 04 D2 01 70 D9 02 80 77 DB 02 20 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=0x1f REMAP_PORT_1=0x1e REMAP_PORT_2=0x1d REMAP_PORT_3=0x1c -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=0x1b REMAP_PORT_5=0x1a REMAP_PORT_6=0x19 REMAP_PORT_7=0x18 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=0x17 REMAP_PORT_9=0x16 REMAP_PORT_10=0x15 REMAP_PORT_11=0x14 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=0x13 REMAP_PORT_13=0x12 REMAP_PORT_14=0x11 REMAP_PORT_15=0x10 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=0xf REMAP_PORT_17=0xe REMAP_PORT_18=0xd REMAP_PORT_19=0xc -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=0xb REMAP_PORT_21=0xa REMAP_PORT_22=0x9 REMAP_PORT_23=0x8 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=0x7 REMAP_PORT_25=0x6 REMAP_PORT_26=0x5 REMAP_PORT_27=0x4 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=0x3 REMAP_PORT_29=0x2 REMAP_PORT_30=0x1 REMAP_PORT_31=0x0 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=0x3f REMAP_PORT_33=0x3e REMAP_PORT_34=0x3d REMAP_PORT_35=0x3c -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=0x3b REMAP_PORT_37=0x3a REMAP_PORT_38=0x39 REMAP_PORT_39=0x38 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=0x37 REMAP_PORT_41=0x36 REMAP_PORT_42=0x35 REMAP_PORT_43=0x34 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=0x33 REMAP_PORT_45=0x32 REMAP_PORT_46=0x31 REMAP_PORT_47=0x30 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=0x2f REMAP_PORT_49=0x2e REMAP_PORT_50=0x2d REMAP_PORT_51=0x2c -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=0x2b REMAP_PORT_53=0x2a REMAP_PORT_54=0x29 REMAP_PORT_55=0x28 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=0x27 REMAP_PORT_57=0x26 REMAP_PORT_58=0x25 REMAP_PORT_59=0x24 -modreg CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=0x23 REMAP_PORT_61=0x22 REMAP_PORT_62=0x21 REMAP_PORT_63=0x20 +led 0 prog 12 00 61 F1 12 10 61 F2 12 04 61 F3 12 04 61 F4 67 16 86 F0 77 74 96 F2 2E F1 67 2B 67 3F 16 F3 FE F1 61 F1 12 00 DE F2 74 16 57 2E F1 32 00 32 01 B7 97 75 3A 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 58 77 48 06 FE D2 01 70 50 77 66 06 F0 C2 08 74 58 77 66 16 F4 91 22 0E 87 22 0E 87 DA 00 74 5A 57 16 F4 91 22 0E 87 22 0F 87 DA 00 74 68 57 02 80 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=28 REMAP_PORT_2=29 REMAP_PORT_1=30 REMAP_PORT_0=31 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=24 REMAP_PORT_6=25 REMAP_PORT_5=26 REMAP_PORT_4=27 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=20 REMAP_PORT_10=21 REMAP_PORT_9=22 REMAP_PORT_8=23 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=16 REMAP_PORT_14=17 REMAP_PORT_13=18 REMAP_PORT_12=19 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=12 REMAP_PORT_18=13 REMAP_PORT_17=14 REMAP_PORT_16=15 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=8 REMAP_PORT_22=9 REMAP_PORT_21=10 REMAP_PORT_20=11 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=4 REMAP_PORT_26=5 REMAP_PORT_25=6 REMAP_PORT_24=7 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=0 REMAP_PORT_30=1 REMAP_PORT_29=2 REMAP_PORT_28=3 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=60 REMAP_PORT_34=61 REMAP_PORT_33=62 REMAP_PORT_32=63 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=56 REMAP_PORT_38=57 REMAP_PORT_37=58 REMAP_PORT_36=59 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=52 REMAP_PORT_42=53 REMAP_PORT_41=54 REMAP_PORT_40=55 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=48 REMAP_PORT_46=49 REMAP_PORT_45=50 REMAP_PORT_44=51 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=44 REMAP_PORT_50=45 REMAP_PORT_49=46 REMAP_PORT_48=47 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=40 REMAP_PORT_54=41 REMAP_PORT_53=42 REMAP_PORT_52=43 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=36 REMAP_PORT_58=37 REMAP_PORT_57=38 REMAP_PORT_56=39 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=32 REMAP_PORT_62=33 REMAP_PORT_61=34 REMAP_PORT_60=35 led 0 auto on led 0 start led 1 stop -led 1 prog 02 04 D2 01 74 0A 12 40 77 0C 12 00 02 04 D2 01 74 14 EA 03 29 61 F1 67 35 74 1F 67 54 67 7E 02 04 D2 01 74 2C 91 DA 00 74 0C 77 31 81 DA 40 74 0C 86 F0 77 D1 06 FD D2 00 70 51 D2 01 74 43 67 A8 77 51 D2 03 74 4B 67 AF 77 51 D2 02 74 51 67 B6 D2 00 57 02 A0 F1 04 D2 01 70 5E 77 68 01 C2 FC 77 69 01 C2 FE 77 69 01 F2 03 28 32 00 32 01 B7 97 75 79 02 01 60 FE 57 02 00 60 FE 57 02 A0 F1 04 D2 01 70 98 77 A8 06 FE D2 01 70 90 77 AF 06 F0 C2 08 74 A8 77 AF 06 FE D2 01 70 A0 77 B6 06 F0 C2 08 74 A8 77 B6 22 0E 87 22 0E 87 57 22 0F 87 22 0E 87 57 22 0E 87 22 0F 87 22 0E 87 22 0F 87 22 0E 87 22 0F 87 22 0E 87 22 0F 87 FA 03 57 02 04 D2 01 70 DB 02 80 77 DD 02 20 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=0x0 REMAP_PORT_1=0x1 REMAP_PORT_2=0x2 REMAP_PORT_3=0x3 -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=0x4 REMAP_PORT_5=0x5 REMAP_PORT_6=0x6 REMAP_PORT_7=0x7 -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=0x8 REMAP_PORT_9=0x9 REMAP_PORT_10=0xa REMAP_PORT_11=0xb -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=0xc REMAP_PORT_13=0xd REMAP_PORT_14=0xe REMAP_PORT_15=0xf -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=0x10 REMAP_PORT_17=0x11 REMAP_PORT_18=0x12 REMAP_PORT_19=0x13 -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=0x14 REMAP_PORT_21=0x15 REMAP_PORT_22=0x16 REMAP_PORT_23=0x17 -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=0x18 REMAP_PORT_25=0x19 REMAP_PORT_26=0x1a REMAP_PORT_27=0x1b -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=0x1c REMAP_PORT_29=0x1d REMAP_PORT_30=0x1e REMAP_PORT_31=0x1f -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=0x20 REMAP_PORT_33=0x21 REMAP_PORT_34=0x22 REMAP_PORT_35=0x23 -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=0x24 REMAP_PORT_37=0x25 REMAP_PORT_38=0x26 REMAP_PORT_39=0x27 -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=0x28 REMAP_PORT_41=0x29 REMAP_PORT_42=0x2a REMAP_PORT_43=0x2b -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=0x2c REMAP_PORT_45=0x2d REMAP_PORT_46=0x2e REMAP_PORT_47=0x2f -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=0x30 REMAP_PORT_49=0x31 REMAP_PORT_50=0x32 REMAP_PORT_51=0x33 -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=0x34 REMAP_PORT_53=0x35 REMAP_PORT_54=0x36 REMAP_PORT_55=0x37 -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=0x38 REMAP_PORT_57=0x39 REMAP_PORT_58=0x3a REMAP_PORT_59=0x3b -modreg CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=0x3c REMAP_PORT_61=0x3d REMAP_PORT_62=0x3e REMAP_PORT_63=0x3f +led 1 prog 12 00 61 F1 12 10 61 F2 12 04 61 F3 12 04 61 F4 67 16 86 F0 77 74 96 F2 2E F1 67 2B 67 3F 16 F3 FE F1 61 F1 12 00 DE F2 74 16 57 2E F1 32 00 32 01 B7 97 75 3A 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 58 77 48 06 FE D2 01 70 50 77 66 06 F0 C2 08 74 58 77 66 16 F4 91 22 0E 87 22 0E 87 DA 00 74 5A 57 16 F4 91 22 0E 87 22 0F 87 DA 00 74 68 57 02 80 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=0 REMAP_PORT_2=1 REMAP_PORT_1=2 REMAP_PORT_0=3 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=4 REMAP_PORT_6=5 REMAP_PORT_5=6 REMAP_PORT_4=7 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=8 REMAP_PORT_10=9 REMAP_PORT_9=10 REMAP_PORT_8=11 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=12 REMAP_PORT_14=13 REMAP_PORT_13=14 REMAP_PORT_12=15 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=16 REMAP_PORT_18=17 REMAP_PORT_17=18 REMAP_PORT_16=19 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=20 REMAP_PORT_22=21 REMAP_PORT_21=22 REMAP_PORT_20=23 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=24 REMAP_PORT_26=25 REMAP_PORT_25=26 REMAP_PORT_24=27 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=28 REMAP_PORT_30=29 REMAP_PORT_29=30 REMAP_PORT_28=31 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=32 REMAP_PORT_34=33 REMAP_PORT_33=34 REMAP_PORT_32=35 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=36 REMAP_PORT_38=37 REMAP_PORT_37=38 REMAP_PORT_36=39 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=40 REMAP_PORT_42=41 REMAP_PORT_41=42 REMAP_PORT_40=43 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=44 REMAP_PORT_46=45 REMAP_PORT_45=46 REMAP_PORT_44=47 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=48 REMAP_PORT_50=49 REMAP_PORT_49=50 REMAP_PORT_48=51 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=52 REMAP_PORT_54=53 REMAP_PORT_53=54 REMAP_PORT_52=55 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=56 REMAP_PORT_58=57 REMAP_PORT_57=58 REMAP_PORT_56=59 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=60 REMAP_PORT_62=61 REMAP_PORT_61=62 REMAP_PORT_60=63 led 1 auto on led 1 start From 7d95fd7e8c30eb6c94706c4ff3a2df330dd0ee90 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 25 Jul 2017 09:49:39 +0300 Subject: [PATCH 0691/1011] [rules/functions][slave.mk]: Refine build output (#838) Print current build configuration before run Update screen with currently running targets (only available if TERM is available) Change format of printed targets Signed-off-by: marian-pritsak --- rules/config | 10 ------ rules/functions | 23 +++---------- slave.mk | 24 ++++++++----- update_screen.sh | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 36 deletions(-) create mode 100755 update_screen.sh diff --git a/rules/config b/rules/config index 66f936c1fa03..5403c981f170 100644 --- a/rules/config +++ b/rules/config @@ -2,10 +2,6 @@ ## Configuration parameters for SONiC build system ############################################################################### -# SONIC_CONFIG_VERBOSE - enable echoing for rules commands. -# Uncomment next line to enable: -# SONIC_CONFIG_VERBOSE = y - # SONIC_CONFIG_PRINT_DEPENDENCIES - show dependencies for each invoked target. # Before executing rule for each target its dependencies are printed to console. # Uncomment next line to enable: @@ -21,12 +17,6 @@ SONIC_CONFIG_BUILD_JOBS = 1 # container. SONIC_CONFIG_MAKE_JOBS = $(shell nproc) -# SONIC_CONFIG_LOG_TO_FILES - print output from execution of rule for each -# target into separate log file under target/log/. -# Useful when executing parallel build -# Uncomment next line to enable: -SONIC_CONFIG_LOG_TO_FILES = y - # SONIC_CONFIG_ENABLE_COLORS - enable colored output in build system. # Comment next line to disable: # SONIC_CONFIG_ENABLE_COLORS = y diff --git a/rules/functions b/rules/functions index 4379d85c9ed8..93e2a346274e 100644 --- a/rules/functions +++ b/rules/functions @@ -41,43 +41,30 @@ log_green = echo -e "$(GREEN)$(1)$(GRAY)" ## Logging ############################################################################### -ifeq ($(SONIC_CONFIG_LOG_TO_FILES),y) FLUSH_LOG = rm -f $@.log -LOG = &>> $(PROJECT_ROOT)/$@.log || { [ $$? -eq 0 ] || cat $(PROJECT_ROOT)/$@.log ; false ; } -endif +LOG = &>> $(PROJECT_ROOT)/$@.log || { [ $$? -eq 0 ] || pushd $(PROJECT_ROOT) > /dev/null ; ./update_screen.sh -e $@ ; popd > /dev/null ; false ; } ############################################################################### ## Header and footer for each target ############################################################################### -# Print name of target being built -PRINT_TARGET = $(call log_purple,Executing rules for $@) - -# Print name of target that finished build -PRINT_END_TARGET = $(call log_green,Finished $@) - # Dump targets taht current depends on ifeq ($(SONIC_CONFIG_PRINT_DEPENDENCIES),y) -PRINT_DEPENDENCIES = $(call log_blue,Dependencies for $@ are $^) -endif - -# Enable verbose mode -ifneq ($(SONIC_CONFIG_VERBOSE),y) -ENABLE_VERBOSE = @ +PRINT_DEPENDENCIES = echo Dependencies for $@ are $^ $(LOG) endif # header for each rule define HEADER -$(ENABLE_VERBOSE) -$(PRINT_TARGET) +@ $(PRINT_DEPENDENCIES) $(FLUSH_LOG) +./update_screen.sh -a $@ endef # footer for each rule define FOOTER -$(PRINT_END_TARGET) +./update_screen.sh -d $@ endef ############################################################################### diff --git a/slave.mk b/slave.mk index 4bd158da7187..abd7458bd98c 100644 --- a/slave.mk +++ b/slave.mk @@ -80,13 +80,21 @@ export SONIC_CONFIG_MAKE_JOBS ## Dumping key config attributes associated to current building exercise ############################################################################### -ifndef $(CONFIGURED_PLATFORM) -$(info CONFIGURED_PLATFORM is $(CONFIGURED_PLATFORM)) -endif - -ifndef $(SONIC_ROUTING_STACK) -$(info ROUTING_STACK is $(SONIC_ROUTING_STACK)) -endif +$(info SONiC Build System) +$(info ) +$(info Build Configuration) +$(info "CONFIGURED_PLATFORM" : "$(if $(PLATFORM),$(PLATFORM),$(CONFIGURED_PLATFORM))") +$(info "SONIC_CONFIG_PRINT_DEPENDENCIES" : "$(SONIC_CONFIG_PRINT_DEPENDENCIES)") +$(info "SONIC_CONFIG_BUILD_JOBS" : "$(SONIC_CONFIG_BUILD_JOBS)") +$(info "SONIC_CONFIG_MAKE_JOBS" : "$(SONIC_CONFIG_MAKE_JOBS)") +$(info "DEFAULT_USERNAME" : "$(DEFAULT_USERNAME)") +$(info "DEFAULT_PASSWORD" : "$(DEFAULT_PASSWORD)") +$(info "ENABLE_DHCP_GRAPH_SERVICE" : "$(ENABLE_DHCP_GRAPH_SERVICE)") +$(info "SHUTDOWN_BGP_ON_START" : "$(SHUTDOWN_BGP_ON_START)") +$(info "SONIC_CONFIG_DEBUG" : "$(SONIC_CONFIG_DEBUG)") +$(info "ROUTING_STACK" : "$(SONIC_ROUTING_STACK)") +$(info "ENABLE_SYNCD_RPC" : "$(ENABLE_SYNCD_RPC)") +$(info ) ############################################################################### ## Generic rules section @@ -241,7 +249,7 @@ SONIC_INSTALL_TARGETS = $(addsuffix -install,$(addprefix $(DEBS_PATH)/, \ $(SONIC_EXTRA_DEBS))) $(SONIC_INSTALL_TARGETS) : $(DEBS_PATH)/%-install : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) $(DEBS_PATH)/$$* $(HEADER) - [ -f $(DEBS_PATH)/$* ] || { echo $(DEBS_PATH)/$* does not exist $(LOG) && exit 1; } + [ -f $(DEBS_PATH)/$* ] || { echo $(DEBS_PATH)/$* does not exist $(LOG) && false $(LOG) } # put a lock here because dpkg does not allow installing packages in parallel while true; do if mkdir $(DEBS_PATH)/dpkg_lock &> /dev/null; then diff --git a/update_screen.sh b/update_screen.sh new file mode 100755 index 000000000000..de54774cc6c6 --- /dev/null +++ b/update_screen.sh @@ -0,0 +1,88 @@ +#!/bin/bash + +lockfile .screen + +target_list_file=/tmp/target_list +touch ${target_list_file} + +function scroll_up { +# Check if TERM is available +[[ "${TERM}" == "dumb" ]] && return + +for i in $(cat ${target_list_file}); do + tput cuu1 + tput el +done +} + +function print_targets { +# Check if TERM is available +[[ "${TERM}" == "dumb" ]] && return + +count=1 +for i in $(cat ${target_list_file}); do + printf "[ %02d ] [ %s ]\n" "${count}" "$i" + ((count++)) +done +} + +function remove_target { +# Check if TERM is available +[[ "${TERM}" == "dumb" ]] && echo "[ finished ] [ $1 ] " && return + +old_list=$(cat ${target_list_file}) +rm ${target_list_file} +for target in ${old_list}; do + if [[ "${target}" != "$1" ]]; then + echo ${target} >> ${target_list_file} + fi +done +touch ${target_list_file} +} + +function add_target { +# Check if TERM is available +[[ "${TERM}" == "dumb" ]] && echo "[ building ] [ $1 ] " && return + +echo $1 >> ${target_list_file} +} + +function print_targets_delay { +sleep 2 && print_targets && rm -f .screen & +exit 0 +} + +while getopts ":a:d:e:" opt; do + case $opt in + a) + scroll_up + add_target ${OPTARG} + print_targets + ;; + d) + scroll_up + remove_target ${OPTARG} + print_targets + ;; + e) + scroll_up + remove_target ${OPTARG} + echo "[ FAIL LOG START ] [ ${OPTARG} ]" + cat ${OPTARG}.log + echo "[ FAIL LOG END ] [ ${OPTARG} ]" + print_targets_delay + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + rm -f .screen + exit 1 + ;; + :) + echo "Option -$OPTARG requires an argument." >&2 + rm -f .screen + exit 1 + ;; + esac +done + +rm -f .screen From c1fd0b1ae578670d4621ee99fd1ba85fcf4c162b Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Tue, 25 Jul 2017 10:05:27 +0300 Subject: [PATCH 0692/1011] [orchagent]: Export platform information before orchagent run. (#835) Export platform information in environment to be able to write vendor specific code. --- dockers/docker-orchagent/orchagent.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index 8dc1b859ee25..328ce8fc053d 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -1,5 +1,9 @@ #!/usr/bin/env bash +# Export platform information. Required to be able to write +# vendor specific code. +export platform=`sonic-cfggen -m /etc/sonic/minigraph.xml -v onie_switch_asic` + ASIC=`sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type` MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` From 4d5420b8652298d7005fdd9bf23ac74bfba6fe01 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 25 Jul 2017 07:09:23 -0700 Subject: [PATCH 0693/1011] [minigraph]: Ignore eth0 IPv6 addresses (#841) - IPv6 is not supported on management interface - Add unit test --- src/sonic-config-engine/minigraph.py | 3 + .../tests/sample_output/interfaces | 259 ++++++++++++++++++ .../tests/t0-sample-graph.xml | 8 + src/sonic-config-engine/tests/test_j2files.py | 5 +- 4 files changed, 273 insertions(+), 2 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample_output/interfaces diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 1fd16f376fab..65738a0508f5 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -188,6 +188,9 @@ def parse_dpg(dpg, hname): for mgmtintf in mgmtintfs.findall(str(QName(ns1, "ManagementIPInterface"))): ipprefix = mgmtintf.find(str(QName(ns1, "PrefixStr"))).text mgmtipn = ipaddress.IPNetwork(ipprefix) + # Ignore IPv6 management address + if mgmtipn.version == 6: + continue ipaddr = mgmtipn.ip prefix_len = str(mgmtipn.prefixlen) ipmask = mgmtipn.netmask diff --git a/src/sonic-config-engine/tests/sample_output/interfaces b/src/sonic-config-engine/tests/sample_output/interfaces new file mode 100644 index 000000000000..5c57bf8fac85 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/interfaces @@ -0,0 +1,259 @@ +# +# =============== Managed by SONiC Config Engine DO NOT EDIT! =============== +# generated from /usr/share/sonic/templates/interfaces.j2 using sonic-cfggen +# file: /etc/network/interfaces +# +# The loopback network interface +auto lo +iface lo inet loopback +# Use command 'ip addr list dev lo' to check all addresses +iface lo inet static + address 10.1.0.32 + netmask 255.255.255.255 +# +iface lo inet6 static + address fc00:1::32 + netmask 128 +# +# The management network interface +auto eth0 +iface eth0 inet static + address 10.0.0.100 + netmask 255.255.255.0 + ########## management network policy routing rules + # management port up rules + up ip route add default via 10.0.0.1 dev eth0 table default + up ip rule add from 10.0.0.100/32 table default + # management port down rules + down ip route delete default via 10.0.0.1 dev eth0 table default + down ip rule delete from 10.0.0.100/32 table default +# +# The switch front panel interfaces +# "|| true" is added to suppress the error when interface is already a member of VLAN +allow-hotplug fortyGigE0/4 +iface fortyGigE0/4 inet manual + pre-up ifconfig fortyGigE0/4 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/4 || true + post-down ifconfig fortyGigE0/4 down +# +allow-hotplug fortyGigE0/8 +iface fortyGigE0/8 inet manual + pre-up ifconfig fortyGigE0/8 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/8 || true + post-down ifconfig fortyGigE0/8 down +# +allow-hotplug fortyGigE0/12 +iface fortyGigE0/12 inet manual + pre-up ifconfig fortyGigE0/12 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/12 || true + post-down ifconfig fortyGigE0/12 down +# +allow-hotplug fortyGigE0/16 +iface fortyGigE0/16 inet manual + pre-up ifconfig fortyGigE0/16 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/16 || true + post-down ifconfig fortyGigE0/16 down +# +allow-hotplug fortyGigE0/20 +iface fortyGigE0/20 inet manual + pre-up ifconfig fortyGigE0/20 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/20 || true + post-down ifconfig fortyGigE0/20 down +# +allow-hotplug fortyGigE0/24 +iface fortyGigE0/24 inet manual + pre-up ifconfig fortyGigE0/24 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/24 || true + post-down ifconfig fortyGigE0/24 down +# +allow-hotplug fortyGigE0/28 +iface fortyGigE0/28 inet manual + pre-up ifconfig fortyGigE0/28 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/28 || true + post-down ifconfig fortyGigE0/28 down +# +allow-hotplug fortyGigE0/32 +iface fortyGigE0/32 inet manual + pre-up ifconfig fortyGigE0/32 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/32 || true + post-down ifconfig fortyGigE0/32 down +# +allow-hotplug fortyGigE0/36 +iface fortyGigE0/36 inet manual + pre-up ifconfig fortyGigE0/36 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/36 || true + post-down ifconfig fortyGigE0/36 down +# +allow-hotplug fortyGigE0/40 +iface fortyGigE0/40 inet manual + pre-up ifconfig fortyGigE0/40 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/40 || true + post-down ifconfig fortyGigE0/40 down +# +allow-hotplug fortyGigE0/44 +iface fortyGigE0/44 inet manual + pre-up ifconfig fortyGigE0/44 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/44 || true + post-down ifconfig fortyGigE0/44 down +# +allow-hotplug fortyGigE0/48 +iface fortyGigE0/48 inet manual + pre-up ifconfig fortyGigE0/48 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/48 || true + post-down ifconfig fortyGigE0/48 down +# +allow-hotplug fortyGigE0/52 +iface fortyGigE0/52 inet manual + pre-up ifconfig fortyGigE0/52 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/52 || true + post-down ifconfig fortyGigE0/52 down +# +allow-hotplug fortyGigE0/56 +iface fortyGigE0/56 inet manual + pre-up ifconfig fortyGigE0/56 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/56 || true + post-down ifconfig fortyGigE0/56 down +# +allow-hotplug fortyGigE0/60 +iface fortyGigE0/60 inet manual + pre-up ifconfig fortyGigE0/60 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/60 || true + post-down ifconfig fortyGigE0/60 down +# +allow-hotplug fortyGigE0/64 +iface fortyGigE0/64 inet manual + pre-up ifconfig fortyGigE0/64 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/64 || true + post-down ifconfig fortyGigE0/64 down +# +allow-hotplug fortyGigE0/68 +iface fortyGigE0/68 inet manual + pre-up ifconfig fortyGigE0/68 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/68 || true + post-down ifconfig fortyGigE0/68 down +# +allow-hotplug fortyGigE0/72 +iface fortyGigE0/72 inet manual + pre-up ifconfig fortyGigE0/72 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/72 || true + post-down ifconfig fortyGigE0/72 down +# +allow-hotplug fortyGigE0/76 +iface fortyGigE0/76 inet manual + pre-up ifconfig fortyGigE0/76 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/76 || true + post-down ifconfig fortyGigE0/76 down +# +allow-hotplug fortyGigE0/80 +iface fortyGigE0/80 inet manual + pre-up ifconfig fortyGigE0/80 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/80 || true + post-down ifconfig fortyGigE0/80 down +# +allow-hotplug fortyGigE0/84 +iface fortyGigE0/84 inet manual + pre-up ifconfig fortyGigE0/84 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/84 || true + post-down ifconfig fortyGigE0/84 down +# +allow-hotplug fortyGigE0/88 +iface fortyGigE0/88 inet manual + pre-up ifconfig fortyGigE0/88 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/88 || true + post-down ifconfig fortyGigE0/88 down +# +allow-hotplug fortyGigE0/92 +iface fortyGigE0/92 inet manual + pre-up ifconfig fortyGigE0/92 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/92 || true + post-down ifconfig fortyGigE0/92 down +# +allow-hotplug fortyGigE0/96 +iface fortyGigE0/96 inet manual + pre-up ifconfig fortyGigE0/96 up mtu 9216 + post-up brctl addif Vlan1000 fortyGigE0/96 || true + post-down ifconfig fortyGigE0/96 down +# +# "|| true" is added to suppress the error when interface is already a member of LAG +# "ip link show | grep -q master" is added to ensure interface is enslaved +allow-hotplug fortyGigE0/112 +iface fortyGigE0/112 inet manual + pre-up teamdctl PortChannel01 port add fortyGigE0/112 || true + post-up ip link show fortyGigE0/112 | grep -q master && ifconfig fortyGigE0/112 up + post-down ifconfig fortyGigE0/112 down +# +allow-hotplug fortyGigE0/116 +iface fortyGigE0/116 inet manual + pre-up teamdctl PortChannel02 port add fortyGigE0/116 || true + post-up ip link show fortyGigE0/116 | grep -q master && ifconfig fortyGigE0/116 up + post-down ifconfig fortyGigE0/116 down +# +allow-hotplug fortyGigE0/120 +iface fortyGigE0/120 inet manual + pre-up teamdctl PortChannel03 port add fortyGigE0/120 || true + post-up ip link show fortyGigE0/120 | grep -q master && ifconfig fortyGigE0/120 up + post-down ifconfig fortyGigE0/120 down +# +allow-hotplug fortyGigE0/124 +iface fortyGigE0/124 inet manual + pre-up teamdctl PortChannel04 port add fortyGigE0/124 || true + post-up ip link show fortyGigE0/124 | grep -q master && ifconfig fortyGigE0/124 up + post-down ifconfig fortyGigE0/124 down +# +# Vlan interfaces +auto Vlan1000 +iface Vlan1000 inet static + bridge_ports none + address 192.168.0.1 + netmask 255.255.255.224 +# +# Portchannel interfaces +allow-hotplug PortChannel01 +iface PortChannel01 inet static + mtu 9216 + address 10.0.0.56 + netmask 255.255.255.254 +# +allow-hotplug PortChannel01 +iface PortChannel01 inet6 static + mtu 9216 + address fc00::71 + netmask 126 +# +allow-hotplug PortChannel02 +iface PortChannel02 inet static + mtu 9216 + address 10.0.0.58 + netmask 255.255.255.254 +# +allow-hotplug PortChannel02 +iface PortChannel02 inet6 static + mtu 9216 + address fc00::75 + netmask 126 +# +allow-hotplug PortChannel03 +iface PortChannel03 inet static + mtu 9216 + address 10.0.0.60 + netmask 255.255.255.254 +# +allow-hotplug PortChannel03 +iface PortChannel03 inet6 static + mtu 9216 + address fc00::79 + netmask 126 +# +allow-hotplug PortChannel04 +iface PortChannel04 inet static + mtu 9216 + address 10.0.0.62 + netmask 255.255.255.254 +# +allow-hotplug PortChannel04 +iface PortChannel04 inet6 static + mtu 9216 + address fc00::7d + netmask 126 +# + diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml index e359b4fa629f..62a41105f937 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph.xml @@ -163,6 +163,14 @@ 10.0.0.100/24 + + HostIP + eth0 + + 2603:10e2:0:2902::8/64 + + 2603:10e2:0:2902::8/64 + diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 238d8c815514..0f9264eb1d3b 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -20,8 +20,9 @@ def run_script(self, argument): def test_interfaces(self): interfaces_template = os.path.join(self.test_dir, '..', '..', '..', 'files', 'image_config', 'interfaces', 'interfaces.j2') - argument = '-m "' + self.t0_minigraph + '" -p "' + self.t0_port_config + '" -t "' + interfaces_template + '"' - output = self.run_script(argument) + argument = '-m ' + self.t0_minigraph + ' -t ' + interfaces_template + ' > ' + self.output_file + self.run_script(argument) + self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'interfaces'), self.output_file)) def test_alias_map(self): alias_map_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-snmp-sv2', 'alias_map.j2') From 987aec3565555618ab6a5216ac56577eb23aa03c Mon Sep 17 00:00:00 2001 From: Pradchaya P Date: Wed, 26 Jul 2017 16:19:24 +0700 Subject: [PATCH 0694/1011] [platform] Update for celestica DX010 platform. (#844) --- platform/broadcom/platform-modules-cel.mk | 2 +- platform/broadcom/sonic-platform-modules-cel | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/broadcom/platform-modules-cel.mk b/platform/broadcom/platform-modules-cel.mk index 37dce948d3d5..09e8b374e861 100644 --- a/platform/broadcom/platform-modules-cel.mk +++ b/platform/broadcom/platform-modules-cel.mk @@ -1,6 +1,6 @@ # Celestica DX010 Platform modules -CEL_DX010_PLATFORM_MODULE_VERSION = 0.5 +CEL_DX010_PLATFORM_MODULE_VERSION = 0.6 export CEL_DX010_PLATFORM_MODULE_VERSION diff --git a/platform/broadcom/sonic-platform-modules-cel b/platform/broadcom/sonic-platform-modules-cel index 514e76c2296f..be37af0179d9 160000 --- a/platform/broadcom/sonic-platform-modules-cel +++ b/platform/broadcom/sonic-platform-modules-cel @@ -1 +1 @@ -Subproject commit 514e76c2296fa3c7736f6cabbe429f1070b3bcac +Subproject commit be37af0179d97f1855fdec1f81c566ea69f5bb87 From 1c165067af72e4e972ad683af1e9112e1f790483 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 27 Jul 2017 07:52:12 +0300 Subject: [PATCH 0695/1011] [Makefile]: Remove lockfile before build (#847) In case previous build was forcefully stopped, we need to remove screen lock so that build won't be stuck. Signed-off-by: marian-pritsak --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 8742e329f07c..ee3c292732c6 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,9 @@ SHELL = /bin/bash USER := $(shell id -un) PWD := $(shell pwd) +# Remove lock file in case previous run was forcefully stopped +$(shell rm -f .screen) + MAKEFLAGS += -B SLAVE_TAG = $(shell shasum sonic-slave/Dockerfile | awk '{print substr($$1,0,11);}') From 829a205b85f8226d522437a655881bcc97f54a2e Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 27 Jul 2017 19:52:22 -0700 Subject: [PATCH 0696/1011] [config services] Not to block syslog service on minigraph update (#850) --- files/image_config/rsyslog/rsyslog-config.service | 1 - files/image_config/rsyslog/rsyslog-config.sh | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/files/image_config/rsyslog/rsyslog-config.service b/files/image_config/rsyslog/rsyslog-config.service index ad72e9c2ea9a..be3c209e7560 100644 --- a/files/image_config/rsyslog/rsyslog-config.service +++ b/files/image_config/rsyslog/rsyslog-config.service @@ -1,6 +1,5 @@ [Unit] Description=Update rsyslog configuration -Before=rsyslog.service [Service] Type=oneshot diff --git a/files/image_config/rsyslog/rsyslog-config.sh b/files/image_config/rsyslog/rsyslog-config.sh index 044888029686..06a4934a4be5 100755 --- a/files/image_config/rsyslog/rsyslog-config.sh +++ b/files/image_config/rsyslog/rsyslog-config.sh @@ -1,3 +1,4 @@ #!/bin/bash sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/rsyslog.conf.j2 >/etc/rsyslog.conf +systemctl restart rsyslog From 382d52843f08f79f6680bdaeefcc47382b6f7e77 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Fri, 28 Jul 2017 20:57:51 +0300 Subject: [PATCH 0697/1011] [mellanox]: Move FW upgrade script to base image. (#849) - Download files to target/files directory (instead of target/debs) - Clean python-weels log files --- .../build_templates/sonic_debian_extension.j2 | 6 ++++ files/build_templates/swss.service.j2 | 4 ++- .../broadcom/docker-syncd-brcm/Dockerfile.j2 | 2 +- platform/mellanox/docker-syncd-mlnx-rpc.mk | 1 - platform/mellanox/docker-syncd-mlnx.mk | 3 +- .../mellanox/docker-syncd-mlnx/Dockerfile.j2 | 3 +- platform/mellanox/fw.mk | 2 ++ .../mlnx-fw-upgrade.sh | 3 -- platform/mellanox/one-image.mk | 1 + slave.mk | 28 +++++++++++++------ 10 files changed, 35 insertions(+), 18 deletions(-) rename platform/mellanox/{docker-syncd-mlnx => }/mlnx-fw-upgrade.sh (94%) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 77c5457327cc..a84b7070a560 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -221,3 +221,9 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get autor sudo cp {{src}} $FILESYSTEM_ROOT/{{dst}} {% endif -%} {% endfor -%} + +{% if sonic_asic_platform == "mellanox" %} +sudo mkdir -p $FILESYSTEM_ROOT/etc/mlnx/ +sudo cp target/files/$MLNX_FW $FILESYSTEM_ROOT/etc/mlnx/fw-SPC.mfa +sudo cp platform/mellanox/mlnx-fw-upgrade.sh $FILESYSTEM_ROOT/usr/bin/ +{% endif %} diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index 1fc9127f260e..ed6b852f18f9 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -18,8 +18,10 @@ ExecStartPre=/usr/bin/docker exec database redis-cli -n 1 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 2 FLUSHDB {% if sonic_asic_platform == 'mellanox' %} -ExecStartPre=/etc/init.d/sxdkernel start +TimeoutStartSec=3min ExecStartPre=/usr/bin/mst start +ExecStartPre=/usr/bin/mlnx-fw-upgrade.sh +ExecStartPre=/etc/init.d/sxdkernel start ExecStartPre=/sbin/modprobe i2c-dev ExecStartPre=/bin/bash -c "/usr/share/sonic/device/$(sonic-cfggen -v platform)/hw-management start" {% elif sonic_asic_platform == 'cavium' %} diff --git a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 index 76af952cef18..96ae65ee8897 100755 --- a/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 +++ b/platform/broadcom/docker-syncd-brcm/Dockerfile.j2 @@ -19,7 +19,7 @@ debs/{{ deb }}{{' '}} ## TODO: add kmod into Depends RUN apt-get install -f kmod -COPY ["debs/dsserve", "debs/bcmcmd", "start.sh", "/usr/bin/"] +COPY ["files/dsserve", "files/bcmcmd", "start.sh", "/usr/bin/"] RUN chmod +x /usr/bin/dsserve /usr/bin/bcmcmd COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] diff --git a/platform/mellanox/docker-syncd-mlnx-rpc.mk b/platform/mellanox/docker-syncd-mlnx-rpc.mk index e8e55e71e8e5..f27242ce17dc 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc.mk +++ b/platform/mellanox/docker-syncd-mlnx-rpc.mk @@ -3,7 +3,6 @@ DOCKER_SYNCD_MLNX_RPC = docker-syncd-mlnx-rpc.gz $(DOCKER_SYNCD_MLNX_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-mlnx-rpc $(DOCKER_SYNCD_MLNX_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) -$(DOCKER_SYNCD_MLNX_RPC)_FILES += $(MLNX_FW) $(DOCKER_SYNCD_MLNX_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_MLNX) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX_RPC) ifeq ($(ENABLE_SYNCD_RPC),y) diff --git a/platform/mellanox/docker-syncd-mlnx.mk b/platform/mellanox/docker-syncd-mlnx.mk index 2675399b705e..2da5961fc046 100644 --- a/platform/mellanox/docker-syncd-mlnx.mk +++ b/platform/mellanox/docker-syncd-mlnx.mk @@ -2,8 +2,7 @@ DOCKER_SYNCD_MLNX = docker-syncd-mlnx.gz $(DOCKER_SYNCD_MLNX)_PATH = $(PLATFORM_PATH)/docker-syncd-mlnx -$(DOCKER_SYNCD_MLNX)_DEPENDS += $(SYNCD) $(MFT) $(PYTHON_SDK_API) -$(DOCKER_SYNCD_MLNX)_FILES += $(MLNX_FW) +$(DOCKER_SYNCD_MLNX)_DEPENDS += $(SYNCD) $(PYTHON_SDK_API) $(DOCKER_SYNCD_MLNX)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MLNX) ifneq ($(ENABLE_SYNCD_RPC),y) diff --git a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 index 79661e0ef7fa..966ef35ac9c8 100755 --- a/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 +++ b/platform/mellanox/docker-syncd-mlnx/Dockerfile.j2 @@ -18,9 +18,8 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} -COPY ["start.sh", "mlnx-fw-upgrade.sh", "/usr/bin/"] +COPY ["start.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] -COPY ["/debs/fw-SPC-*-EVB.mfa", "/etc/mlnx/fw-SPC.mfa"] ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index 8260b9d566d4..8e916d817602 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -3,3 +3,5 @@ MLNX_FW = fw-SPC-rel-13_1224_0140-EVB.mfa $(MLNX_FW)_URL = $(MLNX_SDK_BASE_URL)/$(MLNX_FW) SONIC_ONLINE_FILES += $(MLNX_FW) + +export MLNX_FW diff --git a/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh b/platform/mellanox/mlnx-fw-upgrade.sh similarity index 94% rename from platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh rename to platform/mellanox/mlnx-fw-upgrade.sh index 0efb3ce9ecdd..b27d7095e2e2 100755 --- a/platform/mellanox/docker-syncd-mlnx/mlnx-fw-upgrade.sh +++ b/platform/mellanox/mlnx-fw-upgrade.sh @@ -47,7 +47,4 @@ if [[ ${required_fw_version} == ${fw_version} ]]; then else echo "Mellanox firmware required version is ${required_fw_version}. Installing compatible version..." run_or_fail "mlxfwmanager -i ${fw_file} -u -f -y" - - # exit from here so that syncd service will restart - exit 0 fi diff --git a/platform/mellanox/one-image.mk b/platform/mellanox/one-image.mk index 1aa8da3928da..9293e6a727e9 100644 --- a/platform/mellanox/one-image.mk +++ b/platform/mellanox/one-image.mk @@ -5,4 +5,5 @@ $(SONIC_ONE_IMAGE)_MACHINE = mellanox $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie $(SONIC_ONE_IMAGE)_DEPENDS += $(SX_KERNEL) $(KERNEL_MFT) $(MFT) $(MLNX_HW_MANAGEMENT) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +$(SONIC_ONE_IMAGE)_FILES += $(MLNX_FW) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/slave.mk b/slave.mk index abd7458bd98c..745dc2baa143 100644 --- a/slave.mk +++ b/slave.mk @@ -24,6 +24,7 @@ RULES_PATH = rules TARGET_PATH = target DOCKERS_PATH = dockers DEBS_PATH = $(TARGET_PATH)/debs +FILES_PATH = $(TARGET_PATH)/files PYTHON_WHEELS_PATH = $(TARGET_PATH)/python-wheels PROJECT_ROOT = $(shell pwd) @@ -44,6 +45,7 @@ endif configure : @mkdir -p target/debs + @mkdir -p target/files @mkdir -p target/python-wheels @echo $(PLATFORM) > .platform @@ -121,9 +123,9 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_COPY_DEBS)) : $(DEBS_PATH)/% : .platform # SOME_NEW_FILE = some_new_file # $(SOME_NEW_FILE)_PATH = path/to/some_new_file # SONIC_COPY_FILES += $(SOME_NEW_FILE) -$(addprefix $(DEBS_PATH)/, $(SONIC_COPY_FILES)) : $(DEBS_PATH)/% : .platform +$(addprefix $(FILES_PATH)/, $(SONIC_COPY_FILES)) : $(FILES_PATH)/% : .platform $(HEADER) - cp $($*_PATH)/$* $(DEBS_PATH)/ $(LOG) || exit 1 + cp $($*_PATH)/$* $(FILES_PATH)/ $(LOG) || exit 1 $(FOOTER) ############################################################################### @@ -147,7 +149,7 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_ONLINE_DEBS)) : $(DEBS_PATH)/% : .platform # SOME_NEW_FILE = some_new_file # $(SOME_NEW_FILE)_URL = https://url/to/this/file # SONIC_ONLINE_FILES += $(SOME_NEW_FILE) -$(addprefix $(DEBS_PATH)/, $(SONIC_ONLINE_FILES)) : $(DEBS_PATH)/% : .platform +$(addprefix $(FILES_PATH)/, $(SONIC_ONLINE_FILES)) : $(FILES_PATH)/% : .platform $(HEADER) wget --no-use-server-timestamps -O $@ $($*_URL) $(LOG) $(FOOTER) @@ -313,11 +315,13 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.g $(FOOTER) # Targets for building docker images -$(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addprefix $(DEBS_PATH)/,$$($$*.gz_DEPENDS) $$($$*.gz_FILES)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*.gz_PYTHON_WHEELS)) $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) $$($$*.gz_PATH)/Dockerfile.j2 +$(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addprefix $(DEBS_PATH)/,$$($$*.gz_DEPENDS)) $$(addprefix $(FILES_PATH)/,$$($$*.gz_FILES)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*.gz_PYTHON_WHEELS)) $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) $$($$*.gz_PATH)/Dockerfile.j2 $(HEADER) mkdir -p $($*.gz_PATH)/debs $(LOG) + mkdir -p $($*.gz_PATH)/files $(LOG) mkdir -p $($*.gz_PATH)/python-wheels $(LOG) sudo mount --bind $(DEBS_PATH) $($*.gz_PATH)/debs $(LOG) + sudo mount --bind $(FILES_PATH) $($*.gz_PATH)/files $(LOG) sudo mount --bind $(PYTHON_WHEELS_PATH) $($*.gz_PATH)/python-wheels $(LOG) # Export variables for j2. Use path for unique variable names, e.g. docker_orchagent_debs $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_debs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DEPENDS),RDEPENDS))\n" | awk '!a[$$0]++')) @@ -341,7 +345,7 @@ $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TA ############################################################################### # targets for building installers with base image -$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_DEVICE_DATA) $(SONIC_UTILS)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) +$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) $$(addprefix $(FILES_PATH)/,$$($$*_FILES)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_DEVICE_DATA) $(SONIC_UTILS)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) $(HEADER) ## Pass initramfs and linux kernel explicitly. They are used for all platforms export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" @@ -411,11 +415,19 @@ SONIC_CLEAN_DEBS = $(addsuffix -clean,$(addprefix $(DEBS_PATH)/, \ $(SONIC_PYTHON_STDEB_DEBS) \ $(SONIC_DERIVED_DEBS) \ $(SONIC_EXTRA_DEBS))) + +SONIC_CLEAN_FILES = $(addsuffix -clean,$(addprefix $(FILES_PATH)/, \ + $(SONIC_ONLINE_FILES) \ + $(SONIC_COPY_FILES))) + $(SONIC_CLEAN_DEBS) : $(DEBS_PATH)/%-clean : .platform $$(addsuffix -clean,$$(addprefix $(DEBS_PATH)/,$$($$*_MAIN_DEB))) @# remove derived or extra targets if main one is removed, because we treat them @# as part of one package @rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) +$(SONIC_CLEAN_FILES) : $(FILES_PATH)/%-clean : .platform + @rm -f $(FILES_PATH)/$* + SONIC_CLEAN_TARGETS += $(addsuffix -clean,$(addprefix $(TARGET_PATH)/, \ $(SONIC_DOCKER_IMAGES) \ $(SONIC_SIMPLE_DOCKER_IMAGES) \ @@ -429,9 +441,9 @@ $(SONIC_CLEAN_WHEELS) : $(PYTHON_WHEELS_PATH)/%-clean : .platform @rm -f $(PYTHON_WHEELS_PATH)/$* clean-logs : .platform - @rm -f $(TARGET_PATH)/*.log $(DEBS_PATH)/*.log + @rm -f $(TARGET_PATH)/*.log $(DEBS_PATH)/*.log $(FILES_PATH)/*.log $(PYTHON_WHEELS_PATH)/*.log -clean : .platform clean-logs $$(SONIC_CLEAN_DEBS) $$(SONIC_CLEAN_TARGETS) $$(SONIC_CLEAN_WHEELS) +clean : .platform clean-logs $$(SONIC_CLEAN_DEBS) $$(SONIC_CLEAN_FILES) $$(SONIC_CLEAN_TARGETS) $$(SONIC_CLEAN_WHEELS) ############################################################################### ## all @@ -443,6 +455,6 @@ all : .platform $$(addprefix $(TARGET_PATH)/,$$(SONIC_ALL)) ## Standard targets ############################################################################### -.PHONY : $(SONIC_CLEAN_DEBS) $(SONIC_CLEAN_TARGETS) $(SONIC_CLEAN_WHEELS) clean distclean configure +.PHONY : $(SONIC_CLEAN_DEBS) $(SONIC_CLEAN_FILES) $(SONIC_CLEAN_TARGETS) $(SONIC_CLEAN_WHEELS) clean distclean configure .INTERMEDIATE : $(SONIC_INSTALL_TARGETS) $(SONIC_INSTALL_WHEELS) $(DOCKER_LOAD_TARGETS) docker-start .platform From 175b952508e18e751be80a9fb46a9478c24ca1ff Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Sun, 30 Jul 2017 01:34:27 +0300 Subject: [PATCH 0698/1011] [slave.mk]: Add list target (#856) Add new target to list all available packages, files, docker images and installers. Signed-off-by: marian-pritsak --- README.buildsystem.md | 5 +++++ slave.mk | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/README.buildsystem.md b/README.buildsystem.md index 666ddf026540..d68e190e1f10 100644 --- a/README.buildsystem.md +++ b/README.buildsystem.md @@ -201,4 +201,9 @@ sonic-slave environment is built only once, but if sonic-slave/Dockerfile was up $ make sonic-slave-build ``` +One can print out all available targets by executing the following command: +``` +$ make list +``` + All target groups are used by one or another recipe, so use those recipes as a reference when adding new ones. diff --git a/slave.mk b/slave.mk index 745dc2baa143..cc4a59a6d881 100644 --- a/slave.mk +++ b/slave.mk @@ -52,6 +52,9 @@ configure : distclean : .platform clean @rm -f .platform +list : + @$(foreach target,$(SONIC_TARGET_LIST),echo $(target);) + ############################################################################### ## Include other rules ############################################################################### @@ -118,6 +121,8 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_COPY_DEBS)) : $(DEBS_PATH)/% : .platform { cp $($(deb)_PATH)/$(deb) $(DEBS_PATH)/ $(LOG) || exit 1 ; } ; ) $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(DEBS_PATH)/, $(SONIC_COPY_DEBS)) + # Copy regular files from local directory # Add new package for copy: # SOME_NEW_FILE = some_new_file @@ -128,6 +133,8 @@ $(addprefix $(FILES_PATH)/, $(SONIC_COPY_FILES)) : $(FILES_PATH)/% : .platform cp $($*_PATH)/$* $(FILES_PATH)/ $(LOG) || exit 1 $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(FILES_PATH)/, $(SONIC_COPY_FILES)) + ############################################################################### ## Online targets ############################################################################### @@ -143,6 +150,8 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_ONLINE_DEBS)) : $(DEBS_PATH)/% : .platform { wget --no-use-server-timestamps -O $(DEBS_PATH)/$(deb) $($(deb)_URL) $(LOG) || exit 1 ; } ; ) $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(DEBS_PATH)/, $(SONIC_ONLINE_DEBS)) + # Download regular files from online location # Files are stored in deb packages directory for convenience # Add new file for download: @@ -154,6 +163,8 @@ $(addprefix $(FILES_PATH)/, $(SONIC_ONLINE_FILES)) : $(FILES_PATH)/% : .platform wget --no-use-server-timestamps -O $@ $($*_URL) $(LOG) $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(FILES_PATH)/, $(SONIC_ONLINE_FILES)) + ############################################################################### ## Debian package related targets ############################################################################### @@ -178,6 +189,8 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_MAKE_DEBS)) : $(DEBS_PATH)/% : .platform $$(a if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt pop -a -f; popd; fi $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(DEBS_PATH)/, $(SONIC_MAKE_DEBS)) + # Build project with dpkg-buildpackage # Add new package for build: # SOME_NEW_DEB = some_new_deb.deb @@ -199,6 +212,8 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) : $(DEBS_PATH)/% : .platform $$(a mv $(addprefix $($*_SRC_PATH)/../, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) $(DEBS_PATH) $(LOG) $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) + # Build project with python setup.py --command-packages=stdeb.command # Add new package for build: # SOME_NEW_DEB = some_new_deb.deb @@ -214,6 +229,8 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_PYTHON_STDEB_DEBS)) : $(DEBS_PATH)/% : .platf mv $(addprefix $($*_SRC_PATH)/deb_dist/, $* $($*_DERIVED_DEBS)) $(DEBS_PATH) $(LOG) $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(DEBS_PATH)/, $(SONIC_PYTHON_STDEB_DEBS)) + # Rules for derived debian packages (dev, dbg, etc.) # All noise takes place in main deb recipe, so we are just telling that # we depend on it and move our deb to other targets @@ -227,6 +244,8 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_DERIVED_DEBS)) : $(DEBS_PATH)/% : .platform $ [ -f $@ ] && touch $@ $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(DEBS_PATH)/, $(SONIC_DERIVED_DEBS)) + # Rules for extra debian packages # All noise takes place in main deb recipe, so we are just telling that # we need to build the main deb and move our deb to other targets @@ -240,6 +259,8 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_EXTRA_DEBS)) : $(DEBS_PATH)/% : .platform $$( [ -f $@ ] && touch $@ $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(DEBS_PATH)/, $(SONIC_EXTRA_DEBS)) + # Targets for installing debian packages prior to build one that depends on them SONIC_INSTALL_TARGETS = $(addsuffix -install,$(addprefix $(DEBS_PATH)/, \ $(SONIC_ONLINE_DEBS) \ @@ -285,6 +306,8 @@ $(addprefix $(PYTHON_WHEELS_PATH)/, $(SONIC_PYTHON_WHEELS)) : $(PYTHON_WHEELS_PA mv $($*_SRC_PATH)/dist/$* $(PYTHON_WHEELS_PATH) $(LOG) $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(PYTHON_WHEELS_PATH)/, $(SONIC_PYTHON_WHEELS)) + # Targets for installing python wheels. # Autogenerated SONIC_INSTALL_WHEELS = $(addsuffix -install, $(addprefix $(PYTHON_WHEELS_PATH)/, $(SONIC_PYTHON_WHEELS))) @@ -314,6 +337,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.g docker save $* | gzip -c > $@ $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) + # Targets for building docker images $(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addprefix $(DEBS_PATH)/,$$($$*.gz_DEPENDS)) $$(addprefix $(FILES_PATH)/,$$($$*.gz_FILES)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*.gz_PYTHON_WHEELS)) $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) $$($$*.gz_PATH)/Dockerfile.j2 $(HEADER) @@ -332,6 +357,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .pl docker save $* | gzip -c > $@ $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) + DOCKER_LOAD_TARGETS = $(addsuffix -load,$(addprefix $(TARGET_PATH)/, \ $(SONIC_SIMPLE_DOCKER_IMAGES) \ $(SONIC_DOCKER_IMAGES))) @@ -401,6 +428,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform chmod a+x $@ $(FOOTER) +SONIC_TARGET_LIST += $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) + ############################################################################### ## Clean targets ############################################################################### From 11f08026f1f2da7df37c14c6c8dda7b966e520f8 Mon Sep 17 00:00:00 2001 From: padmanarayana Date: Tue, 1 Aug 2017 20:05:13 +0530 Subject: [PATCH 0699/1011] [platform]: Add EEPROM script for SYS EEPROM on S6100 (#852) --- .../plugins/eeprom.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/plugins/eeprom.py diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/plugins/eeprom.py b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/eeprom.py new file mode 100644 index 000000000000..6af56578c682 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/eeprom.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +############################################################################# +# Dell S6100 +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-2/2-0050/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) + From 9861d0f8f4a6b4954baece49e4d9bddc34eae964 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 1 Aug 2017 17:35:54 +0300 Subject: [PATCH 0700/1011] [device]: Remove illegal character from MSN2700 minigraph (#860) Signed-off-by: marian-pritsak --- device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml b/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml index ecbabba18da2..50f49f63878a 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/minigraph.xml @@ -1042,7 +1042,7 @@ switch2 ACS-MSN2700 - ` + From b6efe438b54df6e649ea1899e7412d241a00cfc4 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 1 Aug 2017 19:02:00 -0700 Subject: [PATCH 0701/1011] Introduce ConfigDB (#808) * [cfggen] Support reading from and writing to configdb * [bgp] Move bgp_admin_state to configdb, support dynamic admin state change * [sonic-utilities] Adapt configDB for admin status, support config save and config load --- dockers/docker-database/Dockerfile.j2 | 3 +- dockers/docker-database/configdb-load.sh | 17 ++++ dockers/docker-database/supervisord.conf | 9 +++ dockers/docker-fpm-quagga/Dockerfile.j2 | 1 + dockers/docker-fpm-quagga/bgpcfgd | 42 ++++++++++ dockers/docker-fpm-quagga/start.sh | 9 +-- dockers/docker-fpm-quagga/supervisord.conf | 9 +++ .../build_templates/sonic_debian_extension.j2 | 3 +- rules/docker-config-engine.mk | 1 + rules/docker-database.mk | 3 +- rules/docker-platform-monitor.mk | 1 - rules/sonic-config.mk | 1 + src/sonic-config-engine/sonic-cfggen | 81 ++++++++++++++++++- src/sonic-py-swsssdk | 2 +- src/sonic-utilities | 2 +- 15 files changed, 170 insertions(+), 14 deletions(-) create mode 100755 dockers/docker-database/configdb-load.sh create mode 100755 dockers/docker-fpm-quagga/bgpcfgd diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index 8397a3acfd22..19fd412b0387 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -1,4 +1,4 @@ -FROM docker-base +FROM docker-config-engine ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive @@ -33,5 +33,6 @@ RUN sed -ri 's/^(save .*$)/# \1/g; ' /etc/redis/redis.conf COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["configdb-load.sh", "/usr/bin/"] ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-database/configdb-load.sh b/dockers/docker-database/configdb-load.sh new file mode 100755 index 000000000000..2175e37d5a75 --- /dev/null +++ b/dockers/docker-database/configdb-load.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +# Wait until redis starts +while true; do + if [ `redis-cli ping` == "PONG" ]; then + break + fi + sleep 1 +done + +# If there is a config db dump file, load it +if [ -r /etc/sonic/config_db.json ]; then + sonic-cfggen -j /etc/sonic/config_db.json --write-to-db +fi + +echo -en "SELECT 4\nSET CONFIG_DB_INITIALIZED true" | redis-cli + diff --git a/dockers/docker-database/supervisord.conf b/dockers/docker-database/supervisord.conf index 8f90e1ed6285..42b0eddac0a7 100644 --- a/dockers/docker-database/supervisord.conf +++ b/dockers/docker-database/supervisord.conf @@ -10,3 +10,12 @@ autostart=true autorestart=false stdout_logfile=syslog stderr_logfile=syslog + +[program:configdb-load.sh] +command=/usr/bin/configdb-load.sh +priority=2 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/dockers/docker-fpm-quagga/Dockerfile.j2 b/dockers/docker-fpm-quagga/Dockerfile.j2 index ffced8161a5b..1f71c7130b8d 100644 --- a/dockers/docker-fpm-quagga/Dockerfile.j2 +++ b/dockers/docker-fpm-quagga/Dockerfile.j2 @@ -23,6 +23,7 @@ RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs COPY ["start.sh", "/usr/bin/"] +COPY ["bgpcfgd", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["*.j2", "/usr/share/sonic/templates/"] COPY ["daemons", "/etc/quagga/"] diff --git a/dockers/docker-fpm-quagga/bgpcfgd b/dockers/docker-fpm-quagga/bgpcfgd new file mode 100755 index 000000000000..2bcecb13f905 --- /dev/null +++ b/dockers/docker-fpm-quagga/bgpcfgd @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +import sys +import redis +import subprocess +import syslog +from swsssdk import ConfigDBConnector + +# Returns BGP ASN as a string +def _get_bgp_asn_from_minigraph(): + # Get BGP ASN from minigraph + proc = subprocess.Popen( + ['sonic-cfggen', '-m', '/etc/sonic/minigraph.xml', '-v', 'minigraph_bgp_asn'], + stdout=subprocess.PIPE, + shell=False, + stderr=subprocess.STDOUT) + stdout = proc.communicate()[0] + proc.wait() + return stdout.rstrip('\n') + +def bgp_config(asn, ip, config): + syslog.syslog(syslog.LOG_INFO, '[bgp cfgd] value for {} changed to {}'.format(ip, config)) + # Currently dynamic config is supported only for bgp admin status + if config.has_key('admin_status'): + command_mod = 'no ' if config['admin_status'] == 'up' else '' + command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c '{}neighbor {} shutdown'".format(asn, command_mod, ip) + + p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) + stdout = p.communicate()[0] + p.wait() + if p.returncode != 0: + syslog.syslog(syslog.LOG_ERR, '[bgp cfgd] command execution returned {}. Command: "{}", stdout: "{}"'.format(p.returncode, command, stdout)) + +def main(): + sub = ConfigDBConnector() + bgp_asn = _get_bgp_asn_from_minigraph() + handler = lambda table, key, data: bgp_config(bgp_asn, key, data) + sub.subscribe('BGP_NEIGHBOR', handler) + sub.connect() + sub.listen() + +main() diff --git a/dockers/docker-fpm-quagga/start.sh b/dockers/docker-fpm-quagga/start.sh index a72a96425f66..892c1f6ea974 100755 --- a/dockers/docker-fpm-quagga/start.sh +++ b/dockers/docker-fpm-quagga/start.sh @@ -1,11 +1,8 @@ #!/usr/bin/env bash 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 -y /etc/sonic/deployment_id_asn_map.yml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf -else - sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/deployment_id_asn_map.yml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf -fi +sonic-cfggen -m -d -y /etc/sonic/deployment_id_asn_map.yml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf + 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 @@ -21,6 +18,8 @@ echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status rm -f /var/run/rsyslogd.pid +supervisorctl start bgpcfgd + supervisorctl start rsyslogd # Quagga has its own monitor process, 'watchquagga' diff --git a/dockers/docker-fpm-quagga/supervisord.conf b/dockers/docker-fpm-quagga/supervisord.conf index f2c9bdce7e6d..7b6de2163642 100644 --- a/dockers/docker-fpm-quagga/supervisord.conf +++ b/dockers/docker-fpm-quagga/supervisord.conf @@ -26,3 +26,12 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog + +[program:bgpcfgd] +command=/usr/bin/bgpcfgd +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index a84b7070a560..3c0804f7abfa 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -132,8 +132,7 @@ sudo bash -c "echo dhcp_as_static=true >> $FILESYSTEM_ROOT/etc/sonic/updategraph 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" +sudo bash -c "echo '{ \"bgp_admin_state\": { \"all\": false } }' >> $FILESYSTEM_ROOT/etc/sonic/config_db.json" {% endif %} # Copy SNMP configuration files sudo cp $IMAGE_CONFIGS/snmp/snmp.yml $FILESYSTEM_ROOT/etc/sonic/ diff --git a/rules/docker-config-engine.mk b/rules/docker-config-engine.mk index ca0a6a739778..f540bb66f350 100644 --- a/rules/docker-config-engine.mk +++ b/rules/docker-config-engine.mk @@ -2,6 +2,7 @@ DOCKER_CONFIG_ENGINE = docker-config-engine.gz $(DOCKER_CONFIG_ENGINE)_PATH = $(DOCKERS_PATH)/docker-config-engine +$(DOCKER_CONFIG_ENGINE)_PYTHON_WHEELS += $(SWSSSDK_PY2) $(DOCKER_CONFIG_ENGINE)_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE) $(DOCKER_CONFIG_ENGINE)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_CONFIG_ENGINE) diff --git a/rules/docker-database.mk b/rules/docker-database.mk index 991f41ce411b..147b6538a098 100644 --- a/rules/docker-database.mk +++ b/rules/docker-database.mk @@ -3,11 +3,12 @@ DOCKER_DATABASE = docker-database.gz $(DOCKER_DATABASE)_PATH = $(DOCKERS_PATH)/docker-database $(DOCKER_DATABASE)_DEPENDS += $(REDIS_SERVER) $(REDIS_TOOLS) -$(DOCKER_DATABASE)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_DATABASE)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_DATABASE) SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DATABASE) $(DOCKER_DATABASE)_CONTAINER_NAME = database $(DOCKER_DATABASE)_RUN_OPT += --net=host --privileged -t +$(DOCKER_DATABASE)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_DATABASE)_BASE_IMAGE_FILES += redis-cli:/usr/bin/redis-cli diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index dea73d2c90ba..39f8cdd3f297 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -3,7 +3,6 @@ DOCKER_PLATFORM_MONITOR = docker-platform-monitor.gz $(DOCKER_PLATFORM_MONITOR)_PATH = $(DOCKERS_PATH)/docker-platform-monitor $(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(SONIC_LEDD) -$(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SWSSSDK_PY2) $(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) diff --git a/rules/sonic-config.mk b/rules/sonic-config.mk index 3dc295c44a69..854b577b3362 100644 --- a/rules/sonic-config.mk +++ b/rules/sonic-config.mk @@ -2,5 +2,6 @@ SONIC_CONFIG_ENGINE = sonic_config_engine-1.0-py2-none-any.whl $(SONIC_CONFIG_ENGINE)_SRC_PATH = $(SRC_PATH)/sonic-config-engine +$(SONIC_CONFIG_ENGINE)_DEPENDS += $(SWSSSDK_PY2) $(SONIC_CONFIG_ENGINE)_PYTHON_VERSION = 2 SONIC_PYTHON_WHEELS += $(SONIC_CONFIG_ENGINE) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 864513f577e0..d93b4a6a41dc 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -1,4 +1,19 @@ #!/usr/bin/env python +"""sonic-cfggen + +A tool to read SONiC config data from one or more of the following sources: +minigraph file, config DB, json file(s), yaml files(s), command line input, +and write the data into DB, print as json, or render a jinja2 config template. + +Examples: + Render template with minigraph: + sonic-cfggen -m -t /usr/share/template/bgpd.conf.j2 + Dump config DB content into json file: + sonic-cfggen -d --print-data > db_dump.json + Load content of json file into config DB: + sonic-cfggen -j db_dump.json --write-to-db +See usage string for detail description for arguments. +""" import sys import os.path @@ -12,6 +27,7 @@ from minigraph import parse_xml from minigraph import parse_device_desc_xml from sonic_platform import get_machine_info from sonic_platform import get_platform_info +from swsssdk import ConfigDBConnector def is_ipv4(value): if not value: @@ -46,18 +62,64 @@ def unique_name(l): new_list.append(item) return new_list + +class FormatConverter: + """Convert config DB based schema to legacy minigraph based schema for backward capability. +We will move to DB schema and remove this class when the config templates are modified. + +TODO(taoyl): Current version of config db only supports BGP admin states. + All other configuration are still loaded from minigraph. Plan to remove + minigraph and move everything into config db in a later commit. + """ + @staticmethod + def db_to_output(db_data): + data_bgp_admin = {} + for table_name, content in db_data.iteritems(): + if table_name == 'BGP_NEIGHBOR': + for key, value in content.iteritems(): + if value.has_key('admin_status'): + data_bgp_admin[key] = (value['admin_status'] == 'up') + elif table_name == 'DEVICE_METADATA': + if content['localhost'].has_key('bgp_default_status'): + data_bgp_admin['all'] = (content['localhost']['bgp_default_status'] == 'up') + + output_data = {'bgp_admin_state': data_bgp_admin} if data_bgp_admin else {} + return output_data + + @staticmethod + def output_to_db(output_data): + db_data = {} + for key, value in output_data.iteritems(): + if key == 'bgp_admin_state': + for neighbor, state in value.iteritems(): + if neighbor == 'all': + if not db_data.has_key('DEVICE_METADATA'): + db_data['DEVICE_METADATA'] = {'localhost': {}} + db_data['DEVICE_METADATA']['localhost']['bgp_default_status'] = 'up' if state else 'down' + else: + if not db_data.has_key('BGP_NEIGHBOR'): + db_data['BGP_NEIGHBOR'] = {} + if not db_data['BGP_NEIGHBOR'].has_key(neighbor): + db_data['BGP_NEIGHBOR'][neighbor] = {} + db_data['BGP_NEIGHBOR'][neighbor]['admin_status'] = 'up' if state else 'down' + return db_data + + def main(): parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") group = parser.add_mutually_exclusive_group() - group.add_argument("-m", "--minigraph", help="minigraph xml file") + group.add_argument("-m", "--minigraph", help="minigraph xml file", nargs='?', const='/etc/sonic/minigraph.xml') group.add_argument("-M", "--device-description", help="device description xml file") parser.add_argument("-p", "--port-config", help="port config file, used with -m") - parser.add_argument("-y", "--yaml", help="yaml file that contains addtional variables", action='append', default=[]) + parser.add_argument("-y", "--yaml", help="yaml file that contains additional variables", action='append', default=[]) + parser.add_argument("-j", "--json", help="json file that contains additional variables", action='append', default=[]) parser.add_argument("-a", "--additional-data", help="addition data, in json string") + parser.add_argument("-d", "--from-db", help="read config from configdb", action='store_true') group = parser.add_mutually_exclusive_group() group.add_argument("-t", "--template", help="render the data with the template file") group.add_argument("-v", "--var", help="print the value of a variable, support jinja2 expression") group.add_argument("--var-json", help="print the value of a variable, in json format") + group.add_argument("--write-to-db", help="write config into configdb", action='store_true') group.add_argument("--print-data", help="print all data", action='store_true') args = parser.parse_args() @@ -90,8 +152,17 @@ def main(): additional_data = yaml.load(stream) data.update(additional_data) + for json_file in args.json: + with open(json_file, 'r') as stream: + data.update(json.load(stream)) + if args.additional_data != None: data.update(json.loads(args.additional_data)) + + if args.from_db: + configdb = ConfigDBConnector() + configdb.connect() + data.update(FormatConverter.db_to_output(configdb.get_config())) if args.template != None: template_file = os.path.abspath(args.template) @@ -109,8 +180,14 @@ def main(): if args.var_json != None: print json.dumps(data[args.var_json], indent=4, cls=minigraph_encoder) + if args.write_to_db: + configdb = ConfigDBConnector() + configdb.connect(False) + configdb.set_config(FormatConverter.output_to_db(data)) + if args.print_data: print json.dumps(data, indent=4, cls=minigraph_encoder) + if __name__ == "__main__": main() diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 4cf7a59a5ffa..9b54b80f1783 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 4cf7a59a5ffa74784f8067484b0dbee51433c184 +Subproject commit 9b54b80f1783808c5ae2a30e189f24a7404a8c95 diff --git a/src/sonic-utilities b/src/sonic-utilities index 5d8f98eeae60..6c7e22362fbc 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 5d8f98eeae60f1b5c6c5d6ad7cb4c31019558efd +Subproject commit 6c7e22362fbc05ba455e7e336e2a88430de0de18 From 618b25f18c8282b51a414b4892af80f52f0787ef Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 1 Aug 2017 20:51:10 +0000 Subject: [PATCH 0702/1011] Squash merge v1.0.3 branch onto master --- dockers/docker-orchagent/start.sh | 11 ----------- dockers/docker-orchagent/swssconfig.sh | 23 ++++++++++++----------- files/build_templates/swss.service.j2 | 1 + platform/broadcom/docker-ptf-brcm.mk | 2 +- platform/broadcom/libsaithrift-dev.mk | 2 +- platform/broadcom/python-saithrift.mk | 2 +- platform/broadcom/rules.mk | 6 ++---- platform/broadcom/sai.mk | 10 ++++++---- platform/broadcom/sdk.mk | 10 ++++++---- platform/mellanox/docker-ptf-mlnx.mk | 2 +- platform/mellanox/fw.mk | 2 +- platform/mellanox/libsaithrift-dev.mk | 2 +- platform/mellanox/mlnx-fw-upgrade.sh | 2 +- platform/mellanox/mlnx-sai.mk | 4 ++-- platform/mellanox/python-saithrift.mk | 2 +- platform/mellanox/rules.mk | 6 ++---- platform/mellanox/sdk.mk | 10 ++-------- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 20 files changed, 44 insertions(+), 59 deletions(-) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 40ef66441c02..446b52852f0a 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -11,17 +11,6 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd -# Wait for syncd to start -while true; do - RESULT=$(echo -en "SELECT 1\nHLEN HIDDEN" | redis-cli | sed -n 2p) - - if [ "$RESULT" != "0" ]; then - break - fi - - sleep 1 -done - supervisorctl start orchagent supervisorctl start portsyncd diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index 768417779e2d..329d1439d897 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -40,17 +40,18 @@ HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json " -if [ "$HWSKU" == "Force10-S6000" ]; then - SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " -elif [ "$HWSKU" == "Force10-S6000-Q32" ]; then - SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " -elif [ "$HWSKU" == "Arista-7050-QX32" ]; then - SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " -elif [ "$HWSKU" == "ACS-MSN2700" ]; then - SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json " -elif [ "$HWSKU" == "ACS-MSN2740" ]; then - SWSSCONFIG_ARGS+="msn2740.32ports.buffers.json msn2740.32ports.qos.json " -fi +# FIXME: Temporarily disable QOS/buffer configurations for further debugging +# if [ "$HWSKU" == "Force10-S6000" ]; then +# SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " +# elif [ "$HWSKU" == "Force10-S6000-Q32" ]; then +# SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " +# elif [ "$HWSKU" == "Arista-7050-QX32" ]; then +# SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " +# elif [ "$HWSKU" == "ACS-MSN2700" ]; then +# SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json " +# elif [ "$HWSKU" == "ACS-MSN2740" ]; then +# SWSSCONFIG_ARGS+="msn2740.32ports.buffers.json msn2740.32ports.qos.json " +# fi for file in $SWSSCONFIG_ARGS; do swssconfig /etc/swss/config.d/$file diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index ed6b852f18f9..f383a886eb35 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -18,6 +18,7 @@ ExecStartPre=/usr/bin/docker exec database redis-cli -n 1 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 2 FLUSHDB {% if sonic_asic_platform == 'mellanox' %} +Environment=FAST_BOOT=1 TimeoutStartSec=3min ExecStartPre=/usr/bin/mst start ExecStartPre=/usr/bin/mlnx-fw-upgrade.sh diff --git a/platform/broadcom/docker-ptf-brcm.mk b/platform/broadcom/docker-ptf-brcm.mk index 7b78aa9ec316..c57ce43dc905 100644 --- a/platform/broadcom/docker-ptf-brcm.mk +++ b/platform/broadcom/docker-ptf-brcm.mk @@ -4,4 +4,4 @@ DOCKER_PTF_BRCM = docker-ptf-brcm.gz $(DOCKER_PTF_BRCM)_PATH = $(DOCKERS_PATH)/docker-ptf-saithrift $(DOCKER_PTF_BRCM)_DEPENDS += $(PYTHON_SAITHRIFT_BRCM) $(DOCKER_PTF_BRCM)_LOAD_DOCKERS += $(DOCKER_PTF) -SONIC_DOCKER_IMAGES += $(DOCKER_PTF_BRCM) +#SONIC_DOCKER_IMAGES += $(DOCKER_PTF_BRCM) diff --git a/platform/broadcom/libsaithrift-dev.mk b/platform/broadcom/libsaithrift-dev.mk index c809539b47fe..6e422db6e799 100644 --- a/platform/broadcom/libsaithrift-dev.mk +++ b/platform/broadcom/libsaithrift-dev.mk @@ -4,4 +4,4 @@ LIBSAITHRIFT_DEV_BRCM = libsaithrift-dev_0.9.4_amd64.deb $(LIBSAITHRIFT_DEV_BRCM)_SRC_PATH = $(SRC_PATH)/SAI $(LIBSAITHRIFT_DEV_BRCM)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(BRCM_SAI) $(BRCM_SAI_DEV) $(LIBSAITHRIFT_DEV_BRCM)_RDEPENDS += $(LIBTHRIFT) $(BRCM_SAI) -SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_BRCM) +#SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_BRCM) diff --git a/platform/broadcom/python-saithrift.mk b/platform/broadcom/python-saithrift.mk index f9da4143c7d9..18bf77c3d009 100644 --- a/platform/broadcom/python-saithrift.mk +++ b/platform/broadcom/python-saithrift.mk @@ -3,4 +3,4 @@ PYTHON_SAITHRIFT_BRCM = python-saithrift_0.9.4_amd64.deb $(PYTHON_SAITHRIFT_BRCM)_SRC_PATH = $(SRC_PATH)/SAI $(PYTHON_SAITHRIFT_BRCM)_DEPENDS += $(BRCM_SAI_DEV) $(THRIFT_COMPILER) $(PYTHON_THRIFT) $(LIBTHRIFT_DEV) -SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_BRCM) +#SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_BRCM) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 253593b30f2a..4ee7fa91304d 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -25,12 +25,10 @@ $(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/20170518/d SONIC_ONLINE_FILES += $(BCMCMD) $(DSSERVE) SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT_IMAGE) \ - $(DOCKER_FPM) \ - $(DOCKER_PTF_BRCM) \ - $(DOCKER_SYNCD_BRCM_RPC) + $(DOCKER_FPM) # Inject brcm sai into sairedis -$(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) $(LIBSAITHRIFT_DEV_BRCM) +$(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) #$(LIBSAITHRIFT_DEV_BRCM) # Runtime dependency on brcm sai is set only for syncd $(SYNCD)_RDEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index ec7a34253075..b829e8207890 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,11 @@ -BRCM_SAI = libsaibcm_2.1.5.1-16-20170712202323.49_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-16-20170712202323.49_amd64.deb?sv=2015-04-05&sr=b&sig=jsPXiAoSyKqZ1SmiyeEj73W8tRlri8ysExnWvc%2BWSi4%3D&se=2031-03-21T22%3A49%3A32Z&sp=r" +BRCM_SAI = libsaibcm_3.0.2.2_amd64.deb +# TODO: upload new SAI build to blob +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.2.2_amd64.deb" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-16-20170712202323.49_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.2.2_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-16-20170712202323.49_amd64.deb?sv=2015-04-05&sr=b&sig=azYZkCi%2FFGS4eELKhIozOok3qimfH%2FjdXlz%2BS2MRBco%3D&se=2031-03-21T22%3A49%3A57Z&sp=r" +# TODO: upload new SAI build to blob +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.2.2_amd64.deb" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 5280fa2c9c1b..d952f436099d 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,7 +1,9 @@ -BRCM_OPENNSL = libopennsl_3.2.2.2-10-20170707181826.44_amd64.deb -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.2.2-10-20170707181826.44_amd64.deb?sv=2015-04-05&sr=b&sig=hc4PbMQvfOu7p7E0MR1kn0OA6vu%2BPIdYOLeDU9hPJMY%3D&se=2031-03-19T21%3A20%3A15Z&sp=r" +BRCM_OPENNSL = libopennsl_3.2.3.1_amd64.deb +# TODO: upload new SDK build to blob +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.3.1+0~20170605184634.7~1.gbp4a0717_amd64.deb" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.2.2-10-20170707181826.44_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.2.2-10-20170707181826.44_amd64.deb?sv=2015-04-05&sr=b&sig=xtGLlxX5SspadCxaObMGGVMQliPGrTkuN0T6A4wLETA%3D&se=2031-03-19T21%3A21%3A43Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.3.1_amd64.deb +# TODO: upload new SDK build to blob +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.1+0~20170605184634.7~1.gbp4a0717_amd64.deb" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) diff --git a/platform/mellanox/docker-ptf-mlnx.mk b/platform/mellanox/docker-ptf-mlnx.mk index 7f23dc715e32..9f994f62de64 100644 --- a/platform/mellanox/docker-ptf-mlnx.mk +++ b/platform/mellanox/docker-ptf-mlnx.mk @@ -4,4 +4,4 @@ DOCKER_PTF_MLNX = docker-ptf-mlnx.gz $(DOCKER_PTF_MLNX)_PATH = $(DOCKERS_PATH)/docker-ptf-saithrift $(DOCKER_PTF_MLNX)_DEPENDS += $(PYTHON_SAITHRIFT_MLNX) $(DOCKER_PTF_MLNX)_LOAD_DOCKERS += $(DOCKER_PTF) -SONIC_DOCKER_IMAGES += $(DOCKER_PTF_MLNX) +#SONIC_DOCKER_IMAGES += $(DOCKER_PTF_MLNX) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index 8e916d817602..84b44053fa19 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -1,6 +1,6 @@ # mellanox firmware -MLNX_FW = fw-SPC-rel-13_1224_0140-EVB.mfa +MLNX_FW = fw-SPC-rel-13_1400_0126-EVB.mfa $(MLNX_FW)_URL = $(MLNX_SDK_BASE_URL)/$(MLNX_FW) SONIC_ONLINE_FILES += $(MLNX_FW) diff --git a/platform/mellanox/libsaithrift-dev.mk b/platform/mellanox/libsaithrift-dev.mk index 0fc6d3f4eb84..39222be39cab 100644 --- a/platform/mellanox/libsaithrift-dev.mk +++ b/platform/mellanox/libsaithrift-dev.mk @@ -4,4 +4,4 @@ LIBSAITHRIFT_DEV_MLNX = libsaithrift-dev_0.9.4_amd64.deb $(LIBSAITHRIFT_DEV_MLNX)_SRC_PATH = $(SRC_PATH)/SAI $(LIBSAITHRIFT_DEV_MLNX)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(MLNX_SAI) $(MLNX_SAI_DEV) $(LIBSAITHRIFT_DEV_MLNX)_RDEPENDS += $(LIBTHRIFT) $(MLNX_SAI) -SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_MLNX) +#SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_MLNX) diff --git a/platform/mellanox/mlnx-fw-upgrade.sh b/platform/mellanox/mlnx-fw-upgrade.sh index b27d7095e2e2..d732eff8cee0 100755 --- a/platform/mellanox/mlnx-fw-upgrade.sh +++ b/platform/mellanox/mlnx-fw-upgrade.sh @@ -1,7 +1,7 @@ #!/bin/bash query_retry_count_max="10" -required_fw_version="13.1224.0140" +required_fw_version="13.1400.0126" fw_file=/etc/mlnx/fw-SPC.mfa run_or_fail() { diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 332d496e76d0..66f6c3e257ce 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI -MLNX_SAI_VERSION = 161120 -MLNX_SAI_REVISION = ba3ccd6de8e5b82fa2cdfc30f9b8b1f1882bfede +MLNX_SAI_VERSION = SAIRel1.8.2-master +MLNX_SAI_REVISION = 852ef62c021dad6a1fec932a9c89df0e7f19460e export MLNX_SAI_VERSION MLNX_SAI_REVISION diff --git a/platform/mellanox/python-saithrift.mk b/platform/mellanox/python-saithrift.mk index cbe5af29b3e2..59685121e02c 100644 --- a/platform/mellanox/python-saithrift.mk +++ b/platform/mellanox/python-saithrift.mk @@ -3,4 +3,4 @@ PYTHON_SAITHRIFT_MLNX = python-saithrift_0.9.4_amd64.deb $(PYTHON_SAITHRIFT_MLNX)_SRC_PATH = $(SRC_PATH)/SAI $(PYTHON_SAITHRIFT_MLNX)_DEPENDS += $(MLNX_SAI_DEV) $(MLNX_SAI) $(THRIFT_COMPILER) $(PYTHON_THRIFT) $(LIBTHRIFT_DEV) -SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_MLNX) +#SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_MLNX) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index 6b88748c73a2..d67401df245d 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -12,12 +12,10 @@ include $(PLATFORM_PATH)/python-saithrift.mk include $(PLATFORM_PATH)/docker-ptf-mlnx.mk SONIC_ALL += $(SONIC_ONE_IMAGE) \ - $(DOCKER_FPM) \ - $(DOCKER_PTF_MLNX) \ - $(DOCKER_SYNCD_MLNX_RPC) + $(DOCKER_FPM) # Inject mlnx sai into sairedis -$(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) $(LIBSAITHRIFT_DEV_MLNX) +$(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) #$(LIBSAITHRIFT_DEV_MLNX) # Runtime dependency on mlnx sai is set only for syncd $(SYNCD)_RDEPENDS += $(MLNX_SAI) diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index bb576aaabee5..56e3145945f8 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,5 +1,5 @@ -MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/ba3ccd6de8e5b82fa2cdfc30f9b8b1f1882bfede/sdk -MLNX_SDK_VERSION = 4.2.3130 +MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/sonicv1.0.2/sdk +MLNX_SDK_VERSION = 4.2.5008 MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2) $(SX_ACL_RM) $(SX_COMPLIB) \ $(SX_EXAMPLES) $(SX_GEN_UTILS) $(SX_SCEW) $(SX_SDN_HAL) \ $(SXD_LIBS) $(TESTX) @@ -20,8 +20,6 @@ $(eval $(call add_derived_package,$(IPROUTE2),$(IPROUTE2_DEV))) SX_COMPLIB = sx-complib_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb SX_COMPLIB_DEV = sx-complib-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SX_COMPLIB),$(SX_COMPLIB_DEV))) -SX_COMPLIB_DEV_STATIC = sx-complib-dev-static_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb -$(eval $(call add_derived_package,$(SX_COMPLIB),$(SX_COMPLIB_DEV_STATIC))) SX_EXAMPLES = sx-examples_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(SX_EXAMPLES)_DEPENDS += $(APPLIBS) $(SX_SCEW) $(SXD_LIBS) SX_EXAMPLES_DEV = sx-examples-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb @@ -33,13 +31,9 @@ $(eval $(call add_derived_package,$(SX_GEN_UTILS),$(SX_GEN_UTILS_DEV))) SX_SCEW = sx-scew_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb SX_SCEW_DEV = sx-scew-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SX_SCEW),$(SX_SCEW_DEV))) -SX_SCEW_DEV_STATIC = sx-scew-dev-static_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb -$(eval $(call add_derived_package,$(SX_SCEW),$(SX_SCEW_DEV_STATIC))) SXD_LIBS = sxd-libs_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb SXD_LIBS_DEV = sxd-libs-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SXD_LIBS),$(SXD_LIBS_DEV))) -SXD_LIBS_DEV_STATIC = sxd-libs-dev-static_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb -$(eval $(call add_derived_package,$(SXD_LIBS),$(SXD_LIBS_DEV_STATIC))) #packages that are required for runtime only PYTHON_SDK_API = python-sdk-api_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(PYTHON_SDK_API)_DEPENDS += $(APPLIBS) $(SXD_LIBS) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index b865912105f2..f0a32153728f 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit b865912105f2f80ee2516899e6367f863d5f6235 +Subproject commit f0a32153728f7e2de6d4624a1d352ae85c8a4406 diff --git a/src/sonic-swss b/src/sonic-swss index 27c49a0bf3a7..72cd3f6c4c17 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 27c49a0bf3a71556b553aa30fe2a7c1cdb996142 +Subproject commit 72cd3f6c4c174d7341f95dbd3b5ecc4f5debf362 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 4f917f2cc345..2716292fdd78 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 4f917f2cc345c54d1bf9d9f01d96e4c01071ac9a +Subproject commit 2716292fdd78dcbc8587a2c8d192d10465ec7225 From e1f2a2dd75b5a83f83d2d72c9f4fa8b02cbca95a Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 2 Aug 2017 20:28:00 -0700 Subject: [PATCH 0703/1011] [lldp] No need to config on port with no minigraph_neighbor, such as port in vlan (#864) --- dockers/docker-lldp-sv2/lldpd.conf.j2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dockers/docker-lldp-sv2/lldpd.conf.j2 b/dockers/docker-lldp-sv2/lldpd.conf.j2 index e3d37d091150..4cfe48065e11 100644 --- a/dockers/docker-lldp-sv2/lldpd.conf.j2 +++ b/dockers/docker-lldp-sv2/lldpd.conf.j2 @@ -1,3 +1,5 @@ {% for member in minigraph_ports.keys() %} +{% if member in minigraph_neighbors %} configure ports {{ member }} lldp portidsubtype local {{ minigraph_ports[member]['alias'] }} description {{ minigraph_neighbors[member]['name'] }}:{{ minigraph_neighbors[member]['port'] }} +{% endif %} {% endfor %} From d0c8e2d12708e6ee90103e32cac73a445e29e80f Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Fri, 4 Aug 2017 15:05:15 +0300 Subject: [PATCH 0704/1011] [mellanox]: Query required FW version from FW file. (#866) This simplifies FW upgrade procedure and allows to specify required version only in one place (fw recipe). --- platform/mellanox/mlnx-fw-upgrade.sh | 35 +++++++++++++--------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/platform/mellanox/mlnx-fw-upgrade.sh b/platform/mellanox/mlnx-fw-upgrade.sh index b27d7095e2e2..d84265e02d97 100755 --- a/platform/mellanox/mlnx-fw-upgrade.sh +++ b/platform/mellanox/mlnx-fw-upgrade.sh @@ -1,7 +1,6 @@ #!/bin/bash query_retry_count_max="10" -required_fw_version="13.1224.0140" fw_file=/etc/mlnx/fw-SPC.mfa run_or_fail() { @@ -14,37 +13,35 @@ run_or_fail() { # wait until devices will be available query_retry_count="0" -mlxfwmanager --query > /dev/null +query_cmd="mlxfwmanager --query -i ${fw_file}" +${query_cmd} > /dev/null while [[ (${query_retry_count} -lt ${query_retry_count_max}) && ($? -ne "0") ]]; do sleep 1 query_retry_count=$[${query_retry_count}+1] - mlxfwmanager --query > /dev/null + ${query_cmd} > /dev/null done -run_or_fail "mlxfwmanager --query" > /tmp/mlnxfwmanager-query.txt +run_or_fail "${query_cmd}" > /tmp/mlnxfwmanager-query.txt -# get current firmware version -found_fw=false -for word in `cat /tmp/mlnxfwmanager-query.txt` -do - if [[ ${found_fw} == true ]]; then - fw_version=${word} - break - fi - if [[ ${word} == FW ]]; then - found_fw=true - fi -done +# get current firmware version and required version +fw_info=$(grep FW /tmp/mlnxfwmanager-query.txt) +fw_current=$(echo $fw_info | cut -f2 -d' ') +fw_required=$(echo $fw_info | cut -f3 -d' ') -if [[ -z ${fw_version} ]]; then +if [[ -z ${fw_current} ]]; then echo "Could not retreive current FW version." exit 1 fi -if [[ ${required_fw_version} == ${fw_version} ]]; then +if [[ -z ${fw_required} ]]; then + echo "Could not retreive required FW version." + exit 1 +fi + +if [[ ${fw_current} == ${fw_required} ]]; then echo "Mellanox firmware is up to date." else - echo "Mellanox firmware required version is ${required_fw_version}. Installing compatible version..." + echo "Mellanox firmware required version is ${fw_required}. Installing compatible version..." run_or_fail "mlxfwmanager -i ${fw_file} -u -f -y" fi From 97e4360d9bb9417ca82c28b291d274e44c28eecd Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Sat, 5 Aug 2017 20:56:32 -0700 Subject: [PATCH 0705/1011] [platform] Add support for Arista DCS-7260CX3-64 (#863) * Update sonic-platform-modules-arista submodule * Update boot0 to handle DCS-7260CX3-64 * Add sys eeprom plugin for DCS-7260CX3-64 * Add sfputil plugin for DCS-7260CX3-64 * Add sensors config for DCS-7260CX3-64 * Add Arista-7260CX3-64 HwSku port_config * Handle slow flash partition re-read * Add minigraph.xml for DCS-7260CX3-64 64x100G --- .../Arista-7260CX3-64/port_config.ini | 67 ++ .../Arista-7260CX3-64/sai.profile | 1 + .../x86_64-arista_7260cx3_64/minigraph.xml | 848 ++++++++++++++++++ .../plugins/eeprom.py | 13 + .../plugins/sfputil.py | 8 + .../x86_64-arista_7260cx3_64/sensors.conf | 53 ++ files/Aboot/boot0.j2 | 16 +- files/initramfs-tools/arista-convertfs.j2 | 2 +- .../broadcom/sonic-platform-modules-arista | 2 +- 9 files changed, 1006 insertions(+), 4 deletions(-) create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/port_config.ini create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/sai.profile create mode 100644 device/arista/x86_64-arista_7260cx3_64/minigraph.xml create mode 100644 device/arista/x86_64-arista_7260cx3_64/plugins/eeprom.py create mode 100644 device/arista/x86_64-arista_7260cx3_64/plugins/sfputil.py create mode 100644 device/arista/x86_64-arista_7260cx3_64/sensors.conf diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/port_config.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/port_config.ini new file mode 100644 index 000000000000..c0213576d087 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/port_config.ini @@ -0,0 +1,67 @@ +# name lanes alias port +Ethernet0 77,78,79,80 Ethernet1/1 1 +Ethernet4 65,66,67,68 Ethernet2/1 2 +Ethernet8 85,86,87,88 Ethernet3/1 3 +Ethernet12 89,90,91,92 Ethernet4/1 4 +Ethernet16 109,110,111,112 Ethernet5/1 5 +Ethernet20 97,98,99,100 Ethernet6/1 6 +Ethernet24 117,118,119,120 Ethernet7/1 7 +Ethernet28 5,6,7,8 Ethernet8/1 8 +Ethernet32 17,18,19,20 Ethernet9/1 9 +Ethernet36 13,14,15,16 Ethernet10/1 10 +Ethernet40 29,30,31,32 Ethernet11/1 11 +Ethernet44 37,38,39,40 Ethernet12/1 12 +Ethernet48 49,50,51,52 Ethernet13/1 13 +Ethernet52 45,46,47,48 Ethernet14/1 14 +Ethernet56 61,62,63,64 Ethernet15/1 15 +Ethernet60 121,122,123,124 Ethernet16/1 16 +Ethernet64 193,194,195,196 Ethernet17/1 17 +Ethernet68 133,134,135,136 Ethernet18/1 18 +Ethernet72 205,206,207,208 Ethernet19/1 19 +Ethernet76 213,214,215,216 Ethernet20/1 20 +Ethernet80 225,226,227,228 Ethernet21/1 21 +Ethernet84 221,222,223,224 Ethernet22/1 22 +Ethernet88 237,238,239,240 Ethernet23/1 23 +Ethernet92 245,246,247,248 Ethernet24/1 24 +Ethernet96 141,142,143,144 Ethernet25/1 25 +Ethernet100 249,250,251,252 Ethernet26/1 26 +Ethernet104 149,150,151,152 Ethernet27/1 27 +Ethernet108 153,154,155,156 Ethernet28/1 28 +Ethernet112 173,174,175,176 Ethernet29/1 29 +Ethernet116 161,162,163,164 Ethernet30/1 30 +Ethernet120 181,182,183,184 Ethernet31/1 31 +Ethernet124 185,186,187,188 Ethernet32/1 32 +Ethernet128 69,70,71,72 Ethernet33/1 33 +Ethernet132 73,74,75,76 Ethernet34/1 34 +Ethernet136 93,94,95,96 Ethernet35/1 35 +Ethernet140 81,82,83,84 Ethernet36/1 36 +Ethernet144 101,102,103,104 Ethernet37/1 37 +Ethernet148 105,106,107,108 Ethernet38/1 38 +Ethernet152 1,2,3,4 Ethernet39/1 39 +Ethernet156 113,114,115,116 Ethernet40/1 40 +Ethernet160 9,10,11,12 Ethernet41/1 41 +Ethernet164 21,22,23,24 Ethernet42/1 42 +Ethernet168 33,34,35,36 Ethernet43/1 43 +Ethernet172 25,26,27,28 Ethernet44/1 44 +Ethernet176 41,42,43,44 Ethernet45/1 45 +Ethernet180 53,54,55,56 Ethernet46/1 46 +Ethernet184 125,126,127,128 Ethernet47/1 47 +Ethernet188 57,58,59,60 Ethernet48/1 48 +Ethernet192 129,130,131,132 Ethernet49/1 49 +Ethernet196 197,198,199,200 Ethernet50/1 50 +Ethernet200 209,210,211,212 Ethernet51/1 51 +Ethernet204 201,202,203,204 Ethernet52/1 52 +Ethernet208 217,218,219,220 Ethernet53/1 53 +Ethernet212 229,230,231,232 Ethernet54/1 54 +Ethernet216 241,242,243,244 Ethernet55/1 55 +Ethernet220 233,234,235,236 Ethernet56/1 56 +Ethernet224 253,254,255,256 Ethernet57/1 57 +Ethernet228 137,138,139,140 Ethernet58/1 58 +Ethernet232 157,158,159,160 Ethernet59/1 59 +Ethernet236 145,146,147,148 Ethernet60/1 60 +Ethernet240 165,166,167,168 Ethernet61/1 61 +Ethernet244 169,170,171,172 Ethernet62/1 62 +Ethernet248 189,190,191,192 Ethernet63/1 63 +Ethernet252 177,178,179,180 Ethernet64/1 64 +Ethernet256 257 Ethernet65 65 +Ethernet260 259 Ethernet66 66 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/sai.profile b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/sai.profile new file mode 100644 index 000000000000..d6fbf6e9c6b1 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th2-a7260cx3-64-64x100G.config.bcm diff --git a/device/arista/x86_64-arista_7260cx3_64/minigraph.xml b/device/arista/x86_64-arista_7260cx3_64/minigraph.xml new file mode 100644 index 000000000000..957b60822ba8 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/minigraph.xml @@ -0,0 +1,848 @@ + + + + + + + + + + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + sonic + + + + + + Ethernet1/1 + 10.0.0.0/31 + + + + Ethernet2/1 + 10.0.0.2/31 + + + + Ethernet3/1 + 10.0.0.4/31 + + + + Ethernet4/1 + 10.0.0.6/31 + + + + Ethernet5/1 + 10.0.0.8/31 + + + + Ethernet6/1 + 10.0.0.10/31 + + + + Ethernet7/1 + 10.0.0.12/31 + + + + Ethernet8/1 + 10.0.0.14/31 + + + + Ethernet9/1 + 10.0.0.16/31 + + + + Ethernet10/1 + 10.0.0.18/31 + + + + Ethernet11/1 + 10.0.0.20/31 + + + + Ethernet12/1 + 10.0.0.22/31 + + + + Ethernet13/1 + 10.0.0.24/31 + + + + Ethernet14/1 + 10.0.0.26/31 + + + + Ethernet15/1 + 10.0.0.28/31 + + + + Ethernet16/1 + 10.0.0.30/31 + + + + Ethernet17/1 + 10.0.0.32/31 + + + + Ethernet18/1 + 10.0.0.34/31 + + + + Ethernet19/1 + 10.0.0.36/31 + + + + Ethernet20/1 + 10.0.0.38/31 + + + + Ethernet21/1 + 10.0.0.40/31 + + + + Ethernet22/1 + 10.0.0.42/31 + + + + Ethernet23/1 + 10.0.0.44/31 + + + + Ethernet24/1 + 10.0.0.46/31 + + + + Ethernet25/1 + 10.0.0.48/31 + + + + Ethernet26/1 + 10.0.0.50/31 + + + + Ethernet27/1 + 10.0.0.52/31 + + + + Ethernet28/1 + 10.0.0.54/31 + + + + Ethernet29/1 + 10.0.0.56/31 + + + + Ethernet30/1 + 10.0.0.58/31 + + + + Ethernet31/1 + 10.0.0.60/31 + + + + Ethernet32/1 + 10.0.0.62/31 + + + + Ethernet33/1 + 10.0.0.64/31 + + + + Ethernet34/1 + 10.0.0.66/31 + + + + Ethernet35/1 + 10.0.0.68/31 + + + + Ethernet36/1 + 10.0.0.70/31 + + + + Ethernet37/1 + 10.0.0.72/31 + + + + Ethernet38/1 + 10.0.0.74/31 + + + + Ethernet39/1 + 10.0.0.76/31 + + + + Ethernet40/1 + 10.0.0.78/31 + + + + Ethernet41/1 + 10.0.0.80/31 + + + + Ethernet42/1 + 10.0.0.82/31 + + + + Ethernet43/1 + 10.0.0.84/31 + + + + Ethernet44/1 + 10.0.0.86/31 + + + + Ethernet45/1 + 10.0.0.88/31 + + + + Ethernet46/1 + 10.0.0.90/31 + + + + Ethernet47/1 + 10.0.0.92/31 + + + + Ethernet48/1 + 10.0.0.94/31 + + + + Ethernet49/1 + 10.0.0.96/31 + + + + Ethernet50/1 + 10.0.0.98/31 + + + + Ethernet51/1 + 10.0.0.100/31 + + + + Ethernet52/1 + 10.0.0.102/31 + + + + Ethernet53/1 + 10.0.0.104/31 + + + + Ethernet54/1 + 10.0.0.106/31 + + + + Ethernet55/1 + 10.0.0.108/31 + + + + Ethernet56/1 + 10.0.0.110/31 + + + + Ethernet57/1 + 10.0.0.112/31 + + + + Ethernet58/1 + 10.0.0.114/31 + + + + Ethernet59/1 + 10.0.0.116/31 + + + + Ethernet60/1 + 10.0.0.118/31 + + + + Ethernet61/1 + 10.0.0.120/31 + + + + Ethernet62/1 + 10.0.0.122/31 + + + + Ethernet63/1 + 10.0.0.124/31 + + + + Ethernet64/1 + 10.0.0.126/31 + + + + + + + + + + + + DeviceInterfaceLink + sonic-target + Ethernet1/1 + sonic + Ethernet1/1 + + + DeviceInterfaceLink + sonic-target + Ethernet2/1 + sonic + Ethernet2/1 + + + DeviceInterfaceLink + sonic-target + Ethernet3/1 + sonic + Ethernet3/1 + + + DeviceInterfaceLink + sonic-target + Ethernet4/1 + sonic + Ethernet4/1 + + + DeviceInterfaceLink + sonic-target + Ethernet5/1 + sonic + Ethernet5/1 + + + DeviceInterfaceLink + sonic-target + Ethernet6/1 + sonic + Ethernet6/1 + + + DeviceInterfaceLink + sonic-target + Ethernet7/1 + sonic + Ethernet7/1 + + + DeviceInterfaceLink + sonic-target + Ethernet8/1 + sonic + Ethernet8/1 + + + DeviceInterfaceLink + sonic-target + Ethernet9/1 + sonic + Ethernet9/1 + + + DeviceInterfaceLink + sonic-target + Ethernet10/1 + sonic + Ethernet10/1 + + + DeviceInterfaceLink + sonic-target + Ethernet11/1 + sonic + Ethernet11/1 + + + DeviceInterfaceLink + sonic-target + Ethernet12/1 + sonic + Ethernet12/1 + + + DeviceInterfaceLink + sonic-target + Ethernet13/1 + sonic + Ethernet13/1 + + + DeviceInterfaceLink + sonic-target + Ethernet14/1 + sonic + Ethernet14/1 + + + DeviceInterfaceLink + sonic-target + Ethernet15/1 + sonic + Ethernet15/1 + + + DeviceInterfaceLink + sonic-target + Ethernet16/1 + sonic + Ethernet16/1 + + + DeviceInterfaceLink + sonic-target + Ethernet17/1 + sonic + Ethernet17/1 + + + DeviceInterfaceLink + sonic-target + Ethernet18/1 + sonic + Ethernet18/1 + + + DeviceInterfaceLink + sonic-target + Ethernet19/1 + sonic + Ethernet19/1 + + + DeviceInterfaceLink + sonic-target + Ethernet20/1 + sonic + Ethernet20/1 + + + DeviceInterfaceLink + sonic-target + Ethernet21/1 + sonic + Ethernet21/1 + + + DeviceInterfaceLink + sonic-target + Ethernet22/1 + sonic + Ethernet22/1 + + + DeviceInterfaceLink + sonic-target + Ethernet23/1 + sonic + Ethernet23/1 + + + DeviceInterfaceLink + sonic-target + Ethernet24/1 + sonic + Ethernet24/1 + + + DeviceInterfaceLink + sonic-target + Ethernet25/1 + sonic + Ethernet25/1 + + + DeviceInterfaceLink + sonic-target + Ethernet26/1 + sonic + Ethernet26/1 + + + DeviceInterfaceLink + sonic-target + Ethernet27/1 + sonic + Ethernet27/1 + + + DeviceInterfaceLink + sonic-target + Ethernet28/1 + sonic + Ethernet28/1 + + + DeviceInterfaceLink + sonic-target + Ethernet29/1 + sonic + Ethernet29/1 + + + DeviceInterfaceLink + sonic-target + Ethernet30/1 + sonic + Ethernet30/1 + + + DeviceInterfaceLink + sonic-target + Ethernet31/1 + sonic + Ethernet31/1 + + + DeviceInterfaceLink + sonic-target + Ethernet32/1 + sonic + Ethernet32/1 + + + DeviceInterfaceLink + sonic-target + Ethernet33/1 + sonic + Ethernet33/1 + + + DeviceInterfaceLink + sonic-target + Ethernet34/1 + sonic + Ethernet34/1 + + + DeviceInterfaceLink + sonic-target + Ethernet35/1 + sonic + Ethernet35/1 + + + DeviceInterfaceLink + sonic-target + Ethernet36/1 + sonic + Ethernet36/1 + + + DeviceInterfaceLink + sonic-target + Ethernet37/1 + sonic + Ethernet37/1 + + + DeviceInterfaceLink + sonic-target + Ethernet38/1 + sonic + Ethernet38/1 + + + DeviceInterfaceLink + sonic-target + Ethernet39/1 + sonic + Ethernet39/1 + + + DeviceInterfaceLink + sonic-target + Ethernet40/1 + sonic + Ethernet40/1 + + + DeviceInterfaceLink + sonic-target + Ethernet41/1 + sonic + Ethernet41/1 + + + DeviceInterfaceLink + sonic-target + Ethernet42/1 + sonic + Ethernet42/1 + + + DeviceInterfaceLink + sonic-target + Ethernet43/1 + sonic + Ethernet43/1 + + + DeviceInterfaceLink + sonic-target + Ethernet44/1 + sonic + Ethernet44/1 + + + DeviceInterfaceLink + sonic-target + Ethernet45/1 + sonic + Ethernet45/1 + + + DeviceInterfaceLink + sonic-target + Ethernet46/1 + sonic + Ethernet46/1 + + + DeviceInterfaceLink + sonic-target + Ethernet47/1 + sonic + Ethernet47/1 + + + DeviceInterfaceLink + sonic-target + Ethernet48/1 + sonic + Ethernet48/1 + + + DeviceInterfaceLink + sonic-target + Ethernet49/1 + sonic + Ethernet49/1 + + + DeviceInterfaceLink + sonic-target + Ethernet50/1 + sonic + Ethernet50/1 + + + DeviceInterfaceLink + sonic-target + Ethernet51/1 + sonic + Ethernet51/1 + + + DeviceInterfaceLink + sonic-target + Ethernet52/1 + sonic + Ethernet52/1 + + + DeviceInterfaceLink + sonic-target + Ethernet53/1 + sonic + Ethernet53/1 + + + DeviceInterfaceLink + sonic-target + Ethernet54/1 + sonic + Ethernet54/1 + + + DeviceInterfaceLink + sonic-target + Ethernet55/1 + sonic + Ethernet55/1 + + + DeviceInterfaceLink + sonic-target + Ethernet56/1 + sonic + Ethernet56/1 + + + DeviceInterfaceLink + sonic-target + Ethernet57/1 + sonic + Ethernet57/1 + + + DeviceInterfaceLink + sonic-target + Ethernet58/1 + sonic + Ethernet58/1 + + + DeviceInterfaceLink + sonic-target + Ethernet59/1 + sonic + Ethernet59/1 + + + DeviceInterfaceLink + sonic-target + Ethernet60/1 + sonic + Ethernet60/1 + + + DeviceInterfaceLink + sonic-target + Ethernet61/1 + sonic + Ethernet61/1 + + + DeviceInterfaceLink + sonic-target + Ethernet62/1 + sonic + Ethernet62/1 + + + DeviceInterfaceLink + sonic-target + Ethernet63/1 + sonic + Ethernet63/1 + + + DeviceInterfaceLink + sonic-target + Ethernet64/1 + sonic + Ethernet64/1 + + + + + sonic + Arista-7260CX3-64 + + + + + + + sonic + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + sonic + Arista-7260CX3-64 + diff --git a/device/arista/x86_64-arista_7260cx3_64/plugins/eeprom.py b/device/arista/x86_64-arista_7260cx3_64/plugins/eeprom.py new file mode 100644 index 000000000000..c4485e895948 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/plugins/eeprom.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python + +""" +Arista 7260CX3-64 eeprom plugin +Uses the arista driver library to obtain the TlvInfoDecoder +""" + +try: + import arista.utils.sonic_eeprom as arista_eeprom +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +board = arista_eeprom.getTlvInfoDecoder() diff --git a/device/arista/x86_64-arista_7260cx3_64/plugins/sfputil.py b/device/arista/x86_64-arista_7260cx3_64/plugins/sfputil.py new file mode 100644 index 000000000000..ce60de2b384d --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/plugins/sfputil.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python + +try: + import arista.utils.sonic_sfputil as arista_sfputil +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +sfputil = arista_sfputil.getSfpUtil() diff --git a/device/arista/x86_64-arista_7260cx3_64/sensors.conf b/device/arista/x86_64-arista_7260cx3_64/sensors.conf new file mode 100644 index 000000000000..e0ad4b434972 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/sensors.conf @@ -0,0 +1,53 @@ +# libsensors configuration file for DCS-7260CX3-64 +# ------------------------------------------------# + +bus "i2c-1" "SCD 0000:06:00.0 SMBus master 0 bus 0" +bus "i2c-3" "SCD 0000:06:00.0 SMBus master 0 bus 2" +bus "i2c-4" "SCD 0000:06:00.0 SMBus master 0 bus 3" +bus "i2c-73" "SCD 0000:ff:0b.3 SMBus master 0 bus 0" +bus "i2c-88" "SCD 0000:ff:0b.3 SMBus master 3 bus 3" + +chip "max6658-i2c-1-4c" + label temp1 "Temp sensor near TH2" + + set temp1_max 65 + set temp1_crit 75 + + ignore temp2 + +chip "pmbus-i2c-3-58" + label temp1 "PSU1 primary hotspot temp" + label temp2 "PSU1 inlet temp" + label temp3 "PSU1 exhaust temp" + + # setting maximum and critical thresholds is not supported for this psu + # fault and warning limits defined internally by hardware + + ignore fan2 + ignore fan3 + +chip "pmbus-i2c-4-58" + label temp1 "PSU2 primary hotspot temp" + label temp2 "PSU2 inlet temp" + label temp3 "PSU2 exhaust temp" + + # setting maximum and critical thresholds is not supported for this psu + # fault and warning limits defined internally by hardware + + ignore fan2 + ignore fan3 + +chip "max6658-i2c-73-4c" + label temp1 "Rear air temp1" + label temp2 "Rear air temp2" + + set temp1_max 65 + set temp1_crit 75 + set temp2_max 65 + set temp2_crit 75 + +chip "lm73-i2c-88-48" + label temp1 "Front air temp" + + set temp1_max 65 + set temp1_crit 75 diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index f278f1070fb1..b88c0ec35b39 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -65,6 +65,9 @@ extract_image() { ## vfat does not support symbol link if [ -n "$sonic_upgrade" ] || [ "$rootfs_type" != "vfat" ]; then + ## on ext4, other doesn't have access to the flash by default + chmod o+rx "$target_path" + mkdir -p "$image_path/{{ DOCKERFS_DIR }}" if [ -n "$sonic_upgrade" ]; then @@ -108,7 +111,7 @@ platform_specific() { local sid="$(grep -Eo 'sid=[^ ]+' /etc/cmdline | cut -f2 -d=)" # set varlog size to 100MB - echo "varlog_size=100" >>/tmp/append + local varlog_size=100 # This is temporary as the platform= and sid= parameters don't provide enough # information to identify the SKU @@ -122,10 +125,19 @@ platform_specific() { aboot_machine=arista_7050_qx32s echo "modprobe.blacklist=radeon" >>/tmp/append fi - if [ "$sid" = "Upperlake" ]; then + if [ "$sid" = "Upperlake" ] || [ "$sid" = "UpperlakeES" ]; then aboot_machine=arista_7060_cx32s echo "amd_iommu=off" >> /tmp/append fi + if [ "$sid" = "Gardena" ] || [ "$sid" = "GardenaSsd" ]; then + aboot_machine=arista_7260cx3_64 + fi + if [ "$platform" = "rook" ]; then + varlog_size=200 + readprefdl -f /tmp/.system-prefdl -d > /mnt/flash/.system-prefdl + fi + + echo "varlog_size=$varlog_size" >>/tmp/append } # check the hash file in the image, and determine to install or just skip diff --git a/files/initramfs-tools/arista-convertfs.j2 b/files/initramfs-tools/arista-convertfs.j2 index a15233615f98..81c6d9d1943f 100644 --- a/files/initramfs-tools/arista-convertfs.j2 +++ b/files/initramfs-tools/arista-convertfs.j2 @@ -178,7 +178,7 @@ umount "$root_mnt" # Create a new partition table (content in flash_dev will be deleted) err_msg="Error: repartitioning $flash_dev failed" -cmd="echo ';' | sfdisk $flash_dev" +cmd="echo ';' | sfdisk $flash_dev || (sleep 3; blockdev --rereadpt $flash_dev && fdisk -l $flash_dev | grep -q ${root_dev}.*Linux)" run_cmd "$cmd" "$err_msg" sleep 5 diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 75e84737680f..a90b9fc5b085 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 75e84737680f5451eb9c947d01968b972d989bb3 +Subproject commit a90b9fc5b085cdb99d10d338a23daa66c7f351b2 From afbf1ee2fb0e6c2ef3a64a87592ac63ae36842c4 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 8 Aug 2017 10:21:54 +0300 Subject: [PATCH 0706/1011] [sonic-slave]: Split user commands from generic. (#868) In case when more than one user builds SONiC on same machine, we can keep generic part that installs all packages to slave image apart from creating user and calling user-related commands. Then generic base image will be built only once, allowing other users to build only smaller specific to them layers. Signed-off-by: marian-pritsak --- Makefile | 19 +++++++++++++++++-- sonic-slave/Dockerfile | 28 ---------------------------- sonic-slave/Dockerfile.user | 29 +++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 30 deletions(-) create mode 100644 sonic-slave/Dockerfile.user diff --git a/Makefile b/Makefile index ee3c292732c6..d779c30718dc 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,9 @@ $(shell rm -f .screen) MAKEFLAGS += -B -SLAVE_TAG = $(shell shasum sonic-slave/Dockerfile | awk '{print substr($$1,0,11);}') +SLAVE_BASE_TAG = $(shell shasum sonic-slave/Dockerfile | awk '{print substr($$1,0,11);}') +SLAVE_TAG = $(shell shasum sonic-slave/Dockerfile.user | awk '{print substr($$1,0,11);}') +SLAVE_BASE_IMAGE = sonic-slave-base SLAVE_IMAGE = sonic-slave-$(USER) DOCKER_RUN := docker run --rm=true --privileged \ @@ -20,12 +22,18 @@ DOCKER_RUN := docker run --rm=true --privileged \ -w /sonic \ -i$(if $(TERM),t,) +DOCKER_BASE_BUILD = docker build --no-cache \ + -t $(SLAVE_BASE_IMAGE) \ + sonic-slave && \ + docker tag $(SLAVE_BASE_IMAGE):latest $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) + DOCKER_BUILD = docker build --no-cache \ --build-arg user=$(USER) \ --build-arg uid=$(shell id -u) \ --build-arg guid=$(shell id -g) \ --build-arg hostname=$(shell echo $$HOSTNAME) \ -t $(SLAVE_IMAGE) \ + -f sonic-slave/Dockerfile.user \ sonic-slave && \ docker tag $(SLAVE_IMAGE):latest $(SLAVE_IMAGE):$(SLAVE_TAG) @@ -34,6 +42,9 @@ DOCKER_BUILD = docker build --no-cache \ .DEFAULT_GOAL := all %:: + @docker inspect --type image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) &> /dev/null || \ + { echo Image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) not found. Building... ; \ + $(DOCKER_BASE_BUILD) ; } @docker inspect --type image $(SLAVE_IMAGE):$(SLAVE_TAG) &> /dev/null || \ { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ $(DOCKER_BUILD) ; } @@ -49,9 +60,13 @@ DOCKER_BUILD = docker build --no-cache \ $@ sonic-slave-build : - @$(DOCKER_BUILD) + $(DOCKER_BASE_BUILD) + $(DOCKER_BUILD) sonic-slave-bash : + @docker inspect --type image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) &> /dev/null || \ + { echo Image $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) not found. Building... ; \ + $(DOCKER_BASE_BUILD) ; } @docker inspect --type image $(SLAVE_IMAGE):$(SLAVE_TAG) &> /dev/null || \ { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ $(DOCKER_BUILD) ; } diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 38fe431a044d..826a7129a7e0 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -254,31 +254,3 @@ RUN add-apt-repository \ RUN apt-get update RUN apt-get install -y docker-ce=17.03.2~ce-0~debian-jessie RUN echo "DOCKER_OPTS=\"--experimental\"" >> /etc/default/docker - -# Add user -ARG user -ARG uid -ARG guid -ARG hostname - -ENV BUILD_HOSTNAME $hostname -ENV USER $user - -RUN groupadd -f -r -g $guid g$user - -RUN useradd $user -l -u $uid -g $guid -d /var/$user -m -s /bin/bash - -RUN gpasswd -a $user docker - -# Config git for stg -RUN su $user -c "git config --global user.name $user" -RUN su $user -c "git config --global user.email $user@contoso.com" - -COPY sonic-jenkins-id_rsa.pub /var/$user/.ssh/authorized_keys2 -RUN chown $user /var/$user/.ssh -R -RUN chmod go= /var/$user/.ssh -R - -# Add user to sudoers -RUN echo "$user ALL=(ALL) NOPASSWD:ALL" >>/etc/sudoers - -USER $user diff --git a/sonic-slave/Dockerfile.user b/sonic-slave/Dockerfile.user new file mode 100644 index 000000000000..ff01f88a769c --- /dev/null +++ b/sonic-slave/Dockerfile.user @@ -0,0 +1,29 @@ +FROM sonic-slave-base + +# Add user +ARG user +ARG uid +ARG guid +ARG hostname + +ENV BUILD_HOSTNAME $hostname +ENV USER $user + +RUN groupadd -f -r -g $guid g$user + +RUN useradd $user -l -u $uid -g $guid -d /var/$user -m -s /bin/bash + +RUN gpasswd -a $user docker + +# Config git for stg +RUN su $user -c "git config --global user.name $user" +RUN su $user -c "git config --global user.email $user@contoso.com" + +COPY sonic-jenkins-id_rsa.pub /var/$user/.ssh/authorized_keys2 +RUN chown $user /var/$user/.ssh -R +RUN chmod go= /var/$user/.ssh -R + +# Add user to sudoers +RUN echo "$user ALL=(ALL) NOPASSWD:ALL" >>/etc/sudoers + +USER $user From a2fe0212be487d173830a07d6999d74589136993 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 8 Aug 2017 16:23:58 -0700 Subject: [PATCH 0707/1011] [ConfigDB] Move all BGP configuration into DB (#861) - BGP data read from minigraph.py now match DB schema - BGP templates are updated - bgpcfgd can now deal with runtime neighbor create/delete --- dockers/docker-fpm-frr/bgpd.conf.j2 | 16 ++-- dockers/docker-fpm-frr/isolate.j2 | 10 +-- dockers/docker-fpm-frr/unisolate.j2 | 10 +-- dockers/docker-fpm-gobgp/gobgpd.conf.j2 | 8 +- dockers/docker-fpm-gobgp/isolate.j2 | 20 ----- dockers/docker-fpm-gobgp/unisolate.j2 | 19 ----- dockers/docker-fpm-quagga/bgpcfgd | 77 ++++++++++++------- dockers/docker-fpm-quagga/bgpd.conf.j2 | 30 ++++---- dockers/docker-fpm-quagga/isolate.j2 | 10 +-- dockers/docker-fpm-quagga/start.sh | 6 +- dockers/docker-fpm-quagga/unisolate.j2 | 10 +-- .../build_templates/sonic_debian_extension.j2 | 2 +- files/image_config/platform/rc.local | 12 +++ files/image_config/updategraph/updategraph | 7 ++ src/sonic-config-engine/minigraph.py | 31 ++++---- src/sonic-config-engine/sonic-cfggen | 58 ++++++-------- src/sonic-config-engine/tests/test_cfggen.py | 2 +- src/sonic-utilities | 2 +- 18 files changed, 160 insertions(+), 170 deletions(-) diff --git a/dockers/docker-fpm-frr/bgpd.conf.j2 b/dockers/docker-fpm-frr/bgpd.conf.j2 index 9b8195943444..d04f6ac623e0 100644 --- a/dockers/docker-fpm-frr/bgpd.conf.j2 +++ b/dockers/docker-fpm-frr/bgpd.conf.j2 @@ -18,7 +18,7 @@ log facility local4 ! ! bgp multiple-instance ! -router bgp {{ minigraph_bgp_asn }} +router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp log-neighbor-changes bgp bestpath as-path multipath-relax {# TODO: use lo[0] for backward compatibility, will revisit the case with multiple lo interfaces #} @@ -46,16 +46,16 @@ router bgp {{ minigraph_bgp_asn }} {% endfor %} {% endblock vlan_advertisement %} {% block bgp_sessions %} -{% for bgp_session in minigraph_bgp %} +{% for neighbor_addr, bgp_session in BGP_NEIGHBOR.iteritems() %} {% if bgp_session['asn'] != 0 %} - neighbor {{ bgp_session['addr'] }} remote-as {{ bgp_session['asn'] }} - neighbor {{ bgp_session['addr'] }} description {{ bgp_session['name'] }} + neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }} + neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} {% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} - neighbor {{ bgp_session['addr'] }} allowas-in 1 + neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} -{% if bgp_session['addr'] | ipv6 %} +{% if neighbor_addr | ipv6 %} address-family ipv6 - neighbor {{ bgp_session['addr'] }} activate + neighbor {{ neighbor_addr }} activate maximum-paths 64 exit-address-family {% endif %} @@ -66,5 +66,5 @@ router bgp {{ minigraph_bgp_asn }} maximum-paths 64 ! route-map ISOLATE permit 10 -set as-path prepend {{ minigraph_bgp_asn }} +set as-path prepend {{ DEVICE_METADATA['localhost']['bgp_asn'] }} ! diff --git a/dockers/docker-fpm-frr/isolate.j2 b/dockers/docker-fpm-frr/isolate.j2 index 35ef5bbc0209..7b7fecf9fa9e 100755 --- a/dockers/docker-fpm-frr/isolate.j2 +++ b/dockers/docker-fpm-frr/isolate.j2 @@ -8,13 +8,13 @@ exit $? ## vtysh script start from next line, which line number MUST eqaul in 'sed' command above configure terminal - router bgp {{ minigraph_bgp_asn }} -{% for bgp_session in minigraph_bgp %} - neighbor {{ bgp_session['addr'] }} route-map ISOLATE out + router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} +{% for neighbor_addr in BGP_NEIGHBOR %} + neighbor {{ neighbor_addr }} route-map ISOLATE out {% endfor %} exit exit -{% for bgp_session in minigraph_bgp %} -clear ip bgp {{ bgp_session['addr'] }} soft out +{% for neighbor_addr in BGP_NEIGHBOR %} +clear ip bgp {{ neighbor_addr }} soft out {% endfor %} diff --git a/dockers/docker-fpm-frr/unisolate.j2 b/dockers/docker-fpm-frr/unisolate.j2 index c113a74fab45..f2129556747b 100755 --- a/dockers/docker-fpm-frr/unisolate.j2 +++ b/dockers/docker-fpm-frr/unisolate.j2 @@ -8,13 +8,13 @@ exit $? ## vtysh script start from next line, which line number MUST eqaul in 'sed' command above configure terminal - router bgp {{ minigraph_bgp_asn }} -{% for bgp_session in minigraph_bgp %} - no neighbor {{ bgp_session['addr'] }} route-map ISOLATE out + router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} +{% for neighbor_ip in BGP_NEIGHBOR %} + no neighbor {{ neighbor_ip }} route-map ISOLATE out {% endfor %} exit exit -{% for bgp_session in minigraph_bgp %} -clear ip bgp {{ bgp_session['addr'] }} soft out +{% for neighbor_ip in BGP_NEIGHBOR %} +clear ip bgp {{ neighbor_ip }} soft out {% endfor %} diff --git a/dockers/docker-fpm-gobgp/gobgpd.conf.j2 b/dockers/docker-fpm-gobgp/gobgpd.conf.j2 index adbc063cfc6c..c6ec7a4fd166 100644 --- a/dockers/docker-fpm-gobgp/gobgpd.conf.j2 +++ b/dockers/docker-fpm-gobgp/gobgpd.conf.j2 @@ -1,17 +1,17 @@ [global.config] - as = {{ minigraph_bgp_asn }} + as = {{ DEVICE_METADATA['localhost']['bgp_asn'] }} router-id = "{{ minigraph_lo_interfaces[0]['addr'] }}" -{% for bgp_session in minigraph_bgp %} +{% for neighbor_addr, bgp_session in BGP_NEIGHBOR.iteritems() %} {% if bgp_session['asn'] != 0 %} [[neighbors]] [neighbors.config] peer-as = {{ bgp_session['asn'] }} - neighbor-address = "{{ bgp_session['addr'] }}" + neighbor-address = "{{ neighbor_addr }}" [neighbors.graceful-restart.config] enabled = true [[neighbors.afi-safis]] [neighbors.afi-safis.config] -{% if bgp_session['addr'] | ipv6 %} +{% if neighbor_addr | ipv6 %} afi-safi-name = "ipv6-unicast" {% else %} afi-safi-name = "ipv4-unicast" diff --git a/dockers/docker-fpm-gobgp/isolate.j2 b/dockers/docker-fpm-gobgp/isolate.j2 index e587623e984f..4502ff895777 100755 --- a/dockers/docker-fpm-gobgp/isolate.j2 +++ b/dockers/docker-fpm-gobgp/isolate.j2 @@ -2,23 +2,3 @@ echo Not implemented yet exit - -## vtysh only accepts script in stdin, so cannot be directly used in shebang -## Cut the tail of this script and feed vtysh stdin -sed -n -e '9,$p' < "$0" | vtysh "$@" -## Exit with vtysh return code -exit $? - -## vtysh script start from next line, which line number MUST eqaul in 'sed' command above - -configure terminal - router bgp {{ minigraph_bgp_asn }} -{% for bgp_session in minigraph_bgp %} - neighbor {{ bgp_session['addr'] }} route-map ISOLATE out -{% endfor %} - exit -exit - -{% for bgp_session in minigraph_bgp %} -clear ip bgp {{ bgp_session['addr'] }} soft out -{% endfor %} diff --git a/dockers/docker-fpm-gobgp/unisolate.j2 b/dockers/docker-fpm-gobgp/unisolate.j2 index d1310114d908..69172744bae7 100755 --- a/dockers/docker-fpm-gobgp/unisolate.j2 +++ b/dockers/docker-fpm-gobgp/unisolate.j2 @@ -3,22 +3,3 @@ echo Not implemented yet exit -## vtysh only accepts script in stdin, so cannot be directly used in shebang -## Cut the tail of this script and feed vtysh stdin -sed -n -e '9,$p' < "$0" | vtysh "$@" -## Exit with vtysh return code -exit $? - -## vtysh script start from next line, which line number MUST eqaul in 'sed' command above - -configure terminal - router bgp {{ minigraph_bgp_asn }} -{% for bgp_session in minigraph_bgp %} - no neighbor {{ bgp_session['addr'] }} route-map ISOLATE out -{% endfor %} - exit -exit - -{% for bgp_session in minigraph_bgp %} -clear ip bgp {{ bgp_session['addr'] }} soft out -{% endfor %} diff --git a/dockers/docker-fpm-quagga/bgpcfgd b/dockers/docker-fpm-quagga/bgpcfgd index 2bcecb13f905..012a766c20b9 100755 --- a/dockers/docker-fpm-quagga/bgpcfgd +++ b/dockers/docker-fpm-quagga/bgpcfgd @@ -6,37 +6,60 @@ import subprocess import syslog from swsssdk import ConfigDBConnector -# Returns BGP ASN as a string -def _get_bgp_asn_from_minigraph(): - # Get BGP ASN from minigraph - proc = subprocess.Popen( - ['sonic-cfggen', '-m', '/etc/sonic/minigraph.xml', '-v', 'minigraph_bgp_asn'], - stdout=subprocess.PIPE, - shell=False, - stderr=subprocess.STDOUT) - stdout = proc.communicate()[0] - proc.wait() - return stdout.rstrip('\n') - -def bgp_config(asn, ip, config): - syslog.syslog(syslog.LOG_INFO, '[bgp cfgd] value for {} changed to {}'.format(ip, config)) - # Currently dynamic config is supported only for bgp admin status - if config.has_key('admin_status'): - command_mod = 'no ' if config['admin_status'] == 'up' else '' - command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c '{}neighbor {} shutdown'".format(asn, command_mod, ip) - +class BGPConfigDaemon: + + def __init__(self): + self.config_db = ConfigDBConnector() + self.config_db.connect() + self.bgp_asn = self.config_db.get_entry('DEVICE_METADATA', 'localhost')['bgp_asn'] + self.bgp_neighbor = self.config_db.get_table('BGP_NEIGHBOR') + + def __run_command(self, command): +# print command p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) stdout = p.communicate()[0] p.wait() if p.returncode != 0: syslog.syslog(syslog.LOG_ERR, '[bgp cfgd] command execution returned {}. Command: "{}", stdout: "{}"'.format(p.returncode, command, stdout)) + def metadata_handler(self, key, data): + if key == 'localhost' and data.has_key('bgp_asn'): + if data['bgp_asn'] != self.bgp_asn: + syslog.syslog(syslog.LOG_INFO, '[bgp cfgd] ASN changed to {} from {}, restart BGP...'.format(data['bgp_asn'], self.bgp_asn)) + self.__run_command("supervisorctl restart start.sh") + self.__run_command("service quagga restart") + self.bgp_asn = data['bgp_asn'] + + def bgp_handler(self, key, data): + syslog.syslog(syslog.LOG_INFO, '[bgp cfgd] value for {} changed to {}'.format(key, data)) + if not data: + # Neighbor is deleted + command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c 'no neighbor {}'".format(self.bgp_asn, key) + self.__run_command(command) + self.bgp_neighbor.pop(key) + else: + command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c 'neighbor {} remote-as {}'".format(self.bgp_asn, key, data['asn']) + self.__run_command(command) + if data.has_key('name'): + command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c 'neighbor {} description {}'".format(self.bgp_asn, key, data['name']) + self.__run_command(command) + if data.has_key('admin_status'): + command_mod = 'no ' if data['admin_status'] == 'up' else '' + command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c '{}neighbor {} shutdown'".format(self.bgp_asn, command_mod, key) + self.__run_command(command) + self.bgp_neighbor[key] = data + + def start(self): + self.config_db.subscribe('BGP_NEIGHBOR', + lambda table, key, data: self.bgp_handler(key, data)) + self.config_db.subscribe('DEVICE_METADATA', + lambda table, key, data: self.metadata_handler(key, data)) + self.config_db.listen() + + def main(): - sub = ConfigDBConnector() - bgp_asn = _get_bgp_asn_from_minigraph() - handler = lambda table, key, data: bgp_config(bgp_asn, key, data) - sub.subscribe('BGP_NEIGHBOR', handler) - sub.connect() - sub.listen() - -main() + daemon = BGPConfigDaemon() + daemon.start() + +if __name__ == "__main__": + main() diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index ceb866edd02d..a5c317aa2e80 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -14,7 +14,7 @@ log facility local4 ! enable password {# {{ en_passwd }} TODO: param needed #} {% endblock system_init %} ! -{% if minigraph_bgp_asn is not none %} +{% if DEVICE_METADATA['localhost'].has_key('bgp_asn') %} {% block bgp_init %} ! ! bgp multiple-instance @@ -23,7 +23,7 @@ route-map FROM_BGP_SPEAKER_V4 permit 10 ! route-map TO_BGP_SPEAKER_V4 deny 10 ! -router bgp {{ minigraph_bgp_asn }} +router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp log-neighbor-changes bgp bestpath as-path multipath-relax {# Advertise graceful restart capability for ToR #} @@ -50,24 +50,24 @@ router bgp {{ minigraph_bgp_asn }} {% endfor %} {% endblock vlan_advertisement %} {% block bgp_sessions %} -{% for bgp_session in minigraph_bgp %} +{% for neighbor_addr, bgp_session in BGP_NEIGHBOR.iteritems() %} {% if bgp_session['asn'] != 0 %} - neighbor {{ bgp_session['addr'] }} remote-as {{ bgp_session['asn'] }} - neighbor {{ bgp_session['addr'] }} description {{ bgp_session['name'] }} -{% 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 + neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }} + neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} +{% if bgp_session.has_key('admin_status') and bgp_session['admin_status'] == 'down' or not bgp_session.has_key('admin_status') and DEVICE_METADATA['localhost'].has_key('default_bgp_status') and DEVICE_METADATA['localhost']['default_bgp_status'] == 'down' %} + neighbor {{ neighbor_addr }} shutdown {% endif %} -{% if bgp_session['addr'] | ipv4 %} +{% if neighbor_addr | ipv4 %} {% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} - neighbor {{ bgp_session['addr'] }} allowas-in 1 + neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} {% endif %} -{% if bgp_session['addr'] | ipv6 %} +{% if neighbor_addr | ipv6 %} address-family ipv6 {% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} - neighbor {{ bgp_session['addr'] }} allowas-in 1 + neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} - neighbor {{ bgp_session['addr'] }} activate + neighbor {{ neighbor_addr }} activate maximum-paths 64 exit-address-family {% endif %} @@ -75,7 +75,7 @@ router bgp {{ minigraph_bgp_asn }} {% endfor %} {% endblock bgp_sessions %} {% block bgp_peers_with_range %} -{% for bgp_peer in minigraph_bgp_peers_with_range %} +{% for bgp_peer in BGP_PEER_RANGE.values() %} neighbor {{ bgp_peer['name'] }} peer-group neighbor {{ bgp_peer['name'] }} passive neighbor {{ bgp_peer['name'] }} remote-as {{deployment_id_asn_map[deployment_id] }} @@ -90,10 +90,10 @@ router bgp {{ minigraph_bgp_asn }} {% endfor %} {% endblock bgp_peers_with_range %} ! -{% if minigraph_bgp_asn is not none %} +{% if DEVICE_METADATA['localhost'].has_key('bgp_asn') %} maximum-paths 64 ! route-map ISOLATE permit 10 -set as-path prepend {{ minigraph_bgp_asn }} +set as-path prepend {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% endif %} ! diff --git a/dockers/docker-fpm-quagga/isolate.j2 b/dockers/docker-fpm-quagga/isolate.j2 index 35ef5bbc0209..7b7fecf9fa9e 100755 --- a/dockers/docker-fpm-quagga/isolate.j2 +++ b/dockers/docker-fpm-quagga/isolate.j2 @@ -8,13 +8,13 @@ exit $? ## vtysh script start from next line, which line number MUST eqaul in 'sed' command above configure terminal - router bgp {{ minigraph_bgp_asn }} -{% for bgp_session in minigraph_bgp %} - neighbor {{ bgp_session['addr'] }} route-map ISOLATE out + router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} +{% for neighbor_addr in BGP_NEIGHBOR %} + neighbor {{ neighbor_addr }} route-map ISOLATE out {% endfor %} exit exit -{% for bgp_session in minigraph_bgp %} -clear ip bgp {{ bgp_session['addr'] }} soft out +{% for neighbor_addr in BGP_NEIGHBOR %} +clear ip bgp {{ neighbor_addr }} soft out {% endfor %} diff --git a/dockers/docker-fpm-quagga/start.sh b/dockers/docker-fpm-quagga/start.sh index 892c1f6ea974..ca876efe184e 100755 --- a/dockers/docker-fpm-quagga/start.sh +++ b/dockers/docker-fpm-quagga/start.sh @@ -3,13 +3,13 @@ mkdir -p /etc/quagga sonic-cfggen -m -d -y /etc/sonic/deployment_id_asn_map.yml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/zebra.conf.j2 > /etc/quagga/zebra.conf +sonic-cfggen -m -d -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 +sonic-cfggen -m -d -t /usr/share/sonic/templates/isolate.j2 > /usr/sbin/bgp-isolate chown root:root /usr/sbin/bgp-isolate chmod 0755 /usr/sbin/bgp-isolate -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/unisolate.j2 > /usr/sbin/bgp-unisolate +sonic-cfggen -m -d -t /usr/share/sonic/templates/unisolate.j2 > /usr/sbin/bgp-unisolate chown root:root /usr/sbin/bgp-unisolate chmod 0755 /usr/sbin/bgp-unisolate diff --git a/dockers/docker-fpm-quagga/unisolate.j2 b/dockers/docker-fpm-quagga/unisolate.j2 index c113a74fab45..f2129556747b 100755 --- a/dockers/docker-fpm-quagga/unisolate.j2 +++ b/dockers/docker-fpm-quagga/unisolate.j2 @@ -8,13 +8,13 @@ exit $? ## vtysh script start from next line, which line number MUST eqaul in 'sed' command above configure terminal - router bgp {{ minigraph_bgp_asn }} -{% for bgp_session in minigraph_bgp %} - no neighbor {{ bgp_session['addr'] }} route-map ISOLATE out + router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} +{% for neighbor_ip in BGP_NEIGHBOR %} + no neighbor {{ neighbor_ip }} route-map ISOLATE out {% endfor %} exit exit -{% for bgp_session in minigraph_bgp %} -clear ip bgp {{ bgp_session['addr'] }} soft out +{% for neighbor_ip in BGP_NEIGHBOR %} +clear ip bgp {{ neighbor_ip }} soft out {% endfor %} diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 3c0804f7abfa..fc84191e3cf1 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -132,7 +132,7 @@ sudo bash -c "echo dhcp_as_static=true >> $FILESYSTEM_ROOT/etc/sonic/updategraph 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\": { \"all\": false } }' >> $FILESYSTEM_ROOT/etc/sonic/config_db.json" +sudo bash -c "echo '{ \"DEVICE_METADATA\": { \"localhost\": { \"default_bgp_status\": \"down\" } } }' >> $FILESYSTEM_ROOT/etc/sonic/init_cfg.json" {% endif %} # Copy SNMP configuration files sudo cp $IMAGE_CONFIGS/snmp/snmp.yml $FILESYSTEM_ROOT/etc/sonic/ diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index dad2510ce756..49b2ed6e1b69 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -35,8 +35,20 @@ if [ -f /host/image-$sonic_version/platform/firsttime ]; then mv -f /host/old_config/* /etc/sonic/ elif [ -f /host/minigraph.xml ]; then mv /host/minigraph.xml /etc/sonic/ + # Combine information in minigraph and init_cfg.json to form initiate config DB dump file. + # TODO: After moving all information from minigraph to DB, sample config DB dump should be provide + if [ -f /etc/sonic/init_cfg.json ]; then + sonic-cfggen -m -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json + else + sonic-cfggen -m --print-data > /etc/sonic/config_db.json + fi else cp /usr/share/sonic/device/$platform/minigraph.xml /etc/sonic/ + if [ -f /etc/sonic/init_cfg.json ]; then + sonic-cfggen -m -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json + else + sonic-cfggen -m --print-data > /etc/sonic/config_db.json + fi fi if [ -d /host/image-$sonic_version/platform/$platform ]; then diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index 7240d913c76d..4e9846fba024 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -68,6 +68,13 @@ while true; do sleep 5 done +echo "Regenerating config DB from minigraph..." +if [ -f /etc/sonic/init_cfg.json ]; then + sonic-cfggen -m -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json +else + sonic-cfggen -m --print-data > /etc/sonic/config_db.json +fi + # Mark as disabled after graph is successfully downloaded sed -i "/enabled=/d" /etc/sonic/updategraph.conf echo "enabled=false" >> /etc/sonic/updategraph.conf diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 65738a0508f5..6dbf0d570d47 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -249,9 +249,9 @@ def parse_dpg(dpg, hname): def parse_cpg(cpg, hname): - bgp_sessions = [] + bgp_sessions = {} myasn = None - bgp_peers_with_range = [] + bgp_peers_with_range = {} for child in cpg: tag = child.tag if tag == str(QName(ns, "PeeringSessions")): @@ -261,17 +261,15 @@ def parse_cpg(cpg, hname): end_router = session.find(str(QName(ns, "EndRouter"))).text end_peer = session.find(str(QName(ns, "EndPeer"))).text if end_router == hname: - bgp_sessions.append({ + bgp_sessions[start_peer] = { 'name': start_router, - 'addr': start_peer, - 'peer_addr': end_peer - }) + 'local_addr': end_peer + } else: - bgp_sessions.append({ + bgp_sessions[end_peer] = { 'name': end_router, - 'addr': end_peer, - 'peer_addr': start_peer - }) + 'local_addr': start_peer + } elif child.tag == str(QName(ns, "Routers")): for router in child.findall(str(QName(ns1, "BGPRouterDeclaration"))): asn = router.find(str(QName(ns1, "ASN"))).text @@ -285,12 +283,13 @@ def parse_cpg(cpg, hname): name = bgpPeer.find(str(QName(ns1, "Name"))).text ip_range = bgpPeer.find(str(QName(ns1, "PeersRange"))).text ip_range_group = ip_range.split(';') if ip_range and ip_range != "" else [] - bgp_peers_with_range.append({ + bgp_peers_with_range[name] = { 'name': name, 'ip_range': ip_range_group - }) + } else: - for bgp_session in bgp_sessions: + for peer in bgp_sessions: + bgp_session = bgp_sessions[peer] if hostname == bgp_session['name']: bgp_session['asn'] = int(asn) @@ -447,9 +446,9 @@ def parse_xml(filename, platform=None, port_config_file=None): # sorting by lambdas are not easily done without custom filters. # TODO: add jinja2 filter to accept a lambda to sort a list of dictionaries by attribute. # 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 + results['BGP_NEIGHBOR'] = bgp_sessions + results['DEVICE_METADATA'] = {'localhost': { 'bgp_asn': bgp_asn }} + results['BGP_PEER_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 = [] diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index d93b4a6a41dc..070b3100ea5a 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -73,37 +73,25 @@ TODO(taoyl): Current version of config db only supports BGP admin states. """ @staticmethod def db_to_output(db_data): - data_bgp_admin = {} - for table_name, content in db_data.iteritems(): - if table_name == 'BGP_NEIGHBOR': - for key, value in content.iteritems(): - if value.has_key('admin_status'): - data_bgp_admin[key] = (value['admin_status'] == 'up') - elif table_name == 'DEVICE_METADATA': - if content['localhost'].has_key('bgp_default_status'): - data_bgp_admin['all'] = (content['localhost']['bgp_default_status'] == 'up') - - output_data = {'bgp_admin_state': data_bgp_admin} if data_bgp_admin else {} - return output_data + return db_data @staticmethod def output_to_db(output_data): db_data = {} - for key, value in output_data.iteritems(): - if key == 'bgp_admin_state': - for neighbor, state in value.iteritems(): - if neighbor == 'all': - if not db_data.has_key('DEVICE_METADATA'): - db_data['DEVICE_METADATA'] = {'localhost': {}} - db_data['DEVICE_METADATA']['localhost']['bgp_default_status'] = 'up' if state else 'down' - else: - if not db_data.has_key('BGP_NEIGHBOR'): - db_data['BGP_NEIGHBOR'] = {} - if not db_data['BGP_NEIGHBOR'].has_key(neighbor): - db_data['BGP_NEIGHBOR'][neighbor] = {} - db_data['BGP_NEIGHBOR'][neighbor]['admin_status'] = 'up' if state else 'down' + for table_name in output_data: + if table_name == 'BGP_NEIGHBOR' or table_name == 'BGP_PEER_RANGE' or table_name == 'DEVICE_METADATA': + db_data[table_name] = output_data[table_name] return db_data +def deep_update(dst, src): + for key, value in src.iteritems(): + if isinstance(value, dict): + node = dst.setdefault(key, {}) + deep_update(node, value) + else: + dst[key] = value + return dst + def main(): parser=argparse.ArgumentParser(description="Render configuration file from minigraph data and jinja2 template.") @@ -126,7 +114,7 @@ def main(): data = {} machine_info = get_machine_info() if machine_info != None: - data.update(machine_info) + deep_update(data, machine_info) platform_info = get_platform_info(machine_info) if platform_info != None: data['platform'] = platform_info @@ -135,34 +123,34 @@ def main(): minigraph = args.minigraph if data.has_key('platform'): if args.port_config != None: - data.update(parse_xml(minigraph, data['platform'], args.port_config)) + deep_update(data, parse_xml(minigraph, data['platform'], args.port_config)) else: - data.update(parse_xml(minigraph, data['platform'])) + deep_update(data, parse_xml(minigraph, data['platform'])) else: if args.port_config != None: - data.update(parse_xml(minigraph, port_config_file=args.port_config)) + deep_update(data, parse_xml(minigraph, port_config_file=args.port_config)) else: - data.update(parse_xml(minigraph)) + deep_update(data, parse_xml(minigraph)) if args.device_description != None: - data.update(parse_device_desc_xml(args.device_description)) + deep_update(data, parse_device_desc_xml(args.device_description)) for yaml_file in args.yaml: with open(yaml_file, 'r') as stream: additional_data = yaml.load(stream) - data.update(additional_data) + deep_update(data, additional_data) for json_file in args.json: with open(json_file, 'r') as stream: - data.update(json.load(stream)) + deep_update(data, json.load(stream)) if args.additional_data != None: - data.update(json.loads(args.additional_data)) + deep_update(data, json.loads(args.additional_data)) if args.from_db: configdb = ConfigDBConnector() configdb.connect() - data.update(FormatConverter.db_to_output(configdb.get_config())) + deep_update(data, FormatConverter.db_to_output(configdb.get_config())) if args.template != None: template_file = os.path.abspath(args.template) diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 6835c60e27fd..d3ff3e8b9f4e 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -111,7 +111,7 @@ def test_minigraph_neighbors(self): self.assertEqual(output.strip(), "{'Ethernet116': {'name': 'ARISTA02T1', 'port': 'Ethernet1/1'}, 'Ethernet124': {'name': 'ARISTA04T1', 'port': 'Ethernet1/1'}, 'Ethernet112': {'name': 'ARISTA01T1', 'port': 'Ethernet1/1'}, 'Ethernet120': {'name': 'ARISTA03T1', 'port': 'Ethernet1/1'}}") def test_minigraph_peers_with_range(self): - argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v minigraph_bgp_peers_with_range' + argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v BGP_PEER_RANGE.values\(\)' output = self.run_script(argument) self.assertEqual(output.strip(), "[{'name': 'BGPSLBPassive', 'ip_range': ['10.10.10.10/26', '100.100.100.100/26']}]") diff --git a/src/sonic-utilities b/src/sonic-utilities index 6c7e22362fbc..e4f7161b055a 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 6c7e22362fbc05ba455e7e336e2a88430de0de18 +Subproject commit e4f7161b055a345813424004f17b116a055d590a From 96636e2124c55700f7542d3f3581ab4b28242770 Mon Sep 17 00:00:00 2001 From: Polly Hsu Date: Wed, 9 Aug 2017 12:19:50 +0800 Subject: [PATCH 0708/1011] [device/accton]: Update Accton-AS7712-32X (#776) * [device/accton]: Update Accton-AS7712-32X * Add Broadcom LED microprocessor / pre-emphasis initialization Signed-off-by: polly_hsu@accton.com * Update start.sh * Update start.sh * [device/accton]: Update Accton-AS7712-32X * Add Broadcom LED microprocessor (Remove pre-emphasis initialization) Signed-off-by: polly_hsu@accton.com --- .../led_proc_init.soc | 41 +++++++++++++++++++ platform/broadcom/docker-syncd-brcm/start.sh | 9 ++-- 2 files changed, 47 insertions(+), 3 deletions(-) create mode 100755 device/accton/x86_64-accton_as7712_32x-r0/led_proc_init.soc diff --git a/device/accton/x86_64-accton_as7712_32x-r0/led_proc_init.soc b/device/accton/x86_64-accton_as7712_32x-r0/led_proc_init.soc new file mode 100755 index 000000000000..719cb777719f --- /dev/null +++ b/device/accton/x86_64-accton_as7712_32x-r0/led_proc_init.soc @@ -0,0 +1,41 @@ +m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=31 REMAP_PORT_1=30 REMAP_PORT_2=29 REMAP_PORT_3=28 +m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=27 REMAP_PORT_5=26 REMAP_PORT_6=25 REMAP_PORT_7=24 +m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=23 REMAP_PORT_9=22 REMAP_PORT_10=21 REMAP_PORT_11=20 +m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=19 REMAP_PORT_13=18 REMAP_PORT_14=17 REMAP_PORT_15=16 +m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=63 REMAP_PORT_17=62 REMAP_PORT_18=61 REMAP_PORT_19=60 +m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=59 REMAP_PORT_21=58 REMAP_PORT_22=57 REMAP_PORT_23=56 +m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=55 REMAP_PORT_25=54 REMAP_PORT_26=53 REMAP_PORT_27=52 +m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=51 REMAP_PORT_29=50 REMAP_PORT_30=49 REMAP_PORT_31=48 +m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=47 REMAP_PORT_33=46 REMAP_PORT_34=45 REMAP_PORT_35=44 +m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=43 REMAP_PORT_37=42 REMAP_PORT_38=41 REMAP_PORT_39=40 +m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=39 REMAP_PORT_41=38 REMAP_PORT_42=37 REMAP_PORT_43=36 +m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=35 REMAP_PORT_45=34 REMAP_PORT_46=33 REMAP_PORT_47=32 +m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=15 REMAP_PORT_49=14 REMAP_PORT_50=13 REMAP_PORT_51=12 +m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=11 REMAP_PORT_53=10 REMAP_PORT_54=9 REMAP_PORT_55=8 +m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=7 REMAP_PORT_57=6 REMAP_PORT_58=5 REMAP_PORT_59=4 +m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=3 REMAP_PORT_61=2 REMAP_PORT_62=1 REMAP_PORT_63=0 + +m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=35 REMAP_PORT_1=34 REMAP_PORT_2=33 REMAP_PORT_3=32 +m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=39 REMAP_PORT_5=38 REMAP_PORT_6=37 REMAP_PORT_7=36 +m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=43 REMAP_PORT_9=42 REMAP_PORT_10=41 REMAP_PORT_11=40 +m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=47 REMAP_PORT_13=46 REMAP_PORT_14=45 REMAP_PORT_15=44 +m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=3 REMAP_PORT_17=2 REMAP_PORT_18=1 REMAP_PORT_19=0 +m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=7 REMAP_PORT_21=6 REMAP_PORT_22=5 REMAP_PORT_23=4 +m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=11 REMAP_PORT_25=10 REMAP_PORT_26=9 REMAP_PORT_27=8 +m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=15 REMAP_PORT_29=14 REMAP_PORT_30=13 REMAP_PORT_31=12 +m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=19 REMAP_PORT_33=18 REMAP_PORT_34=17 REMAP_PORT_35=16 +m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=23 REMAP_PORT_37=22 REMAP_PORT_38=21 REMAP_PORT_39=20 +m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=27 REMAP_PORT_41=26 REMAP_PORT_42=25 REMAP_PORT_43=24 +m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=31 REMAP_PORT_45=30 REMAP_PORT_46=29 REMAP_PORT_47=28 +m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=51 REMAP_PORT_49=50 REMAP_PORT_50=49 REMAP_PORT_51=48 +m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=55 REMAP_PORT_53=54 REMAP_PORT_54=53 REMAP_PORT_55=52 +m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=59 REMAP_PORT_57=58 REMAP_PORT_58=57 REMAP_PORT_59=56 +m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=63 REMAP_PORT_61=62 REMAP_PORT_62=61 REMAP_PORT_63=60 + +led 0 prog 02 FD 42 80 02 FF 42 00 02 FE 42 00 02 FA 42 E0 02 FB 42 40 06 F9 D2 00 74 1E 02 F9 42 03 67 AC 67 C3 67 52 86 FE 67 C3 67 52 86 FE 67 C3 67 52 86 FE 67 C3 67 52 86 FE 06 FB D6 FE 74 1E 86 FC 3E FA 06 FE 88 4A 03 71 4C 67 84 57 67 84 57 67 98 57 06 FE 88 80 4A 00 27 97 75 4F 90 4A 00 27 4A 01 27 B7 97 71 69 77 42 06 F9 D6 FC 74 7C 02 F9 4A 07 37 4E 07 02 FC 42 00 4E 07 06 F9 0A 07 71 4F 77 42 16 FF 06 FD 17 4D DA 07 74 95 12 FF 52 00 86 FD 57 86 FF 57 16 FF 06 FD 07 4D DA 07 74 A9 12 FF 52 00 86 FD 57 86 FF 57 06 FE C2 FC 98 98 12 F4 50 C2 FC 98 98 F2 F0 14 06 F4 C2 03 88 77 D1 06 FE C2 FC 98 98 F2 E0 14 06 FE C2 03 88 18 71 E2 80 18 71 DD 67 98 67 98 57 67 84 67 98 57 80 18 71 EB 67 98 67 84 57 67 84 67 84 57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +led 0 start + +led 1 prog 02 FD 42 80 02 FF 42 00 02 FE 42 00 02 FA 42 E0 02 FB 42 40 06 F9 D2 00 74 1E 02 F9 42 03 67 AC 67 C3 67 52 86 FE 67 C3 67 52 86 FE 67 C3 67 52 86 FE 67 C3 67 52 86 FE 06 FB D6 FE 74 1E 86 FC 3E FA 06 FE 88 4A 03 71 4C 67 84 57 67 84 57 67 98 57 06 FE 88 80 4A 00 27 97 75 4F 90 4A 00 27 4A 01 27 B7 97 71 69 77 42 06 F9 D6 FC 74 7C 02 F9 4A 07 37 4E 07 02 FC 42 00 4E 07 06 F9 0A 07 71 4F 77 42 16 FF 06 FD 17 4D DA 07 74 95 12 FF 52 00 86 FD 57 86 FF 57 16 FF 06 FD 07 4D DA 07 74 A9 12 FF 52 00 86 FD 57 86 FF 57 06 FE C2 FC 98 98 12 F4 50 C2 FC 98 98 F2 F0 14 06 F4 C2 03 88 77 D1 06 FE C2 FC 98 98 F2 E0 14 06 FE C2 03 88 18 71 E2 80 18 71 DD 67 98 67 98 57 67 84 67 98 57 80 18 71 EB 67 98 67 84 57 67 84 67 84 57 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +led 1 start + +led auto on \ No newline at end of file diff --git a/platform/broadcom/docker-syncd-brcm/start.sh b/platform/broadcom/docker-syncd-brcm/start.sh index 930609a1958d..e06a29b2b2a8 100755 --- a/platform/broadcom/docker-syncd-brcm/start.sh +++ b/platform/broadcom/docker-syncd-brcm/start.sh @@ -8,15 +8,18 @@ supervisorctl start rsyslogd supervisorctl start syncd -# If this platform has an initialization file for the Broadcom LED microprocessor, load it -if [ -r ${PLATFORM_DIR}/led_proc_init.soc ]; then - # Wait until syncd has created the socket for bcmcmd to connect to +# Function: wait until syncd has created the socket for bcmcmd to connect to +wait_syncd() { while true; do if [ -e /var/run/sswsyncd/sswsyncd.socket ]; then break fi sleep 1 done +} +# If this platform has an initialization file for the Broadcom LED microprocessor, load it +if [ -r ${PLATFORM_DIR}/led_proc_init.soc ]; then + wait_syncd /usr/bin/bcmcmd -t 60 "rcload ${PLATFORM_DIR}/led_proc_init.soc" fi From 847a9480698f0098315b86c3216c65e039e91a02 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 8 Aug 2017 21:40:31 -0700 Subject: [PATCH 0709/1011] Update sonic-utilities pointer to support reload minigraph (#871) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index e4f7161b055a..c7f6ff677b54 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit e4f7161b055a345813424004f17b116a055d590a +Subproject commit c7f6ff677b54eb401e7b2fd3a3d9c4072325bb78 From 9d5adb993ae34d9ce64de3320b0a4654af94af26 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 10 Aug 2017 16:24:57 -0700 Subject: [PATCH 0710/1011] [System logs]: Improvements to prevent filling /var/log partition (#865) - Force log rotation at size thresholds only (no longer also rotating logs daily), allowing for more consistent archived log size - Eliminate remaining duplicate log messages - Cron facility now only logs to cron.log (was also logging to syslog) - Debug, mail, news and user log facilities only log to syslog; no longer creating separate log files for these facilities - Cron job that calls logrotate every minute now uses the main /etc/logrotate.conf file so as to check/rotate all logs every minute, not just the logs specified in the rsyslog file. Also redirecting output of this command to /dev/null to prevent "(CRON) info (No MTA installed, discarding output)" messages in cron.log due to lack of a mail service - Delete archive files based on remaining /var/log partition space. Note that this solution currently requires a minimum /var/log partition size of 32MB to function correctly - Update sonic-sairedis and sonic-swss submodules to incorporate recording file name changes - Add .screen file to .gitignore (unrelated) --- .gitignore | 1 + .../build_templates/sonic_debian_extension.j2 | 2 +- files/image_config/cron.d/logrotate | 2 +- files/image_config/logrotate.d/rsyslog | 62 ------------ files/image_config/logrotate/logrotate.conf | 32 +++++++ files/image_config/logrotate/logrotate.d/apt | 15 +++ files/image_config/logrotate/logrotate.d/dpkg | 18 ++++ .../image_config/logrotate/logrotate.d/monit | 12 +++ .../logrotate/logrotate.d/rsyslog | 96 +++++++++++++++++++ .../rsyslog/rsyslog.d/99-default.conf | 51 +--------- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- 12 files changed, 182 insertions(+), 113 deletions(-) delete mode 100644 files/image_config/logrotate.d/rsyslog create mode 100644 files/image_config/logrotate/logrotate.conf create mode 100644 files/image_config/logrotate/logrotate.d/apt create mode 100644 files/image_config/logrotate/logrotate.d/dpkg create mode 100644 files/image_config/logrotate/logrotate.d/monit create mode 100644 files/image_config/logrotate/logrotate.d/rsyslog diff --git a/.gitignore b/.gitignore index 16d7b53f60af..9ca9d2ff1a98 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Build system related .platform +.screen # Build artifacts fsroot/ diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index fc84191e3cf1..0b1d19b6e1b9 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -106,7 +106,7 @@ sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.conf.j2 $FILESYSTEM_ROOT/usr/share/sonic/ sudo cp $IMAGE_CONFIGS/rsyslog/rsyslog.d/* $FILESYSTEM_ROOT/etc/rsyslog.d/ # Copy logrotate.d configuration files -sudo cp -f $IMAGE_CONFIGS/logrotate.d/rsyslog $FILESYSTEM_ROOT/etc/logrotate.d/ +sudo cp -f $IMAGE_CONFIGS/logrotate/logrotate.d/* $FILESYSTEM_ROOT/etc/logrotate.d/ # Copy systemd-journald configuration files sudo cp -f $IMAGE_CONFIGS/systemd/journald.conf $FILESYSTEM_ROOT/etc/systemd/ diff --git a/files/image_config/cron.d/logrotate b/files/image_config/cron.d/logrotate index 9e1335cbd43e..d0c2e0829ba9 100644 --- a/files/image_config/cron.d/logrotate +++ b/files/image_config/cron.d/logrotate @@ -1,2 +1,2 @@ # Attempt to rotate system logs once per minute -* * * * * root /usr/sbin/logrotate /etc/logrotate.d/rsyslog +* * * * * root /usr/sbin/logrotate /etc/logrotate.conf > /dev/null 2>&1 diff --git a/files/image_config/logrotate.d/rsyslog b/files/image_config/logrotate.d/rsyslog deleted file mode 100644 index 5101b0e41fd2..000000000000 --- a/files/image_config/logrotate.d/rsyslog +++ /dev/null @@ -1,62 +0,0 @@ -/var/log/syslog -/var/log/quagga/*.log -/var/log/teamd.log -{ - rotate 7 - daily - maxsize 100M - missingok - notifempty - compress - delaycompress - postrotate - # Calling kill directly instead of 'service rsyslog rotate >/dev/null' due - # to bug in init-system-helpers. Bug has apparently been fixed in v1.47. - # However, Debian Jessie is still using v1.22. - # See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=672218 - kill -HUP $(cat /var/run/rsyslogd.pid) - endscript -} -/var/log/swss/*.rec -{ - rotate 7 - daily - maxsize 20M - missingok - notifempty - compress - delaycompress - sharedscripts - postrotate - pgrep -x orchagent | xargs /bin/kill -HUP 2>/dev/null || true - endscript -} -/var/log/mail.info -/var/log/mail.warn -/var/log/mail.err -/var/log/mail.log -/var/log/daemon.log -/var/log/kern.log -/var/log/auth.log -/var/log/user.log -/var/log/lpr.log -/var/log/cron.log -/var/log/debug -/var/log/messages -{ - rotate 4 - daily - maxsize 50M - missingok - notifempty - compress - delaycompress - sharedscripts - postrotate - # Calling kill directly instead of 'service rsyslog rotate >/dev/null' due - # to bug in init-system-helpers. Bug has apparently been fixed in v1.47. - # However, Debian Jessie is still using v1.22. - # See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=672218 - kill -HUP $(cat /var/run/rsyslogd.pid) - endscript -} diff --git a/files/image_config/logrotate/logrotate.conf b/files/image_config/logrotate/logrotate.conf new file mode 100644 index 000000000000..6f107e209837 --- /dev/null +++ b/files/image_config/logrotate/logrotate.conf @@ -0,0 +1,32 @@ +# see "man logrotate" for details +# Rotate log files daily by default +daily + +# Keep 4 days worth of backlogs by default +rotate 4 + +# create new (empty) log files after rotating old ones +create + +# uncomment this if you want your log files compressed +#compress + +# packages drop log rotation information into this directory +include /etc/logrotate.d + +# no packages own wtmp, or btmp -- we'll rotate them here +/var/log/wtmp { + missingok + size 100k + create 0664 root utmp + rotate 1 +} + +/var/log/btmp { + missingok + size 100k + create 0660 root utmp + rotate 1 +} + +# system-specific logs may be configured here diff --git a/files/image_config/logrotate/logrotate.d/apt b/files/image_config/logrotate/logrotate.d/apt new file mode 100644 index 000000000000..7584dcacc881 --- /dev/null +++ b/files/image_config/logrotate/logrotate.d/apt @@ -0,0 +1,15 @@ +/var/log/apt/term.log { + size 100k + rotate 1 + compress + missingok + notifempty +} + +/var/log/apt/history.log { + size 100k + rotate 1 + compress + missingok + notifempty +} diff --git a/files/image_config/logrotate/logrotate.d/dpkg b/files/image_config/logrotate/logrotate.d/dpkg new file mode 100644 index 000000000000..5e24c7ed74e1 --- /dev/null +++ b/files/image_config/logrotate/logrotate.d/dpkg @@ -0,0 +1,18 @@ +/var/log/dpkg.log { + size 100k + rotate 1 + compress + delaycompress + missingok + notifempty + create 644 root root +} +/var/log/alternatives.log { + size 100k + rotate 1 + compress + delaycompress + missingok + notifempty + create 644 root root +} diff --git a/files/image_config/logrotate/logrotate.d/monit b/files/image_config/logrotate/logrotate.d/monit new file mode 100644 index 000000000000..7846dfadb77c --- /dev/null +++ b/files/image_config/logrotate/logrotate.d/monit @@ -0,0 +1,12 @@ +/var/log/monit.log { + size 100k + rotate 1 + missingok + create 640 root adm + notifempty + compress + delaycompress + postrotate + invoke-rc.d monit reload > /dev/null + endscript +} diff --git a/files/image_config/logrotate/logrotate.d/rsyslog b/files/image_config/logrotate/logrotate.d/rsyslog new file mode 100644 index 000000000000..ba550dcd242b --- /dev/null +++ b/files/image_config/logrotate/logrotate.d/rsyslog @@ -0,0 +1,96 @@ +# These logs should no longer get created. However, in case they do get created, +# we should keep them to a small size and rotate them also. +/var/log/mail.info +/var/log/mail.warn +/var/log/mail.err +/var/log/mail.log +/var/log/daemon.log +/var/log/kern.log +/var/log/user.log +/var/log/lpr.log +/var/log/debug +/var/log/messages +{ + size 10k + rotate 1 + missingok + notifempty + compress + delaycompress + sharedscripts + postrotate + # calling kill directly instead of 'service rsyslog rotate >/dev/null' due + # to bug in init-system-helpers. bug has apparently been fixed in v1.47. + # however, debian jessie is still using v1.22. + # see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=672218 + kill -hup $(cat /var/run/rsyslogd.pid) + endscript +} + +/var/log/auth.log +/var/log/cron.log +/var/log/syslog +/var/log/teamd.log +/var/log/quagga/bgpd.log +/var/log/quagga/zebra.log +/var/log/swss/sairedis.rec +/var/log/swss/swss.rec +{ + size 1M + rotate 5000 + missingok + notifempty + compress + delaycompress + nosharedscripts + prerotate + # Adjust NUM_LOGS_TO_ROTATE to reflect number of log files that trigger this block specified above + NUM_LOGS_TO_ROTATE=8 + + # Adjust LOG_FILE_ROTATE_SIZE_KB to reflect the "size" parameter specified above, in kB + LOG_FILE_ROTATE_SIZE_KB=1024 + + # Reserve space for btmp, wtmp, dpkg.log, monit.log, etc., as well as logs that + # should be disabled, just in case they get created and rotated + RESERVED_SPACE_KB=4096 + + VAR_LOG_SIZE_KB=$(df -k /var/log | sed -n 2p | awk '{ print $2 }') + + # Limit usable space to 95% of the partition minus the reserved space for other logs + USABLE_SPACE_KB=$(( (VAR_LOG_SIZE_KB * 95 / 100) - RESERVED_SPACE_KB)) + + # Set our threshold so as to maintain enough space to write all logs from empty to full + # Most likely, some logs will have non-zero size when this is called, so this errs on the side + # of caution, giving us a bit of a cushion if a log grows quickly and passes its rotation size + THRESHOLD_KB=$((USABLE_SPACE_KB - (NUM_LOGS_TO_ROTATE * LOG_FILE_ROTATE_SIZE_KB * 2))) + + while true; do + USED_KB=$(du -s /var/log | awk '{ print $1; }') + + if [ $USED_KB -lt $THRESHOLD_KB ]; then + break + else + OLDEST_ARCHIVE_FILE=$(find /var/log -type f -printf '%T+ %p\n' | grep -E '.+\.[0-9]+(\.gz)?$' | sort | head -n 1 | awk '{ print $2; }') + + if [ -z "$OLDEST_ARCHIVE_FILE" ]; then + logger -p syslog.err -t "logrotate" "No archive file to delete -- potential for filling up /var/log partition!" + break + fi + + logger -p syslog.info -t "logrotate" "Deleting archive file $OLDEST_ARCHIVE_FILE to free up space" + rm -rf "$OLDEST_ARCHIVE_FILE" + fi + done + endscript + postrotate + if [ $(echo $1 | grep -c "/var/log/swss/") -gt 0 ]; then + pgrep -x orchagent | xargs /bin/kill -HUP 2>/dev/null || true + else + # Calling kill directly instead of 'service rsyslog rotate >/dev/null' due + # to bug in init-system-helpers. Bug has apparently been fixed in v1.47. + # However, Debian Jessie is still using v1.22. + # See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=672218 + kill -HUP $(cat /var/run/rsyslogd.pid) + fi + endscript +} diff --git a/files/image_config/rsyslog/rsyslog.d/99-default.conf b/files/image_config/rsyslog/rsyslog.d/99-default.conf index 51049e7473a8..06a40ca64852 100644 --- a/files/image_config/rsyslog/rsyslog.d/99-default.conf +++ b/files/image_config/rsyslog/rsyslog.d/99-default.conf @@ -1,61 +1,18 @@ # # First some standard log files. Log by facility. # + +# Log all facilities to /var/log/syslog except cron, auth +# and authpriv. They are noisy - log them to their own files +*.*;cron,auth,authpriv.none -/var/log/syslog auth,authpriv.* /var/log/auth.log -*.*;auth,authpriv.none -/var/log/syslog cron.* /var/log/cron.log -# Do not redirect daemon, kernel or lpr logs to -# their own files. Let them log to /var/log/syslog -#daemon.* -/var/log/daemon.log -#kern.* -/var/log/kern.log -#kern.* -/var/persist/log/kern.log -#lpr.* -/var/log/lpr.log -mail.* -/var/log/mail.log -user.* -/var/log/user.log - -# -# Logging for the mail system. Split it up so that -# it is easy to write scripts to parse these files. -# -mail.info -/var/log/mail.info -mail.warn -/var/log/mail.warn -mail.err /var/log/mail.err - -# -# Logging for INN news system. -# -news.crit /var/log/news/news.crit -news.err /var/log/news/news.err -news.notice -/var/log/news/news.notice -# -# Some "catch-all" log files. -# -*.=debug;\ - auth,authpriv.none;\ - news.none;mail.none -/var/log/debug -# -# Removed as duplicates: -#*.=info;*.=notice;*.=warn;\ -# auth,authpriv.none;\ -# cron,daemon.none;\ -# mail,news.none -/var/log/messages -# -*.=crit;*.=alert;*.=emerg -/var/persist/log/alarms # # Emergencies are sent to everybody logged in. # *.emerg :omusrmsg:* -# -# I like to have messages displayed on the console, but only on a virtual -# console I usually leave idle. -# -#daemon,mail.*;\ -# news.=crit;news.=err;news.=notice;\ -# *.=debug;*.=info;\ -# *.=notice;*.=warn /dev/tty8 - # The named pipe /dev/xconsole is for the `xconsole' utility. To use it, # you must invoke `xconsole' with the `-file' option: # diff --git a/src/sonic-sairedis b/src/sonic-sairedis index b865912105f2..7e70b4d63020 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit b865912105f2f80ee2516899e6367f863d5f6235 +Subproject commit 7e70b4d63020fc9ea1aa009c264e4effab7bcda0 diff --git a/src/sonic-swss b/src/sonic-swss index 27c49a0bf3a7..ab31a9af7ef2 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 27c49a0bf3a71556b553aa30fe2a7c1cdb996142 +Subproject commit ab31a9af7ef2c5ea9fe5f0f89f0a61b3ec0f83bf From 5cf37cbcb39ea1eda5b034f98f20b9247ce9f9c6 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 10 Aug 2017 16:48:45 -0700 Subject: [PATCH 0711/1011] [Broadcom]: Update Broadcom SAI/SDK version (#883) --- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index b829e8207890..54655563d638 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,11 +1,11 @@ -BRCM_SAI = libsaibcm_3.0.2.2_amd64.deb +BRCM_SAI = libsaibcm_3.0.2.3_amd64.deb # TODO: upload new SAI build to blob -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.2.2_amd64.deb" +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.2.3_amd64.deb" -BRCM_SAI_DEV = libsaibcm-dev_3.0.2.2_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.2.3_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) # TODO: upload new SAI build to blob -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.2.2_amd64.deb" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.2.3_amd64.deb" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index d952f436099d..5824590c8d52 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,9 +1,9 @@ -BRCM_OPENNSL = libopennsl_3.2.3.1_amd64.deb +BRCM_OPENNSL = libopennsl_3.2.3.3_amd64.deb # TODO: upload new SDK build to blob -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.3.1+0~20170605184634.7~1.gbp4a0717_amd64.deb" +$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.3.3_amd64.deb" -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.3.1_amd64.deb +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.3.3_amd64.deb # TODO: upload new SDK build to blob -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.1+0~20170605184634.7~1.gbp4a0717_amd64.deb" +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.3_amd64.deb" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) From c82868e631566a652fd61142cc09838b45e522c6 Mon Sep 17 00:00:00 2001 From: Shu0T1an ChenG Date: Thu, 10 Aug 2017 19:03:05 -0700 Subject: [PATCH 0712/1011] [quagga]: Update sonic-quagga submodule - [bgpd]: Enable forwarding state flag in graceful restart capability - [debian]: Add autoreconf_clean --- src/sonic-quagga | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-quagga b/src/sonic-quagga index df6b70902b4c..b066bef0e8dc 160000 --- a/src/sonic-quagga +++ b/src/sonic-quagga @@ -1 +1 @@ -Subproject commit df6b70902b4c29447ac52277cf6d5b7f6abca71e +Subproject commit b066bef0e8dcf23b8e1751652397c09e61ee4bdd From e383a27f5f1d5550de377f50c69fde66ba0e2459 Mon Sep 17 00:00:00 2001 From: Shu0T1an ChenG Date: Thu, 10 Aug 2017 19:10:36 -0700 Subject: [PATCH 0713/1011] [mellanox]: Disable fsat boot mode for SX kernel --- files/build_templates/swss.service.j2 | 1 - 1 file changed, 1 deletion(-) diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index f383a886eb35..ed6b852f18f9 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -18,7 +18,6 @@ ExecStartPre=/usr/bin/docker exec database redis-cli -n 1 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 2 FLUSHDB {% if sonic_asic_platform == 'mellanox' %} -Environment=FAST_BOOT=1 TimeoutStartSec=3min ExecStartPre=/usr/bin/mst start ExecStartPre=/usr/bin/mlnx-fw-upgrade.sh From fa1ac0e05a7fc9263ffd57f32f178399336761ef Mon Sep 17 00:00:00 2001 From: Shu0T1an ChenG Date: Thu, 10 Aug 2017 19:14:20 -0700 Subject: [PATCH 0714/1011] [swss-common]: Update sonic-swss-common submodule - [netlink]: Increase netlink buffer size - [netlink]: Check return vode from nl_recvmsgs_default - [select]: EINTR error hanlding - [makefile]: Use full file names --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 2716292fdd78..5779685e1652 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 2716292fdd78dcbc8587a2c8d192d10465ec7225 +Subproject commit 5779685e165201f69dae5e75b8549550dd5f165c From df3436b80b2931a0baed6656ad96495e7999cdf6 Mon Sep 17 00:00:00 2001 From: Shu0T1an ChenG Date: Thu, 10 Aug 2017 19:24:43 -0700 Subject: [PATCH 0715/1011] [utilities]: Update sonic-utilities submodule - [sfputil]: Refactor and add support for presence, low-power mode and reset --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index c7f6ff677b54..ac7ea4f3b9dc 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit c7f6ff677b54eb401e7b2fd3a3d9c4072325bb78 +Subproject commit ac7ea4f3b9dcc5cef15cc7ec0e796cde8a7f8ab8 From 338a83bacc646148e0fec0cca400bfd34a818669 Mon Sep 17 00:00:00 2001 From: Shu0T1an ChenG Date: Thu, 10 Aug 2017 19:32:39 -0700 Subject: [PATCH 0716/1011] [mellanox]: Update Mellanox SAI version --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 66f6c3e257ce..c1c69b1192c3 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = SAIRel1.8.2-master -MLNX_SAI_REVISION = 852ef62c021dad6a1fec932a9c89df0e7f19460e +MLNX_SAI_REVISION = 9a5155c0df10d733863c8c3d0e5385cecac3324a export MLNX_SAI_VERSION MLNX_SAI_REVISION From 178fc032ae45a17170a2c4fb22d0569dc139b63c Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 11 Aug 2017 11:36:32 -0700 Subject: [PATCH 0717/1011] [sfputil]: Add support for SFP presence, low-power mode and reset (#877) - Update sfputil plugins for Dell FORCE10-S6000, Arista 7050-QX-32, 7050-QX-32-S --- .../plugins/sfputil.py | 11 +- .../plugins/sfputil.py | 11 +- .../plugins/sfputil.py | 182 ++++++++++++++++-- files/image_config/sudoers/sudoers | 2 +- .../broadcom/sonic-platform-modules-arista | 2 +- src/sonic-utilities | 2 +- 6 files changed, 182 insertions(+), 28 deletions(-) diff --git a/device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py b/device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py index b85e0f53653e..9a6d770d460b 100644 --- a/device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py +++ b/device/arista/x86_64-arista_7050_qx32/plugins/sfputil.py @@ -1,9 +1,12 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: import arista.utils.sonic_sfputil as arista_sfputil -except ImportError, e: - raise ImportError (str(e) + "- required module not found") +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -sfputil = arista_sfputil.getSfpUtil() +SfpUtil = arista_sfputil.getSfpUtil() diff --git a/device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py b/device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py index b85e0f53653e..9a6d770d460b 100644 --- a/device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py +++ b/device/arista/x86_64-arista_7050_qx32s/plugins/sfputil.py @@ -1,9 +1,12 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: import arista.utils.sonic_sfputil as arista_sfputil -except ImportError, e: - raise ImportError (str(e) + "- required module not found") +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -sfputil = arista_sfputil.getSfpUtil() +SfpUtil = arista_sfputil.getSfpUtil() diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py index 8b1ec277d79f..1f2b9e9f61ef 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py @@ -1,27 +1,175 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -class sfputil(sfputilbase): - """Platform specific sfputil class""" +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" - port_start = 0 - port_end = 31 - ports_in_block = 32 + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 - eeprom_offset = 20 + EEPROM_OFFSET = 20 - port_to_eeprom_mapping = {} + _port_to_eeprom_mapping = {} - _qsfp_ports = range(0, ports_in_block + 1) + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' for x in range(0, self.port_end + 1): - self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) - sfputilbase.__init__(self, port_num) + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_modprs") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ModPrsL is active low + if reg_value & mask == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_lpmode") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # LPMode is active high + if reg_value & mask == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_lpmode", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = hex(reg_value) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/devices/platform/dell-s6000-cpld.0/qsfp_reset" + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # File content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_value | mask + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + return True diff --git a/files/image_config/sudoers/sudoers b/files/image_config/sudoers/sudoers index cfff38b5027d..715a1979f1ab 100644 --- a/files/image_config/sudoers/sudoers +++ b/files/image_config/sudoers/sudoers @@ -25,7 +25,7 @@ Cmnd_Alias READ_ONLY_CMDS = /usr/bin/decode-syseeprom, \ /usr/bin/lldpctl, \ /usr/bin/lldpshow, \ /usr/bin/sensors, \ - /usr/bin/sfputil, \ + /usr/bin/sfputil show *, \ /usr/bin/vtysh -c show *, \ /bin/cat /var/log/syslog, \ /usr/bin/tail -f /var/log/syslog diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index a90b9fc5b085..51bbe2cd86af 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit a90b9fc5b085cdb99d10d338a23daa66c7f351b2 +Subproject commit 51bbe2cd86af7df20b27e0cd1f02c2ad08ab2f03 diff --git a/src/sonic-utilities b/src/sonic-utilities index c7f6ff677b54..ac7ea4f3b9dc 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit c7f6ff677b54eb401e7b2fd3a3d9c4072325bb78 +Subproject commit ac7ea4f3b9dcc5cef15cc7ec0e796cde8a7f8ab8 From 49feeaa4568731f475fcb46d224c2544b6942bcc Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 14 Aug 2017 10:25:50 -0700 Subject: [PATCH 0718/1011] [LEDs]: Initialize status and fan LEDs to green on Arista 7050-QX-32/7050-QX-32-S (#886) --- .../plugins/led_control.py | 20 ++++++++++++++++++ .../plugins/led_control.py | 21 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py b/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py index 1c69d8109f57..1f6034e2e2eb 100644 --- a/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py +++ b/device/arista/x86_64-arista_7050_qx32/plugins/led_control.py @@ -75,6 +75,26 @@ def port_link_state_change(self, port, state): # Constructor def __init__(self): + # Initialize all front-panel status LEDs to green + with open("/sys/class/leds/status/brightness", "w") as f: + f.write("1") + with open("/sys/class/leds/fan_status/brightness", "w") as f: + f.write("1") + with open("/sys/class/leds/psu1/brightness", "w") as f: + f.write("1") + with open("/sys/class/leds/psu2/brightness", "w") as f: + f.write("1") + + # Initialize all fan LEDs to green + with open("/sys/devices/platform/sb800-fans/hwmon/hwmon1/fan1_led", "w") as f: + f.write("3") + with open("/sys/devices/platform/sb800-fans/hwmon/hwmon1/fan2_led", "w") as f: + f.write("3") + with open("/sys/devices/platform/sb800-fans/hwmon/hwmon1/fan3_led", "w") as f: + f.write("3") + with open("/sys/devices/platform/sb800-fans/hwmon/hwmon1/fan4_led", "w") as f: + f.write("3") + # Initialize: Turn all front panel QSFP LEDs off for qsfp_index in range(self.QSFP_BREAKOUT_START_IDX, self.QSFP_BREAKOUT_END_IDX + 1): for lane in range(1, 5): diff --git a/device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py b/device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py index 839092ee1d4b..f2cb73194e14 100644 --- a/device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py +++ b/device/arista/x86_64-arista_7050_qx32s/plugins/led_control.py @@ -70,6 +70,27 @@ def port_link_state_change(self, port, state): # Constructor def __init__(self): + # Initialize all front-panel status LEDs to green + with open("/sys/class/leds/status/brightness", "w") as f: + f.write("1") + with open("/sys/class/leds/fan_status/brightness", "w") as f: + f.write("1") + with open("/sys/class/leds/psu1/brightness", "w") as f: + f.write("1") + with open("/sys/class/leds/psu2/brightness", "w") as f: + f.write("1") + + # Initialize all fan LEDs to green + with open("/sys/devices/pci0000:00/0000:00:02.2/0000:02:00.0/i2c-3/3-0060/hwmon/hwmon2/fan1_led", "w") as f: + f.write("1") + with open("/sys/devices/pci0000:00/0000:00:02.2/0000:02:00.0/i2c-3/3-0060/hwmon/hwmon2/fan2_led", "w") as f: + f.write("1") + with open("/sys/devices/pci0000:00/0000:00:02.2/0000:02:00.0/i2c-3/3-0060/hwmon/hwmon2/fan3_led", "w") as f: + f.write("1") + with open("/sys/devices/pci0000:00/0000:00:02.2/0000:02:00.0/i2c-3/3-0060/hwmon/hwmon2/fan4_led", "w") as f: + f.write("1") + + # Initialize: Turn all front panel QSFP LEDs off for qsfp_index in range(self.QSFP_BREAKOUT_START_IDX, self.QSFP_BREAKOUT_END_IDX + 1): for lane in range(1, 5): From 232acbf2176eb489ff0b80e2ebfb7a0966a3162b Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Mon, 14 Aug 2017 21:41:44 +0300 Subject: [PATCH 0719/1011] [submodule] update sonic-swss submodule (#885) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index ab31a9af7ef2..f9b55d30276d 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit ab31a9af7ef2c5ea9fe5f0f89f0a61b3ec0f83bf +Subproject commit f9b55d30276d1a6ab94e7321d9b2a3bf076fd683 From c299fe472d35077fe932d592c9e5c2b3fdebd3b3 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 14 Aug 2017 15:56:40 -0700 Subject: [PATCH 0720/1011] Update sonic-utilities (#887) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index ac7ea4f3b9dc..18bb5ed74cb4 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit ac7ea4f3b9dcc5cef15cc7ec0e796cde8a7f8ab8 +Subproject commit 18bb5ed74cb40c5205cdc0a553ce79c02a541272 From f938f3ecafcb9fde755508da721424b31269e76c Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 15 Aug 2017 10:38:22 -0700 Subject: [PATCH 0721/1011] [docker-platform-monitor]: Prevent supervisor from logging unexpected exits from processes known to exit in < 1 second (#889) --- dockers/docker-platform-monitor/supervisord.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dockers/docker-platform-monitor/supervisord.conf b/dockers/docker-platform-monitor/supervisord.conf index 6fb73450afec..0a05e61efff1 100644 --- a/dockers/docker-platform-monitor/supervisord.conf +++ b/dockers/docker-platform-monitor/supervisord.conf @@ -10,6 +10,7 @@ autostart=true autorestart=false stdout_logfile=syslog stderr_logfile=syslog +startsecs=0 [program:rsyslogd] command=/usr/sbin/rsyslogd -n @@ -26,6 +27,7 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +startsecs=0 [program:fancontrol] command=/usr/sbin/fancontrol @@ -41,3 +43,4 @@ priority=5 autostart=false stdout_logfile=syslog stderr_logfile=syslog +startsecs=0 From 3a8f5be19a1b4978c415e37a4817e61ecd549b87 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 15 Aug 2017 10:38:49 -0700 Subject: [PATCH 0722/1011] [docker-database]: Start rsyslogd to allow supervisor to log to syslog (#890) --- dockers/docker-database/supervisord.conf | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/dockers/docker-database/supervisord.conf b/dockers/docker-database/supervisord.conf index 42b0eddac0a7..9ad7ff32bcf9 100644 --- a/dockers/docker-database/supervisord.conf +++ b/dockers/docker-database/supervisord.conf @@ -3,9 +3,17 @@ logfile_maxbytes=1MB logfile_backups=2 nodaemon=true +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=1 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + [program:redis-server] command=/usr/bin/redis-server /etc/redis/redis.conf -priority=1 +priority=2 autostart=true autorestart=false stdout_logfile=syslog @@ -13,9 +21,8 @@ stderr_logfile=syslog [program:configdb-load.sh] command=/usr/bin/configdb-load.sh -priority=2 +priority=3 autostart=true autorestart=false stdout_logfile=syslog stderr_logfile=syslog - From 674e2f9467fa71d6af751c41a8ce0f3f89a1f08a Mon Sep 17 00:00:00 2001 From: Shu0T1an ChenG Date: Tue, 15 Aug 2017 11:54:18 -0700 Subject: [PATCH 0723/1011] Revert "[mellanox]: Update Mellanox SAI version" This reverts commit 338a83bacc646148e0fec0cca400bfd34a818669. We first test the previous version of the SAI and make sure it passes all the tests and then update the SAI version to a later one. --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index c1c69b1192c3..fbf4f94b590e 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = SAIRel1.8.2-master -MLNX_SAI_REVISION = 9a5155c0df10d733863c8c3d0e5385cecac3324a +MLNX_SAI_REVISION = 6b094746adc7ef2321701b4868806bc54a95bbd1 export MLNX_SAI_VERSION MLNX_SAI_REVISION From 693ad9c4eea816cc060bf74320abfd6242ff4812 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 15 Aug 2017 12:10:43 -0700 Subject: [PATCH 0724/1011] [quagga]: Update sonic-quagga submodule (#892) - [bgpd]: Enable forwarding state flag in graceful restart capability - [debian]: Add autoreconf_clean --- src/sonic-quagga | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-quagga b/src/sonic-quagga index df6b70902b4c..b066bef0e8dc 160000 --- a/src/sonic-quagga +++ b/src/sonic-quagga @@ -1 +1 @@ -Subproject commit df6b70902b4c29447ac52277cf6d5b7f6abca71e +Subproject commit b066bef0e8dcf23b8e1751652397c09e61ee4bdd From 6603e0ad5d261133e45bfe84bfe80582b3332ab5 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Tue, 15 Aug 2017 16:10:08 -0700 Subject: [PATCH 0725/1011] [Submodule update]: sonic-utilities (#888) * Track branch v1.0.3 for sonic-utilities * Spaces to tabs --- .gitmodules | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitmodules b/.gitmodules index 5bf6fb5b4a61..431a525ebab1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -44,6 +44,7 @@ [submodule "src/sonic-utilities"] path = src/sonic-utilities url = https://github.com/Azure/sonic-utilities + branch = v1.0.3 [submodule "platform/broadcom/sonic-platform-modules-s6000"] path = platform/broadcom/sonic-platform-modules-s6000 url = https://github.com/Azure/sonic-platform-modules-s6000 From 1be1c466fe0b5aacb3c6db7295203dec2bdf3972 Mon Sep 17 00:00:00 2001 From: cytsai0409 Date: Wed, 16 Aug 2017 22:38:10 +0800 Subject: [PATCH 0726/1011] Add s8810 32q platform support (#867) * Add S8810-32Q platform support * Update sonic-platform-modules-ingrasys submodule * Add sys eeprom plugin for S8810-32Q * Add sfputil plugin for S8810-32Q * Add sensors config for S8810-32Q * Add S8810-32Q HwSku port_config * Add fancontrol config for S8810-32Q Signed-off-by: Jason Tsai * Add S8810-32Q platform support * Add sys eeprom plugin for S8810-32Q * Add sfputil plugin for S8810-32Q * Add sensors config for S8810-32Q * Add S8810-32Q HwSku port_config * Add fancontrol config for S8810-32Q Signed-off-by: Jason Tsai * Add S8810-32Q platform support * Add S8810-32Q platform support in Makefile Signed-off-by: Jason Tsai * Fix build error on S8810 platform driver package Signed-off-by: Jason Tsai --- .../INGRASYS-S8810-32Q/port_config.ini | 33 +++++ .../INGRASYS-S8810-32Q/sai.profile | 1 + .../x86_64-ingrasys_s8810_32q-r0/fancontrol | 12 ++ .../installer.conf | 3 + .../led_proc_init.soc | 45 +++++++ .../minigraph.xml | 121 ++++++++++++++++++ .../plugins/eeprom.py | 24 ++++ .../plugins/sfputil.py | 61 +++++++++ .../x86_64-ingrasys_s8810_32q-r0/sensors.conf | 47 +++++++ platform/broadcom/one-image.mk | 1 + .../broadcom/platform-modules-ingrasys.mk | 8 +- .../broadcom/sonic-platform-modules-ingrasys | 2 +- 12 files changed, 356 insertions(+), 2 deletions(-) create mode 100644 device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini create mode 100644 device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/sai.profile create mode 100644 device/ingrasys/x86_64-ingrasys_s8810_32q-r0/fancontrol create mode 100644 device/ingrasys/x86_64-ingrasys_s8810_32q-r0/installer.conf create mode 100644 device/ingrasys/x86_64-ingrasys_s8810_32q-r0/led_proc_init.soc create mode 100644 device/ingrasys/x86_64-ingrasys_s8810_32q-r0/minigraph.xml create mode 100644 device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/eeprom.py create mode 100644 device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/sfputil.py create mode 100644 device/ingrasys/x86_64-ingrasys_s8810_32q-r0/sensors.conf diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini new file mode 100644 index 000000000000..fb9235101108 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 37,38,39,40 +Ethernet4 33,34,35,36 +Ethernet8 45,46,47,48 +Ethernet12 41,42,43,44 +Ethernet16 53,54,55,56 +Ethernet20 49,50,51,52 +Ethernet24 61,62,63,64 +Ethernet28 57,58,59,60 +Ethernet32 69,70,71,72 +Ethernet36 65,66,67,68 +Ethernet40 77,78,79,80 +Ethernet44 73,74,75,76 +Ethernet48 85,86,87,88 +Ethernet52 81,82,83,84 +Ethernet56 93,94,95,96 +Ethernet60 89,90,91,92 +Ethernet64 101,102,103,104 +Ethernet68 97,98,99,100 +Ethernet72 109,110,111,112 +Ethernet76 105,106,107,108 +Ethernet80 117,118,119,120 +Ethernet84 113,114,115,116 +Ethernet88 125,126,127,128 +Ethernet92 121,122,123,124 +Ethernet96 5,6,7,8 +Ethernet100 1,2,3,4 +Ethernet104 13,14,15,16 +Ethernet108 9,10,11,12 +Ethernet112 21,22,23,24 +Ethernet116 17,18,19,20 +Ethernet120 29,30,31,32 +Ethernet124 25,26,27,28 diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/sai.profile b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/sai.profile new file mode 100644 index 000000000000..3fdcc3f1a506 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/td2-s8810-32x40G.config.bcm diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/fancontrol new file mode 100644 index 000000000000..05a71e8d999c --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/fancontrol @@ -0,0 +1,12 @@ +# Configuration file generated by pwmconfig, changes will be lost +INTERVAL=10 +DEVPATH=hwmon2=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f +DEVNAME=hwmon2=w83795adg +FCTEMPS=hwmon2/device/pwm2=hwmon2/device/temp2_input hwmon2/device/pwm1=hwmon2/device/temp2_input +#FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input+hwmon2/device/fan7_input+hwmon2/device/fan6_input+hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input+hwmon2/device/fan3_input+hwmon2/device/fan2_input+hwmon2/device/fan1_input +FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input hwmon2/device/pwm2=hwmon2/device/fan7_input hwmon2/device/pwm2=hwmon2/device/fan6_input hwmon2/device/pwm2=hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input hwmon2/device/pwm1=hwmon2/device/fan3_input hwmon2/device/pwm1=hwmon2/device/fan2_input hwmon2/device/pwm1=hwmon2/device/fan1_input +MINTEMP=hwmon2/device/pwm2=20 hwmon2/device/pwm1=20 +MAXTEMP=hwmon2/device/pwm2=60 hwmon2/device/pwm1=60 +MINSTART=hwmon2/device/pwm2=75 hwmon2/device/pwm1=75 +MINSTOP=hwmon2/device/pwm2=22 hwmon2/device/pwm1=22 + diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/installer.conf b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/installer.conf new file mode 100644 index 000000000000..14404194ef53 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x2f8 +CONSOLE_DEV=1 +CONSOLE_SPEED=115200 diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/led_proc_init.soc b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/led_proc_init.soc new file mode 100644 index 000000000000..8c1a18f6236b --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/led_proc_init.soc @@ -0,0 +1,45 @@ +#processor initialization for Ingrasys S8810-32Q + +led 0 stop +led 0 prog 12 00 61 F1 12 10 61 F2 12 04 61 F3 12 04 61 F4 67 16 86 F0 77 74 96 F2 2E F1 67 2B 67 3F 16 F3 FE F1 61 F1 12 00 DE F2 74 16 57 2E F1 32 00 32 01 B7 97 75 3A 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 58 77 48 06 FE D2 01 70 50 77 66 06 F0 C2 08 74 58 77 66 16 F4 91 22 0E 87 22 0E 87 DA 00 74 5A 57 16 F4 91 22 0E 87 22 0F 87 DA 00 74 68 57 02 80 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=48 REMAP_PORT_2=49 REMAP_PORT_1=50 REMAP_PORT_0=51 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=52 REMAP_PORT_6=53 REMAP_PORT_5=54 REMAP_PORT_4=55 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=56 REMAP_PORT_10=57 REMAP_PORT_9=58 REMAP_PORT_8=59 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=60 REMAP_PORT_14=61 REMAP_PORT_13=62 REMAP_PORT_12=63 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=44 REMAP_PORT_18=45 REMAP_PORT_17=46 REMAP_PORT_16=47 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=40 REMAP_PORT_22=41 REMAP_PORT_21=42 REMAP_PORT_20=43 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=36 REMAP_PORT_26=37 REMAP_PORT_25=38 REMAP_PORT_24=39 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=32 REMAP_PORT_30=33 REMAP_PORT_29=34 REMAP_PORT_28=35 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=16 REMAP_PORT_34=17 REMAP_PORT_33=18 REMAP_PORT_32=19 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=20 REMAP_PORT_38=21 REMAP_PORT_37=22 REMAP_PORT_36=23 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=24 REMAP_PORT_42=25 REMAP_PORT_41=26 REMAP_PORT_40=27 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=28 REMAP_PORT_46=29 REMAP_PORT_45=30 REMAP_PORT_44=31 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=12 REMAP_PORT_50=13 REMAP_PORT_49=14 REMAP_PORT_48=15 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=8 REMAP_PORT_54=9 REMAP_PORT_53=10 REMAP_PORT_52=11 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=4 REMAP_PORT_58=5 REMAP_PORT_57=6 REMAP_PORT_56=7 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0 REMAP_PORT_62=1 REMAP_PORT_61=2 REMAP_PORT_60=3 + +led 0 auto on +led 0 start + +led 1 stop +led 1 prog 12 00 61 F1 12 10 61 F2 12 04 61 F3 12 04 61 F4 67 16 86 F0 77 74 96 F2 2E F1 67 2B 67 3F 16 F3 FE F1 61 F1 12 00 DE F2 74 16 57 2E F1 32 00 32 01 B7 97 75 3A 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 58 77 48 06 FE D2 01 70 50 77 66 06 F0 C2 08 74 58 77 66 16 F4 91 22 0E 87 22 0E 87 DA 00 74 5A 57 16 F4 91 22 0E 87 22 0F 87 DA 00 74 68 57 02 80 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=48 REMAP_PORT_2=49 REMAP_PORT_1=50 REMAP_PORT_0=51 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=52 REMAP_PORT_6=53 REMAP_PORT_5=54 REMAP_PORT_4=55 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=56 REMAP_PORT_10=57 REMAP_PORT_9=58 REMAP_PORT_8=59 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=60 REMAP_PORT_14=61 REMAP_PORT_13=62 REMAP_PORT_12=63 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=44 REMAP_PORT_18=45 REMAP_PORT_17=46 REMAP_PORT_16=47 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=40 REMAP_PORT_22=41 REMAP_PORT_21=42 REMAP_PORT_20=43 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=36 REMAP_PORT_26=37 REMAP_PORT_25=38 REMAP_PORT_24=39 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=32 REMAP_PORT_30=33 REMAP_PORT_29=34 REMAP_PORT_28=35 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=16 REMAP_PORT_34=17 REMAP_PORT_33=18 REMAP_PORT_32=19 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=20 REMAP_PORT_38=21 REMAP_PORT_37=22 REMAP_PORT_36=23 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=24 REMAP_PORT_42=25 REMAP_PORT_41=26 REMAP_PORT_40=27 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=28 REMAP_PORT_46=29 REMAP_PORT_45=30 REMAP_PORT_44=31 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=12 REMAP_PORT_50=13 REMAP_PORT_49=14 REMAP_PORT_48=15 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=8 REMAP_PORT_54=9 REMAP_PORT_53=10 REMAP_PORT_52=11 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=4 REMAP_PORT_58=5 REMAP_PORT_57=6 REMAP_PORT_56=7 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0 REMAP_PORT_62=1 REMAP_PORT_61=2 REMAP_PORT_60=3 + +led 1 auto on +led 1 start diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/minigraph.xml new file mode 100644 index 000000000000..ab90ada24274 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/minigraph.xml @@ -0,0 +1,121 @@ + + + + + + OCPSCH0104001MS + 10.10.1.30 + OCPSCH01040HHLF + 10.10.1.29 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.30 + OCPSCH01040HHLF + 10.10.2.29 + 1 + 10 + 3 + + + + + 64536 + OCPSCH01040HHLF + + +
10.10.1.30
+ + +
+ +
10.10.2.30
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.10/32 + + 100.0.0.10/32 + + + + + + + + OCPSCH01040HHLF + + + + + + Ethernet48 + 10.10.1.29/30 + + + + Ethernet52 + 10.10.2.29/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet48 + OCPSCH01040HHLF + Ethernet48 + + + 40000 + DeviceInterfaceLink + OCPSCH8810MS + Ethernet0 + OCPSCH01040HHLF + Ethernet52 + + + + + OCPSCH8810HHLF + INGRASYS-S8810-32Q + + + + OCPSCH01040HHLF + INGRASYS-S8810-32Q +
diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/eeprom.py b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/eeprom.py new file mode 100644 index 000000000000..4f919ccd7273 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/eeprom.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +############################################################################# +# Ingrasys S8810-32Q +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + i2c_bus = "12" + i2c_addr = "0056" + self.eeprom_path = "/sys/class/i2c-adapter/i2c-" + i2c_bus + "/" + i2c_bus + "-" + i2c_addr + "/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/sfputil.py new file mode 100644 index 000000000000..7bc71c27eeb6 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/sfputil.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +try: + from sonic_sfp.sfputilbase import sfputilbase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class sfputil(sfputilbase): + """Platform specific sfputil class""" + + port_start = 0 + port_end = 31 + ports_in_block = 32 + + port_to_eeprom_mapping = {} + #FIXME + port_to_i2c_mapping = { + 0: 18, + 1: 19, + 2: 20, + 3: 21, + 4: 22, + 5: 23, + 6: 24, + 7: 25, + 8: 26, + 9: 27, + 10: 28, + 11: 29, + 12: 30, + 13: 31, + 14: 32, + 15: 33, + 16: 34, + 17: 35, + 18: 36, + 19: 37, + 20: 38, + 21: 39, + 22: 40, + 23: 41, + 24: 42, + 25: 43, + 26: 44, + 27: 45, + 28: 46, + 29: 47, + 30: 48, + 31: 49 + } + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self, port_num): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + for x in range(self.port_start, self.port_end + 1): + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + sfputilbase.__init__(self, port_num) diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/sensors.conf new file mode 100644 index 000000000000..7ab599698225 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/sensors.conf @@ -0,0 +1,47 @@ +# libsensors configuration file +chip "i350bb-*" + ignore loc1 + +chip "jc42-*" + label temp1 "DIMM Temp" + set temp1_max 50 + set temp1_crit 85 + +chip "w83795adg-*" + label in0 "ROV" + set in0_min 1 * 0.97 + set in0_max 1 * 1.033 + ignore in1 + ignore in2 + label in3 "1.0V" + set in3_min 1 * 0.97 + set in3_max 1 * 1.03 + label in4 "1.8V" + set in4_min 1.8 * 0.95 + set in4_max 1.8 * 1.05 + ignore in5 + label in6 "5.0V" + compute in6 (4)*@, @/(4) + set in6_min 5 * 0.95 + set in6_max 5 * 1.05 + ignore in7 + label in12 "3.3V" + compute in6 (2)*@, @/(2) + set in12_min 3.3 * 0.97 + set in12_max 3.3 * 1.03 + ignore in14 + ignore in15 + ignore in16 + label fan1 "FANTRAY 1-A" + label fan2 "FANTRAY 1-B" + label fan3 "FANTRAY 2-A" + label fan4 "FANTRAY 2-B" + label fan5 "FANTRAY 3-A" + label fan6 "FANTRAY 3-B" + label fan7 "FANTRAY 4-A" + label fan8 "FANTRAY 4-B" + label temp1 "MAC Temp" + label temp2 "SFP+ Port 1 Temp" + label temp3 "SFP+ Port 8 Temp" + ignore temp4 + ignore intrusion0 diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 912c3ea3961d..2340177fd18b 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -10,6 +10,7 @@ $(SONIC_ONE_IMAGE)_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(INGRASYS_S8900_54XC_PLATFORM_MODULE) \ $(INGRASYS_S8900_64XC_PLATFORM_MODULE) \ $(INGRASYS_S9100_PLATFORM_MODULE) \ + $(INGRASYS_S8810_32Q_PLATFORM_MODULE) \ $(ACCTON_AS7712_32X_PLATFORM_MODULE) \ $(INVENTEC_D7032Q28B_PLATFORM_MODULE) \ $(CEL_DX010_PLATFORM_MODULE) diff --git a/platform/broadcom/platform-modules-ingrasys.mk b/platform/broadcom/platform-modules-ingrasys.mk index 95009102dd76..e5ef4021eff7 100644 --- a/platform/broadcom/platform-modules-ingrasys.mk +++ b/platform/broadcom/platform-modules-ingrasys.mk @@ -1,12 +1,14 @@ -# Ingrasys S9100, S8900-64XC and S8900-54XC Platform modules +# Ingrasys S9100, S8900-64XC, S8900-54XC and S8810-32Q Platform modules INGRASYS_S9100_PLATFORM_MODULE_VERSION = 1.1.0 INGRASYS_S8900_64XC_PLATFORM_MODULE_VERSION = 1.1.0 INGRASYS_S8900_54XC_PLATFORM_MODULE_VERSION = 1.1.0 +INGRASYS_S8810_32Q_PLATFORM_MODULE_VERSION = 1.1.0 export INGRASYS_S9100_PLATFORM_MODULE_VERSION export INGRASYS_S8900_64XC_PLATFORM_MODULE_VERSION export INGRASYS_S8900_54XC_PLATFORM_MODULE_VERSION +export INGRASYS_S8810_32Q_PLATFORM_MODULE_VERSION INGRASYS_S9100_PLATFORM_MODULE = sonic-platform-ingrasys-s9100_$(INGRASYS_S9100_PLATFORM_MODULE_VERSION)_amd64.deb $(INGRASYS_S9100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ingrasys @@ -20,5 +22,9 @@ $(INGRASYS_S8900_64XC_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s8900_64xc-r0 INGRASYS_S8900_54XC_PLATFORM_MODULE = sonic-platform-ingrasys-s8900-54xc_$(INGRASYS_S8900_54XC_PLATFORM_MODULE_VERSION)_amd64.deb $(INGRASYS_S8900_54XC_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s8900_54xc-r0 +INGRASYS_S8810_32Q_PLATFORM_MODULE = sonic-platform-ingrasys-s8810-32q_$(INGRASYS_S8810_32Q_PLATFORM_MODULE_VERSION)_amd64.deb +$(INGRASYS_S8810_32Q_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s8810_32q-r0 + $(eval $(call add_extra_package,$(INGRASYS_S9100_PLATFORM_MODULE),$(INGRASYS_S8900_64XC_PLATFORM_MODULE))) $(eval $(call add_extra_package,$(INGRASYS_S9100_PLATFORM_MODULE),$(INGRASYS_S8900_54XC_PLATFORM_MODULE))) +$(eval $(call add_extra_package,$(INGRASYS_S9100_PLATFORM_MODULE),$(INGRASYS_S8810_32Q_PLATFORM_MODULE))) diff --git a/platform/broadcom/sonic-platform-modules-ingrasys b/platform/broadcom/sonic-platform-modules-ingrasys index 50471fdaaa48..1a67af3caa00 160000 --- a/platform/broadcom/sonic-platform-modules-ingrasys +++ b/platform/broadcom/sonic-platform-modules-ingrasys @@ -1 +1 @@ -Subproject commit 50471fdaaa4849c19a97d8623971450f09903d5d +Subproject commit 1a67af3caa00352e5e7db880e1eeda0bdf1fde6b From f0cc414dff1fc5a269ed15abf5dcf1ae363467b0 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 16 Aug 2017 13:47:20 -0700 Subject: [PATCH 0727/1011] [SAI]: Remove the SAI submodule from buildimage repo (#893) SAI is a submodule of sonic-sairedis repository. Remove the dependency from this repository. --- .gitmodules | 4 ---- src/SAI | 1 - 2 files changed, 5 deletions(-) delete mode 160000 src/SAI diff --git a/.gitmodules b/.gitmodules index 431a525ebab1..4bddfb4a60da 100644 --- a/.gitmodules +++ b/.gitmodules @@ -57,10 +57,6 @@ [submodule "platform/broadcom/sonic-platform-modules-ingrasys"] path = platform/broadcom/sonic-platform-modules-ingrasys url = https://github.com/Ingrasys-sonic/sonic-platform-modules-ingrasys -[submodule "src/SAI"] - path = src/SAI - url = https://github.com/opencomputeproject/SAI - branch = v0.9.4 [submodule "src/sonic-platform-daemons"] path = src/sonic-platform-daemons url = https://github.com/Azure/sonic-platform-daemons diff --git a/src/SAI b/src/SAI deleted file mode 160000 index 940c7b6afb1d..000000000000 --- a/src/SAI +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 940c7b6afb1db4e8504b7cdb24ccd669748dbde8 From c52e876697f2fa96a8ed3a7556bf5d367b47df23 Mon Sep 17 00:00:00 2001 From: zhenggen-xu Date: Wed, 16 Aug 2017 21:12:32 -0700 Subject: [PATCH 0728/1011] Fix the network command for ipv6 vlan interfaces (#894) --- dockers/docker-fpm-quagga/bgpd.conf.j2 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index a5c317aa2e80..eb1da1f1a3ea 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -46,7 +46,13 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% endif %} {% block vlan_advertisement %} {% for vlan_interface in minigraph_vlan_interfaces %} +{% if vlan_interface['addr'] | ipv4 %} network {{ vlan_interface['subnet'] }} +{% elif vlan_interface['addr'] | ipv6 %} + address-family ipv6 + network {{ vlan_interface['subnet'] }} + exit-address-family +{% endif %} {% endfor %} {% endblock vlan_advertisement %} {% block bgp_sessions %} From 78ce6b951f9a519bccea4331b11fe938f4ddfdb2 Mon Sep 17 00:00:00 2001 From: Rodny Molina Date: Wed, 16 Aug 2017 21:13:01 -0700 Subject: [PATCH 0729/1011] Fixing a couple of issues to enable FRR to run with latest SONiC code. (#895) * Adjusting FRR's jinja template to meet latest sonic-cfgen requirements. Basically, i'm just extending #448 changes into FRR. * Eliminate FRR's integrated-config file to prevent daemons from bypassing their own config files. FRR daemons now default to an integrated-config file for config-parsing purposes. But we are still interested in having each daemon looking in their specific config file (bgpd.conf, zebra.conf, etc). So here i'm just deleting this integrating-config file to prevent FRR from running from a bogus config-file. RB= G=lnos-reviewers R=ntrianta,rjonnadu,rmolina,sfardeen,zxu A= --- dockers/docker-fpm-frr/config.sh | 5 +++++ dockers/docker-fpm-frr/zebra.conf.j2 | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/dockers/docker-fpm-frr/config.sh b/dockers/docker-fpm-frr/config.sh index d795bcefa701..0636a6dc413c 100755 --- a/dockers/docker-fpm-frr/config.sh +++ b/dockers/docker-fpm-frr/config.sh @@ -12,5 +12,10 @@ sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/unisolate chown root:root /usr/sbin/bgp-unisolate chmod 0755 /usr/sbin/bgp-unisolate +# If there's an integrated-config file, go ahead and remote it +if [ -f /etc/frr/frr.conf ]; then + rm -rf /etc/frr/frr.conf +fi + mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" >/var/sonic/config_status diff --git a/dockers/docker-fpm-frr/zebra.conf.j2 b/dockers/docker-fpm-frr/zebra.conf.j2 index dc2061f8a02a..1ce06eecd2d9 100644 --- a/dockers/docker-fpm-frr/zebra.conf.j2 +++ b/dockers/docker-fpm-frr/zebra.conf.j2 @@ -15,12 +15,12 @@ enable password zebra {% block interfaces %} ! Enable link-detect (default disabled) {% for interface in minigraph_interfaces %} -interface {{ interface['alias'] }} +interface {{ interface['attachto'] }} link-detect ! {% endfor %} -{% for interface in minigraph_portchannel_interfaces %} -interface {{ interface['name'] }} +{% for interface in minigraph_portchannels.keys() %} +interface {{ interface }} link-detect ! {% endfor %} From 7fca49e7dfcbafa8043f4f28982c5b78883cece0 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 18 Aug 2017 10:41:06 -0700 Subject: [PATCH 0730/1011] [sonic-utilities]: Update submodule to remove pager from CLI utils (#897) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 18bb5ed74cb4..d1ded16b06b4 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 18bb5ed74cb40c5205cdc0a553ce79c02a541272 +Subproject commit d1ded16b06b493e2420d1013aee97afbdc8160d9 From 9c5988fa7ce330dae15122e5e973a76c774e82d7 Mon Sep 17 00:00:00 2001 From: "Vitaly.Vovnoboy" Date: Sat, 19 Aug 2017 11:57:36 +0300 Subject: [PATCH 0731/1011] Add Marvell platform (#765) * Adding Marvell platform. --- platform/marvell/docker-orchagent-mrvl.mk | 17 +++++++ platform/marvell/docker-syncd-mrvl-rpc.mk | 15 ++++++ .../docker-syncd-mrvl-rpc/99-syncd.conf | 2 + .../docker-syncd-mrvl-rpc/Dockerfile.j2 | 51 +++++++++++++++++++ .../docker-syncd-mrvl-rpc/ptf_nn_agent.conf | 10 ++++ platform/marvell/docker-syncd-mrvl.mk | 15 ++++++ .../marvell/docker-syncd-mrvl/Dockerfile.j2 | 29 +++++++++++ platform/marvell/docker-syncd-mrvl/start.sh | 8 +++ .../docker-syncd-mrvl/supervisord.conf | 29 +++++++++++ platform/marvell/docker-syncd-mrvl/syncd.sh | 12 +++++ platform/marvell/libsaithrift-dev.mk | 7 +++ platform/marvell/one-image.mk | 7 +++ platform/marvell/platform.conf | 0 platform/marvell/python-saithrift.mk | 6 +++ platform/marvell/rules.mk | 18 +++++++ platform/marvell/sai.mk | 9 ++++ platform/marvell/sai/Makefile | 9 ++++ platform/marvell/sdk.mk | 8 +++ platform/marvell/sdk/Makefile | 9 ++++ 19 files changed, 261 insertions(+) create mode 100644 platform/marvell/docker-orchagent-mrvl.mk create mode 100644 platform/marvell/docker-syncd-mrvl-rpc.mk create mode 100644 platform/marvell/docker-syncd-mrvl-rpc/99-syncd.conf create mode 100644 platform/marvell/docker-syncd-mrvl-rpc/Dockerfile.j2 create mode 100644 platform/marvell/docker-syncd-mrvl-rpc/ptf_nn_agent.conf create mode 100644 platform/marvell/docker-syncd-mrvl.mk create mode 100755 platform/marvell/docker-syncd-mrvl/Dockerfile.j2 create mode 100755 platform/marvell/docker-syncd-mrvl/start.sh create mode 100644 platform/marvell/docker-syncd-mrvl/supervisord.conf create mode 100755 platform/marvell/docker-syncd-mrvl/syncd.sh create mode 100644 platform/marvell/libsaithrift-dev.mk create mode 100644 platform/marvell/one-image.mk create mode 100644 platform/marvell/platform.conf create mode 100644 platform/marvell/python-saithrift.mk create mode 100644 platform/marvell/rules.mk create mode 100644 platform/marvell/sai.mk create mode 100644 platform/marvell/sai/Makefile create mode 100644 platform/marvell/sdk.mk create mode 100644 platform/marvell/sdk/Makefile diff --git a/platform/marvell/docker-orchagent-mrvl.mk b/platform/marvell/docker-orchagent-mrvl.mk new file mode 100644 index 000000000000..9461cafe2e89 --- /dev/null +++ b/platform/marvell/docker-orchagent-mrvl.mk @@ -0,0 +1,17 @@ +# docker image for orchagent + +DOCKER_ORCHAGENT_MRVL = docker-orchagent-mrvl.gz +$(DOCKER_ORCHAGENT_MRVL)_PATH = $(DOCKERS_PATH)/docker-orchagent +$(DOCKER_ORCHAGENT_MRVL)_DEPENDS += $(SWSS) $(REDIS_TOOLS) +$(DOCKER_ORCHAGENT_MRVL)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) +SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_MRVL) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_MRVL) + +$(DOCKER_ORCHAGENT_MRVL)_CONTAINER_NAME = swss +$(DOCKER_ORCHAGENT_MRVL)_RUN_OPT += --net=host --privileged -t +$(DOCKER_ORCHAGENT_MRVL)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro +$(DOCKER_ORCHAGENT_MRVL)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro +$(DOCKER_ORCHAGENT_MRVL)_RUN_OPT += -v /host/machine.conf:/host/machine.conf +$(DOCKER_ORCHAGENT_MRVL)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +$(DOCKER_ORCHAGENT_MRVL)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel diff --git a/platform/marvell/docker-syncd-mrvl-rpc.mk b/platform/marvell/docker-syncd-mrvl-rpc.mk new file mode 100644 index 000000000000..d4002a3d645f --- /dev/null +++ b/platform/marvell/docker-syncd-mrvl-rpc.mk @@ -0,0 +1,15 @@ +# docker image for mrvl syncd with rpc + +DOCKER_SYNCD_MRVL_RPC = docker-syncd-mrvl-rpc.gz +$(DOCKER_SYNCD_MRVL_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-mrvl-rpc +$(DOCKER_SYNCD_MRVL_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) +$(DOCKER_SYNCD_MRVL_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_MRVL) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MRVL_RPC) +ifeq ($(ENABLE_SYNCD_RPC),y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_MRVL_RPC) +endif + +$(DOCKER_SYNCD_MRVL_RPC)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_MRVL_RPC)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_MRVL_RPC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_MRVL_RPC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/marvell/docker-syncd-mrvl-rpc/99-syncd.conf b/platform/marvell/docker-syncd-mrvl-rpc/99-syncd.conf new file mode 100644 index 000000000000..f3b57e3b1964 --- /dev/null +++ b/platform/marvell/docker-syncd-mrvl-rpc/99-syncd.conf @@ -0,0 +1,2 @@ +sysctl -w net.core.rmem_max=509430500 + diff --git a/platform/marvell/docker-syncd-mrvl-rpc/Dockerfile.j2 b/platform/marvell/docker-syncd-mrvl-rpc/Dockerfile.j2 new file mode 100644 index 000000000000..14a4698702f5 --- /dev/null +++ b/platform/marvell/docker-syncd-mrvl-rpc/Dockerfile.j2 @@ -0,0 +1,51 @@ +FROM docker-syncd-mrvl + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +COPY \ +{% for deb in docker_syncd_mrvl_rpc_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -P syncd + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ +{% for deb in docker_syncd_mrvl_rpc_debs.split(' ') -%} +dpkg_apt debs/{{ deb }}{{'; '}} +{%- endfor %} + +## Pre-install the fundamental packages +RUN apt-get update \ + && apt-get -y install \ + net-tools \ + python-pip \ + build-essential \ + libssl-dev \ + libffi-dev \ + python-dev \ + wget \ + cmake \ + && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ + && tar xvfz 1.0.0.tar.gz \ + && cd nanomsg-1.0.0 \ + && mkdir -p build \ + && cmake . \ + && make install \ + && ldconfig \ + && cd .. \ + && rm -fr nanomsg-1.0.0 \ + && rm -f 1.0.0.tar.gz \ + && pip install cffi==1.7.0 \ + && pip install --upgrade cffi==1.7.0 \ + && pip install nnpy \ + && mkdir -p /opt \ + && cd /opt \ + && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ + && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ + && rm -rf /root/deps + +COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] + +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/marvell/docker-syncd-mrvl-rpc/ptf_nn_agent.conf b/platform/marvell/docker-syncd-mrvl-rpc/ptf_nn_agent.conf new file mode 100644 index 000000000000..fa1ed0eb1622 --- /dev/null +++ b/platform/marvell/docker-syncd-mrvl-rpc/ptf_nn_agent.conf @@ -0,0 +1,10 @@ +[program:ptf_nn_agent] +command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-iface-rcv-buffer=109430400 +process_name=ptf_nn_agent +stdout_logfile=/tmp/ptf_nn_agent.out.log +stderr_logfile=/tmp/ptf_nn_agent.err.log +redirect_stderr=false +autostart=true +autorestart=true +startsecs=1 +numprocs=1 diff --git a/platform/marvell/docker-syncd-mrvl.mk b/platform/marvell/docker-syncd-mrvl.mk new file mode 100644 index 000000000000..4ee42e9cb904 --- /dev/null +++ b/platform/marvell/docker-syncd-mrvl.mk @@ -0,0 +1,15 @@ +# docker image for mrvl syncd + +DOCKER_SYNCD_MRVL = docker-syncd-mrvl.gz +$(DOCKER_SYNCD_MRVL)_PATH = $(PLATFORM_PATH)/docker-syncd-mrvl +$(DOCKER_SYNCD_MRVL)_DEPENDS += $(SYNCD) $(MRVL_FPA) $(REDIS_TOOLS) +$(DOCKER_SYNCD_MRVL)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_MRVL) +ifneq ($(ENABLE_SYNCD_RPC),y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_MRVL) +endif + +$(DOCKER_SYNCD_MRVL)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_MRVL)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_MRVL)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_MRVL)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/marvell/docker-syncd-mrvl/Dockerfile.j2 b/platform/marvell/docker-syncd-mrvl/Dockerfile.j2 new file mode 100755 index 000000000000..7676b3f2ffa1 --- /dev/null +++ b/platform/marvell/docker-syncd-mrvl/Dockerfile.j2 @@ -0,0 +1,29 @@ +FROM docker-config-engine + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update + +COPY \ +{% for deb in docker_syncd_mrvl_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN apt-get -y install libpcap-dev libxml2-dev python-dev swig libsensors4-dev libjemalloc1 nfs-common + +RUN dpkg -i \ +{% for deb in docker_syncd_mrvl_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +COPY ["start.sh", "syncd.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +ENTRYPOINT ["/usr/bin/supervisord"] + diff --git a/platform/marvell/docker-syncd-mrvl/start.sh b/platform/marvell/docker-syncd-mrvl/start.sh new file mode 100755 index 000000000000..96e2a9128081 --- /dev/null +++ b/platform/marvell/docker-syncd-mrvl/start.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd + +supervisorctl start syncd + diff --git a/platform/marvell/docker-syncd-mrvl/supervisord.conf b/platform/marvell/docker-syncd-mrvl/supervisord.conf new file mode 100644 index 000000000000..1e015fef931f --- /dev/null +++ b/platform/marvell/docker-syncd-mrvl/supervisord.conf @@ -0,0 +1,29 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:syncd] +command=/usr/bin/syncd_start.sh +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/platform/marvell/docker-syncd-mrvl/syncd.sh b/platform/marvell/docker-syncd-mrvl/syncd.sh new file mode 100755 index 000000000000..993cf100f2f0 --- /dev/null +++ b/platform/marvell/docker-syncd-mrvl/syncd.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +function clean_up { + service syncd stop + exit +} + +trap clean_up SIGTERM SIGKILL + +service syncd start + +read diff --git a/platform/marvell/libsaithrift-dev.mk b/platform/marvell/libsaithrift-dev.mk new file mode 100644 index 000000000000..443406e9c2fb --- /dev/null +++ b/platform/marvell/libsaithrift-dev.mk @@ -0,0 +1,7 @@ +# libsaithrift-dev package + +LIBSAITHRIFT_DEV_MRVL = libsaithrift-dev_0.9.4_amd64.deb +$(LIBSAITHRIFT_DEV_MRVL)_SRC_PATH = $(SRC_PATH)/SAI +$(LIBSAITHRIFT_DEV_MRVL)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(MRVL_FPA) $(MRVL_SAI) +$(LIBSAITHRIFT_DEV_MRVL)_RDEPENDS += $(LIBTHRIFT) $(MRVL_SAI) +SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_MRVL) diff --git a/platform/marvell/one-image.mk b/platform/marvell/one-image.mk new file mode 100644 index 000000000000..ad8cd522f998 --- /dev/null +++ b/platform/marvell/one-image.mk @@ -0,0 +1,7 @@ +# sonic marvell one image installer + +SONIC_ONE_IMAGE = sonic-marvell.bin +$(SONIC_ONE_IMAGE)_MACHINE = marvell +$(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie +$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/marvell/platform.conf b/platform/marvell/platform.conf new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/marvell/python-saithrift.mk b/platform/marvell/python-saithrift.mk new file mode 100644 index 000000000000..f7a63b19edb8 --- /dev/null +++ b/platform/marvell/python-saithrift.mk @@ -0,0 +1,6 @@ +# python-saithrift package + +PYTHON_SAITHRIFT_MRVL = python-saithrift_0.9.4_amd64.deb +$(PYTHON_SAITHRIFT_MRVL)_SRC_PATH = $(SRC_PATH)/SAI +$(PYTHON_SAITHRIFT_MRVL)_DEPENDS += $(MRVL_FPA) $(MRVL_SAI) $(THRIFT_COMPILER) $(PYTHON_THRIFT) $(LIBTHRIFT_DEV) +SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_MRVL) diff --git a/platform/marvell/rules.mk b/platform/marvell/rules.mk new file mode 100644 index 000000000000..c5df6bab194e --- /dev/null +++ b/platform/marvell/rules.mk @@ -0,0 +1,18 @@ +include $(PLATFORM_PATH)/sdk.mk +include $(PLATFORM_PATH)/sai.mk +include $(PLATFORM_PATH)/docker-syncd-mrvl.mk +include $(PLATFORM_PATH)/docker-syncd-mrvl-rpc.mk +include $(PLATFORM_PATH)/docker-orchagent-mrvl.mk +include $(PLATFORM_PATH)/libsaithrift-dev.mk +include $(PLATFORM_PATH)/python-saithrift.mk +include $(PLATFORM_PATH)/one-image.mk + +SONIC_ALL += $(SONIC_ONE_IMAGE) \ + $(DOCKER_FPM) \ + $(DOCKER_SYNCD_MRVL_RPC) + +# Inject mrvl sai into sairedis +$(LIBSAIREDIS)_DEPENDS += $(MRVL_FPA) $(MRVL_SAI) $(LIBSAITHRIFT_DEV_MRVL) + +# Runtime dependency on mrvl sai is set only for syncd +$(SYNCD)_RDEPENDS += $(MRVL_SAI) diff --git a/platform/marvell/sai.mk b/platform/marvell/sai.mk new file mode 100644 index 000000000000..a620e2f68761 --- /dev/null +++ b/platform/marvell/sai.mk @@ -0,0 +1,9 @@ +# Marvell SAI + +export MRVL_SAI_VERSION = 1.0.1 +export MRVL_SAI_TAG = SONiC.201705 +export MRVL_SAI = mrvllibsai_$(MRVL_SAI_VERSION).deb + +$(MRVL_SAI)_SRC_PATH = $(PLATFORM_PATH)/sai +$(MRVL_SAI)_DEPENDS += $(MRVL_FPA) +SONIC_MAKE_DEBS += $(MRVL_SAI) diff --git a/platform/marvell/sai/Makefile b/platform/marvell/sai/Makefile new file mode 100644 index 000000000000..1fad592a79ee --- /dev/null +++ b/platform/marvell/sai/Makefile @@ -0,0 +1,9 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MRVL_SAI_URL = https://github.com/Marvell-switching/SAI-plugin/raw/$(MRVL_SAI_TAG)/sai_deb/$(MRVL_SAI) + +$(addprefix $(DEST)/, $(MRVL_SAI)): $(DEST)/% : + # get deb package + wget -O $(DEST)/$(MRVL_SAI) $(MRVL_SAI_URL) diff --git a/platform/marvell/sdk.mk b/platform/marvell/sdk.mk new file mode 100644 index 000000000000..d5e31b995141 --- /dev/null +++ b/platform/marvell/sdk.mk @@ -0,0 +1,8 @@ +# Marvell FPA + +export MRVL_FPA_VERSION = 1.0.1 +export MRVL_FPA_TAG = SONiC.201705 +export MRVL_FPA = mrvllibfpa_$(MRVL_FPA_VERSION).deb + +$(MRVL_FPA)_SRC_PATH = $(PLATFORM_PATH)/sdk +SONIC_MAKE_DEBS += $(MRVL_FPA) diff --git a/platform/marvell/sdk/Makefile b/platform/marvell/sdk/Makefile new file mode 100644 index 000000000000..6822c7d7d274 --- /dev/null +++ b/platform/marvell/sdk/Makefile @@ -0,0 +1,9 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MRVL_FPA_URL = https://github.com/Marvell-switching/SAI-plugin/raw/$(MRVL_FPA_TAG)/sdk_deb/$(MRVL_FPA) + +$(addprefix $(DEST)/, $(MRVL_FPA)): $(DEST)/% : + # get deb package + wget -O $(DEST)/$(MRVL_FPA) $(MRVL_FPA_URL) From a92f5a9ffed21801b7f6989e0ff52b6d6e4e39bb Mon Sep 17 00:00:00 2001 From: byu343 Date: Sat, 19 Aug 2017 21:32:10 -0700 Subject: [PATCH 0732/1011] Add arista-net initramfs hook (#899) --- build_debian.sh | 4 +++ files/initramfs-tools/arista-net | 61 ++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 files/initramfs-tools/arista-net diff --git a/build_debian.sh b/build_debian.sh index ff86cb22de45..22cbef494f87 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -123,6 +123,10 @@ sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista- sudo cp files/initramfs-tools/mke2fs $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/mke2fs sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/mke2fs +# Hook into initramfs: rename the management interfaces on arista switches +sudo cp files/initramfs-tools/arista-net $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-net +sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-net + ## Hook into initramfs: after partition mount and loop file mount ## 1. Prepare layered file system ## 2. Bind-mount docker working directory (docker aufs cannot work over aufs rootfs) diff --git a/files/initramfs-tools/arista-net b/files/initramfs-tools/arista-net new file mode 100644 index 000000000000..1fbe4838adf5 --- /dev/null +++ b/files/initramfs-tools/arista-net @@ -0,0 +1,61 @@ +#!/bin/sh + +case $1 in + prereqs) + exit 0 + ;; +esac + +set -e + +# Extract kernel parameters +set -- $(cat /proc/cmdline) +items="" +for x in "$@"; do + case "$x" in + Aboot=*) + aboot_flag="${x#Aboot=}" + ;; + net_*) + item="${x#net_}" + items="$items $item" + ;; + platform=*) + platform_flag="${x#platform=}" + ;; + esac +done + +arista_net_rename() { + local device_path="$1" + local new_name="$2" + local from_name="$3" + for path in $(ls -d /sys/class/net/$from_name* 2>/dev/null); do + local devid="$(realpath "$path/device")" + if echo "$devid" | grep -q "$device_path"; then + local cur_name="${path##*/}" + ip link set "$cur_name" name "$new_name" + return + fi + done +} + +# Iterate over all the net_maX items found in the cmdline two times. +# First time renaming the interfaces to maX. +# The second time renaming them to their final name ethX. +if [ -n "$aboot_flag" -a "$platform_flag" == 'rook' ]; then + for item in $items; do + key="${item%=*}" + value="${item#*=}" + arista_net_rename "$value" "$key" eth + done + for item in $items; do + key="${item%=*}" + value="${item#*=}" + index="${key#ma}" + index="$(( $index - 1 ))" + newKey="eth$index" + arista_net_rename "$value" "$newKey" ma + done +fi + From ed665884733fd72146c4d1ab35cc221d3c085e26 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 21 Aug 2017 13:55:59 -0700 Subject: [PATCH 0733/1011] [docker-fpm-quagga]: Manage Quagga processes (zebra, bgpd) using supervisor instead of watchquagga (#900) --- dockers/docker-fpm-quagga/Dockerfile.j2 | 4 +-- dockers/docker-fpm-quagga/daemons | 31 ---------------------- dockers/docker-fpm-quagga/start.sh | 5 ++-- dockers/docker-fpm-quagga/supervisord.conf | 27 ++++++++++++++----- 4 files changed, 25 insertions(+), 42 deletions(-) delete mode 100644 dockers/docker-fpm-quagga/daemons diff --git a/dockers/docker-fpm-quagga/Dockerfile.j2 b/dockers/docker-fpm-quagga/Dockerfile.j2 index 1f71c7130b8d..c10cf0fd71d9 100644 --- a/dockers/docker-fpm-quagga/Dockerfile.j2 +++ b/dockers/docker-fpm-quagga/Dockerfile.j2 @@ -22,10 +22,8 @@ debs/{{ deb }}{{' '}} RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -COPY ["start.sh", "/usr/bin/"] -COPY ["bgpcfgd", "/usr/bin/"] +COPY ["bgpcfgd", "start.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["*.j2", "/usr/share/sonic/templates/"] -COPY ["daemons", "/etc/quagga/"] ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-fpm-quagga/daemons b/dockers/docker-fpm-quagga/daemons deleted file mode 100644 index cb7c2322c9fb..000000000000 --- a/dockers/docker-fpm-quagga/daemons +++ /dev/null @@ -1,31 +0,0 @@ -# This file tells the quagga package which daemons to start. -# -# Entries are in the format: =(yes|no|priority) -# 0, "no" = disabled -# 1, "yes" = highest priority -# 2 .. 10 = lower priorities -# Read /usr/share/doc/quagga/README.Debian for details. -# -# Sample configurations for these daemons can be found in -# /usr/share/doc/quagga/examples/. -# -# ATTENTION: -# -# When activation a daemon at the first time, a config file, even if it is -# empty, has to be present *and* be owned by the user and group "quagga", else -# the daemon will not be started by /etc/init.d/quagga. The permissions should -# be u=rw,g=r,o=. -# When using "vtysh" such a config file is also needed. It should be owned by -# group "quaggavty" and set to ug=rw,o= though. Check /etc/pam.d/quagga, too. -# -# The watchquagga daemon is always started. Per default in monitoring-only but -# that can be changed via /etc/quagga/debian.conf. -# -zebra=yes -bgpd=yes -ospfd=no -ospf6d=no -ripd=no -ripngd=no -isisd=no -babeld=no diff --git a/dockers/docker-fpm-quagga/start.sh b/dockers/docker-fpm-quagga/start.sh index ca876efe184e..1e7a49809d55 100755 --- a/dockers/docker-fpm-quagga/start.sh +++ b/dockers/docker-fpm-quagga/start.sh @@ -22,7 +22,8 @@ supervisorctl start bgpcfgd supervisorctl start rsyslogd -# Quagga has its own monitor process, 'watchquagga' -service quagga start +# Start Quagga processes +supervisorctl start zebra +supervisorctl start bgpd supervisorctl start fpmsyncd diff --git a/dockers/docker-fpm-quagga/supervisord.conf b/dockers/docker-fpm-quagga/supervisord.conf index 7b6de2163642..5a310a790f18 100644 --- a/dockers/docker-fpm-quagga/supervisord.conf +++ b/dockers/docker-fpm-quagga/supervisord.conf @@ -11,27 +11,42 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n +[program:bgpcfgd] +command=/usr/bin/bgpcfgd priority=2 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog -[program:fpmsyncd] -command=fpmsyncd +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n priority=3 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog -[program:bgpcfgd] -command=/usr/bin/bgpcfgd +[program:zebra] +command=/usr/lib/quagga/zebra -A 127.0.0.1 priority=4 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog +[program:bgpd] +command=/usr/lib/quagga/bgpd -A 127.0.0.1 +priority=5 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:fpmsyncd] +command=fpmsyncd +priority=6 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog From 7c75030ceadacf7183477a838f95c00fea801aec Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Tue, 22 Aug 2017 18:08:07 +0300 Subject: [PATCH 0734/1011] [mlnx-fw-upgrade]: Define required FW version in build time. (#902) - Do not query required FW from file. --- files/build_templates/sonic_debian_extension.j2 | 5 +++-- platform/mellanox/fw.mk | 10 ++++++---- .../{mlnx-fw-upgrade.sh => mlnx-fw-upgrade.j2} | 4 ++-- platform/mellanox/one-image.mk | 2 +- 4 files changed, 12 insertions(+), 9 deletions(-) rename platform/mellanox/{mlnx-fw-upgrade.sh => mlnx-fw-upgrade.j2} (91%) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 0b1d19b6e1b9..04f5181ff610 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -223,6 +223,7 @@ sudo cp {{src}} $FILESYSTEM_ROOT/{{dst}} {% if sonic_asic_platform == "mellanox" %} sudo mkdir -p $FILESYSTEM_ROOT/etc/mlnx/ -sudo cp target/files/$MLNX_FW $FILESYSTEM_ROOT/etc/mlnx/fw-SPC.mfa -sudo cp platform/mellanox/mlnx-fw-upgrade.sh $FILESYSTEM_ROOT/usr/bin/ +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 %} diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index 8e916d817602..a50230a025d9 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -1,7 +1,9 @@ # mellanox firmware -MLNX_FW = fw-SPC-rel-13_1224_0140-EVB.mfa -$(MLNX_FW)_URL = $(MLNX_SDK_BASE_URL)/$(MLNX_FW) -SONIC_ONLINE_FILES += $(MLNX_FW) +MLNX_FW_VERSION = 13.1224.0140 +MLNX_FW_FILE = fw-SPC-rel-$(subst .,_,$(MLNX_FW_VERSION))-EVB.mfa +$(MLNX_FW_FILE)_URL = $(MLNX_SDK_BASE_URL)/$(MLNX_FW_FILE) +SONIC_ONLINE_FILES += $(MLNX_FW_FILE) -export MLNX_FW +export MLNX_FW_VERSION +export MLNX_FW_FILE diff --git a/platform/mellanox/mlnx-fw-upgrade.sh b/platform/mellanox/mlnx-fw-upgrade.j2 similarity index 91% rename from platform/mellanox/mlnx-fw-upgrade.sh rename to platform/mellanox/mlnx-fw-upgrade.j2 index d84265e02d97..ec002497ebd8 100755 --- a/platform/mellanox/mlnx-fw-upgrade.sh +++ b/platform/mellanox/mlnx-fw-upgrade.j2 @@ -1,5 +1,6 @@ #!/bin/bash +fw_required="{{ MLNX_FW_VERSION }}" query_retry_count_max="10" fw_file=/etc/mlnx/fw-SPC.mfa @@ -13,7 +14,7 @@ run_or_fail() { # wait until devices will be available query_retry_count="0" -query_cmd="mlxfwmanager --query -i ${fw_file}" +query_cmd="mlxfwmanager --query" ${query_cmd} > /dev/null while [[ (${query_retry_count} -lt ${query_retry_count_max}) && ($? -ne "0") ]]; do @@ -27,7 +28,6 @@ run_or_fail "${query_cmd}" > /tmp/mlnxfwmanager-query.txt # get current firmware version and required version fw_info=$(grep FW /tmp/mlnxfwmanager-query.txt) fw_current=$(echo $fw_info | cut -f2 -d' ') -fw_required=$(echo $fw_info | cut -f3 -d' ') if [[ -z ${fw_current} ]]; then echo "Could not retreive current FW version." diff --git a/platform/mellanox/one-image.mk b/platform/mellanox/one-image.mk index 9293e6a727e9..db8826951ca8 100644 --- a/platform/mellanox/one-image.mk +++ b/platform/mellanox/one-image.mk @@ -5,5 +5,5 @@ $(SONIC_ONE_IMAGE)_MACHINE = mellanox $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie $(SONIC_ONE_IMAGE)_DEPENDS += $(SX_KERNEL) $(KERNEL_MFT) $(MFT) $(MLNX_HW_MANAGEMENT) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) -$(SONIC_ONE_IMAGE)_FILES += $(MLNX_FW) +$(SONIC_ONE_IMAGE)_FILES += $(MLNX_FW_FILE) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) From d2120449d51362da6a4ded1676ff2db18e5e95b5 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Tue, 22 Aug 2017 13:54:10 -0700 Subject: [PATCH 0735/1011] [sonic-sairedis] update sairedis submodule (#211, #212) (#904) --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 7e70b4d63020..3f4afbbd9d7e 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 7e70b4d63020fc9ea1aa009c264e4effab7bcda0 +Subproject commit 3f4afbbd9d7ed2f077922e0cb0d59df743e34a9a From af8a20d011d957e5fd6151ed77f943824709786a Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 22 Aug 2017 18:04:02 -0700 Subject: [PATCH 0736/1011] [submodule]: update sonic linux kernel (#906) --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index a97c5e416f8d..e124218e943b 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit a97c5e416f8d4c8d6ddd69a7bb6b983527b3c627 +Subproject commit e124218e943becfc358f83b0b0df52680f751fd2 From 34377f25610471e0a49646428774e7241ba316f6 Mon Sep 17 00:00:00 2001 From: nikos-li <31227248+nikos-li@users.noreply.github.com> Date: Wed, 23 Aug 2017 02:50:39 -0700 Subject: [PATCH 0737/1011] IPv4 prefixes shouldn't be sent by default over IPv6 session with FRR. (#905) RB= G=lnos-reviewers R=ntrianta,rjonnadu,rmolina,sfardeen,zxu A= --- dockers/docker-fpm-frr/bgpd.conf.j2 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dockers/docker-fpm-frr/bgpd.conf.j2 b/dockers/docker-fpm-frr/bgpd.conf.j2 index d04f6ac623e0..c66d5bfb232f 100644 --- a/dockers/docker-fpm-frr/bgpd.conf.j2 +++ b/dockers/docker-fpm-frr/bgpd.conf.j2 @@ -21,6 +21,7 @@ log facility local4 router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp log-neighbor-changes bgp bestpath as-path multipath-relax + no bgp default ipv4-unicast {# TODO: use lo[0] for backward compatibility, will revisit the case with multiple lo interfaces #} bgp router-id {{ minigraph_lo_interfaces[0]['addr'] }} {# advertise loopback #} @@ -53,6 +54,12 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} +{% if neighbor_addr | ipv4 %} + address-family ipv4 + neighbor {{ neighbor_addr }} activate + maximum-paths 64 + exit-address-family +{% endif %} {% if neighbor_addr | ipv6 %} address-family ipv6 neighbor {{ neighbor_addr }} activate From 1e404315814d5677e3d6ecb9ecfc6485171bba05 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 23 Aug 2017 04:03:49 -0700 Subject: [PATCH 0738/1011] [broadcom]: update broadcom sai package to 2.1.5.1-17 (#908) --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index ec7a34253075..eaf188485fed 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_2.1.5.1-16-20170712202323.49_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-16-20170712202323.49_amd64.deb?sv=2015-04-05&sr=b&sig=jsPXiAoSyKqZ1SmiyeEj73W8tRlri8ysExnWvc%2BWSi4%3D&se=2031-03-21T22%3A49%3A32Z&sp=r" +BRCM_SAI = libsaibcm_2.1.5.1-17_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_2.1.5.1-17_amd64.deb?sv=2015-04-05&sr=b&sig=6sJ4dd%2FF1hqStNQk5Z6d%2BYQGRZxLDihXRl60EeN7agc%3D&se=2031-05-02T09%3A37%3A54Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-16-20170712202323.49_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_2.1.5.1-17_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-16-20170712202323.49_amd64.deb?sv=2015-04-05&sr=b&sig=azYZkCi%2FFGS4eELKhIozOok3qimfH%2FjdXlz%2BS2MRBco%3D&se=2031-03-21T22%3A49%3A57Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_2.1.5.1-17_amd64.deb?sv=2015-04-05&sr=b&sig=syV0rie0L2Dn4lhmndCTyCTgXQv8DPoWD3IxtlSdeNo%3D&se=2031-05-02T09%3A37%3A18Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) From 22bc1420b9a3f07c8f7aa2e349bc8b6331e2815d Mon Sep 17 00:00:00 2001 From: padmanarayana Date: Thu, 24 Aug 2017 00:38:14 +0530 Subject: [PATCH 0739/1011] [device]: Updated dell s6100 submodule to 5ab014 (#909) --- platform/broadcom/sonic-platform-modules-dell | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-dell b/platform/broadcom/sonic-platform-modules-dell index 6cff8248fa8c..5ab014c0d4f9 160000 --- a/platform/broadcom/sonic-platform-modules-dell +++ b/platform/broadcom/sonic-platform-modules-dell @@ -1 +1 @@ -Subproject commit 6cff8248fa8c772a077bf3dcb5c86a376357f261 +Subproject commit 5ab014c0d4f9ad71d7791e7d4da0645d2b2d493b From 9a458d843448c61dfba264fcfd45b37d26ab4623 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 23 Aug 2017 12:08:27 -0700 Subject: [PATCH 0740/1011] [kernel]: update kernel submodule (#910) --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index e124218e943b..b386d52bd68b 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit e124218e943becfc358f83b0b0df52680f751fd2 +Subproject commit b386d52bd68bdc5facbd837e265f49a8350e14a1 From 12ba083b668058b57dfbe922a955b64ee4cf36a2 Mon Sep 17 00:00:00 2001 From: jeankuo Date: Thu, 24 Aug 2017 03:08:43 +0800 Subject: [PATCH 0741/1011] [Accton]: Add a new supported device AS5712-54X (#898) * [Accton]: Add a new supported device AS5712-54X Switch Vendor: Edge-core Switch SKU: AS5712-54X ASIC Vendor: Broadcom Swich ASIC: TRIDENT2 Port Configuration: 48x10G+6x40G SONiC Image: SONiC-ONIE-Broadcom * [Accton]: Add a new supported device AS5712-54X (Update 1) Switch Vendor: Edge-core Switch SKU: AS5712-54X ASIC Vendor: Broadcom Swich ASIC: TRIDENT2 Port Configuration: 48x10G+6x40G SONiC Image: SONiC-ONIE-Broadcom * [Accton]: Add a new supported device AS5712-54X (Update 2) Switch Vendor: Edge-core Switch SKU: AS5712-54X ASIC Vendor: Broadcom Swich ASIC: TRIDENT2 Port Configuration: 48x10G+6x40G SONiC Image: SONiC-ONIE-Broadcom * [Accton]: Add a new supported device AS5712-54X (Update 3) Switch Vendor: Edge-core Switch SKU: AS5712-54X ASIC Vendor: Broadcom Swich ASIC: TRIDENT2 Port Configuration: 48x10G+6x40G SONiC Image: SONiC-ONIE-Broadcom --- .../Accton-AS5712-54X/port_config.ini | 74 ++++++++ .../Accton-AS5712-54X/sai.profile | 2 + .../installer.conf | 3 + .../led_proc_init.soc | 163 ++++++++++++++++ .../x86_64-accton_as5712_54x-r0/minigraph.xml | 151 +++++++++++++++ .../plugins/eeprom.py | 24 +++ .../plugins/sfputil.py | 175 ++++++++++++++++++ 7 files changed, 592 insertions(+) create mode 100644 device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/port_config.ini create mode 100644 device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile create mode 100644 device/accton/x86_64-accton_as5712_54x-r0/installer.conf create mode 100644 device/accton/x86_64-accton_as5712_54x-r0/led_proc_init.soc create mode 100644 device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml create mode 100644 device/accton/x86_64-accton_as5712_54x-r0/plugins/eeprom.py create mode 100644 device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py diff --git a/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/port_config.ini b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/port_config.ini new file mode 100644 index 000000000000..61325e1ec43c --- /dev/null +++ b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/port_config.ini @@ -0,0 +1,74 @@ +# name lanes alias +Ethernet0 13 tenGigE0 +Ethernet1 14 tenGigE1 +Ethernet2 15 tenGigE2 +Ethernet3 16 tenGigE3 +Ethernet4 21 tenGigE4 +Ethernet5 22 tenGigE5 +Ethernet6 23 tenGigE6 +Ethernet7 24 tenGigE7 +Ethernet8 25 tenGigE8 +Ethernet9 26 tenGigE9 +Ethernet10 27 tenGigE10 +Ethernet11 28 tenGigE11 +Ethernet12 29 tenGigE12 +Ethernet13 30 tenGigE13 +Ethernet14 31 tenGigE14 +Ethernet15 32 tenGigE15 +Ethernet16 45 tenGigE16 +Ethernet17 46 tenGigE17 +Ethernet18 47 tenGigE18 +Ethernet19 48 tenGigE19 +Ethernet20 49 tenGigE20 +Ethernet21 50 tenGigE21 +Ethernet22 51 tenGigE22 +Ethernet23 52 tenGigE23 +Ethernet24 53 tenGigE24 +Ethernet25 54 tenGigE25 +Ethernet26 55 tenGigE26 +Ethernet27 56 tenGigE27 +Ethernet28 57 tenGigE28 +Ethernet29 58 tenGigE29 +Ethernet30 59 tenGigE30 +Ethernet31 60 tenGigE31 +Ethernet32 61 tenGigE32 +Ethernet33 62 tenGigE33 +Ethernet34 63 tenGigE34 +Ethernet35 64 tenGigE35 +Ethernet36 65 tenGigE36 +Ethernet37 66 tenGigE37 +Ethernet38 67 tenGigE38 +Ethernet39 68 tenGigE39 +Ethernet40 69 tenGigE40 +Ethernet41 70 tenGigE41 +Ethernet42 71 tenGigE42 +Ethernet43 72 tenGigE43 +Ethernet44 73 tenGigE44 +Ethernet45 74 tenGigE45 +Ethernet46 75 tenGigE46 +Ethernet47 76 tenGigE47 +Ethernet48 97 tenGigE48 +Ethernet49 98 tenGigE49 +Ethernet50 99 tenGigE50 +Ethernet51 100 tenGigE51 +Ethernet52 101 tenGigE52 +Ethernet53 102 tenGigE53 +Ethernet54 103 tenGigE54 +Ethernet55 104 tenGigE55 +Ethernet56 81 tenGigE56 +Ethernet57 82 tenGigE57 +Ethernet58 83 tenGigE58 +Ethernet59 84 tenGigE59 +Ethernet60 105 tenGigE60 +Ethernet61 106 tenGigE61 +Ethernet62 107 tenGigE62 +Ethernet63 108 tenGigE63 +Ethernet64 109 tenGigE64 +Ethernet65 110 tenGigE65 +Ethernet66 111 tenGigE66 +Ethernet67 112 tenGigE67 +Ethernet68 77 tenGigE68 +Ethernet69 78 tenGigE69 +Ethernet70 79 tenGigE70 +Ethernet71 80 tenGigE71 + diff --git a/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile new file mode 100644 index 000000000000..7fafa54db963 --- /dev/null +++ b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/td2-as5712-72x10G.config.bcm + diff --git a/device/accton/x86_64-accton_as5712_54x-r0/installer.conf b/device/accton/x86_64-accton_as5712_54x-r0/installer.conf new file mode 100644 index 000000000000..14404194ef53 --- /dev/null +++ b/device/accton/x86_64-accton_as5712_54x-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x2f8 +CONSOLE_DEV=1 +CONSOLE_SPEED=115200 diff --git a/device/accton/x86_64-accton_as5712_54x-r0/led_proc_init.soc b/device/accton/x86_64-accton_as5712_54x-r0/led_proc_init.soc new file mode 100644 index 000000000000..e27679db9ab0 --- /dev/null +++ b/device/accton/x86_64-accton_as5712_54x-r0/led_proc_init.soc @@ -0,0 +1,163 @@ +# LED setting for active +# ----------------------------------------------------------------------------- +# for as5712_54x (48xg+6qxg) +# +# on green - if link up +# off - if link down +# blink - if active +# ----------------------------------------------------------------------------- +m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0 +m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_62=1 +m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_61=2 +m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=3 +m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=4 +m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_58=5 +m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_57=6 +m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=7 +m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=8 +m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_54=9 +m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_53=10 +m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=11 +m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=12 +m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_50=13 +m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_49=14 +m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=15 +m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=16 +m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_34=17 +m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_33=18 +m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=19 +m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=20 +m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_38=21 +m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_37=22 +m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=23 +m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=24 +m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_42=25 +m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_41=26 +m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=27 +m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=28 +m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_46=29 +m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_45=30 +m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=31 +m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=32 +m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_30=33 +m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_29=34 +m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=35 +m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=36 +m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_26=37 +m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_25=38 +m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=39 +m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=40 +m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_22=41 +m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_21=42 +m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=43 +m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=44 +m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_18=45 +m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_17=46 +m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=47 +m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=48 +m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_2=49 +m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_1=50 +m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=51 +m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=52 +m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_6=53 +m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_5=54 +m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=55 +m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=56 +m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_10=57 +m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_9=58 +m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=59 +m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=60 +m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_14=61 +m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_13=62 +m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=63 +m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0 +m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_62=1 +m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_61=2 +m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=3 +m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=4 +m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_58=5 +m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_57=6 +m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=7 +m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=8 +m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_54=9 +m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_53=10 +m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=11 +m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=12 +m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_50=13 +m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_49=14 +m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=15 +m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=16 +m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_34=17 +m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_33=18 +m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=19 +m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=20 +m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_38=21 +m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_37=22 +m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=23 +m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=24 +m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_42=25 +m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_41=26 +m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=27 +m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=28 +m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_46=29 +m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_45=30 +m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=31 +m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=32 +m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_30=33 +m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_29=34 +m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=35 +m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=36 +m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_26=37 +m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_25=38 +m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=39 +m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=40 +m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_22=41 +m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_21=42 +m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=43 +m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=44 +m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_18=45 +m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_17=46 +m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=47 +m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=48 +m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_2=49 +m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_1=50 +m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=51 +m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=52 +m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_6=53 +m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_5=54 +m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=55 +m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=56 +m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_10=57 +m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_9=58 +m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=59 +m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=60 +m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_14=61 +m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_13=62 +m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=63 + +led 0 stop +led 0 prog \ + 06 FE 80 D2 19 71 08 E0 60 FE E9 D2 0F 75 10 81 \ + 61 FD 02 3F 60 FF 28 32 0F 87 67 4A 96 FF 06 FF \ + D2 2B 74 16 02 1F 60 FF 28 32 0F 87 67 4A 96 FF \ + 06 FF D2 13 74 28 02 0F 60 FF 28 32 0F 87 67 4A \ + 96 FF 06 FF D2 0B 74 3A 3A 48 32 07 32 08 C7 32 \ + 04 C7 97 71 57 77 69 32 00 32 01 B7 97 71 63 32 \ + 0E 77 6B 26 FD 97 27 77 6B 32 0F 87 57 00 00 00 +led 0 start + +led 1 stop +led 1 prog \ + 06 FE 80 D2 19 71 08 E0 60 FE E9 D2 0F 75 10 81 \ + 61 FD 02 20 67 89 02 24 67 89 02 10 67 89 02 28 \ + 67 89 02 2C 67 89 02 0C 67 89 02 2C 67 79 02 28 \ + 67 79 02 24 67 79 02 20 67 79 02 10 67 79 02 0C \ + 67 79 02 0B 60 FF 28 32 0F 87 67 56 96 FF 06 FF \ + D2 FF 74 46 3A 36 32 07 32 08 C7 32 04 C7 97 71 \ + 63 77 75 32 00 32 01 B7 97 71 6F 32 0E 77 77 26 \ + FD 97 27 77 77 32 0F 87 57 12 A0 F8 15 1A 01 75 \ + 85 28 67 56 57 32 0F 87 57 12 A0 F8 15 1A 01 71 \ + A1 28 67 56 80 28 67 56 80 28 67 56 80 28 67 56 \ + 57 32 0F 87 32 0F 87 32 0F 87 32 0F 87 57 00 00 +led 1 start + diff --git a/device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml b/device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml new file mode 100644 index 000000000000..8d89f28b0d86 --- /dev/null +++ b/device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml @@ -0,0 +1,151 @@ + + + + + + OCPSCH0104001MS + 10.10.1.26 + switch1 + 10.10.1.25 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.26 + switch1 + 10.10.2.25 + 1 + 10 + 3 + + + + + 64536 + switch1 + + +
10.10.1.26
+ + +
+ +
10.10.2.26
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.9/32 + + 100.0.0.9/32 + + + + + + + + switch1 + + + + + + Ethernet48 + 10.10.1.25/30 + + + + Ethernet52 + 10.10.2.25/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet24 + switch1 + Ethernet48 + + + 40000 + DeviceInterfaceLink + OCPSCH0104002MS + Ethernet24 + switch1 + Ethernet52 + + + + + switch1 + Accton-AS5712-54X + + + + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + switch1 + Accton-AS5712-54X +
diff --git a/device/accton/x86_64-accton_as5712_54x-r0/plugins/eeprom.py b/device/accton/x86_64-accton_as5712_54x-r0/plugins/eeprom.py new file mode 100644 index 000000000000..7681caafeef4 --- /dev/null +++ b/device/accton/x86_64-accton_as5712_54x-r0/plugins/eeprom.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/1-0057/eeprom" + #Two i2c buses might get flipped order, check them both. + if not os.path.exists(self.eeprom_path): + self.eeprom_path = "/sys/bus/i2c/devices/0-0057/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py new file mode 100644 index 000000000000..070b1da934cb --- /dev/null +++ b/device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py @@ -0,0 +1,175 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 + + EEPROM_OFFSET = 20 + + _port_to_eeprom_mapping = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + + for x in range(0, self.port_end + 1): + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/accton/qsfp_modprs") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ModPrsL is active low + if reg_value & mask == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/accton/qsfp_lpmode") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # LPMode is active high + if reg_value & mask == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/accton/qsfp_lpmode", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = hex(reg_value) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/devices/platform/accton/qsfp_reset" + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # File content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_value | mask + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + return True From 48b0beb7ff786c45597ea2ce8790400775bf6d2a Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Thu, 24 Aug 2017 05:41:14 +0300 Subject: [PATCH 0742/1011] Port speed (#879) * Add port speed configuration * Add DeviceInfos support in minigraph parser * Add cfggen test 'test_minigraph_ethernet_interfaces' * Fixed PR comments * Update sonic-swss submodule reference --- dockers/docker-orchagent/Dockerfile.j2 | 1 + dockers/docker-orchagent/ports.json.j2 | 11 ++++ dockers/docker-orchagent/start.sh | 1 + dockers/docker-orchagent/swssconfig.sh | 2 +- src/sonic-config-engine/minigraph.py | 17 +++++ .../tests/simple-sample-graph.xml | 62 +++++++++++++++++++ src/sonic-config-engine/tests/test_cfggen.py | 5 ++ src/sonic-swss | 2 +- 8 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 dockers/docker-orchagent/ports.json.j2 diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 73fb087401ab..587d8f4db2ee 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -30,5 +30,6 @@ COPY ["arp_update", "start.sh", "orchagent.sh", "swssconfig.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["ipinip.json.j2", "/usr/share/sonic/templates/"] COPY ["mirror.json.j2", "/usr/share/sonic/templates/"] +COPY ["ports.json.j2", "/usr/share/sonic/templates/"] ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-orchagent/ports.json.j2 b/dockers/docker-orchagent/ports.json.j2 new file mode 100644 index 000000000000..f59ee993eead --- /dev/null +++ b/dockers/docker-orchagent/ports.json.j2 @@ -0,0 +1,11 @@ +[ +{% for interface in ethernet_interfaces %} + { + "PORT_TABLE:{{ interface['name'] }}": { + "speed": "{{ interface['speed'] }}" + }, + "OP": "SET" + }{% if not loop.last %},{% endif %} + +{% endfor %} +] diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 40ef66441c02..5f961a8bd294 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -4,6 +4,7 @@ mkdir -p /etc/swss/config.d/ sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/mirror.json.j2 > /etc/swss/config.d/mirror.json +sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/ports.json.j2 > /etc/swss/config.d/ports.json export platform=`sonic-cfggen -m /etc/sonic/minigraph.xml -v platform` diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index 768417779e2d..2530aca06bb3 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -38,7 +38,7 @@ fast_reboot HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` -SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json " +SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json ports.json " if [ "$HWSKU" == "Force10-S6000" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 6dbf0d570d47..1877e552858e 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -325,6 +325,19 @@ def parse_meta(meta, hname): deployment_id = value return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst, deployment_id +def parse_deviceinfo(meta, hwsku): + ethernet_interfaces = [] + + for device_info in meta.findall(str(QName(ns, "DeviceInfo"))): + dev_sku = device_info.find(str(QName(ns, "HwSku"))).text + if dev_sku == hwsku: + interfaces = device_info.find(str(QName(ns, "EthernetInterfaces"))) + for interface in interfaces.findall(str(QName(ns1, "EthernetInterface"))): + name = interface.find(str(QName(ns, "InterfaceName"))).text + speed = interface.find(str(QName(ns, "Speed"))).text + ethernet_interfaces.append({ 'name':name, 'speed':speed }) + + return ethernet_interfaces def get_console_info(devices, dev, port): for k, v in devices.items(): @@ -411,6 +424,7 @@ def parse_xml(filename, platform=None, port_config_file=None): neighbors = None devices = None hostname = None + ethernet_interfaces = [] syslog_servers = [] dhcp_servers = [] ntp_servers = [] @@ -440,6 +454,8 @@ def parse_xml(filename, platform=None, port_config_file=None): (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, deployment_id) = parse_meta(child, hostname) + elif child.tag == str(QName(ns, "DeviceInfos")): + ethernet_interfaces = parse_deviceinfo(child, hwsku) results = {} results['minigraph_hwsku'] = hwsku @@ -488,6 +504,7 @@ def parse_xml(filename, platform=None, port_config_file=None): results['forced_mgmt_routes'] = mgmt_routes results['erspan_dst'] = erspan_dst results['deployment_id'] = deployment_id + results['ethernet_interfaces'] = ethernet_interfaces return results diff --git a/src/sonic-config-engine/tests/simple-sample-graph.xml b/src/sonic-config-engine/tests/simple-sample-graph.xml index 20bfb07f00d0..7daae24f49a6 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph.xml @@ -200,6 +200,68 @@
+ + + true + + + DeviceInterface + + true + true + 1 + fortyGigE0/0 + + false + 0 + 0 + 10000 + + + DeviceInterface + + true + true + 1 + fortyGigE0/4 + + false + 0 + 0 + 25000 + + + DeviceInterface + + true + true + 1 + fortyGigE0/8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + fortyGigE0/12 + + false + 0 + 0 + 1000000 + + + true + 0 + Force10-S6000 + + switch-t0 Force10-S6000 diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index d3ff3e8b9f4e..153b0bb14f36 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -119,3 +119,8 @@ def test_minigraph_deployment_id(self): argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v deployment_id' output = self.run_script(argument) self.assertEqual(output.strip(), "1") + + def test_minigraph_ethernet_interfaces(self): + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v ethernet_interfaces' + output = self.run_script(argument) + self.assertEqual(output.strip(), "[{'speed': '10000', 'name': 'fortyGigE0/0'}, {'speed': '25000', 'name': 'fortyGigE0/4'}, {'speed': '40000', 'name': 'fortyGigE0/8'}, {'speed': '1000000', 'name': 'fortyGigE0/12'}]") diff --git a/src/sonic-swss b/src/sonic-swss index f9b55d30276d..eaccf67cabd2 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit f9b55d30276d1a6ab94e7321d9b2a3bf076fd683 +Subproject commit eaccf67cabd22df0ff7d0117fe55f4261bc961d9 From d918b1349173a708cc491bfd080ccb532184ffd4 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Thu, 24 Aug 2017 00:10:50 -0700 Subject: [PATCH 0743/1011] Update sfputil support for Arista platforms (#912) * Bump sonic-platform-modules-arista submodule * Fix sfputil plugin for arista_7060_cx32s * Fix sfputil plugin for arista_7260cx3_64 * Add front panel port number for arista platforms --- .../Arista-7050-Q16S64/port_config.ini | 114 +++++++++--------- .../Arista-7050-QX32/port_config.ini | 66 +++++----- .../Arista-7050-QX-32S/port_config.ini | 66 +++++----- .../Arista-7060-CX32S/port_config.ini | 66 +++++----- .../plugins/sfputil.py | 11 +- .../plugins/sfputil.py | 14 ++- .../broadcom/sonic-platform-modules-arista | 2 +- 7 files changed, 173 insertions(+), 166 deletions(-) diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini b/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini index 28edbeccf224..dea477b26152 100644 --- a/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini @@ -1,57 +1,57 @@ -# name lanes alias -Ethernet0 125,126,127,128 Ethernet1/1 -Ethernet4 121,122,123,124 Ethernet2/1 -Ethernet8 13,14,15,16 Ethernet3/1 -Ethernet12 9,10,11,12 Ethernet4/1 -Ethernet16 17,18,19,20 Ethernet5/1 -Ethernet20 21,22,23,24 Ethernet6/1 -Ethernet24 25,26,27,28 Ethernet7/1 -Ethernet28 29,30,31,32 Ethernet8/1 -Ethernet32 37,38,39,40 Ethernet9/1 -Ethernet36 33,34,35,36 Ethernet10/1 -Ethernet40 45,46,47,48 Ethernet11/1 -Ethernet44 41,42,43,44 Ethernet12/1 -Ethernet48 53,54,55,56 Ethernet13/1 -Ethernet52 49,50,51,52 Ethernet14/1 -Ethernet56 69,70,71,72 Ethernet15/1 -Ethernet60 65,66,67,68 Ethernet16/1 -Ethernet64 77 Ethernet17/1 -Ethernet65 78 Ethernet17/2 -Ethernet66 79 Ethernet17/3 -Ethernet67 80 Ethernet17/4 -Ethernet68 73 Ethernet18/1 -Ethernet69 74 Ethernet18/2 -Ethernet70 75 Ethernet18/3 -Ethernet71 76 Ethernet18/4 -Ethernet72 93 Ethernet19/1 -Ethernet73 94 Ethernet19/2 -Ethernet74 95 Ethernet19/3 -Ethernet75 96 Ethernet19/4 -Ethernet76 89 Ethernet20/1 -Ethernet77 90 Ethernet20/2 -Ethernet78 91 Ethernet20/3 -Ethernet79 92 Ethernet20/4 -Ethernet80 101 Ethernet21/1 -Ethernet81 102 Ethernet21/2 -Ethernet82 103 Ethernet21/3 -Ethernet83 104 Ethernet21/4 -Ethernet84 97 Ethernet22/1 -Ethernet85 98 Ethernet22/2 -Ethernet86 99 Ethernet22/3 -Ethernet87 100 Ethernet22/4 -Ethernet88 109 Ethernet23/1 -Ethernet89 110 Ethernet23/2 -Ethernet90 111 Ethernet23/3 -Ethernet91 112 Ethernet23/4 -Ethernet92 105 Ethernet24/1 -Ethernet93 106 Ethernet24/2 -Ethernet94 107 Ethernet24/3 -Ethernet95 108 Ethernet24/4 -Ethernet96 61,62,63,64 Ethernet25 -Ethernet100 57,58,59,60 Ethernet26 -Ethernet104 81,82,83,84 Ethernet27 -Ethernet108 85,86,87,88 Ethernet28 -Ethernet112 117,118,119,120 Ethernet29 -Ethernet116 113,114,115,116 Ethernet30 -Ethernet120 5,6,7,8 Ethernet31 -Ethernet124 1,2,3,4 Ethernet32 +# name lanes alias port +Ethernet0 125,126,127,128 Ethernet1/1 1 +Ethernet4 121,122,123,124 Ethernet2/1 2 +Ethernet8 13,14,15,16 Ethernet3/1 3 +Ethernet12 9,10,11,12 Ethernet4/1 4 +Ethernet16 17,18,19,20 Ethernet5/1 5 +Ethernet20 21,22,23,24 Ethernet6/1 6 +Ethernet24 25,26,27,28 Ethernet7/1 7 +Ethernet28 29,30,31,32 Ethernet8/1 8 +Ethernet32 37,38,39,40 Ethernet9/1 9 +Ethernet36 33,34,35,36 Ethernet10/1 10 +Ethernet40 45,46,47,48 Ethernet11/1 11 +Ethernet44 41,42,43,44 Ethernet12/1 12 +Ethernet48 53,54,55,56 Ethernet13/1 13 +Ethernet52 49,50,51,52 Ethernet14/1 14 +Ethernet56 69,70,71,72 Ethernet15/1 15 +Ethernet60 65,66,67,68 Ethernet16/1 16 +Ethernet64 77 Ethernet17/1 17 +Ethernet65 78 Ethernet17/2 17 +Ethernet66 79 Ethernet17/3 17 +Ethernet67 80 Ethernet17/4 17 +Ethernet68 73 Ethernet18/1 18 +Ethernet69 74 Ethernet18/2 18 +Ethernet70 75 Ethernet18/3 18 +Ethernet71 76 Ethernet18/4 18 +Ethernet72 93 Ethernet19/1 19 +Ethernet73 94 Ethernet19/2 19 +Ethernet74 95 Ethernet19/3 19 +Ethernet75 96 Ethernet19/4 19 +Ethernet76 89 Ethernet20/1 20 +Ethernet77 90 Ethernet20/2 20 +Ethernet78 91 Ethernet20/3 20 +Ethernet79 92 Ethernet20/4 20 +Ethernet80 101 Ethernet21/1 21 +Ethernet81 102 Ethernet21/2 21 +Ethernet82 103 Ethernet21/3 21 +Ethernet83 104 Ethernet21/4 21 +Ethernet84 97 Ethernet22/1 22 +Ethernet85 98 Ethernet22/2 22 +Ethernet86 99 Ethernet22/3 22 +Ethernet87 100 Ethernet22/4 22 +Ethernet88 109 Ethernet23/1 23 +Ethernet89 110 Ethernet23/2 23 +Ethernet90 111 Ethernet23/3 23 +Ethernet91 112 Ethernet23/4 23 +Ethernet92 105 Ethernet24/1 24 +Ethernet93 106 Ethernet24/2 24 +Ethernet94 107 Ethernet24/3 24 +Ethernet95 108 Ethernet24/4 24 +Ethernet96 61,62,63,64 Ethernet25 25 +Ethernet100 57,58,59,60 Ethernet26 26 +Ethernet104 81,82,83,84 Ethernet27 27 +Ethernet108 85,86,87,88 Ethernet28 28 +Ethernet112 117,118,119,120 Ethernet29 29 +Ethernet116 113,114,115,116 Ethernet30 30 +Ethernet120 5,6,7,8 Ethernet31 31 +Ethernet124 1,2,3,4 Ethernet32 32 diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini index b9ab8854a2ec..32fa6885fa93 100644 --- a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini @@ -1,33 +1,33 @@ -# name lanes alias -Ethernet0 125,126,127,128 Ethernet1/1 -Ethernet4 121,122,123,124 Ethernet2/1 -Ethernet8 13,14,15,16 Ethernet3/1 -Ethernet12 9,10,11,12 Ethernet4/1 -Ethernet16 17,18,19,20 Ethernet5/1 -Ethernet20 21,22,23,24 Ethernet6/1 -Ethernet24 25,26,27,28 Ethernet7/1 -Ethernet28 29,30,31,32 Ethernet8/1 -Ethernet32 37,38,39,40 Ethernet9/1 -Ethernet36 33,34,35,36 Ethernet10/1 -Ethernet40 45,46,47,48 Ethernet11/1 -Ethernet44 41,42,43,44 Ethernet12/1 -Ethernet48 53,54,55,56 Ethernet13/1 -Ethernet52 49,50,51,52 Ethernet14/1 -Ethernet56 69,70,71,72 Ethernet15/1 -Ethernet60 65,66,67,68 Ethernet16/1 -Ethernet64 77,78,79,80 Ethernet17/1 -Ethernet68 73,74,75,76 Ethernet18/1 -Ethernet72 93,94,95,96 Ethernet19/1 -Ethernet76 89,90,91,92 Ethernet20/1 -Ethernet80 101,102,103,104 Ethernet21/1 -Ethernet84 97,98,99,100 Ethernet22/1 -Ethernet88 109,110,111,112 Ethernet23/1 -Ethernet92 105,106,107,108 Ethernet24/1 -Ethernet96 61,62,63,64 Ethernet25 -Ethernet100 57,58,59,60 Ethernet26 -Ethernet104 81,82,83,84 Ethernet27 -Ethernet108 85,86,87,88 Ethernet28 -Ethernet112 117,118,119,120 Ethernet29 -Ethernet116 113,114,115,116 Ethernet30 -Ethernet120 5,6,7,8 Ethernet31 -Ethernet124 1,2,3,4 Ethernet32 +# name lanes alias port +Ethernet0 125,126,127,128 Ethernet1/1 1 +Ethernet4 121,122,123,124 Ethernet2/1 2 +Ethernet8 13,14,15,16 Ethernet3/1 3 +Ethernet12 9,10,11,12 Ethernet4/1 4 +Ethernet16 17,18,19,20 Ethernet5/1 5 +Ethernet20 21,22,23,24 Ethernet6/1 6 +Ethernet24 25,26,27,28 Ethernet7/1 7 +Ethernet28 29,30,31,32 Ethernet8/1 8 +Ethernet32 37,38,39,40 Ethernet9/1 9 +Ethernet36 33,34,35,36 Ethernet10/1 10 +Ethernet40 45,46,47,48 Ethernet11/1 11 +Ethernet44 41,42,43,44 Ethernet12/1 12 +Ethernet48 53,54,55,56 Ethernet13/1 13 +Ethernet52 49,50,51,52 Ethernet14/1 14 +Ethernet56 69,70,71,72 Ethernet15/1 15 +Ethernet60 65,66,67,68 Ethernet16/1 16 +Ethernet64 77,78,79,80 Ethernet17/1 17 +Ethernet68 73,74,75,76 Ethernet18/1 18 +Ethernet72 93,94,95,96 Ethernet19/1 19 +Ethernet76 89,90,91,92 Ethernet20/1 20 +Ethernet80 101,102,103,104 Ethernet21/1 21 +Ethernet84 97,98,99,100 Ethernet22/1 22 +Ethernet88 109,110,111,112 Ethernet23/1 23 +Ethernet92 105,106,107,108 Ethernet24/1 24 +Ethernet96 61,62,63,64 Ethernet25 25 +Ethernet100 57,58,59,60 Ethernet26 26 +Ethernet104 81,82,83,84 Ethernet27 27 +Ethernet108 85,86,87,88 Ethernet28 28 +Ethernet112 117,118,119,120 Ethernet29 29 +Ethernet116 113,114,115,116 Ethernet30 30 +Ethernet120 5,6,7,8 Ethernet31 31 +Ethernet124 1,2,3,4 Ethernet32 32 diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini index b56d958499d4..cb36404ac44f 100644 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini @@ -1,33 +1,33 @@ -# name lanes alias -Ethernet0 9,10,11,12 Ethernet5/1 -Ethernet4 13,14,15,16 Ethernet6/1 -Ethernet8 17,18,19,20 Ethernet7/1 -Ethernet12 21,22,23,24 Ethernet8/1 -Ethernet16 29,30,31,32 Ethernet9/1 -Ethernet20 25,26,27,28 Ethernet10/1 -Ethernet24 33,34,35,36 Ethernet11/1 -Ethernet28 37,38,39,40 Ethernet12/1 -Ethernet32 45,46,47,48 Ethernet13/1 -Ethernet36 41,42,43,44 Ethernet14/1 -Ethernet40 49,50,51,52 Ethernet15/1 -Ethernet44 53,54,55,56 Ethernet16/1 -Ethernet48 69,70,71,72 Ethernet17/1 -Ethernet52 65,66,67,68 Ethernet18/1 -Ethernet56 73,74,75,76 Ethernet19/1 -Ethernet60 77,78,79,80 Ethernet20/1 -Ethernet64 93,94,95,96 Ethernet21/1 -Ethernet68 89,90,91,92 Ethernet22/1 -Ethernet72 97,98,99,100 Ethernet23/1 -Ethernet76 101,102,103,104 Ethernet24/1 -Ethernet80 109,110,111,112 Ethernet25/1 -Ethernet84 105,106,107,108 Ethernet26/1 -Ethernet88 121,122,123,124 Ethernet27/1 -Ethernet92 125,126,127,128 Ethernet28/1 -Ethernet96 61,62,63,64 Ethernet29 -Ethernet100 57,58,59,60 Ethernet30 -Ethernet104 81,82,83,84 Ethernet31 -Ethernet108 85,86,87,88 Ethernet32 -Ethernet112 117,118,119,120 Ethernet33 -Ethernet116 113,114,115,116 Ethernet34 -Ethernet120 1,2,3,4 Ethernet35 -Ethernet124 5,6,7,8 Ethernet36 +# name lanes alias port +Ethernet0 9,10,11,12 Ethernet5/1 5 +Ethernet4 13,14,15,16 Ethernet6/1 6 +Ethernet8 17,18,19,20 Ethernet7/1 7 +Ethernet12 21,22,23,24 Ethernet8/1 8 +Ethernet16 29,30,31,32 Ethernet9/1 9 +Ethernet20 25,26,27,28 Ethernet10/1 10 +Ethernet24 33,34,35,36 Ethernet11/1 11 +Ethernet28 37,38,39,40 Ethernet12/1 12 +Ethernet32 45,46,47,48 Ethernet13/1 13 +Ethernet36 41,42,43,44 Ethernet14/1 14 +Ethernet40 49,50,51,52 Ethernet15/1 15 +Ethernet44 53,54,55,56 Ethernet16/1 16 +Ethernet48 69,70,71,72 Ethernet17/1 17 +Ethernet52 65,66,67,68 Ethernet18/1 18 +Ethernet56 73,74,75,76 Ethernet19/1 19 +Ethernet60 77,78,79,80 Ethernet20/1 20 +Ethernet64 93,94,95,96 Ethernet21/1 21 +Ethernet68 89,90,91,92 Ethernet22/1 22 +Ethernet72 97,98,99,100 Ethernet23/1 23 +Ethernet76 101,102,103,104 Ethernet24/1 24 +Ethernet80 109,110,111,112 Ethernet25/1 25 +Ethernet84 105,106,107,108 Ethernet26/1 26 +Ethernet88 121,122,123,124 Ethernet27/1 27 +Ethernet92 125,126,127,128 Ethernet28/1 28 +Ethernet96 61,62,63,64 Ethernet29 29 +Ethernet100 57,58,59,60 Ethernet30 30 +Ethernet104 81,82,83,84 Ethernet31 31 +Ethernet108 85,86,87,88 Ethernet32 32 +Ethernet112 117,118,119,120 Ethernet33 33 +Ethernet116 113,114,115,116 Ethernet34 34 +Ethernet120 1,2,3,4 Ethernet35 35 +Ethernet124 5,6,7,8 Ethernet36 36 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini index 414fb94efbc1..c1dbcfabd9e3 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini @@ -1,33 +1,33 @@ -# name lanes alias -Ethernet0 33,34,35,36 Ethernet1/1 -Ethernet4 37,38,39,40 Ethernet2/1 -Ethernet8 41,42,43,44 Ethernet3/1 -Ethernet12 45,46,47,48 Ethernet4/1 -Ethernet16 49,50,51,52 Ethernet5/1 -Ethernet20 53,54,55,56 Ethernet6/1 -Ethernet24 57,58,59,60 Ethernet7/1 -Ethernet28 61,62,63,64 Ethernet8/1 -Ethernet32 65,66,67,68 Ethernet9/1 -Ethernet36 69,70,71,72 Ethernet10/1 -Ethernet40 73,74,75,76 Ethernet11/1 -Ethernet44 77,78,79,80 Ethernet12/1 -Ethernet48 81,82,83,84 Ethernet13/1 -Ethernet52 85,86,87,88 Ethernet14/1 -Ethernet56 89,90,91,92 Ethernet15/1 -Ethernet60 93,94,95,96 Ethernet16/1 -Ethernet64 97,98,99,100 Ethernet17/1 -Ethernet68 101,102,103,104 Ethernet18/1 -Ethernet72 105,106,107,108 Ethernet19/1 -Ethernet76 109,110,111,112 Ethernet20/1 -Ethernet80 113,114,115,116 Ethernet21/1 -Ethernet84 117,118,119,120 Ethernet22/1 -Ethernet88 121,122,123,124 Ethernet23/1 -Ethernet92 125,126,127,128 Ethernet24/1 -Ethernet96 1,2,3,4 Ethernet25/1 -Ethernet100 5,6,7,8 Ethernet26/1 -Ethernet104 9,10,11,12 Ethernet27/1 -Ethernet108 13,14,15,16 Ethernet28/1 -Ethernet112 17,18,19,20 Ethernet29/1 -Ethernet116 21,22,23,24 Ethernet30/1 -Ethernet120 25,26,27,28 Ethernet31/1 -Ethernet124 29,30,31,32 Ethernet32/1 +# name lanes alias port +Ethernet0 33,34,35,36 Ethernet1/1 1 +Ethernet4 37,38,39,40 Ethernet2/1 2 +Ethernet8 41,42,43,44 Ethernet3/1 3 +Ethernet12 45,46,47,48 Ethernet4/1 4 +Ethernet16 49,50,51,52 Ethernet5/1 5 +Ethernet20 53,54,55,56 Ethernet6/1 6 +Ethernet24 57,58,59,60 Ethernet7/1 7 +Ethernet28 61,62,63,64 Ethernet8/1 8 +Ethernet32 65,66,67,68 Ethernet9/1 9 +Ethernet36 69,70,71,72 Ethernet10/1 10 +Ethernet40 73,74,75,76 Ethernet11/1 11 +Ethernet44 77,78,79,80 Ethernet12/1 12 +Ethernet48 81,82,83,84 Ethernet13/1 13 +Ethernet52 85,86,87,88 Ethernet14/1 14 +Ethernet56 89,90,91,92 Ethernet15/1 15 +Ethernet60 93,94,95,96 Ethernet16/1 16 +Ethernet64 97,98,99,100 Ethernet17/1 17 +Ethernet68 101,102,103,104 Ethernet18/1 18 +Ethernet72 105,106,107,108 Ethernet19/1 19 +Ethernet76 109,110,111,112 Ethernet20/1 20 +Ethernet80 113,114,115,116 Ethernet21/1 21 +Ethernet84 117,118,119,120 Ethernet22/1 22 +Ethernet88 121,122,123,124 Ethernet23/1 23 +Ethernet92 125,126,127,128 Ethernet24/1 24 +Ethernet96 1,2,3,4 Ethernet25/1 25 +Ethernet100 5,6,7,8 Ethernet26/1 26 +Ethernet104 9,10,11,12 Ethernet27/1 27 +Ethernet108 13,14,15,16 Ethernet28/1 28 +Ethernet112 17,18,19,20 Ethernet29/1 29 +Ethernet116 21,22,23,24 Ethernet30/1 30 +Ethernet120 25,26,27,28 Ethernet31/1 31 +Ethernet124 29,30,31,32 Ethernet32/1 32 diff --git a/device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py b/device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py index b85e0f53653e..9a6d770d460b 100644 --- a/device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py +++ b/device/arista/x86_64-arista_7060_cx32s/plugins/sfputil.py @@ -1,9 +1,12 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: import arista.utils.sonic_sfputil as arista_sfputil -except ImportError, e: - raise ImportError (str(e) + "- required module not found") +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -sfputil = arista_sfputil.getSfpUtil() +SfpUtil = arista_sfputil.getSfpUtil() diff --git a/device/arista/x86_64-arista_7260cx3_64/plugins/sfputil.py b/device/arista/x86_64-arista_7260cx3_64/plugins/sfputil.py index ce60de2b384d..9a6d770d460b 100644 --- a/device/arista/x86_64-arista_7260cx3_64/plugins/sfputil.py +++ b/device/arista/x86_64-arista_7260cx3_64/plugins/sfputil.py @@ -1,8 +1,12 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - import arista.utils.sonic_sfputil as arista_sfputil -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import arista.utils.sonic_sfputil as arista_sfputil +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -sfputil = arista_sfputil.getSfpUtil() + +SfpUtil = arista_sfputil.getSfpUtil() diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 51bbe2cd86af..7c505290bb26 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 51bbe2cd86af7df20b27e0cd1f02c2ad08ab2f03 +Subproject commit 7c505290bb26babdef604a377e71b3df702897a8 From 3638dcad281d1caf6d6f26ce94816916bd19ac14 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 24 Aug 2017 18:38:47 -0700 Subject: [PATCH 0744/1011] [translate-acl] Specify pyangbind version to not introduce new dependency (#915) --- dockers/docker-config-engine/Dockerfile.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-config-engine/Dockerfile.j2 b/dockers/docker-config-engine/Dockerfile.j2 index 68555d44779b..b4d924bddfc3 100644 --- a/dockers/docker-config-engine/Dockerfile.j2 +++ b/dockers/docker-config-engine/Dockerfile.j2 @@ -10,7 +10,7 @@ RUN apt-get install -y python-lxml python-yaml python-bitarray python-pip python RUN pip install --upgrade pip -RUN pip install netaddr ipaddr jinja2 pyangbind +RUN pip install netaddr ipaddr jinja2 pyangbind==0.5.10 {% if docker_config_engine_debs.strip() %} COPY \ From a73065a2cb95b17292303d41c488382749f280d5 Mon Sep 17 00:00:00 2001 From: Nadiya Date: Fri, 25 Aug 2017 09:46:14 +0300 Subject: [PATCH 0745/1011] [cavm]Update sai revision and packet driver (#914) Signed-off-by: Nadiya Stetskovych --- platform/cavium/cavm-sai.mk | 2 +- platform/cavium/cavm-xpnet.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/cavium/cavm-sai.mk b/platform/cavium/cavm-sai.mk index c52c4960b9d6..0008135729c5 100644 --- a/platform/cavium/cavm-sai.mk +++ b/platform/cavium/cavm-sai.mk @@ -1,6 +1,6 @@ # Cavium SAI -CAVM_SAI_GITHUB = https://github.com/XPliant/OpenXPS/raw/eedd0b8bb7e7a09602a24418a462a5c10792a145/SAI/cavm-sai/ +CAVM_SAI_GITHUB = https://github.com/XPliant/OpenXPS/raw/13a7eaf10f523e7887964ca235f19095fcc88537/SAI/cavm-sai/ CAVM_LIBSAI = libsai.deb CAVM_SAI = sai.deb diff --git a/platform/cavium/cavm-xpnet.mk b/platform/cavium/cavm-xpnet.mk index 613fa9433564..ed86558a36ae 100644 --- a/platform/cavium/cavm-xpnet.mk +++ b/platform/cavium/cavm-xpnet.mk @@ -1,4 +1,4 @@ -CAVM_SAI_URL = https://github.com/XPliant/OpenXPS/raw/092461a1cf57a11132fbf8e74fa79bab3ab00f2a/SAI +CAVM_SAI_URL = https://github.com/XPliant/OpenXPS/raw/c26aea6a7098936ab3692e148238d73fa8962585/SAI CAVM_XPNET_DEB = xp80-Pcie-Endpoint.deb $(CAVM_XPNET_DEB)_URL = $(CAVM_SAI_URL)/netdev/$(CAVM_XPNET_DEB) From 9aa906a0a03ff40f13a7402a8fe510593761ebbe Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 25 Aug 2017 10:55:11 -0700 Subject: [PATCH 0746/1011] [devices]: modify sfputil plugins for mellanox devices for new platform API (#916) get presence, get/set lpmode, reset are not implemented --- .../x86_64-mlnx_msn2100-r0/plugins/sfputil.py | 70 ++++++++++++++----- .../x86_64-mlnx_msn2410-r0/plugins/sfputil.py | 70 ++++++++++++++----- .../x86_64-mlnx_msn2700-r0/plugins/sfputil.py | 70 ++++++++++++++----- .../x86_64-mlnx_msn2740-r0/plugins/sfputil.py | 70 ++++++++++++++----- 4 files changed, 208 insertions(+), 72 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/sfputil.py index c6628e66e419..ce0adde71a15 100644 --- a/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/sfputil.py +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/sfputil.py @@ -1,28 +1,62 @@ -#! /usr/bin/python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -class sfputil(sfputilbase): - """Platform specific sfputil class""" +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" - port_start = 0 - port_end = 15 - ports_in_block = 16 + PORT_START = 0 + PORT_END = 15 + PORTS_IN_BLOCK = 16 - eeprom_offset = 1 + EEPROM_OFFSET = 1 - port_to_eeprom_mapping = {} + _port_to_eeprom_mapping = {} - _qsfp_ports = range(0, ports_in_block + 1) + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/bsp/qsfp/qsfp{0}" - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/bsp/qsfp/qsfp{0}' for x in range(0, self.port_end + 1): - self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) - sfputilbase.__init__(self, port_num) - + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + + raise NotImplementedError + + def get_low_power_mode(self, port_num): + + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + + raise NotImplementedError + + def reset(self, port_num): + + raise NotImplementedError diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py index 9d4474ac1ec9..db71cb423503 100644 --- a/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py @@ -1,28 +1,62 @@ -#! /usr/bin/python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -class sfputil(sfputilbase): - """Platform specific sfputil class""" +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" - port_start = 0 - port_end = 55 - ports_in_block = 56 + PORT_START = 0 + PORT_END = 55 + PORTS_IN_BLOCK = 56 - eeprom_offset = 1 + EEPROM_OFFSET = 1 - port_to_eeprom_mapping = {} + _port_to_eeprom_mapping = {} - _qsfp_ports = range(0, ports_in_block + 1) + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/bsp/qsfp/qsfp{0}" - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/bsp/qsfp/qsfp{0}' for x in range(0, self.port_end + 1): - self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) - sfputilbase.__init__(self, port_num) - + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + + raise NotImplementedError + + def get_low_power_mode(self, port_num): + + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + + raise NotImplementedError + + def reset(self, port_num): + + raise NotImplementedError diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py index 04e9a4eff85e..b746af219917 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py @@ -1,28 +1,62 @@ -#! /usr/bin/python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -class sfputil(sfputilbase): - """Platform specific sfputil class""" +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" - port_start = 0 - port_end = 31 - ports_in_block = 32 + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 - eeprom_offset = 1 + EEPROM_OFFSET = 1 - port_to_eeprom_mapping = {} + _port_to_eeprom_mapping = {} - _qsfp_ports = range(0, ports_in_block + 1) + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/bsp/qsfp/qsfp{0}" - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/bsp/qsfp/qsfp{0}' for x in range(0, self.port_end + 1): - self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) - sfputilbase.__init__(self, port_num) - + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + + raise NotImplementedError + + def get_low_power_mode(self, port_num): + + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + + raise NotImplementedError + + def reset(self, port_num): + + raise NotImplementedError diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py index 04e9a4eff85e..b746af219917 100644 --- a/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py @@ -1,28 +1,62 @@ -#! /usr/bin/python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -class sfputil(sfputilbase): - """Platform specific sfputil class""" +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" - port_start = 0 - port_end = 31 - ports_in_block = 32 + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 - eeprom_offset = 1 + EEPROM_OFFSET = 1 - port_to_eeprom_mapping = {} + _port_to_eeprom_mapping = {} - _qsfp_ports = range(0, ports_in_block + 1) + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/bsp/qsfp/qsfp{0}" - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/bsp/qsfp/qsfp{0}' for x in range(0, self.port_end + 1): - self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) - sfputilbase.__init__(self, port_num) - + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + + raise NotImplementedError + + def get_low_power_mode(self, port_num): + + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + + raise NotImplementedError + + def reset(self, port_num): + + raise NotImplementedError From 02c125f5ce4f4d70f6c9a885edd0cbd750899033 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 25 Aug 2017 17:31:19 -0700 Subject: [PATCH 0747/1011] [Arista-7260CX3] Rename hwSKU Arista-7260CX3-64 to Arista-7260CX3-C64, introducing new hwSKU Arista-7260CX3-D108C8 (#920) * [Device] Rename SKU Arista-7260CX3-64 to Arista-7260CX3-C64 Renaming to add the speed indication: C64 means 64 100G ports. renamed: Arista-7260CX3-64/port_config.ini -> Arista-7260CX3-C64/port_config.ini renamed: Arista-7260CX3-64/sai.profile -> Arista-7260CX3-C64/sai.profile * [Arista-7260cx3] Fix 64x100G port_config.ini Reorder the port lanes to match the front panel port numbering. * [Arista-7260CX3] add hwSKU Arista-7260CX3-D108C8 This hwSKU has 108x50G ports and 8x100G ports (2 x 100G ports are unused) --- .../Arista-7260CX3-64/port_config.ini | 67 ---------- .../Arista-7260CX3-C64/port_config.ini | 67 ++++++++++ .../sai.profile | 0 .../Arista-7260CX3-D108C8/port_config.ini | 121 ++++++++++++++++++ .../Arista-7260CX3-D108C8/sai.profile | 1 + .../x86_64-arista_7260cx3_64/minigraph.xml | 4 +- 6 files changed, 191 insertions(+), 69 deletions(-) delete mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/port_config.ini create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/port_config.ini rename device/arista/x86_64-arista_7260cx3_64/{Arista-7260CX3-64 => Arista-7260CX3-C64}/sai.profile (100%) create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini create mode 100644 device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/sai.profile diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/port_config.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/port_config.ini deleted file mode 100644 index c0213576d087..000000000000 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/port_config.ini +++ /dev/null @@ -1,67 +0,0 @@ -# name lanes alias port -Ethernet0 77,78,79,80 Ethernet1/1 1 -Ethernet4 65,66,67,68 Ethernet2/1 2 -Ethernet8 85,86,87,88 Ethernet3/1 3 -Ethernet12 89,90,91,92 Ethernet4/1 4 -Ethernet16 109,110,111,112 Ethernet5/1 5 -Ethernet20 97,98,99,100 Ethernet6/1 6 -Ethernet24 117,118,119,120 Ethernet7/1 7 -Ethernet28 5,6,7,8 Ethernet8/1 8 -Ethernet32 17,18,19,20 Ethernet9/1 9 -Ethernet36 13,14,15,16 Ethernet10/1 10 -Ethernet40 29,30,31,32 Ethernet11/1 11 -Ethernet44 37,38,39,40 Ethernet12/1 12 -Ethernet48 49,50,51,52 Ethernet13/1 13 -Ethernet52 45,46,47,48 Ethernet14/1 14 -Ethernet56 61,62,63,64 Ethernet15/1 15 -Ethernet60 121,122,123,124 Ethernet16/1 16 -Ethernet64 193,194,195,196 Ethernet17/1 17 -Ethernet68 133,134,135,136 Ethernet18/1 18 -Ethernet72 205,206,207,208 Ethernet19/1 19 -Ethernet76 213,214,215,216 Ethernet20/1 20 -Ethernet80 225,226,227,228 Ethernet21/1 21 -Ethernet84 221,222,223,224 Ethernet22/1 22 -Ethernet88 237,238,239,240 Ethernet23/1 23 -Ethernet92 245,246,247,248 Ethernet24/1 24 -Ethernet96 141,142,143,144 Ethernet25/1 25 -Ethernet100 249,250,251,252 Ethernet26/1 26 -Ethernet104 149,150,151,152 Ethernet27/1 27 -Ethernet108 153,154,155,156 Ethernet28/1 28 -Ethernet112 173,174,175,176 Ethernet29/1 29 -Ethernet116 161,162,163,164 Ethernet30/1 30 -Ethernet120 181,182,183,184 Ethernet31/1 31 -Ethernet124 185,186,187,188 Ethernet32/1 32 -Ethernet128 69,70,71,72 Ethernet33/1 33 -Ethernet132 73,74,75,76 Ethernet34/1 34 -Ethernet136 93,94,95,96 Ethernet35/1 35 -Ethernet140 81,82,83,84 Ethernet36/1 36 -Ethernet144 101,102,103,104 Ethernet37/1 37 -Ethernet148 105,106,107,108 Ethernet38/1 38 -Ethernet152 1,2,3,4 Ethernet39/1 39 -Ethernet156 113,114,115,116 Ethernet40/1 40 -Ethernet160 9,10,11,12 Ethernet41/1 41 -Ethernet164 21,22,23,24 Ethernet42/1 42 -Ethernet168 33,34,35,36 Ethernet43/1 43 -Ethernet172 25,26,27,28 Ethernet44/1 44 -Ethernet176 41,42,43,44 Ethernet45/1 45 -Ethernet180 53,54,55,56 Ethernet46/1 46 -Ethernet184 125,126,127,128 Ethernet47/1 47 -Ethernet188 57,58,59,60 Ethernet48/1 48 -Ethernet192 129,130,131,132 Ethernet49/1 49 -Ethernet196 197,198,199,200 Ethernet50/1 50 -Ethernet200 209,210,211,212 Ethernet51/1 51 -Ethernet204 201,202,203,204 Ethernet52/1 52 -Ethernet208 217,218,219,220 Ethernet53/1 53 -Ethernet212 229,230,231,232 Ethernet54/1 54 -Ethernet216 241,242,243,244 Ethernet55/1 55 -Ethernet220 233,234,235,236 Ethernet56/1 56 -Ethernet224 253,254,255,256 Ethernet57/1 57 -Ethernet228 137,138,139,140 Ethernet58/1 58 -Ethernet232 157,158,159,160 Ethernet59/1 59 -Ethernet236 145,146,147,148 Ethernet60/1 60 -Ethernet240 165,166,167,168 Ethernet61/1 61 -Ethernet244 169,170,171,172 Ethernet62/1 62 -Ethernet248 189,190,191,192 Ethernet63/1 63 -Ethernet252 177,178,179,180 Ethernet64/1 64 -Ethernet256 257 Ethernet65 65 -Ethernet260 259 Ethernet66 66 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/port_config.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/port_config.ini new file mode 100644 index 000000000000..4f073e46dce3 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/port_config.ini @@ -0,0 +1,67 @@ +# name lanes alias port +Ethernet0 77,78,79,80 Ethernet1/1 1 +Ethernet4 65,66,67,68 Ethernet2/1 2 +Ethernet8 85,86,87,88 Ethernet3/1 3 +Ethernet12 89,90,91,92 Ethernet4/1 4 +Ethernet16 109,110,111,112 Ethernet5/1 5 +Ethernet20 97,98,99,100 Ethernet6/1 6 +Ethernet24 5,6,7,8 Ethernet7/1 7 +Ethernet28 13,14,15,16 Ethernet8/1 8 +Ethernet32 25,26,27,28 Ethernet9/1 9 +Ethernet36 21,22,23,24 Ethernet10/1 10 +Ethernet40 37,38,39,40 Ethernet11/1 11 +Ethernet44 45,46,47,48 Ethernet12/1 12 +Ethernet48 57,58,59,60 Ethernet13/1 13 +Ethernet52 53,54,55,56 Ethernet14/1 14 +Ethernet56 117,118,119,120 Ethernet15/1 15 +Ethernet60 121,122,123,124 Ethernet16/1 16 +Ethernet64 141,142,143,144 Ethernet17/1 17 +Ethernet68 133,134,135,136 Ethernet18/1 18 +Ethernet72 197,198,199,200 Ethernet19/1 19 +Ethernet76 205,206,207,208 Ethernet20/1 20 +Ethernet80 217,218,219,220 Ethernet21/1 21 +Ethernet84 213,214,215,216 Ethernet22/1 22 +Ethernet88 229,230,231,232 Ethernet23/1 23 +Ethernet92 237,238,239,240 Ethernet24/1 24 +Ethernet96 249,250,251,252 Ethernet25/1 25 +Ethernet100 245,246,247,248 Ethernet26/1 26 +Ethernet104 149,150,151,152 Ethernet27/1 27 +Ethernet108 153,154,155,156 Ethernet28/1 28 +Ethernet112 173,174,175,176 Ethernet29/1 29 +Ethernet116 161,162,163,164 Ethernet30/1 30 +Ethernet120 181,182,183,184 Ethernet31/1 31 +Ethernet124 185,186,187,188 Ethernet32/1 32 +Ethernet128 69,70,71,72 Ethernet33/1 33 +Ethernet132 73,74,75,76 Ethernet34/1 34 +Ethernet136 93,94,95,96 Ethernet35/1 35 +Ethernet140 81,82,83,84 Ethernet36/1 36 +Ethernet144 101,102,103,104 Ethernet37/1 37 +Ethernet148 105,106,107,108 Ethernet38/1 38 +Ethernet152 9,10,11,12 Ethernet39/1 39 +Ethernet156 1,2,3,4 Ethernet40/1 40 +Ethernet160 17,18,19,20 Ethernet41/1 41 +Ethernet164 29,30,31,32 Ethernet42/1 42 +Ethernet168 41,42,43,44 Ethernet43/1 43 +Ethernet172 33,34,35,36 Ethernet44/1 44 +Ethernet176 49,50,51,52 Ethernet45/1 45 +Ethernet180 61,62,63,64 Ethernet46/1 46 +Ethernet184 125,126,127,128 Ethernet47/1 47 +Ethernet188 113,114,115,116 Ethernet48/1 48 +Ethernet192 129,130,131,132 Ethernet49/1 49 +Ethernet196 137,138,139,140 Ethernet50/1 50 +Ethernet200 201,202,203,204 Ethernet51/1 51 +Ethernet204 193,194,195,196 Ethernet52/1 52 +Ethernet208 209,210,211,212 Ethernet53/1 53 +Ethernet212 221,222,223,224 Ethernet54/1 54 +Ethernet216 233,234,235,236 Ethernet55/1 55 +Ethernet220 225,226,227,228 Ethernet56/1 56 +Ethernet224 241,242,243,244 Ethernet57/1 57 +Ethernet228 253,254,255,256 Ethernet58/1 58 +Ethernet232 157,158,159,160 Ethernet59/1 59 +Ethernet236 145,146,147,148 Ethernet60/1 60 +Ethernet240 165,166,167,168 Ethernet61/1 61 +Ethernet244 169,170,171,172 Ethernet62/1 62 +Ethernet248 189,190,191,192 Ethernet63/1 63 +Ethernet252 177,178,179,180 Ethernet64/1 64 +Ethernet256 257 Ethernet65 65 +Ethernet260 259 Ethernet66 66 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/sai.profile b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/sai.profile similarity index 100% rename from device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-64/sai.profile rename to device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/sai.profile diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini new file mode 100644 index 000000000000..b06d1c7575d4 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini @@ -0,0 +1,121 @@ +# name lanes alias port +Ethernet0 77,78 Ethernet1/1 1 +Ethernet2 79,80 Ethernet1/3 2 +Ethernet4 65,66 Ethernet2/1 3 +Ethernet6 67,68 Ethernet2/3 4 +Ethernet8 85,86 Ethernet3/1 5 +Ethernet10 87,88 Ethernet3/3 6 +Ethernet12 89,90 Ethernet4/1 7 +Ethernet14 91,92 Ethernet4/3 8 +Ethernet16 109,110 Ethernet5/1 9 +Ethernet18 111,112 Ethernet5/3 10 +Ethernet20 97,98 Ethernet6/1 11 +Ethernet22 99,100 Ethernet6/3 12 +Ethernet24 5,6 Ethernet7/1 13 +Ethernet26 7,8 Ethernet7/3 14 +Ethernet28 13,14 Ethernet8/1 15 +Ethernet30 15,16 Ethernet8/3 16 +Ethernet32 25,26 Ethernet9/1 17 +Ethernet34 27,28 Ethernet9/3 18 +Ethernet36 21,22 Ethernet10/1 19 +Ethernet38 23,24 Ethernet10/3 20 +Ethernet40 37,38 Ethernet11/1 21 +Ethernet42 39,40 Ethernet11/3 22 +Ethernet44 45,46 Ethernet12/1 23 +Ethernet46 47,48 Ethernet12/3 24 +Ethernet48 57,58 Ethernet13/1 25 +Ethernet50 59,60 Ethernet13/3 26 +Ethernet52 53,54 Ethernet14/1 27 +Ethernet54 55,56 Ethernet14/3 28 +Ethernet56 117,118 Ethernet15/1 29 +Ethernet58 119,120 Ethernet15/3 30 +Ethernet60 121,122 Ethernet16/1 31 +Ethernet62 123,124 Ethernet16/3 32 +Ethernet64 141,142 Ethernet17/1 33 +Ethernet66 143,144 Ethernet17/3 34 +Ethernet68 133,134,135,136 Ethernet18/1 35 +Ethernet72 197,198 Ethernet19/1 36 +Ethernet74 199,200 Ethernet19/3 37 +Ethernet76 205,206,207,208 Ethernet20/1 38 +Ethernet80 217,218 Ethernet21/1 39 +Ethernet82 219,220 Ethernet21/3 40 +Ethernet84 213,214 Ethernet22/1 41 +Ethernet86 215,216 Ethernet22/3 42 +Ethernet88 229,230 Ethernet23/1 43 +Ethernet90 231,232 Ethernet23/3 44 +Ethernet92 237,238 Ethernet24/1 45 +Ethernet94 239,240 Ethernet24/3 46 +Ethernet96 249,250 Ethernet25/1 47 +Ethernet98 251,252 Ethernet25/3 48 +Ethernet100 245,246 Ethernet26/1 49 +Ethernet102 247,248 Ethernet26/3 50 +Ethernet104 149,150 Ethernet27/1 51 +Ethernet106 151,152 Ethernet27/3 52 +Ethernet108 153,154 Ethernet28/1 53 +Ethernet110 155,156 Ethernet28/3 54 +Ethernet112 173,174 Ethernet29/1 55 +Ethernet114 175,176 Ethernet29/3 56 +Ethernet116 161,162 Ethernet30/1 57 +Ethernet118 163,164 Ethernet30/3 58 +Ethernet120 181,182 Ethernet31/1 59 +Ethernet122 183,184 Ethernet31/3 60 +Ethernet124 185,186 Ethernet32/1 61 +Ethernet126 187,188 Ethernet32/3 62 +Ethernet128 69,70 Ethernet33/1 63 +Ethernet130 71,72 Ethernet33/3 64 +Ethernet132 73,74 Ethernet34/1 65 +Ethernet134 75,76 Ethernet34/3 66 +Ethernet136 93,94 Ethernet35/1 67 +Ethernet138 95,96 Ethernet35/3 68 +Ethernet140 81,82 Ethernet36/1 69 +Ethernet142 83,84 Ethernet36/3 70 +Ethernet144 101,102 Ethernet37/1 71 +Ethernet146 103,104 Ethernet37/3 72 +Ethernet148 105,106 Ethernet38/1 73 +Ethernet150 107,108 Ethernet38/3 74 +Ethernet152 9,10 Ethernet39/1 75 +Ethernet154 11,12 Ethernet39/3 76 +Ethernet156 1,2 Ethernet40/1 77 +Ethernet158 3,4 Ethernet40/3 78 +Ethernet160 17,18 Ethernet41/1 79 +Ethernet162 19,20 Ethernet41/3 80 +Ethernet164 29,30 Ethernet42/1 81 +Ethernet166 31,32 Ethernet42/1 82 +Ethernet168 41,42 Ethernet43/1 83 +Ethernet170 43,44 Ethernet43/3 84 +Ethernet172 33,34 Ethernet44/1 85 +Ethernet174 35,36 Ethernet44/3 86 +Ethernet176 49,50,51,52 Ethernet45/1 87 +Ethernet180 61,62,63,64 Ethernet46/1 88 +Ethernet184 125,126,127,128 Ethernet47/1 89 +Ethernet188 113,114,115,116 Ethernet48/1 90 +Ethernet192 129,130,131,132 Ethernet49/1 91 +Ethernet196 137,138,139,140 Ethernet50/1 92 +Ethernet200 201,202,203,204 Ethernet51/1 93 +Ethernet204 193,194,195,196 Ethernet52/1 94 +Ethernet208 209,210 Ethernet53/1 95 +Ethernet210 211,212 Ethernet53/3 96 +Ethernet212 221,222 Ethernet54/1 97 +Ethernet214 223,224 Ethernet54/3 98 +Ethernet216 233,234 Ethernet55/1 99 +Ethernet218 235,236 Ethernet55/3 100 +Ethernet220 225,226 Ethernet56/1 101 +Ethernet222 227,228 Ethernet56/3 102 +Ethernet224 241,242 Ethernet57/1 103 +Ethernet226 243,244 Ethernet57/3 104 +Ethernet228 253,254 Ethernet58/1 105 +Ethernet230 255,256 Ethernet58/3 106 +Ethernet232 157,158 Ethernet59/1 107 +Ethernet234 159,160 Ethernet59/3 108 +Ethernet236 145,146 Ethernet60/1 109 +Ethernet238 147,148 Ethernet60/3 110 +Ethernet240 165,166 Ethernet61/1 111 +Ethernet242 167,168 Ethernet61/3 112 +Ethernet244 169,170 Ethernet62/1 113 +Ethernet246 171,172 Ethernet62/3 114 +Ethernet248 189,190 Ethernet63/1 115 +Ethernet250 191,192 Ethernet63/3 116 +Ethernet252 177,178 Ethernet64/1 117 +Ethernet254 179,180 Ethernet64/3 118 +Ethernet256 257 Ethernet257 119 +Ethernet260 259 Ethernet259 120 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/sai.profile b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/sai.profile new file mode 100644 index 000000000000..030527daf9c0 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th2-a7260cx3-64-108x50G+10x100G.config.bcm diff --git a/device/arista/x86_64-arista_7260cx3_64/minigraph.xml b/device/arista/x86_64-arista_7260cx3_64/minigraph.xml index 957b60822ba8..2c632dacc471 100644 --- a/device/arista/x86_64-arista_7260cx3_64/minigraph.xml +++ b/device/arista/x86_64-arista_7260cx3_64/minigraph.xml @@ -809,7 +809,7 @@ sonic - Arista-7260CX3-64 + Arista-7260CX3-C64 @@ -844,5 +844,5 @@
sonic - Arista-7260CX3-64 + Arista-7260CX3-C64 From 0a9d60ebb266c0d2d06c50d30930b65da7cdeab1 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Sat, 26 Aug 2017 14:29:44 -0700 Subject: [PATCH 0748/1011] [sonic-slave] Force pyangbind version to 0.5.10 (#918) --- sonic-slave/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 826a7129a7e0..f194bf604caa 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -221,7 +221,7 @@ RUN pip install \ RUN pip install j2cli # For sonic config engine testing -RUN pip install pyangbind +RUN pip install pyangbind==0.5.10 # For supervisor build RUN pip install meld3 mock From 2d3b064437c8795b6b3f85131577ee32a38eb125 Mon Sep 17 00:00:00 2001 From: padmanarayana Date: Mon, 28 Aug 2017 08:43:38 +0530 Subject: [PATCH 0749/1011] [image]: build sonic-broadcom.raw image for sonic conversion from ftos (#901) 1. "make target/sonic-broadcom.raw" will create the compressed dd'able image. 2. This will also update the grub config files (device/dell/*/nos_to_sonic_grub.cfg) with the image versions. --- build_image.sh | 56 ++++++++++++-- .../nos_to_sonic_grub.cfg | 44 +++++++++++ .../nos_to_sonic_grub.cfg | 44 +++++++++++ files/image_config/platform/rc.local | 21 ++++++ installer/sharch_body.sh | 1 + installer/x86_64/install.sh | 74 +++++++++++++------ onie-image.conf | 6 ++ onie-mk-demo.sh | 5 ++ platform/broadcom/raw-image.mk | 9 +++ platform/broadcom/rules.mk | 1 + 10 files changed, 232 insertions(+), 29 deletions(-) create mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/nos_to_sonic_grub.cfg create mode 100644 device/dell/x86_64-dell_z9100_c2538-r0/nos_to_sonic_grub.cfg create mode 100644 platform/broadcom/raw-image.mk diff --git a/build_image.sh b/build_image.sh index a275c383c45d..2d229c2d194b 100755 --- a/build_image.sh +++ b/build_image.sh @@ -14,11 +14,8 @@ IMAGE_VERSION=$(. functions.sh && sonic_get_version) -if [ "$IMAGE_TYPE" = "onie" ]; then - echo "Build ONIE installer" - mkdir -p `dirname $OUTPUT_ONIE_IMAGE` - sudo rm -f $OUTPUT_ONIE_IMAGE - +generate_onie_installer_image() +{ # Copy platform-specific ONIE installer config files where onie-mk-demo.sh expects them rm -rf ./installer/x86_64/platforms/ mkdir -p ./installer/x86_64/platforms/ @@ -27,6 +24,11 @@ if [ "$IMAGE_TYPE" = "onie" ]; then if [ -f ./device/$VENDOR/$PLATFORM/installer.conf ]; then cp ./device/$VENDOR/$PLATFORM/installer.conf ./installer/x86_64/platforms/$PLATFORM fi + + if [ "$IMAGE_TYPE" = "raw" ] && [ -f ./device/$VENDOR/$PLATFORM/nos_to_sonic_grub.cfg ]; then + sed -i -e "s/%%IMAGE_VERSION%%/$IMAGE_VERSION/g" ./device/$VENDOR/$PLATFORM/nos_to_sonic_grub.cfg + echo "IMAGE_VERSION is $IMAGE_VERSION" + fi done done @@ -35,6 +37,50 @@ if [ "$IMAGE_TYPE" = "onie" ]; then ./onie-mk-demo.sh $TARGET_PLATFORM $TARGET_MACHINE $TARGET_PLATFORM-$TARGET_MACHINE-$ONIEIMAGE_VERSION \ installer platform/$TARGET_MACHINE/platform.conf $OUTPUT_ONIE_IMAGE OS $IMAGE_VERSION $ONIE_IMAGE_PART_SIZE \ $ONIE_INSTALLER_PAYLOAD +} + +if [ "$IMAGE_TYPE" = "onie" ]; then + echo "Build ONIE installer" + mkdir -p `dirname $OUTPUT_ONIE_IMAGE` + sudo rm -f $OUTPUT_ONIE_IMAGE + + generate_onie_installer_image + +## Build a raw partition dump image using the ONIE installer that can be +## used to dd' in-lieu of using the onie-nos-installer. Used while migrating +## into SONiC from other NOS. +elif [ "$IMAGE_TYPE" = "raw" ]; then + + echo "Build RAW image" + mkdir -p `dirname $OUTPUT_RAW_IMAGE` + sudo rm -f $OUTPUT_RAW_IMAGE + + generate_onie_installer_image + + echo "Creating SONiC raw partition : $OUTPUT_RAW_IMAGE of size $RAW_IMAGE_DISK_SIZE MB" + fallocate -l "$RAW_IMAGE_DISK_SIZE"M $OUTPUT_RAW_IMAGE + + ## Generate a compressed 8GB partition dump that can be used to 'dd' in-lieu of using the onie-nos-installer + ## Run the installer + ## The 'build' install mode of the installer is used to generate this dump. + sudo chmod a+x $OUTPUT_ONIE_IMAGE + sudo ./$OUTPUT_ONIE_IMAGE + + [ -r $OUTPUT_RAW_IMAGE ] || { + echo "Error : $OUTPUT_RAW_IMAGE not generated!" + exit 1 + } + + gzip $OUTPUT_RAW_IMAGE + + [ -r $OUTPUT_RAW_IMAGE.gz ] || { + echo "Error : gzip $OUTPUT_RAW_IMAGE failed!" + exit 1 + } + + mv $OUTPUT_RAW_IMAGE.gz $OUTPUT_RAW_IMAGE + echo "The compressed raw image is in $OUTPUT_RAW_IMAGE" + ## Use 'aboot' as target machine category which includes Aboot as bootloader elif [ "$IMAGE_TYPE" = "aboot" ]; then echo "Build Aboot installer" diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/nos_to_sonic_grub.cfg b/device/dell/x86_64-dell_s6100_c2538-r0/nos_to_sonic_grub.cfg new file mode 100644 index 000000000000..058b1a9ea118 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/nos_to_sonic_grub.cfg @@ -0,0 +1,44 @@ +# +# Grub config to launch SONiC +# with ONIE boot option + +insmod serial +# Initialize USB-Serial com2 port +serial --unit=1 --speed=9600 +#Serial port config;Defaults: COM1,9600 +serial --unit=0 --speed=9600 +terminal_output serial_com0 +terminal_input serial_com0 +#terminfo added to prevent text wrap issue. +terminfo -g 80x100 serial_com0 +terminfo -g 80x100 serial_com1 + +echo -n "Press Esc to stop autoboot ... " +if sleep --verbose --interruptible 5 ; then + insmod gzio + insmod part_msdos + insmod ext2 + set root='(hd0,gpt8)' + linux /image-%%IMAGE_VERSION%%/boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda8 rw console=tty0 console=ttyS1,9600n8 loop=image-%%IMAGE_VERSION%%/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor + initrd /image-%%IMAGE_VERSION%%/boot/initrd.img-3.16.0-4-amd64 + boot +else + menuentry 'SONiC' { + insmod gzio + insmod part_msdos + insmod ext2 + set root='(hd0,gpt8)' + linux /image-%%IMAGE_VERSION%%/boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda8 rw console=tty0 console=ttyS1,9600n8 loop=image-%%IMAGE_VERSION%%/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor + initrd /image-%%IMAGE_VERSION%%/boot/initrd.img-3.16.0-4-amd64 + boot + } + + menuentry 'ONIE' { + insmod force10 + onieboot + } + + menuentry 'DELL-DIAG' { + delldiagboot + } +fi diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/nos_to_sonic_grub.cfg b/device/dell/x86_64-dell_z9100_c2538-r0/nos_to_sonic_grub.cfg new file mode 100644 index 000000000000..058b1a9ea118 --- /dev/null +++ b/device/dell/x86_64-dell_z9100_c2538-r0/nos_to_sonic_grub.cfg @@ -0,0 +1,44 @@ +# +# Grub config to launch SONiC +# with ONIE boot option + +insmod serial +# Initialize USB-Serial com2 port +serial --unit=1 --speed=9600 +#Serial port config;Defaults: COM1,9600 +serial --unit=0 --speed=9600 +terminal_output serial_com0 +terminal_input serial_com0 +#terminfo added to prevent text wrap issue. +terminfo -g 80x100 serial_com0 +terminfo -g 80x100 serial_com1 + +echo -n "Press Esc to stop autoboot ... " +if sleep --verbose --interruptible 5 ; then + insmod gzio + insmod part_msdos + insmod ext2 + set root='(hd0,gpt8)' + linux /image-%%IMAGE_VERSION%%/boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda8 rw console=tty0 console=ttyS1,9600n8 loop=image-%%IMAGE_VERSION%%/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor + initrd /image-%%IMAGE_VERSION%%/boot/initrd.img-3.16.0-4-amd64 + boot +else + menuentry 'SONiC' { + insmod gzio + insmod part_msdos + insmod ext2 + set root='(hd0,gpt8)' + linux /image-%%IMAGE_VERSION%%/boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda8 rw console=tty0 console=ttyS1,9600n8 loop=image-%%IMAGE_VERSION%%/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor + initrd /image-%%IMAGE_VERSION%%/boot/initrd.img-3.16.0-4-amd64 + boot + } + + menuentry 'ONIE' { + insmod force10 + onieboot + } + + menuentry 'DELL-DIAG' { + delldiagboot + } +fi diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index 49b2ed6e1b69..8b8db4a261c3 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -11,6 +11,27 @@ # # By default this script does nothing. +# If the machine.conf is absent, it indicates that the unit booted +# into SONiC from another NOS. Extract the machine.conf from ONIE. +if [ ! -e /host/machine.conf ]; then + onie_dev=$(blkid | grep ONIE-BOOT | head -n 1 | awk '{print $1}' | sed -e 's/:.*$//') + mkdir -p /mnt/onie-boot + mount $onie_dev /mnt/onie-boot + onie_grub_cfg=/mnt/onie-boot/onie/grub/grub-machine.cfg + + if [ ! -e $onie_grub_cfg ]; then + echo "$onie_grub_cfg not found" >> /etc/migration.log + else + . ./$onie_grub_cfg + grep = $onie_grub_cfg | sed -e 's/onie_//' -e 's/=.*$//' | while read var ; do + eval val='$'onie_$var + echo "onie_${var}=${val}" >> /host/machine.conf + done + fi + + umount /mnt/onie-boot +fi + . /host/machine.conf echo "install platform dependent packages at the first boot time" diff --git a/installer/sharch_body.sh b/installer/sharch_body.sh index 8260d0fd00e6..d22fe26b6998 100644 --- a/installer/sharch_body.sh +++ b/installer/sharch_body.sh @@ -27,6 +27,7 @@ echo " OK." # Untar and launch install script in a tmpfs cur_wd=$(pwd) +export cur_wd archive_path=$(realpath "$0") tmp_dir=$(mktemp -d) if [ "$(id -u)" = "0" ] ; then diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index ca8c4d3e47e7..ad1cc3691fbf 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -24,8 +24,25 @@ _trap_push true set -e cd $(dirname $0) +if [ -d "/etc/sonic" ]; then + echo "Installing SONiC in SONiC" + install_env="sonic" +elif grep -Fxqs "DISTRIB_ID=onie" /etc/lsb-release > /dev/null +then + echo "Installing SONiC in ONIE" + install_env="onie" +else + echo "Installing SONiC in BUILD" + install_env="build" +fi + +if [ -r ./machine.conf ]; then . ./machine.conf +fi + +if [ -r ./onie-image.conf ]; then . ./onie-image.conf +fi echo "ONIE Installer: platform: $platform" @@ -40,7 +57,7 @@ if [ -r /etc/machine.conf ]; then . /etc/machine.conf elif [ -r /host/machine.conf ]; then . /host/machine.conf -else +elif [ "$install_env" != "build" ]; then echo "cannot find machine.conf" exit 1 fi @@ -58,26 +75,20 @@ ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="" # Default var/log device size in MB VAR_LOG_SIZE=4096 -if [ -d "/etc/sonic" ]; then - echo "Installing SONiC in SONiC" - install_env="sonic" -else - echo "Installing SONiC in ONIE" - install_env="onie" -fi - [ -r platforms/$onie_platform ] && . platforms/$onie_platform # Install demo on same block device as ONIE -onie_dev=$(blkid | grep ONIE-BOOT | head -n 1 | awk '{print $1}' | sed -e 's/:.*$//') -blk_dev=$(echo $onie_dev | sed -e 's/[1-9][0-9]*$//' | sed -e 's/\([0-9]\)\(p\)/\1/') -# Note: ONIE has no mount setting for / with device node, so below will be empty string -cur_part=$(cat /proc/mounts | awk "{ if(\$2==\"/\") print \$1 }" | grep $blk_dev || true) - -[ -b "$blk_dev" ] || { - echo "Error: Unable to determine block device of ONIE install" - exit 1 -} +if [ "$install_env" != "build" ]; then + onie_dev=$(blkid | grep ONIE-BOOT | head -n 1 | awk '{print $1}' | sed -e 's/:.*$//') + blk_dev=$(echo $onie_dev | sed -e 's/[1-9][0-9]*$//' | sed -e 's/\([0-9]\)\(p\)/\1/') + # Note: ONIE has no mount setting for / with device node, so below will be empty string + cur_part=$(cat /proc/mounts | awk "{ if(\$2==\"/\") print \$1 }" | grep $blk_dev || true) + + [ -b "$blk_dev" ] || { + echo "Error: Unable to determine block device of ONIE install" + exit 1 + } +fi # If running in ONIE if [ "$install_env" = "onie" ]; then @@ -108,7 +119,7 @@ else firmware="bios" fi -if [ "$install_env" != "sonic" ]; then +if [ "$install_env" = "onie" ]; then # determine ONIE partition type onie_partition_type=$(${onie_bin} onie-sysinfo -t) # demo partition size in MB @@ -310,6 +321,7 @@ demo_install_grub() cat $grub_install_log && rm -f $grub_install_log exit 1 } + rm -f $grub_install_log # restore immutable flag on the core.img file as discussed @@ -374,7 +386,7 @@ demo_install_uefi_grub() image_dir="image-$image_version" -if [ "$install_env" != "sonic" ]; then +if [ "$install_env" = "onie" ]; then eval $create_demo_partition $blk_dev demo_dev=$(echo $blk_dev | sed -e 's/\(mmcblk[0-9]\)/\1p/')$demo_part @@ -391,7 +403,8 @@ if [ "$install_env" != "sonic" ]; then echo "Error: Unable to mount $demo_dev on $demo_mnt" exit 1 } -else + +elif [ "$install_env" = "sonic" ]; then demo_mnt="/host" running_sonic_revision=$(cat /etc/sonic/sonic_version.yml | grep build_version | cut -f2 -d" ") # Prevent installing existing SONiC if it is running @@ -406,6 +419,15 @@ else rm -rf $f fi done +else + demo_mnt="build_raw_image_mnt" + demo_dev=$cur_wd/"%%OUTPUT_RAW_IMAGE%%" + + mkfs.ext4 $demo_dev + + echo "Mounting $demo_dev on $demo_mnt..." + mkdir $demo_mnt + mount -t auto -o loop $demo_dev $demo_mnt fi echo "Installing SONiC to $demo_mnt/$image_dir" @@ -446,7 +468,7 @@ if [ "$VAR_LOG_SIZE" != "0" ]; then mkfs.ext4 -q $demo_mnt/disk-img/var-log.ext4 -F fi -if [ "$install_env" != "sonic" ]; then +if [ "$install_env" = "onie" ]; then # Store machine description in target file system cp /etc/machine.conf $demo_mnt @@ -547,7 +569,7 @@ menuentry '$demo_grub_entry' { } EOF -if [ "$install_env" != "sonic" ]; then +if [ "$install_env" = "onie" ]; then # Add menu entries for ONIE -- use the grub fragment provided by the # ONIE distribution. $onie_root_dir/grub.d/50_onie_grub >> $grub_cfg @@ -559,7 +581,11 @@ $onie_menuentry EOF fi -cp $grub_cfg $onie_initrd_tmp/$demo_mnt/grub/grub.cfg +if [ "$install_env" = "build" ]; then + umount $demo_mnt +else + cp $grub_cfg $onie_initrd_tmp/$demo_mnt/grub/grub.cfg +fi cd / diff --git a/onie-image.conf b/onie-image.conf index f12e23f7414b..b6564feb1a41 100644 --- a/onie-image.conf +++ b/onie-image.conf @@ -27,6 +27,12 @@ DOCKERFS_DIR=docker ## Output file name for onie installer OUTPUT_ONIE_IMAGE=target/sonic-$TARGET_MACHINE.bin +### Output file name for raw image +OUTPUT_RAW_IMAGE=target/sonic-$TARGET_MACHINE.raw + +### Raw image size in MB +RAW_IMAGE_DISK_SIZE=8192 + ## Output file name for aboot installer OUTPUT_ABOOT_IMAGE=target/sonic-aboot-$TARGET_MACHINE.swi diff --git a/onie-mk-demo.sh b/onie-mk-demo.sh index 91d6d1b3ceb2..b8418d79a678 100755 --- a/onie-mk-demo.sh +++ b/onie-mk-demo.sh @@ -83,11 +83,16 @@ cp onie-image.conf $tmp_installdir # sed. Special chars are: \ / & EXTRA_CMDLINE_LINUX=`echo $EXTRA_CMDLINE_LINUX | sed -e 's/[\/&]/\\\&/g'` +output_raw_image=$(cat onie-image.conf | grep OUTPUT_RAW_IMAGE | cut -f2 -d"=") +[ -z "$TARGET_MACHINE" ] && output_raw_image=$(echo $output_raw_image | sed -e 's/$TARGET_MACHINE/$machine/g') +output_raw_image=$(eval echo $output_raw_image) + # Tailor the demo installer for OS mode or DIAG mode sed -i -e "s/%%DEMO_TYPE%%/$demo_type/g" \ -e "s/%%IMAGE_VERSION%%/$image_version/g" \ -e "s/%%ONIE_IMAGE_PART_SIZE%%/$onie_image_part_size/" \ -e "s/%%EXTRA_CMDLINE_LINUX%%/$EXTRA_CMDLINE_LINUX/" \ + -e "s@%%OUTPUT_RAW_IMAGE%%@$output_raw_image@" \ $tmp_installdir/install.sh || clean_up 1 echo -n "." cp -r $* $tmp_installdir || clean_up 1 diff --git a/platform/broadcom/raw-image.mk b/platform/broadcom/raw-image.mk new file mode 100644 index 000000000000..ae93683c543d --- /dev/null +++ b/platform/broadcom/raw-image.mk @@ -0,0 +1,9 @@ +# sonic broadcom raw image installer + +SONIC_RAW_IMAGE = sonic-broadcom.raw +$(SONIC_RAW_IMAGE)_MACHINE = broadcom +$(SONIC_RAW_IMAGE)_IMAGE_TYPE = raw +$(SONIC_RAW_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) +$(SONIC_RAW_IMAGE)_INSTALLS += $($(SONIC_ONE_IMAGE)_INSTALLS) +$(SONIC_RAW_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_RAW_IMAGE) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 253593b30f2a..30b517f8d385 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -11,6 +11,7 @@ include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm-rpc.mk include $(PLATFORM_PATH)/one-image.mk +include $(PLATFORM_PATH)/raw-image.mk include $(PLATFORM_PATH)/one-aboot.mk include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk From 3e7c3e6ea398e5d5e3820ea143b040688ba458d3 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Tue, 29 Aug 2017 00:53:19 -0700 Subject: [PATCH 0750/1011] [devices]: Bump sonic-platform-modules-arista submodule (#924) --- platform/broadcom/sonic-platform-modules-arista | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 7c505290bb26..4ad9358d16b8 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 7c505290bb26babdef604a377e71b3df702897a8 +Subproject commit 4ad9358d16b8cd0b57d5922353f38055f83042e4 From 44502b217b226da6b33591e1b199a47d35c95df5 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 29 Aug 2017 10:47:25 -0700 Subject: [PATCH 0751/1011] Migrate DEVICE_METADATA to db (#919) --- dockers/docker-fpm-frr/bgpd.conf.j2 | 4 ++-- dockers/docker-fpm-frr/zebra.conf.j2 | 2 +- dockers/docker-fpm-gobgp/zebra.conf.j2 | 2 +- dockers/docker-fpm-quagga/bgpd.conf.j2 | 8 +++---- dockers/docker-fpm-quagga/zebra.conf.j2 | 2 +- src/sonic-config-engine/minigraph.py | 23 ++++++++++---------- src/sonic-config-engine/sonic-cfggen | 13 +++++++++++ src/sonic-config-engine/tests/test_cfggen.py | 8 +++---- 8 files changed, 37 insertions(+), 25 deletions(-) diff --git a/dockers/docker-fpm-frr/bgpd.conf.j2 b/dockers/docker-fpm-frr/bgpd.conf.j2 index c66d5bfb232f..1624b5d3578d 100644 --- a/dockers/docker-fpm-frr/bgpd.conf.j2 +++ b/dockers/docker-fpm-frr/bgpd.conf.j2 @@ -7,7 +7,7 @@ {% endblock banner %} ! {% block system_init %} -hostname {{ inventory_hostname }} +hostname {{ DEVICE_METADATA['localhost']['hostname'] }} password zebra log syslog informational log facility local4 @@ -51,7 +51,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% if bgp_session['asn'] != 0 %} neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }} neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} -{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} +{% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} {% if neighbor_addr | ipv4 %} diff --git a/dockers/docker-fpm-frr/zebra.conf.j2 b/dockers/docker-fpm-frr/zebra.conf.j2 index 1ce06eecd2d9..9214eab22c88 100644 --- a/dockers/docker-fpm-frr/zebra.conf.j2 +++ b/dockers/docker-fpm-frr/zebra.conf.j2 @@ -7,7 +7,7 @@ {% endblock banner %} ! {% block sys_init %} -hostname {{ inventory_hostname }} +hostname {{ DEVICE_METADATA['localhost']['hostname'] }} password zebra enable password zebra {% endblock sys_init %} diff --git a/dockers/docker-fpm-gobgp/zebra.conf.j2 b/dockers/docker-fpm-gobgp/zebra.conf.j2 index 1ce06eecd2d9..9214eab22c88 100644 --- a/dockers/docker-fpm-gobgp/zebra.conf.j2 +++ b/dockers/docker-fpm-gobgp/zebra.conf.j2 @@ -7,7 +7,7 @@ {% endblock banner %} ! {% block sys_init %} -hostname {{ inventory_hostname }} +hostname {{ DEVICE_METADATA['localhost']['hostname'] }} password zebra enable password zebra {% endblock sys_init %} diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index eb1da1f1a3ea..daca10b102bd 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -7,7 +7,7 @@ {% endblock banner %} ! {% block system_init %} -hostname {{ inventory_hostname }} +hostname {{ DEVICE_METADATA['localhost']['hostname'] }} password zebra log syslog informational log facility local4 @@ -27,7 +27,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp log-neighbor-changes bgp bestpath as-path multipath-relax {# Advertise graceful restart capability for ToR #} -{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} +{% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} bgp graceful-restart {% endif %} {# TODO: use lo[0] for backward compatibility, will revisit the case with multiple lo interfaces #} @@ -64,13 +64,13 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} neighbor {{ neighbor_addr }} shutdown {% endif %} {% if neighbor_addr | ipv4 %} -{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} +{% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} {% endif %} {% if neighbor_addr | ipv6 %} address-family ipv6 -{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} +{% if DEVICE_METADATA['locahost']['type'] == 'ToRRouter' %} neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} neighbor {{ neighbor_addr }} activate diff --git a/dockers/docker-fpm-quagga/zebra.conf.j2 b/dockers/docker-fpm-quagga/zebra.conf.j2 index 1ce06eecd2d9..9214eab22c88 100644 --- a/dockers/docker-fpm-quagga/zebra.conf.j2 +++ b/dockers/docker-fpm-quagga/zebra.conf.j2 @@ -7,7 +7,7 @@ {% endblock banner %} ! {% block sys_init %} -hostname {{ inventory_hostname }} +hostname {{ DEVICE_METADATA['localhost']['hostname'] }} password zebra enable password zebra {% endblock sys_init %} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 1877e552858e..06a4a3cb3f2e 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -458,14 +458,15 @@ def parse_xml(filename, platform=None, port_config_file=None): ethernet_interfaces = parse_deviceinfo(child, hwsku) results = {} - results['minigraph_hwsku'] = hwsku - # sorting by lambdas are not easily done without custom filters. - # TODO: add jinja2 filter to accept a lambda to sort a list of dictionaries by attribute. - # TODO: alternatively (preferred), implement class containers for multiple-attribute entries, enabling sort by attr results['BGP_NEIGHBOR'] = bgp_sessions - results['DEVICE_METADATA'] = {'localhost': { 'bgp_asn': bgp_asn }} + results['DEVICE_METADATA'] = {'localhost': { + 'bgp_asn': bgp_asn, + 'deployment_id': deployment_id, + 'hostname': hostname, + 'hwsku': hwsku, + 'type': devices[hostname]['type'] + }} results['BGP_PEER_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 = [] vlan_intfs = [] @@ -496,14 +497,11 @@ def parse_xml(filename, platform=None, port_config_file=None): if devices != None: results['minigraph_console'] = get_console_info(devices, console_dev, console_port) results['minigraph_mgmt'] = get_mgmt_info(devices, mgmt_dev, mgmt_port) - results['minigraph_hostname'] = hostname - results['inventory_hostname'] = hostname results['syslog_servers'] = syslog_servers results['dhcp_servers'] = dhcp_servers results['ntp_servers'] = ntp_servers results['forced_mgmt_routes'] = mgmt_routes results['erspan_dst'] = erspan_dst - results['deployment_id'] = deployment_id results['ethernet_interfaces'] = ethernet_interfaces return results @@ -513,9 +511,10 @@ def parse_device_desc_xml(filename): (lo_prefix, mgmt_prefix, hostname, hwsku, d_type) = parse_device(root) results = {} - results['minigraph_hwsku'] = hwsku - results['minigraph_hostname'] = hostname - results['inventory_hostname'] = hostname + results['DEVICE_METADATA'] = {'localhost': { + 'hostname': hostname, + 'hwsku': hwsku, + }} lo_intfs = [] ipn = ipaddress.IPNetwork(lo_prefix) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 070b3100ea5a..029f6cfc17b0 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -22,6 +22,7 @@ import yaml import jinja2 import netaddr import json +from functools import partial from minigraph import minigraph_encoder from minigraph import parse_xml from minigraph import parse_device_desc_xml @@ -53,6 +54,16 @@ def is_ipv6(value): return False return addr.version == 6 +def prefix_attr(attr, value): + if not value: + return None + else: + try: + prefix = netaddr.IPNetwork(str(value)) + except: + return None + return str(getattr(prefix, attr)) + def unique_name(l): name_list = [] new_list = [] @@ -158,6 +169,8 @@ def main(): env.filters['ipv4'] = is_ipv4 env.filters['ipv6'] = is_ipv6 env.filters['unique_name'] = unique_name + for attr in ['ip', 'network', 'prefixlen', 'netmask']: + env.filters[attr] = partial(prefix_attr, attr) template = env.get_template(template_file) print template.render(data) diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 153b0bb14f36..6a563088d338 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -31,7 +31,7 @@ def test_dummy_run(self): self.assertEqual(output, '') def test_device_desc(self): - argument = '-v minigraph_hwsku -M "' + self.sample_device_desc + '"' + argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -M "' + self.sample_device_desc + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'ACS-MSN2700') @@ -41,7 +41,7 @@ def test_device_desc_mgmt_ip(self): self.assertEqual(output.strip(), '10.0.1.5') def test_minigraph_sku(self): - argument = '-v minigraph_hwsku -m "' + self.sample_graph + '"' + argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -m "' + self.sample_graph + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'Force10-Z9100') @@ -51,7 +51,7 @@ def test_print_data(self): self.assertTrue(len(output.strip()) > 0) def test_jinja_expression(self): - argument = '-m "' + self.sample_graph + '" -v "minigraph_devices[minigraph_hostname][\'type\']"' + argument = '-m "' + self.sample_graph + '" -v "DEVICE_METADATA[\'localhost\'][\'type\']"' output = self.run_script(argument) self.assertEqual(output.strip(), 'LeafRouter') @@ -116,7 +116,7 @@ def test_minigraph_peers_with_range(self): self.assertEqual(output.strip(), "[{'name': 'BGPSLBPassive', 'ip_range': ['10.10.10.10/26', '100.100.100.100/26']}]") def test_minigraph_deployment_id(self): - argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v deployment_id' + argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v "DEVICE_METADATA[\'localhost\'][\'deployment_id\']"' output = self.run_script(argument) self.assertEqual(output.strip(), "1") From e4502527d00a6d101f73f7c3a07eae9d7f548336 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 29 Aug 2017 17:03:31 -0700 Subject: [PATCH 0752/1011] Revert "Migrate DEVICE_METADATA to db (#919)" (#928) This reverts commit 44502b217b226da6b33591e1b199a47d35c95df5. --- dockers/docker-fpm-frr/bgpd.conf.j2 | 4 ++-- dockers/docker-fpm-frr/zebra.conf.j2 | 2 +- dockers/docker-fpm-gobgp/zebra.conf.j2 | 2 +- dockers/docker-fpm-quagga/bgpd.conf.j2 | 8 +++---- dockers/docker-fpm-quagga/zebra.conf.j2 | 2 +- src/sonic-config-engine/minigraph.py | 23 ++++++++++---------- src/sonic-config-engine/sonic-cfggen | 13 ----------- src/sonic-config-engine/tests/test_cfggen.py | 8 +++---- 8 files changed, 25 insertions(+), 37 deletions(-) diff --git a/dockers/docker-fpm-frr/bgpd.conf.j2 b/dockers/docker-fpm-frr/bgpd.conf.j2 index 1624b5d3578d..c66d5bfb232f 100644 --- a/dockers/docker-fpm-frr/bgpd.conf.j2 +++ b/dockers/docker-fpm-frr/bgpd.conf.j2 @@ -7,7 +7,7 @@ {% endblock banner %} ! {% block system_init %} -hostname {{ DEVICE_METADATA['localhost']['hostname'] }} +hostname {{ inventory_hostname }} password zebra log syslog informational log facility local4 @@ -51,7 +51,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% if bgp_session['asn'] != 0 %} neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }} neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} -{% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} +{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} {% if neighbor_addr | ipv4 %} diff --git a/dockers/docker-fpm-frr/zebra.conf.j2 b/dockers/docker-fpm-frr/zebra.conf.j2 index 9214eab22c88..1ce06eecd2d9 100644 --- a/dockers/docker-fpm-frr/zebra.conf.j2 +++ b/dockers/docker-fpm-frr/zebra.conf.j2 @@ -7,7 +7,7 @@ {% endblock banner %} ! {% block sys_init %} -hostname {{ DEVICE_METADATA['localhost']['hostname'] }} +hostname {{ inventory_hostname }} password zebra enable password zebra {% endblock sys_init %} diff --git a/dockers/docker-fpm-gobgp/zebra.conf.j2 b/dockers/docker-fpm-gobgp/zebra.conf.j2 index 9214eab22c88..1ce06eecd2d9 100644 --- a/dockers/docker-fpm-gobgp/zebra.conf.j2 +++ b/dockers/docker-fpm-gobgp/zebra.conf.j2 @@ -7,7 +7,7 @@ {% endblock banner %} ! {% block sys_init %} -hostname {{ DEVICE_METADATA['localhost']['hostname'] }} +hostname {{ inventory_hostname }} password zebra enable password zebra {% endblock sys_init %} diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index daca10b102bd..eb1da1f1a3ea 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -7,7 +7,7 @@ {% endblock banner %} ! {% block system_init %} -hostname {{ DEVICE_METADATA['localhost']['hostname'] }} +hostname {{ inventory_hostname }} password zebra log syslog informational log facility local4 @@ -27,7 +27,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp log-neighbor-changes bgp bestpath as-path multipath-relax {# Advertise graceful restart capability for ToR #} -{% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} +{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} bgp graceful-restart {% endif %} {# TODO: use lo[0] for backward compatibility, will revisit the case with multiple lo interfaces #} @@ -64,13 +64,13 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} neighbor {{ neighbor_addr }} shutdown {% endif %} {% if neighbor_addr | ipv4 %} -{% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} +{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} {% endif %} {% if neighbor_addr | ipv6 %} address-family ipv6 -{% if DEVICE_METADATA['locahost']['type'] == 'ToRRouter' %} +{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} neighbor {{ neighbor_addr }} activate diff --git a/dockers/docker-fpm-quagga/zebra.conf.j2 b/dockers/docker-fpm-quagga/zebra.conf.j2 index 9214eab22c88..1ce06eecd2d9 100644 --- a/dockers/docker-fpm-quagga/zebra.conf.j2 +++ b/dockers/docker-fpm-quagga/zebra.conf.j2 @@ -7,7 +7,7 @@ {% endblock banner %} ! {% block sys_init %} -hostname {{ DEVICE_METADATA['localhost']['hostname'] }} +hostname {{ inventory_hostname }} password zebra enable password zebra {% endblock sys_init %} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 06a4a3cb3f2e..1877e552858e 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -458,15 +458,14 @@ def parse_xml(filename, platform=None, port_config_file=None): ethernet_interfaces = parse_deviceinfo(child, hwsku) results = {} + results['minigraph_hwsku'] = hwsku + # sorting by lambdas are not easily done without custom filters. + # TODO: add jinja2 filter to accept a lambda to sort a list of dictionaries by attribute. + # TODO: alternatively (preferred), implement class containers for multiple-attribute entries, enabling sort by attr results['BGP_NEIGHBOR'] = bgp_sessions - results['DEVICE_METADATA'] = {'localhost': { - 'bgp_asn': bgp_asn, - 'deployment_id': deployment_id, - 'hostname': hostname, - 'hwsku': hwsku, - 'type': devices[hostname]['type'] - }} + results['DEVICE_METADATA'] = {'localhost': { 'bgp_asn': bgp_asn }} results['BGP_PEER_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 = [] vlan_intfs = [] @@ -497,11 +496,14 @@ def parse_xml(filename, platform=None, port_config_file=None): if devices != None: results['minigraph_console'] = get_console_info(devices, console_dev, console_port) results['minigraph_mgmt'] = get_mgmt_info(devices, mgmt_dev, mgmt_port) + results['minigraph_hostname'] = hostname + results['inventory_hostname'] = hostname results['syslog_servers'] = syslog_servers results['dhcp_servers'] = dhcp_servers results['ntp_servers'] = ntp_servers results['forced_mgmt_routes'] = mgmt_routes results['erspan_dst'] = erspan_dst + results['deployment_id'] = deployment_id results['ethernet_interfaces'] = ethernet_interfaces return results @@ -511,10 +513,9 @@ def parse_device_desc_xml(filename): (lo_prefix, mgmt_prefix, hostname, hwsku, d_type) = parse_device(root) results = {} - results['DEVICE_METADATA'] = {'localhost': { - 'hostname': hostname, - 'hwsku': hwsku, - }} + results['minigraph_hwsku'] = hwsku + results['minigraph_hostname'] = hostname + results['inventory_hostname'] = hostname lo_intfs = [] ipn = ipaddress.IPNetwork(lo_prefix) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 029f6cfc17b0..070b3100ea5a 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -22,7 +22,6 @@ import yaml import jinja2 import netaddr import json -from functools import partial from minigraph import minigraph_encoder from minigraph import parse_xml from minigraph import parse_device_desc_xml @@ -54,16 +53,6 @@ def is_ipv6(value): return False return addr.version == 6 -def prefix_attr(attr, value): - if not value: - return None - else: - try: - prefix = netaddr.IPNetwork(str(value)) - except: - return None - return str(getattr(prefix, attr)) - def unique_name(l): name_list = [] new_list = [] @@ -169,8 +158,6 @@ def main(): env.filters['ipv4'] = is_ipv4 env.filters['ipv6'] = is_ipv6 env.filters['unique_name'] = unique_name - for attr in ['ip', 'network', 'prefixlen', 'netmask']: - env.filters[attr] = partial(prefix_attr, attr) template = env.get_template(template_file) print template.render(data) diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 6a563088d338..153b0bb14f36 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -31,7 +31,7 @@ def test_dummy_run(self): self.assertEqual(output, '') def test_device_desc(self): - argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -M "' + self.sample_device_desc + '"' + argument = '-v minigraph_hwsku -M "' + self.sample_device_desc + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'ACS-MSN2700') @@ -41,7 +41,7 @@ def test_device_desc_mgmt_ip(self): self.assertEqual(output.strip(), '10.0.1.5') def test_minigraph_sku(self): - argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -m "' + self.sample_graph + '"' + argument = '-v minigraph_hwsku -m "' + self.sample_graph + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'Force10-Z9100') @@ -51,7 +51,7 @@ def test_print_data(self): self.assertTrue(len(output.strip()) > 0) def test_jinja_expression(self): - argument = '-m "' + self.sample_graph + '" -v "DEVICE_METADATA[\'localhost\'][\'type\']"' + argument = '-m "' + self.sample_graph + '" -v "minigraph_devices[minigraph_hostname][\'type\']"' output = self.run_script(argument) self.assertEqual(output.strip(), 'LeafRouter') @@ -116,7 +116,7 @@ def test_minigraph_peers_with_range(self): self.assertEqual(output.strip(), "[{'name': 'BGPSLBPassive', 'ip_range': ['10.10.10.10/26', '100.100.100.100/26']}]") def test_minigraph_deployment_id(self): - argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v "DEVICE_METADATA[\'localhost\'][\'deployment_id\']"' + argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v deployment_id' output = self.run_script(argument) self.assertEqual(output.strip(), "1") From 9c87eff5fa0d54df4d0e0d9ad4ac2410d3a87aa8 Mon Sep 17 00:00:00 2001 From: padmanarayana Date: Wed, 30 Aug 2017 08:40:21 +0530 Subject: [PATCH 0753/1011] [devices]: Update Dell s6100/z9100 platform modules (#925) [devices]: Update Dell s6100/z9100 platform modules --- platform/broadcom/sonic-platform-modules-dell | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-dell b/platform/broadcom/sonic-platform-modules-dell index 5ab014c0d4f9..1abd4e6c41f6 160000 --- a/platform/broadcom/sonic-platform-modules-dell +++ b/platform/broadcom/sonic-platform-modules-dell @@ -1 +1 @@ -Subproject commit 5ab014c0d4f9ad71d7791e7d4da0645d2b2d493b +Subproject commit 1abd4e6c41f633272667a5833a63ab6f8da15199 From 1a4f039f55dd575694bdb0f4509fef5b2c31bb3c Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 30 Aug 2017 09:41:47 -0700 Subject: [PATCH 0754/1011] [quagga] enable core dump for bgpd and zebra (#927) * [core dump] pass unix time to coredump-compress script Currently we only have program name (e.g. bgpd) and PID in the core file name. PID could collide especially after docker restart or recreate. Passing the unix time to coredump-compress so it could also add time to the core file name. * [utilities] include the change to coredump_compress script * [quagga] enable core dump for bgpd and zebra bgpd and zebra downgrade their privilege shortly after started. For that sysctrl kernel.suid_dumpable needs to be set to 2, so that they can dump core. Note that fs.suid_dumpable SHOULD NOT be set to 1. Which will bypass all system security. --- build_debian.sh | 3 ++- src/sonic-utilities | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 22cbef494f87..d7e7c3307536 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -239,10 +239,11 @@ EOF ## Config sysctl sudo mkdir -p $FILESYSTEM_ROOT/var/core sudo augtool --autosave " -set /files/etc/sysctl.conf/kernel.core_pattern '|/usr/bin/coredump-compress %e %p' +set /files/etc/sysctl.conf/kernel.core_pattern '|/usr/bin/coredump-compress %e %t %p' set /files/etc/sysctl.conf/kernel.softlockup_panic 1 set /files/etc/sysctl.conf/kernel.panic 10 +set /files/etc/sysctl.conf/fs.suid_dumpable 2 set /files/etc/sysctl.conf/net.ipv4.conf.default.forwarding 1 set /files/etc/sysctl.conf/net.ipv4.conf.all.forwarding 1 diff --git a/src/sonic-utilities b/src/sonic-utilities index d1ded16b06b4..b82ea42a3546 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit d1ded16b06b493e2420d1013aee97afbdc8160d9 +Subproject commit b82ea42a35468cbb653cf59296d1cca716d400a4 From 127a73aac35d21d8c8d13d28bffb71df1a49ca1c Mon Sep 17 00:00:00 2001 From: sihuihan88 Date: Wed, 30 Aug 2017 13:06:02 -0700 Subject: [PATCH 0755/1011] [quagga]: Disable ipv4 over ipv6 and enable ipv6 over ipv4 peer group (#922) * [bgpd]:disable ipv4 over ipv6 and enable ipv6 over ipv4 peer group * update as comments --- dockers/docker-fpm-quagga/bgpd.conf.j2 | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index eb1da1f1a3ea..02cf40fa8b47 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -26,6 +26,7 @@ route-map TO_BGP_SPEAKER_V4 deny 10 router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp log-neighbor-changes bgp bestpath as-path multipath-relax + no bgp default ipv4-unicast {# Advertise graceful restart capability for ToR #} {% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} bgp graceful-restart @@ -64,9 +65,13 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} neighbor {{ neighbor_addr }} shutdown {% endif %} {% if neighbor_addr | ipv4 %} + address-family ipv4 {% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} - neighbor {{ neighbor_addr }} allowas-in 1 + neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} + neighbor {{ neighbor_addr }} activate + maximum-paths 64 + exit-address-family {% endif %} {% if neighbor_addr | ipv6 %} address-family ipv6 @@ -93,6 +98,14 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% for ip_range in bgp_peer['ip_range'] %} bgp listen range {{ip_range}} peer-group {{ bgp_peer['name'] }} {% endfor %} + address-family ipv4 + neighbor {{ bgp_peer['name'] }} activate + maximum-paths 64 + exit-address-family + address-family ipv6 + neighbor {{ bgp_peer['name'] }} activate + maximum-paths 64 + exit-address-family {% endfor %} {% endblock bgp_peers_with_range %} ! From 7f1991cf2f57be39594af91a31c971e2840670bc Mon Sep 17 00:00:00 2001 From: wadelnn Date: Fri, 1 Sep 2017 07:57:58 +0800 Subject: [PATCH 0756/1011] Update sfputil support for Ingrasys S9100 (#929) * Update sonic-platform-modules-ingrasys submodule. * Fixed sfputil plugin for read QSFP EEPROM. * Add sfputil plugin for get presence. * Add sfputil plugin for get/set low power mode. * Add sfputil plugin for reset QSFP. Signed-off-by: Wade He chihen.he@gmail.com --- .../plugins/sfputil.py | 250 +++++++++++++++++- .../broadcom/sonic-platform-modules-ingrasys | 2 +- 2 files changed, 237 insertions(+), 15 deletions(-) diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/sfputil.py index f45502ab9ab4..f4ffc29bebc6 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/sfputil.py +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/plugins/sfputil.py @@ -1,19 +1,26 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -class sfputil(sfputilbase): - """Platform specific sfputil class""" +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" - port_start = 0 - port_end = 31 - ports_in_block = 32 + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 - port_to_eeprom_mapping = {} + BASE_DIR_PATH = "/sys/class/gpio/gpio{0}/direction" + BASE_VAL_PATH = "/sys/class/gpio/gpio{0}/value" + + _port_to_eeprom_mapping = {} port_to_i2c_mapping = { 0: 11, 1: 10, @@ -49,12 +56,227 @@ class sfputil(sfputilbase): 31: 40 } - _qsfp_ports = range(0, ports_in_block + 1) + abs_to_gpio_mapping = { + 0: 241, + 1: 240, + 2: 243, + 3: 242, + 4: 245, + 5: 244, + 6: 247, + 7: 246, + 8: 249, + 9: 248, + 10: 251, + 11: 250, + 12: 253, + 13: 252, + 14: 255, + 15: 254, + 16: 225, + 17: 224, + 18: 227, + 19: 226, + 20: 229, + 21: 228, + 22: 231, + 23: 230, + 24: 233, + 25: 232, + 26: 235, + 27: 234, + 28: 237, + 29: 236, + 30: 239, + 31: 238 + } + + lpmode_to_gpio_mapping = { + 0: 177, + 1: 176, + 2: 179, + 3: 178, + 4: 181, + 5: 180, + 6: 183, + 7: 182, + 8: 185, + 9: 184, + 10: 187, + 11: 186, + 12: 189, + 13: 188, + 14: 191, + 15: 190, + 16: 161, + 17: 160, + 18: 163, + 19: 162, + 20: 165, + 21: 164, + 22: 167, + 23: 166, + 24: 169, + 25: 168, + 26: 171, + 27: 170, + 28: 173, + 29: 172, + 30: 175, + 31: 174 + } + + reset_to_gpio_mapping = { + 0: 145, + 1: 144, + 2: 147, + 3: 146, + 4: 149, + 5: 148, + 6: 151, + 7: 150, + 8: 153, + 9: 152, + 10: 155, + 11: 154, + 12: 157, + 13: 156, + 14: 159, + 15: 158, + 16: 129, + 17: 128, + 18: 131, + 19: 130, + 20: 133, + 21: 132, + 22: 135, + 23: 134, + 24: 137, + 25: 136, + 26: 139, + 27: 138, + 28: 141, + 29: 140, + 30: 143, + 31: 142 + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) - def __init__(self, port_num): + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + for x in range(self.port_start, self.port_end + 1): port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) self.port_to_eeprom_mapping[x] = port_eeprom_path - sfputilbase.__init__(self, port_num) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + abs_device_file = self.BASE_VAL_PATH.format( + self.abs_to_gpio_mapping[port_num]) + val_file = open(abs_device_file) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + val_file.close() + + # content is a string, either "0" or "1" + if content == "1": + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + lpmode_val_device_file = self.BASE_VAL_PATH.format( + self.lpmode_to_gpio_mapping[port_num]) + val_file = open(lpmode_val_device_file) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + val_file.close() + + # content is a string, either "0" or "1" + if content == "1": + return True + + return False + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + lpmode_val_device_file = self.BASE_VAL_PATH.format( + self.lpmode_to_gpio_mapping[port_num]) + val_file = open(lpmode_val_device_file, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + val_file.write("1" if lpmode is True else "0") + val_file.close() + + return True + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reset_val_device_file = self.BASE_VAL_PATH.format( + self.reset_to_gpio_mapping[port_num]) + val_file = open(reset_val_device_file, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + val_file.write("1") + val_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + try: + reset_val_device_file = self.BASE_VAL_PATH.format( + self.reset_to_gpio_mapping[port_num]) + val_file = open(reset_val_device_file, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + val_file.write("0") + val_file.close() + + return True diff --git a/platform/broadcom/sonic-platform-modules-ingrasys b/platform/broadcom/sonic-platform-modules-ingrasys index 1a67af3caa00..00ea01132665 160000 --- a/platform/broadcom/sonic-platform-modules-ingrasys +++ b/platform/broadcom/sonic-platform-modules-ingrasys @@ -1 +1 @@ -Subproject commit 1a67af3caa00352e5e7db880e1eeda0bdf1fde6b +Subproject commit 00ea0113266590a5b17b923f017b52cab373234e From 1b944dba39f3d6e95d3303e4cce6e4725ef64a81 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 1 Sep 2017 15:28:33 -0700 Subject: [PATCH 0757/1011] Fix confusing comment (#931) --- rules/config | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rules/config b/rules/config index 5403c981f170..2d6e6a82b6a8 100644 --- a/rules/config +++ b/rules/config @@ -12,9 +12,8 @@ # container. SONIC_CONFIG_BUILD_JOBS = 1 -# SONIC_CONFIG_BUILD_JOBS - set number of jobs for number of jobs per package. +# SONIC_CONFIG_MAKE_JOBS - set number of parallel make jobs per package. # Corresponding -j argument will be passed to make/dpkg commands that build separate packages -# container. SONIC_CONFIG_MAKE_JOBS = $(shell nproc) # SONIC_CONFIG_ENABLE_COLORS - enable colored output in build system. From bb1a7b2e22fe7d7db3d5a4552fb24a0503242686 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 1 Sep 2017 15:28:46 -0700 Subject: [PATCH 0758/1011] Replace CRLF line endings with LF (#932) --- .../led_proc_init.soc | 325 ++++---- .../x86_64-cel_seastone-r0/led_proc_init.soc | 19 +- .../minigraph.xml | 242 +++--- .../minigraph.xml | 718 +++++++++--------- 4 files changed, 650 insertions(+), 654 deletions(-) diff --git a/device/accton/x86_64-accton_as5712_54x-r0/led_proc_init.soc b/device/accton/x86_64-accton_as5712_54x-r0/led_proc_init.soc index e27679db9ab0..85030e1db349 100644 --- a/device/accton/x86_64-accton_as5712_54x-r0/led_proc_init.soc +++ b/device/accton/x86_64-accton_as5712_54x-r0/led_proc_init.soc @@ -1,163 +1,162 @@ -# LED setting for active -# ----------------------------------------------------------------------------- -# for as5712_54x (48xg+6qxg) -# -# on green - if link up -# off - if link down -# blink - if active -# ----------------------------------------------------------------------------- -m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0 -m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_62=1 -m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_61=2 -m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=3 -m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=4 -m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_58=5 -m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_57=6 -m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=7 -m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=8 -m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_54=9 -m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_53=10 -m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=11 -m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=12 -m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_50=13 -m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_49=14 -m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=15 -m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=16 -m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_34=17 -m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_33=18 -m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=19 -m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=20 -m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_38=21 -m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_37=22 -m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=23 -m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=24 -m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_42=25 -m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_41=26 -m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=27 -m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=28 -m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_46=29 -m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_45=30 -m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=31 -m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=32 -m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_30=33 -m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_29=34 -m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=35 -m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=36 -m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_26=37 -m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_25=38 -m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=39 -m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=40 -m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_22=41 -m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_21=42 -m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=43 -m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=44 -m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_18=45 -m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_17=46 -m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=47 -m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=48 -m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_2=49 -m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_1=50 -m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=51 -m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=52 -m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_6=53 -m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_5=54 -m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=55 -m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=56 -m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_10=57 -m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_9=58 -m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=59 -m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=60 -m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_14=61 -m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_13=62 -m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=63 -m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0 -m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_62=1 -m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_61=2 -m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=3 -m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=4 -m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_58=5 -m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_57=6 -m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=7 -m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=8 -m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_54=9 -m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_53=10 -m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=11 -m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=12 -m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_50=13 -m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_49=14 -m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=15 -m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=16 -m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_34=17 -m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_33=18 -m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=19 -m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=20 -m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_38=21 -m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_37=22 -m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=23 -m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=24 -m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_42=25 -m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_41=26 -m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=27 -m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=28 -m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_46=29 -m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_45=30 -m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=31 -m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=32 -m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_30=33 -m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_29=34 -m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=35 -m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=36 -m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_26=37 -m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_25=38 -m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=39 -m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=40 -m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_22=41 -m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_21=42 -m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=43 -m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=44 -m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_18=45 -m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_17=46 -m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=47 -m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=48 -m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_2=49 -m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_1=50 -m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=51 -m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=52 -m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_6=53 -m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_5=54 -m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=55 -m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=56 -m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_10=57 -m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_9=58 -m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=59 -m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=60 -m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_14=61 -m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_13=62 -m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=63 - -led 0 stop -led 0 prog \ - 06 FE 80 D2 19 71 08 E0 60 FE E9 D2 0F 75 10 81 \ - 61 FD 02 3F 60 FF 28 32 0F 87 67 4A 96 FF 06 FF \ - D2 2B 74 16 02 1F 60 FF 28 32 0F 87 67 4A 96 FF \ - 06 FF D2 13 74 28 02 0F 60 FF 28 32 0F 87 67 4A \ - 96 FF 06 FF D2 0B 74 3A 3A 48 32 07 32 08 C7 32 \ - 04 C7 97 71 57 77 69 32 00 32 01 B7 97 71 63 32 \ - 0E 77 6B 26 FD 97 27 77 6B 32 0F 87 57 00 00 00 -led 0 start - -led 1 stop -led 1 prog \ - 06 FE 80 D2 19 71 08 E0 60 FE E9 D2 0F 75 10 81 \ - 61 FD 02 20 67 89 02 24 67 89 02 10 67 89 02 28 \ - 67 89 02 2C 67 89 02 0C 67 89 02 2C 67 79 02 28 \ - 67 79 02 24 67 79 02 20 67 79 02 10 67 79 02 0C \ - 67 79 02 0B 60 FF 28 32 0F 87 67 56 96 FF 06 FF \ - D2 FF 74 46 3A 36 32 07 32 08 C7 32 04 C7 97 71 \ - 63 77 75 32 00 32 01 B7 97 71 6F 32 0E 77 77 26 \ - FD 97 27 77 77 32 0F 87 57 12 A0 F8 15 1A 01 75 \ - 85 28 67 56 57 32 0F 87 57 12 A0 F8 15 1A 01 71 \ - A1 28 67 56 80 28 67 56 80 28 67 56 80 28 67 56 \ - 57 32 0F 87 32 0F 87 32 0F 87 32 0F 87 57 00 00 -led 1 start - +# LED setting for active +# ----------------------------------------------------------------------------- +# for as5712_54x (48xg+6qxg) +# +# on green - if link up +# off - if link down +# blink - if active +# ----------------------------------------------------------------------------- +m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0 +m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_62=1 +m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_61=2 +m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=3 +m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=4 +m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_58=5 +m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_57=6 +m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=7 +m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=8 +m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_54=9 +m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_53=10 +m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=11 +m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=12 +m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_50=13 +m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_49=14 +m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=15 +m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=16 +m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_34=17 +m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_33=18 +m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=19 +m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=20 +m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_38=21 +m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_37=22 +m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=23 +m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=24 +m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_42=25 +m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_41=26 +m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=27 +m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=28 +m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_46=29 +m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_45=30 +m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=31 +m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=32 +m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_30=33 +m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_29=34 +m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=35 +m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=36 +m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_26=37 +m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_25=38 +m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=39 +m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=40 +m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_22=41 +m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_21=42 +m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=43 +m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=44 +m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_18=45 +m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_17=46 +m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=47 +m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=48 +m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_2=49 +m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_1=50 +m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=51 +m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=52 +m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_6=53 +m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_5=54 +m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=55 +m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=56 +m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_10=57 +m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_9=58 +m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=59 +m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=60 +m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_14=61 +m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_13=62 +m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=63 +m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0 +m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_62=1 +m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_61=2 +m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=3 +m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=4 +m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_58=5 +m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_57=6 +m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=7 +m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=8 +m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_54=9 +m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_53=10 +m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=11 +m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=12 +m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_50=13 +m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_49=14 +m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=15 +m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=16 +m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_34=17 +m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_33=18 +m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=19 +m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=20 +m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_38=21 +m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_37=22 +m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=23 +m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=24 +m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_42=25 +m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_41=26 +m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=27 +m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=28 +m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_46=29 +m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_45=30 +m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=31 +m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=32 +m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_30=33 +m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_29=34 +m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=35 +m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=36 +m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_26=37 +m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_25=38 +m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=39 +m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=40 +m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_22=41 +m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_21=42 +m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=43 +m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=44 +m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_18=45 +m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_17=46 +m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=47 +m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=48 +m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_2=49 +m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_1=50 +m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=51 +m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=52 +m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_6=53 +m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_5=54 +m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=55 +m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=56 +m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_10=57 +m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_9=58 +m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=59 +m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=60 +m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_14=61 +m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_13=62 +m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=63 + +led 0 stop +led 0 prog \ + 06 FE 80 D2 19 71 08 E0 60 FE E9 D2 0F 75 10 81 \ + 61 FD 02 3F 60 FF 28 32 0F 87 67 4A 96 FF 06 FF \ + D2 2B 74 16 02 1F 60 FF 28 32 0F 87 67 4A 96 FF \ + 06 FF D2 13 74 28 02 0F 60 FF 28 32 0F 87 67 4A \ + 96 FF 06 FF D2 0B 74 3A 3A 48 32 07 32 08 C7 32 \ + 04 C7 97 71 57 77 69 32 00 32 01 B7 97 71 63 32 \ + 0E 77 6B 26 FD 97 27 77 6B 32 0F 87 57 00 00 00 +led 0 start + +led 1 stop +led 1 prog \ + 06 FE 80 D2 19 71 08 E0 60 FE E9 D2 0F 75 10 81 \ + 61 FD 02 20 67 89 02 24 67 89 02 10 67 89 02 28 \ + 67 89 02 2C 67 89 02 0C 67 89 02 2C 67 79 02 28 \ + 67 79 02 24 67 79 02 20 67 79 02 10 67 79 02 0C \ + 67 79 02 0B 60 FF 28 32 0F 87 67 56 96 FF 06 FF \ + D2 FF 74 46 3A 36 32 07 32 08 C7 32 04 C7 97 71 \ + 63 77 75 32 00 32 01 B7 97 71 6F 32 0E 77 77 26 \ + FD 97 27 77 77 32 0F 87 57 12 A0 F8 15 1A 01 75 \ + 85 28 67 56 57 32 0F 87 57 12 A0 F8 15 1A 01 71 \ + A1 28 67 56 80 28 67 56 80 28 67 56 80 28 67 56 \ + 57 32 0F 87 32 0F 87 32 0F 87 32 0F 87 57 00 00 +led 1 start diff --git a/device/celestica/x86_64-cel_seastone-r0/led_proc_init.soc b/device/celestica/x86_64-cel_seastone-r0/led_proc_init.soc index fb898fcadfc1..450533c0dc68 100755 --- a/device/celestica/x86_64-cel_seastone-r0/led_proc_init.soc +++ b/device/celestica/x86_64-cel_seastone-r0/led_proc_init.soc @@ -1,11 +1,8 @@ - -# Download LED code into LED processor and enable (if applicable). - -led 0 load /usr/share/sonic/platform/led-code/ledcode0; -led 0 auto on; led 0 start; -led 1 load /usr/share/sonic/platform/led-code/ledcode1; -led 1 auto on; led 1 start; -led 2 load /usr/share/sonic/platform/led-code/ledcode2; -led 2 auto on; led 2 start - - +# Download LED code into LED processor and enable (if applicable). + +led 0 load /usr/share/sonic/platform/led-code/ledcode0; +led 0 auto on; led 0 start; +led 1 load /usr/share/sonic/platform/led-code/ledcode1; +led 1 auto on; led 1 start; +led 2 load /usr/share/sonic/platform/led-code/ledcode2; +led 2 auto on; led 2 start diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/minigraph.xml index 470b07922b9d..98c87eb8af0e 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/minigraph.xml +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/minigraph.xml @@ -1,121 +1,121 @@ - - - - - - OCPSCH0104001MS - 10.10.1.30 - OCPSCH01040HHLF - 10.10.1.29 - 1 - 10 - 3 - - - OCPSCH0104002MS - 10.10.2.30 - OCPSCH01040HHLF - 10.10.2.29 - 1 - 10 - 3 - - - - - 64536 - OCPSCH01040HHLF - - -
10.10.1.30
- - -
- -
10.10.2.30
- - -
-
- -
- - 64542 - OCPSCH0104001MS - - - - 64543 - OCPSCH0104002MS - - -
-
- - - - - - HostIP - Loopback0 - - 100.0.0.10/32 - - 100.0.0.10/32 - - - - - - - - OCPSCH01040HHLF - - - - - - Ethernet48 - 10.10.1.29/30 - - - - Ethernet52 - 10.10.2.29/30 - - - - - - - - - - - - 40000 - DeviceInterfaceLink - OCPSCH0104001MS - Ethernet48 - OCPSCH01040HHLF - Ethernet48 - - - 40000 - DeviceInterfaceLink - OCPSCH0104002MS - Ethernet0 - OCPSCH01040HHLF - Ethernet52 - - - - - OCPSCH01040HHLF - INGRASYS-S8900-54XC - - - - OCPSCH01040HHLF - INGRASYS-S8900-54XC -
+ + + + + + OCPSCH0104001MS + 10.10.1.30 + OCPSCH01040HHLF + 10.10.1.29 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.30 + OCPSCH01040HHLF + 10.10.2.29 + 1 + 10 + 3 + + + + + 64536 + OCPSCH01040HHLF + + +
10.10.1.30
+ + +
+ +
10.10.2.30
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.10/32 + + 100.0.0.10/32 + + + + + + + + OCPSCH01040HHLF + + + + + + Ethernet48 + 10.10.1.29/30 + + + + Ethernet52 + 10.10.2.29/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet48 + OCPSCH01040HHLF + Ethernet48 + + + 40000 + DeviceInterfaceLink + OCPSCH0104002MS + Ethernet0 + OCPSCH01040HHLF + Ethernet52 + + + + + OCPSCH01040HHLF + INGRASYS-S8900-54XC + + + + OCPSCH01040HHLF + INGRASYS-S8900-54XC +
diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/minigraph.xml index fe96dc87acf6..8a7d765cefc1 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/minigraph.xml +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/minigraph.xml @@ -1,359 +1,359 @@ - - - - - - BGPSession - OCPSCH0104001MS - 10.10.1.2 - OCPSCH01040AALF - 10.10.1.1 - 1 - 10 - 3 - - - BGPSession - OCPSCH0104001MS - 10.10.1.6 - OCPSCH01040BBLF - 10.10.1.5 - 1 - 10 - 3 - - - BGPSession - OCPSCH0104001MS - 10.10.1.10 - OCPSCH01040CCLF - 10.10.1.9 - 1 - 10 - 3 - - - BGPSession - OCPSCH0104001MS - 10.10.1.14 - OCPSCH01040DDLF - 10.10.1.13 - 1 - 10 - 3 - - - BGPSession - OCPSCH0104001MS - 10.10.1.18 - OCPSCH01040EELF - 10.10.1.17 - 1 - 10 - 3 - - - BGPSession - OCPSCH0104001MS - 10.10.1.22 - OCPSCH01040FFLF - 10.10.1.21 - 1 - 10 - 3 - - - BGPSession - OCPSCH0104001MS - 10.10.1.26 - OCPSCH01040GGLF - 10.10.1.25 - 1 - 10 - 3 - - - BGPSession - OCPSCH0104001MS - 10.10.1.30 - OCPSCH01040HHLF - 10.10.1.29 - 1 - 10 - 3 - - - - - 64542 - OCPSCH0104001MS - - - BGPPeer -
10.10.1.2
- - -
- - BGPPeer -
10.10.1.6
- - -
- - BGPPeer -
10.10.1.10
- - -
- - BGPPeer -
10.10.1.14
- - -
- - BGPPeer -
10.10.1.18
- - -
- - BGPPeer -
10.10.1.22
- - -
- - BGPPeer -
10.10.1.26
- - -
- - BGPPeer -
10.10.1.30
- - -
-
- -
- - 64536 - OCPSCH01040AALF - - - - 64536 - OCPSCH01040BBLF - - - - 64536 - OCPSCH01040CCLF - - - - 64536 - OCPSCH01040DDLF - - - - 64536 - OCPSCH01040EELF - - - - 64536 - OCPSCH01040FFLF - - - - 64536 - OCPSCH01040GGLF - - - - 64536 - OCPSCH01040HHLF - - -
-
- - - - - - LoopbackInterface - HostIP - Loopback0 - - 100.0.0.1/32 - - 100.0.0.1/32 - - - - - - - - OCPSCH0104001MS - - - - VlanInterface - Vlan851 - Ethernet0;Ethernet1;Ethernet2;Ethernet3;Ethernet96;Ethernet100;Ethernet104;Ethernet108 - False - 0.0.0.0/0 - - 851 - 10.20.1.0/24 - - - - - IPInterface - - Vlan851 - 10.20.1.1/24 - - - IPInterface - - Ethernet48 - 10.10.1.2/30 - - - IPInterface - - Ethernet52 - 10.10.1.6/30 - - - IPInterface - - Ethernet56 - 10.10.1.10/30 - - - IPInterface - - Ethernet60 - 10.10.1.14/30 - - - IPInterface - - Ethernet64 - 10.10.1.18/30 - - - IPInterface - - Ethernet68 - 10.10.1.22/30 - - - IPInterface - - Ethernet72 - 10.10.1.26/30 - - - IPInterface - - Ethernet76 - 10.10.1.30/30 - - - - - - - - - - - - 40000 - DeviceInterfaceLink - OCPSCH0104001MS - Ethernet48 - OCPSCH01040AALF - Ethernet0 - - - 40000 - DeviceInterfaceLink - OCPSCH0104001MS - Ethernet52 - OCPSCH01040BBLF - Ethernet0 - - - 40000 - DeviceInterfaceLink - OCPSCH0104001MS - Ethernet56 - OCPSCH01040CCLF - Ethernet0 - - - 40000 - DeviceInterfaceLink - OCPSCH0104001MS - Ethernet60 - OCPSCH01040DDLF - Ethernet0 - - - 40000 - DeviceInterfaceLink - OCPSCH0104001MS - Ethernet64 - OCPSCH01040EELF - Ethernet0 - - - 40000 - DeviceInterfaceLink - OCPSCH0104001MS - Ethernet68 - OCPSCH01040FFLF - Ethernet0 - - - 40000 - DeviceInterfaceLink - OCPSCH0104001MS - Ethernet72 - OCPSCH01040GGLF - Ethernet0 - - - 40000 - DeviceInterfaceLink - OCPSCH0104001MS - Ethernet76 - OCPSCH01040HHLF - Ethernet48 - - - - - OCPSCH0104001MS - INGRASYS-S8900-64XC - - - - - - - - OCPSCH0104001MS - INGRASYS-S8900-64XC -
+ + + + + + BGPSession + OCPSCH0104001MS + 10.10.1.2 + OCPSCH01040AALF + 10.10.1.1 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.6 + OCPSCH01040BBLF + 10.10.1.5 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.10 + OCPSCH01040CCLF + 10.10.1.9 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.14 + OCPSCH01040DDLF + 10.10.1.13 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.18 + OCPSCH01040EELF + 10.10.1.17 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.22 + OCPSCH01040FFLF + 10.10.1.21 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.26 + OCPSCH01040GGLF + 10.10.1.25 + 1 + 10 + 3 + + + BGPSession + OCPSCH0104001MS + 10.10.1.30 + OCPSCH01040HHLF + 10.10.1.29 + 1 + 10 + 3 + + + + + 64542 + OCPSCH0104001MS + + + BGPPeer +
10.10.1.2
+ + +
+ + BGPPeer +
10.10.1.6
+ + +
+ + BGPPeer +
10.10.1.10
+ + +
+ + BGPPeer +
10.10.1.14
+ + +
+ + BGPPeer +
10.10.1.18
+ + +
+ + BGPPeer +
10.10.1.22
+ + +
+ + BGPPeer +
10.10.1.26
+ + +
+ + BGPPeer +
10.10.1.30
+ + +
+
+ +
+ + 64536 + OCPSCH01040AALF + + + + 64536 + OCPSCH01040BBLF + + + + 64536 + OCPSCH01040CCLF + + + + 64536 + OCPSCH01040DDLF + + + + 64536 + OCPSCH01040EELF + + + + 64536 + OCPSCH01040FFLF + + + + 64536 + OCPSCH01040GGLF + + + + 64536 + OCPSCH01040HHLF + + +
+
+ + + + + + LoopbackInterface + HostIP + Loopback0 + + 100.0.0.1/32 + + 100.0.0.1/32 + + + + + + + + OCPSCH0104001MS + + + + VlanInterface + Vlan851 + Ethernet0;Ethernet1;Ethernet2;Ethernet3;Ethernet96;Ethernet100;Ethernet104;Ethernet108 + False + 0.0.0.0/0 + + 851 + 10.20.1.0/24 + + + + + IPInterface + + Vlan851 + 10.20.1.1/24 + + + IPInterface + + Ethernet48 + 10.10.1.2/30 + + + IPInterface + + Ethernet52 + 10.10.1.6/30 + + + IPInterface + + Ethernet56 + 10.10.1.10/30 + + + IPInterface + + Ethernet60 + 10.10.1.14/30 + + + IPInterface + + Ethernet64 + 10.10.1.18/30 + + + IPInterface + + Ethernet68 + 10.10.1.22/30 + + + IPInterface + + Ethernet72 + 10.10.1.26/30 + + + IPInterface + + Ethernet76 + 10.10.1.30/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet48 + OCPSCH01040AALF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet52 + OCPSCH01040BBLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet56 + OCPSCH01040CCLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet60 + OCPSCH01040DDLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet64 + OCPSCH01040EELF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet68 + OCPSCH01040FFLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet72 + OCPSCH01040GGLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet76 + OCPSCH01040HHLF + Ethernet48 + + + + + OCPSCH0104001MS + INGRASYS-S8900-64XC + + + + + + + + OCPSCH0104001MS + INGRASYS-S8900-64XC +
From 48f1a638cb669a4cd2f3f87f6d34ac527c740e84 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 5 Sep 2017 20:55:07 -0700 Subject: [PATCH 0759/1011] [sairedis]: revert deadlock fix in sonic-sairedis submodule (#934) The deadlock fix in sonic-sairedis introduce other race conditions which is more prevelant. --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 3f4afbbd9d7e..7e70b4d63020 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 3f4afbbd9d7ed2f077922e0cb0d59df743e34a9a +Subproject commit 7e70b4d63020fc9ea1aa009c264e4effab7bcda0 From 116ba4b180d6c8589123a73d5056628949a6a748 Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 6 Sep 2017 20:07:32 -0700 Subject: [PATCH 0760/1011] [baseimage]: allocate varlog disk in the initramfs stage (#936) moving to initramfs unifies disk allocate on different platforms. use fallocate instead of dd to speed up the disk allocation. By default, mkfs.ext4 has -E discard option which discards the blocks at the mkfs time, also speed up the initialization time. --- build_debian.sh | 2 ++ files/initramfs-tools/arista-convertfs.j2 | 31 ++----------------- files/initramfs-tools/union-mount.j2 | 6 ++++ files/initramfs-tools/varlog | 36 +++++++++++++++++++++++ installer/x86_64/install.sh | 20 +------------ 5 files changed, 47 insertions(+), 48 deletions(-) create mode 100644 files/initramfs-tools/varlog diff --git a/build_debian.sh b/build_debian.sh index d7e7c3307536..21c370753592 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -132,6 +132,8 @@ sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista- ## 2. Bind-mount docker working directory (docker aufs cannot work over aufs rootfs) sudo cp files/initramfs-tools/union-mount $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-bottom/union-mount sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-bottom/union-mount +sudo cp files/initramfs-tools/varlog $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-bottom/varlog +sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-bottom/varlog sudo cp files/initramfs-tools/union-fsck $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/union-fsck sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/union-fsck sudo chroot $FILESYSTEM_ROOT update-initramfs -u diff --git a/files/initramfs-tools/arista-convertfs.j2 b/files/initramfs-tools/arista-convertfs.j2 index 81c6d9d1943f..75ce011e839a 100644 --- a/files/initramfs-tools/arista-convertfs.j2 +++ b/files/initramfs-tools/arista-convertfs.j2 @@ -82,28 +82,6 @@ run_cmd() { fi } -create_varlog_file() { - local err_msg="Error: create var-log ext4 file" - local cmd="[ -n "$varlog_size" ] && mkdir -p $root_mnt/disk-img && dd if=/dev/zero of=$root_mnt/disk-img/var-log.ext4 count=$((2048*$varlog_size)) && mke2fs -t ext4 -q -F $root_mnt/disk-img/var-log.ext4" - run_cmd "$cmd" "$err_msg" -} - -mount_and_create_varlog_file() { - [ -z "$varlog_size" ] && exit 0 - mkdir -p "$root_mnt" - mount -t ext4 "$root_dev" "$root_mnt" - # exit when the var_log.ext4 exists and the size matches - if [ -e "$root_mnt/disk-img/var-log.ext4" ]; then - cur_varlog_size=$(ls -l $root_mnt/disk-img/var-log.ext4 | awk '{print $5}') - if [ $cur_varlog_size == $((1024*1024*$varlog_size)) ]; then - exit 0 - fi - fi - create_varlog_file - umount "$root_mnt" - exit 0 -} - # Extract kernel parameters set -- $(cat /proc/cmdline) for x in "$@"; do @@ -114,9 +92,6 @@ for x in "$@"; do Aboot=*) aboot_flag="${x#Aboot=}" ;; - varlog_size=*) - varlog_size="${x#varlog_size=}" - ;; loop=*) x1="${x#loop=}" image_dir="${x1%/*}" @@ -135,8 +110,8 @@ if ! wait_for_root_dev; then exit 1 fi -# mount, create varlog file and exit when the root is ext4 -blkid | grep "$root_dev.*vfat" -q || mount_and_create_varlog_file +# exit when the root is ext4 +blkid | grep "$root_dev.*vfat" -q || exit 0 # Get flash dev name if [ -z "$block_flash" ]; then @@ -201,5 +176,3 @@ run_cmd "$cmd" "$err_msg" err_msg="Error: copying files form $tmp_mnt to $root_mnt failed" cmd="cp -a $tmp_mnt/. $root_mnt/" run_cmd "$cmd" "$err_msg" - -create_varlog_file diff --git a/files/initramfs-tools/union-mount.j2 b/files/initramfs-tools/union-mount.j2 index acc21e2885bc..db40d4f08601 100644 --- a/files/initramfs-tools/union-mount.j2 +++ b/files/initramfs-tools/union-mount.j2 @@ -1,6 +1,12 @@ #!/bin/sh -e + +PREREQS="varlog" + +prereqs() { echo "$PREREQS"; } + case $1 in prereqs) + prereqs exit 0 ;; esac diff --git a/files/initramfs-tools/varlog b/files/initramfs-tools/varlog new file mode 100644 index 000000000000..d1340eaa9d8b --- /dev/null +++ b/files/initramfs-tools/varlog @@ -0,0 +1,36 @@ +#!/bin/sh -e + +PREREQS="" + +prereqs() { echo "$PREREQS"; } + +case $1 in + prereqs) + prereqs + exit 0 + ;; +esac + +# Extract kernel parameters +set -- $(cat /proc/cmdline) +for x in "$@"; do + case "$x" in + varlog_size=*) + varlog_size="${x#varlog_size=}" + esac +done + +[ -z "$varlog_size" ] && exit 0 + +# exit when the var_log.ext4 exists and the size matches +if [ -e "${rootmnt}/host/disk-img/var-log.ext4" ]; then + cur_varlog_size=$(ls -l ${rootmnt}/host/disk-img/var-log.ext4 | awk '{print $5}') + if [ $cur_varlog_size == $((1024*1024*$varlog_size)) ]; then + exit 0 + else + rm -rf ${rootmnt}/host/disk-img + fi +fi + +# create varlog disk +mkdir -p ${rootmnt}/host/disk-img && ${rootmnt}/usr/bin/fallocate -l "$varlog_size"M ${rootmnt}/host/disk-img/var-log.ext4 && mkfs.ext4 -q -F ${rootmnt}/host/disk-img/var-log.ext4 diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index ad1cc3691fbf..46942d6d58c3 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -450,24 +450,6 @@ TAR_EXTRA_OPTION="--numeric-owner" mkdir -p $demo_mnt/$image_dir/$DOCKERFS_DIR unzip -op $ONIE_INSTALLER_PAYLOAD "$FILESYSTEM_DOCKERFS" | tar xz $TAR_EXTRA_OPTION -f - -C $demo_mnt/$image_dir/$DOCKERFS_DIR -# Create loop device for /var/log to limit its size to $VAR_LOG_SIZE MB -if [ -f $demo_mnt/disk-img/var-log.ext4 ]; then - current_log_size_mb=$(ls -l --block-size=M $demo_mnt/disk-img/var-log.ext4 | cut -f5 -d" ") - if [ "$current_log_size_mb" = "$VAR_LOG_SIZE"M ]; then - echo "Log file system already exists. Size: ${VAR_LOG_SIZE}MB" - VAR_LOG_SIZE=0 - else - rm -rf $demo_mnt/disk-img - fi -fi - -if [ "$VAR_LOG_SIZE" != "0" ]; then - echo "Creating new log file system. Size: ${VAR_LOG_SIZE}MB" - mkdir -p $demo_mnt/disk-img - dd if=/dev/zero of=$demo_mnt/disk-img/var-log.ext4 count=$((2048*$VAR_LOG_SIZE)) - mkfs.ext4 -q $demo_mnt/disk-img/var-log.ext4 -F -fi - if [ "$install_env" = "onie" ]; then # Store machine description in target file system cp /etc/machine.conf $demo_mnt @@ -563,7 +545,7 @@ menuentry '$demo_grub_entry' { insmod ext2 linux /$image_dir/boot/vmlinuz-3.16.0-4-amd64 root=$demo_dev rw $GRUB_CMDLINE_LINUX \ loop=$image_dir/$FILESYSTEM_SQUASHFS loopfstype=squashfs \ - apparmor=1 security=apparmor $ONIE_PLATFORM_EXTRA_CMDLINE_LINUX + apparmor=1 security=apparmor varlog_size=$VAR_LOG_SIZE $ONIE_PLATFORM_EXTRA_CMDLINE_LINUX echo 'Loading $demo_volume_label $demo_type initial ramdisk ...' initrd /$image_dir/boot/initrd.img-3.16.0-4-amd64 } From 38cd1d5368f626243d3455c102b07db9289dfd46 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 6 Sep 2017 20:08:25 -0700 Subject: [PATCH 0761/1011] [Broadcom]: Remove BRCM_OPENNSL library and upgrade BRCM_SAI to 3.0.3.2 (#938) This library will be archived in to BRCM_SAI library --- platform/broadcom/rules.mk | 4 ++-- platform/broadcom/sai.mk | 9 ++++----- platform/broadcom/sdk.mk | 6 +----- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 529919d63e0d..21af44775dd3 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -29,7 +29,7 @@ SONIC_ALL += $(SONIC_ONE_IMAGE) $(SONIC_ONE_ABOOT_IMAGE) \ $(DOCKER_FPM) # Inject brcm sai into sairedis -$(LIBSAIREDIS)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) $(BRCM_SAI_DEV) #$(LIBSAITHRIFT_DEV_BRCM) +$(LIBSAIREDIS)_DEPENDS += $(BRCM_SAI) $(BRCM_SAI_DEV) #$(LIBSAITHRIFT_DEV_BRCM) # Runtime dependency on brcm sai is set only for syncd -$(SYNCD)_RDEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI) +$(SYNCD)_RDEPENDS += $(BRCM_SAI) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 54655563d638..60a1d1f15eb7 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,12 +1,11 @@ -BRCM_SAI = libsaibcm_3.0.2.3_amd64.deb +BRCM_SAI = libsaibcm_3.0.3.2_amd64.deb # TODO: upload new SAI build to blob -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.2.3_amd64.deb" +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2_amd64.deb" -BRCM_SAI_DEV = libsaibcm-dev_3.0.2.3_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) # TODO: upload new SAI build to blob -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.2.3_amd64.deb" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2_amd64.deb" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) -$(BRCM_SAI)_DEPENDS += $(BRCM_OPENNSL) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 5824590c8d52..76a7671599f2 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,9 +1,5 @@ -BRCM_OPENNSL = libopennsl_3.2.3.3_amd64.deb -# TODO: upload new SDK build to blob -$(BRCM_OPENNSL)_URL = "https://sonicstorage.blob.core.windows.net/packages/libopennsl_3.2.3.3_amd64.deb" - BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.3.3_amd64.deb # TODO: upload new SDK build to blob $(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.3_amd64.deb" -SONIC_ONLINE_DEBS += $(BRCM_OPENNSL) $(BRCM_OPENNSL_KERNEL) +SONIC_ONLINE_DEBS += $(BRCM_OPENNSL_KERNEL) From e418675ba5ca0c489a7f834fc462253b47a03180 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 7 Sep 2017 23:01:20 +0300 Subject: [PATCH 0762/1011] [rsyslog]: Use SONiC template in containers (#940) --- files/image_config/rsyslog/rsyslog.conf.j2 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/files/image_config/rsyslog/rsyslog.conf.j2 b/files/image_config/rsyslog/rsyslog.conf.j2 index 54e2eec3f999..07d81de9348e 100644 --- a/files/image_config/rsyslog/rsyslog.conf.j2 +++ b/files/image_config/rsyslog/rsyslog.conf.j2 @@ -30,11 +30,6 @@ $UDPServerRun 514 ########################### #### GLOBAL DIRECTIVES #### ########################### -#Set remote syslog server -{% for server in syslog_servers %} -*.* @{{ server }}:514 -{% endfor %} - # # Use traditional timestamp format. # To enable high precision timestamps, comment out the following line. @@ -45,6 +40,11 @@ $UDPServerRun 514 $template SONiCFileFormat,"%TIMESTAMP%.%timestamp:::date-subseconds% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" $ActionFileDefaultTemplate SONiCFileFormat +#Set remote syslog server +{% for server in syslog_servers %} +*.* @{{ server }}:514;SONiCFileFormat +{% endfor %} + # # Set the default permissions for all log files. # From 211689ad292c53934ae9d2664c906af75865bc0f Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 7 Sep 2017 14:02:17 -0700 Subject: [PATCH 0763/1011] [slave.mk]: Apply series of patches to SONIC_PYTHON_STDEB_DEBS targets if they exist (#941) --- slave.mk | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/slave.mk b/slave.mk index cc4a59a6d881..c44fe12642ac 100644 --- a/slave.mk +++ b/slave.mk @@ -179,13 +179,13 @@ SONIC_TARGET_LIST += $(addprefix $(FILES_PATH)/, $(SONIC_ONLINE_FILES)) # SONIC_MAKE_DEBS += $(SOME_NEW_DEB) $(addprefix $(DEBS_PATH)/, $(SONIC_MAKE_DEBS)) : $(DEBS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) $(HEADER) - # remove target to force rebuild + # Remove target to force rebuild rm -f $(addprefix $(DEBS_PATH)/, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) - # apply series of patches if exist + # Apply series of patches if exist if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi - # build project and take package + # Build project and take package make DEST=$(shell pwd)/$(DEBS_PATH) -C $($*_SRC_PATH) $(shell pwd)/$(DEBS_PATH)/$* $(LOG) - # clean up + # Clean up if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt pop -a -f; popd; fi $(FOOTER) @@ -199,16 +199,18 @@ SONIC_TARGET_LIST += $(addprefix $(DEBS_PATH)/, $(SONIC_MAKE_DEBS)) # SONIC_DPKG_DEBS += $(SOME_NEW_DEB) $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) : $(DEBS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) $(HEADER) - # Build project and take package + # Remove old build logs if they exist rm -f $($*_SRC_PATH)/debian/*.debhelper.log - # apply series of patches if exist + # Apply series of patches if exist if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi + # Build project pushd $($*_SRC_PATH) $(LOG) [ ! -f ./autogen.sh ] || ./autogen.sh $(LOG) dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) $(LOG) popd $(LOG) - # clean up + # Clean up if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt pop -a -f; popd; fi + # Take built package(s) mv $(addprefix $($*_SRC_PATH)/../, $* $($*_DERIVED_DEBS) $($*_EXTRA_DEBS)) $(DEBS_PATH) $(LOG) $(FOOTER) @@ -222,10 +224,15 @@ SONIC_TARGET_LIST += $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) # SONIC_PYTHON_STDEB_DEBS += $(SOME_NEW_DEB) $(addprefix $(DEBS_PATH)/, $(SONIC_PYTHON_STDEB_DEBS)) : $(DEBS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) $(HEADER) - # Build project and take package + # Apply series of patches if exist + if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi + # Build project pushd $($*_SRC_PATH) $(LOG) python setup.py --command-packages=stdeb.command bdist_deb $(LOG) popd $(LOG) + # Clean up + if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt pop -a -f; popd; fi + # Take built package(s) mv $(addprefix $($*_SRC_PATH)/deb_dist/, $* $($*_DERIVED_DEBS)) $(DEBS_PATH) $(LOG) $(FOOTER) @@ -374,7 +381,7 @@ $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TA # targets for building installers with base image $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) $$(addprefix $(FILES_PATH)/,$$($$*_FILES)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_DEVICE_DATA) $(SONIC_UTILS)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) $(HEADER) - ## Pass initramfs and linux kernel explicitly. They are used for all platforms + # Pass initramfs and linux kernel explicitly. They are used for all platforms export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" export linux_kernel="$(DEBS_PATH)/$(LINUX_KERNEL)" export kversion="$(KVERSION)" From 5098d98976b4173fd3ce492d8a0c1179ccf787aa Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 8 Sep 2017 08:26:30 -0700 Subject: [PATCH 0764/1011] [dell]: remove nos_to_sonic_grub.cfg (#943) no longer needed in the build image --- build_image.sh | 4 -- .../nos_to_sonic_grub.cfg | 44 ------------------- .../nos_to_sonic_grub.cfg | 44 ------------------- 3 files changed, 92 deletions(-) delete mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/nos_to_sonic_grub.cfg delete mode 100644 device/dell/x86_64-dell_z9100_c2538-r0/nos_to_sonic_grub.cfg diff --git a/build_image.sh b/build_image.sh index 2d229c2d194b..ee7fb8a75823 100755 --- a/build_image.sh +++ b/build_image.sh @@ -25,10 +25,6 @@ generate_onie_installer_image() cp ./device/$VENDOR/$PLATFORM/installer.conf ./installer/x86_64/platforms/$PLATFORM fi - if [ "$IMAGE_TYPE" = "raw" ] && [ -f ./device/$VENDOR/$PLATFORM/nos_to_sonic_grub.cfg ]; then - sed -i -e "s/%%IMAGE_VERSION%%/$IMAGE_VERSION/g" ./device/$VENDOR/$PLATFORM/nos_to_sonic_grub.cfg - echo "IMAGE_VERSION is $IMAGE_VERSION" - fi done done diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/nos_to_sonic_grub.cfg b/device/dell/x86_64-dell_s6100_c2538-r0/nos_to_sonic_grub.cfg deleted file mode 100644 index 058b1a9ea118..000000000000 --- a/device/dell/x86_64-dell_s6100_c2538-r0/nos_to_sonic_grub.cfg +++ /dev/null @@ -1,44 +0,0 @@ -# -# Grub config to launch SONiC -# with ONIE boot option - -insmod serial -# Initialize USB-Serial com2 port -serial --unit=1 --speed=9600 -#Serial port config;Defaults: COM1,9600 -serial --unit=0 --speed=9600 -terminal_output serial_com0 -terminal_input serial_com0 -#terminfo added to prevent text wrap issue. -terminfo -g 80x100 serial_com0 -terminfo -g 80x100 serial_com1 - -echo -n "Press Esc to stop autoboot ... " -if sleep --verbose --interruptible 5 ; then - insmod gzio - insmod part_msdos - insmod ext2 - set root='(hd0,gpt8)' - linux /image-%%IMAGE_VERSION%%/boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda8 rw console=tty0 console=ttyS1,9600n8 loop=image-%%IMAGE_VERSION%%/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor - initrd /image-%%IMAGE_VERSION%%/boot/initrd.img-3.16.0-4-amd64 - boot -else - menuentry 'SONiC' { - insmod gzio - insmod part_msdos - insmod ext2 - set root='(hd0,gpt8)' - linux /image-%%IMAGE_VERSION%%/boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda8 rw console=tty0 console=ttyS1,9600n8 loop=image-%%IMAGE_VERSION%%/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor - initrd /image-%%IMAGE_VERSION%%/boot/initrd.img-3.16.0-4-amd64 - boot - } - - menuentry 'ONIE' { - insmod force10 - onieboot - } - - menuentry 'DELL-DIAG' { - delldiagboot - } -fi diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/nos_to_sonic_grub.cfg b/device/dell/x86_64-dell_z9100_c2538-r0/nos_to_sonic_grub.cfg deleted file mode 100644 index 058b1a9ea118..000000000000 --- a/device/dell/x86_64-dell_z9100_c2538-r0/nos_to_sonic_grub.cfg +++ /dev/null @@ -1,44 +0,0 @@ -# -# Grub config to launch SONiC -# with ONIE boot option - -insmod serial -# Initialize USB-Serial com2 port -serial --unit=1 --speed=9600 -#Serial port config;Defaults: COM1,9600 -serial --unit=0 --speed=9600 -terminal_output serial_com0 -terminal_input serial_com0 -#terminfo added to prevent text wrap issue. -terminfo -g 80x100 serial_com0 -terminfo -g 80x100 serial_com1 - -echo -n "Press Esc to stop autoboot ... " -if sleep --verbose --interruptible 5 ; then - insmod gzio - insmod part_msdos - insmod ext2 - set root='(hd0,gpt8)' - linux /image-%%IMAGE_VERSION%%/boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda8 rw console=tty0 console=ttyS1,9600n8 loop=image-%%IMAGE_VERSION%%/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor - initrd /image-%%IMAGE_VERSION%%/boot/initrd.img-3.16.0-4-amd64 - boot -else - menuentry 'SONiC' { - insmod gzio - insmod part_msdos - insmod ext2 - set root='(hd0,gpt8)' - linux /image-%%IMAGE_VERSION%%/boot/vmlinuz-3.16.0-4-amd64 root=/dev/sda8 rw console=tty0 console=ttyS1,9600n8 loop=image-%%IMAGE_VERSION%%/fs.squashfs loopfstype=squashfs apparmor=1 security=apparmor - initrd /image-%%IMAGE_VERSION%%/boot/initrd.img-3.16.0-4-amd64 - boot - } - - menuentry 'ONIE' { - insmod force10 - onieboot - } - - menuentry 'DELL-DIAG' { - delldiagboot - } -fi From 8f1ac5d5ecbc1d95cd617575edc6efcb14f86e25 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Sat, 9 Sep 2017 04:25:25 +0300 Subject: [PATCH 0765/1011] [rsyslog]: Use timegenerated instead of timestamp (#944) * [rsyslog]: Use timegenerated instead of timestamp This is useful when rsyslog is used to put markers generated on other machines. This way all messages will have a timestamp from a single system. * [rsyslog] Use subseconds from local machine --- files/image_config/rsyslog/rsyslog.conf.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/image_config/rsyslog/rsyslog.conf.j2 b/files/image_config/rsyslog/rsyslog.conf.j2 index 07d81de9348e..264ddd8dd7bf 100644 --- a/files/image_config/rsyslog/rsyslog.conf.j2 +++ b/files/image_config/rsyslog/rsyslog.conf.j2 @@ -37,7 +37,7 @@ $UDPServerRun 514 #$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # Define a custom template -$template SONiCFileFormat,"%TIMESTAMP%.%timestamp:::date-subseconds% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" +$template SONiCFileFormat,"%timegenerated%.%timegenerated:::date-subseconds% %HOSTNAME% %syslogseverity-text:::uppercase% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" $ActionFileDefaultTemplate SONiCFileFormat #Set remote syslog server From 2cd2f95384fc8662f89b5ed408ce843b37c0212a Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 8 Sep 2017 21:27:15 -0700 Subject: [PATCH 0766/1011] [github]: add templates for submitting issues and PR (#947) --- .github/ISSUE_TEMPLATE.md | 60 ++++++++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 26 ++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000000..05f39760b195 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,60 @@ + + +**Description** + + + +**Steps to reproduce the issue:** +1. +2. +3. + +**Describe the results you received:** + + +**Describe the results you expected:** + + +**Additional information you deem important (e.g. issue happens only occasionally):** + + **Output of `show version`:** + + ``` + (paste your output here) + ``` + + **Attach debug file `sudo generate_dump`:** + + ``` + (paste your output here) + ``` diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000000..2ac7d9e47730 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ + + +**- What I did** + +**- How I did it** + +**- How to verify it** + +**- Description for the changelog** + + + +**- A picture of a cute animal (not mandatory but encouraged)** From d3997f4a356d0669bccbd96cd12c191fecfe0212 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 9 Sep 2017 15:22:52 -0700 Subject: [PATCH 0767/1011] [sonic-slave]: SLAVE_TAG should be for both Dockerfile and Dockerfile.user (#950) Should rebuild both Dockerfile and Dockerfile.user when any of the two files change. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d779c30718dc..7240237c2744 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ $(shell rm -f .screen) MAKEFLAGS += -B SLAVE_BASE_TAG = $(shell shasum sonic-slave/Dockerfile | awk '{print substr($$1,0,11);}') -SLAVE_TAG = $(shell shasum sonic-slave/Dockerfile.user | awk '{print substr($$1,0,11);}') +SLAVE_TAG = $(shell cat sonic-slave/Dockerfile.user sonic-slave/Dockerfile | shasum | awk '{print substr($$1,0,11);}') SLAVE_BASE_IMAGE = sonic-slave-base SLAVE_IMAGE = sonic-slave-$(USER) From bc730829225226eb6c9526a263321750a9ac30af Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Mon, 11 Sep 2017 15:29:42 -0700 Subject: [PATCH 0768/1011] [devices]: Add led plugin for Arista 7060CX-32S and 7260CX3-64 (#945) * Bump sonic-platform-modules-arista submodule * Allow image specific mount option for containers * Add led plugin for DCS-7060CX-32S * Add led plugin for DCS-7260CX3-64 --- .../arista/x86_64-arista_7060_cx32s/plugins/led_control.py | 6 ++++++ .../arista/x86_64-arista_7260cx3_64/plugins/led_control.py | 6 ++++++ platform/broadcom/sonic-platform-modules-arista | 2 +- rules/docker-platform-monitor.mk | 3 +++ slave.mk | 1 + 5 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 device/arista/x86_64-arista_7060_cx32s/plugins/led_control.py create mode 100644 device/arista/x86_64-arista_7260cx3_64/plugins/led_control.py diff --git a/device/arista/x86_64-arista_7060_cx32s/plugins/led_control.py b/device/arista/x86_64-arista_7060_cx32s/plugins/led_control.py new file mode 100644 index 000000000000..8d387e513c6c --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/plugins/led_control.py @@ -0,0 +1,6 @@ +try: + import arista.utils.sonic_leds as arista_leds +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +LedControl = arista_leds.getLedControl() diff --git a/device/arista/x86_64-arista_7260cx3_64/plugins/led_control.py b/device/arista/x86_64-arista_7260cx3_64/plugins/led_control.py new file mode 100644 index 000000000000..8d387e513c6c --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/plugins/led_control.py @@ -0,0 +1,6 @@ +try: + import arista.utils.sonic_leds as arista_leds +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +LedControl = arista_leds.getLedControl() diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 4ad9358d16b8..d1417bff1778 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 4ad9358d16b8cd0b57d5922353f38055f83042e4 +Subproject commit d1417bff17780255d4cc371b315f620087673eb8 diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index 39f8cdd3f297..76e7dac4ab63 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -12,4 +12,7 @@ $(DOCKER_PLATFORM_MONITOR)_CONTAINER_NAME = pmon $(DOCKER_PLATFORM_MONITOR)_RUN_OPT += --net=host --privileged -t $(DOCKER_PLATFORM_MONITOR)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +# Mount Arista python library on Aboot images to be used by plugins +$(DOCKER_PLATFORM_MONITOR)_aboot_RUN_OPT += -v /usr/lib/python2.7/dist-packages/arista:/usr/lib/python2.7/dist-packages/arista:ro + $(DOCKER_PLATFORM_MONITOR)_BASE_IMAGE_FILES += sensors:/usr/bin/sensors diff --git a/slave.mk b/slave.mk index c44fe12642ac..caed4279dcc3 100644 --- a/slave.mk +++ b/slave.mk @@ -400,6 +400,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export docker_image="$(docker)" export docker_image_name="$(basename $(docker))" export docker_container_name="$($(docker)_CONTAINER_NAME)" + $(eval $(docker)_RUN_OPT += $($(docker)_$($*_IMAGE_TYPE)_RUN_OPT)) export docker_image_run_opt="$($(docker)_RUN_OPT)" j2 files/build_templates/docker_image_ctl.j2 > $($(docker)_CONTAINER_NAME).sh if [ -f files/build_templates/$($(docker)_CONTAINER_NAME).service.j2 ]; then From c9cc7aea41f9d6864ee606f3eae9209f70193d61 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 12 Sep 2017 14:13:27 -0700 Subject: [PATCH 0769/1011] [configdb] Migrate minigraph configurations to DB (#942) Modify minigraph parser output format so it fit DB schema Modify configuration templates to fit new schema Systemd services dependencies are modified so database starts before any configuration consumer --- dockers/docker-dhcp-relay/Dockerfile.j2 | 1 + dockers/docker-dhcp-relay/isc-dhcp-relay.j2 | 20 +- dockers/docker-dhcp-relay/start.sh | 34 +-- dockers/docker-dhcp-relay/wait_for_intf.sh.j2 | 28 ++ dockers/docker-fpm-frr/bgpd.conf.j2 | 28 +- dockers/docker-fpm-frr/config.sh | 8 +- dockers/docker-fpm-frr/zebra.conf.j2 | 40 +-- dockers/docker-fpm-gobgp/gobgpd.conf.j2 | 2 +- dockers/docker-fpm-gobgp/start.sh | 8 +- dockers/docker-fpm-gobgp/zebra.conf.j2 | 40 +-- dockers/docker-fpm-quagga/bgpd.conf.j2 | 40 +-- dockers/docker-fpm-quagga/zebra.conf.j2 | 40 +-- dockers/docker-lldp-sv2/lldpd.conf.j2 | 6 +- dockers/docker-lldp-sv2/start.sh | 2 +- dockers/docker-orchagent/arp_update | 2 +- dockers/docker-orchagent/ipinip.json.j2 | 4 +- dockers/docker-orchagent/mirror.json.j2 | 13 +- dockers/docker-orchagent/orchagent.sh | 2 +- dockers/docker-orchagent/ports.json.j2 | 10 +- dockers/docker-orchagent/start.sh | 10 +- dockers/docker-orchagent/swssconfig.sh | 2 +- dockers/docker-snmp-sv2/alias_map.j2 | 4 +- dockers/docker-snmp-sv2/snmpd.conf.j2 | 16 +- dockers/docker-snmp-sv2/start.sh | 6 +- dockers/docker-snmp-sv2/sysDescription.j2 | 2 +- dockers/docker-teamd/start.sh | 4 +- dockers/docker-teamd/teamd.j2 | 4 +- files/build_templates/docker_image_ctl.j2 | 14 +- files/build_templates/swss.service.j2 | 1 + .../interfaces/interfaces-config.service | 3 +- .../interfaces/interfaces-config.sh | 2 +- files/image_config/interfaces/interfaces.j2 | 88 +++--- files/image_config/ntp/ntp-config.service | 2 + files/image_config/ntp/ntp-config.sh | 2 +- files/image_config/ntp/ntp.conf.j2 | 6 +- .../rsyslog/rsyslog-config.service | 2 + files/image_config/rsyslog/rsyslog-config.sh | 2 +- files/image_config/rsyslog/rsyslog.conf.j2 | 2 +- .../updategraph/updategraph.service | 4 +- src/sonic-config-engine/minigraph.py | 255 ++++++------------ src/sonic-config-engine/sonic-cfggen | 50 +++- .../tests/sample_output/interfaces | 10 + .../tests/sample_output/mirror.json | 2 +- src/sonic-config-engine/tests/test_cfggen.py | 48 ++-- src/sonic-config-engine/tests/test_j2files.py | 4 +- src/sonic-config-engine/translate_acl | 17 +- src/sonic-py-swsssdk | 2 +- 47 files changed, 461 insertions(+), 431 deletions(-) create mode 100755 dockers/docker-dhcp-relay/wait_for_intf.sh.j2 diff --git a/dockers/docker-dhcp-relay/Dockerfile.j2 b/dockers/docker-dhcp-relay/Dockerfile.j2 index a7e1a1cffb9d..3c6614c4921f 100644 --- a/dockers/docker-dhcp-relay/Dockerfile.j2 +++ b/dockers/docker-dhcp-relay/Dockerfile.j2 @@ -25,5 +25,6 @@ RUN rm -rf /debs COPY ["start.sh", "isc-dhcp-relay.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["isc-dhcp-relay.j2", "/usr/share/sonic/templates/"] +COPY ["wait_for_intf.sh.j2", "/usr/share/sonic/templates/"] ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 index 1c50b685ebda..cdedfcf9692b 100644 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 +++ b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 @@ -1,25 +1,25 @@ -SERVERS="{{ dhcp_servers | join(' ') }}" +SERVERS="{{ DHCP_SERVER | join(' ') }}" INTERFACES=" {%- set add_preceding_space = { 'flag': False } %} -{%- for interface in minigraph_interfaces %} -{%- if interface['addr'] | ipv4 %} +{%- for (name, prefix) in INTERFACE %} +{%- if prefix | ipv4 %} {%- if add_preceding_space.flag %} {% endif %} -{{ interface['attachto'] }} +{{ name }} {%- set _dummy = add_preceding_space.update({'flag': True}) %} {%- endif %} {%- endfor %} -{%- for vlan_interface in minigraph_vlan_interfaces %} -{%- if vlan_interface['addr'] | ipv4 %} +{%- for (name, prefix) in VLAN_INTERFACE %} +{%- if prefix | ipv4 %} {%- if add_preceding_space.flag %} {% endif %} -{{ vlan_interface['attachto'] }} +{{ name }} {%- set _dummy = add_preceding_space.update({'flag': True}) %} {%- endif %} {%- endfor %} -{%- for pc_interface in minigraph_portchannel_interfaces %} -{%- if pc_interface['addr'] | ipv4 %} +{%- for (name, prefix) in PORTCHANNEL_INTERFACE %} +{%- if prefix | ipv4 %} {%- if add_preceding_space.flag %} {% endif %} -{{ pc_interface['attachto'] }} +{{ name }} {%- set _dummy = add_preceding_space.update({'flag': True}) %} {%- endif %} {%- endfor %}" diff --git a/dockers/docker-dhcp-relay/start.sh b/dockers/docker-dhcp-relay/start.sh index 5c2e9de09703..37c3f488a5c7 100755 --- a/dockers/docker-dhcp-relay/start.sh +++ b/dockers/docker-dhcp-relay/start.sh @@ -1,42 +1,16 @@ #!/usr/bin/env bash -function wait_until_iface_exists -{ - IFACE=$1 - - echo "Waiting for interface ${IFACE}..." - - # Wait for the interface to come up (i.e., 'ip link show' returns 0) - until ip link show $IFACE > /dev/null 2>&1; do - sleep 1 - done - - echo "Interface ${IFACE} is created" -} - # Create isc-dhcp-relay config file -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/isc-dhcp-relay.j2 > /etc/default/isc-dhcp-relay +sonic-cfggen -d -t /usr/share/sonic/templates/isc-dhcp-relay.j2 > /etc/default/isc-dhcp-relay rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd # Wait for all interfaces to come up before starting the DHCP relay - -FRONT_PANEL_IFACES=$(sonic-cfggen -m /etc/sonic/minigraph.xml --var-json "minigraph_interfaces" | grep "\"attachto\":" | sed 's/^\s*"attachto":\s"\(.*\)".*$/\1/') -for IFACE in $FRONT_PANEL_IFACES; do - wait_until_iface_exists $IFACE -done - -VLAN_IFACES=$(sonic-cfggen -m /etc/sonic/minigraph.xml --var-json "minigraph_vlan_interfaces" | grep "\"attachto\":" | sed 's/^\s*"attachto":\s"\(.*\)".*$/\1/') -for IFACE in $VLAN_IFACES; do - wait_until_iface_exists $IFACE -done - -PORTCHANNEL_IFACES=$(sonic-cfggen -m /etc/sonic/minigraph.xml --var-json "minigraph_portchannel_interfaces" | grep "\"attachto\":" | sed 's/^\s*"attachto":\s"\(.*\)".*$/\1/') -for IFACE in $PORTCHANNEL_IFACES; do - wait_until_iface_exists $IFACE -done +sonic-cfggen -d -t /usr/share/sonic/templates/wait_for_intf.sh.j2 > /usr/bin/wait_for_intf.sh +chmod +x /usr/bin/wait_for_intf.sh +/usr/bin/wait_for_intf.sh # Start the DHCP relay supervisorctl start isc-dhcp-relay diff --git a/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 new file mode 100755 index 000000000000..b859a43b07b1 --- /dev/null +++ b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +function wait_until_iface_exists +{ + IFACE=$1 + + echo "Waiting for interface ${IFACE}..." + + # Wait for the interface to come up (i.e., 'ip link show' returns 0) + until ip link show $IFACE > /dev/null 2>&1; do + sleep 1 + done + + echo "Interface ${IFACE} is created" +} + + +# Wait for all interfaces to come up before starting the DHCP relay +{% for (name, prefix) in INTERFACE %} +wait_until_iface_exists {{ name }} +{% endfor %} +{% for (name, prefix) in VLAN_INTERFACE %} +wait_until_iface_exists {{ name }} +{% endfor %} +{% for (name, prefix) in PORTCHANNEL_INTERFACE %} +wait_until_iface_exists {{ name }} +{% endfor %} + diff --git a/dockers/docker-fpm-frr/bgpd.conf.j2 b/dockers/docker-fpm-frr/bgpd.conf.j2 index c66d5bfb232f..0f1e255b5cd1 100644 --- a/dockers/docker-fpm-frr/bgpd.conf.j2 +++ b/dockers/docker-fpm-frr/bgpd.conf.j2 @@ -1,13 +1,13 @@ ! {% block banner %} ! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== -! generated by templates/quagga/bgpd.conf.j2 using minigraph_facts.py +! generated by templates/quagga/bgpd.conf.j2 with config DB data ! file: bgpd.conf ! {% endblock banner %} ! {% block system_init %} -hostname {{ inventory_hostname }} +hostname {{ DEVICE_METADATA['localhost']['hostname'] }} password zebra log syslog informational log facility local4 @@ -23,25 +23,25 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp bestpath as-path multipath-relax no bgp default ipv4-unicast {# TODO: use lo[0] for backward compatibility, will revisit the case with multiple lo interfaces #} - bgp router-id {{ minigraph_lo_interfaces[0]['addr'] }} + bgp router-id {{ LOOPBACK_INTERFACE.keys()[0][1] }} {# advertise loopback #} -{% for lo in minigraph_lo_interfaces %} -{% if lo['addr'] | ipv4 %} - network {{ lo['addr'] }}/32 -{% elif lo['addr'] | ipv6 %} +{% for (name, prefix) in LOOPBACK_INTERFACE %} +{% if prefix | ipv4 %} + network {{ prefix | ip }}/32 +{% elif prefix | ipv6 %} address-family ipv6 - network {{ lo['addr'] }}/128 + network {{ prefix | ip }}/128 exit-address-family {% endif %} {% endfor %} {% endblock bgp_init %} {% block vlan_advertisement %} -{% for vlan_interface in minigraph_vlan_interfaces %} -{% if vlan_interface['addr'] | ipv4 %} - network {{ vlan_interface['subnet'] }} -{% elif vlan_interface['addr'] | ipv6 %} +{% for (name, prefix) in VLAN_INTERFACE %} +{% if prefix | ipv4 %} + network {{ prefix }} +{% elif prefix | ipv6 %} address-family ipv6 - network {{ vlan_interface['subnet'] }} + network {{ prefix }} exit-address-family {% endif %} {% endfor %} @@ -51,7 +51,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% if bgp_session['asn'] != 0 %} neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }} neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} -{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} +{% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} {% if neighbor_addr | ipv4 %} diff --git a/dockers/docker-fpm-frr/config.sh b/dockers/docker-fpm-frr/config.sh index 0636a6dc413c..ef7a13a214f4 100755 --- a/dockers/docker-fpm-frr/config.sh +++ b/dockers/docker-fpm-frr/config.sh @@ -1,14 +1,14 @@ #!/bin/bash mkdir -p /etc/frr -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/bgpd.conf.j2 >/etc/frr/bgpd.conf -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/zebra.conf.j2 >/etc/frr/zebra.conf +sonic-cfggen -d -t /usr/share/sonic/templates/bgpd.conf.j2 >/etc/frr/bgpd.conf +sonic-cfggen -d -t /usr/share/sonic/templates/zebra.conf.j2 >/etc/frr/zebra.conf -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/isolate.j2 >/usr/sbin/bgp-isolate +sonic-cfggen -d -t /usr/share/sonic/templates/isolate.j2 >/usr/sbin/bgp-isolate chown root:root /usr/sbin/bgp-isolate chmod 0755 /usr/sbin/bgp-isolate -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/unisolate.j2 >/usr/sbin/bgp-unisolate +sonic-cfggen -d -t /usr/share/sonic/templates/unisolate.j2 >/usr/sbin/bgp-unisolate chown root:root /usr/sbin/bgp-unisolate chmod 0755 /usr/sbin/bgp-unisolate diff --git a/dockers/docker-fpm-frr/zebra.conf.j2 b/dockers/docker-fpm-frr/zebra.conf.j2 index 1ce06eecd2d9..8b967f98671c 100644 --- a/dockers/docker-fpm-frr/zebra.conf.j2 +++ b/dockers/docker-fpm-frr/zebra.conf.j2 @@ -1,26 +1,26 @@ ! {% block banner %} ! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== -! generated by templates/quagga/zebra.conf.j2 using minigraph_facts.py +! generated by templates/quagga/zebra.conf.j2 using config DB data ! file: zebra.conf ! {% endblock banner %} ! {% block sys_init %} -hostname {{ inventory_hostname }} +hostname {{ DEVICE_METADATA['localhost']['hostname'] }} password zebra enable password zebra {% endblock sys_init %} ! {% block interfaces %} ! Enable link-detect (default disabled) -{% for interface in minigraph_interfaces %} -interface {{ interface['attachto'] }} +{% for (name, prefix) in INTERFACE %} +interface {{ name }} link-detect ! {% endfor %} -{% for interface in minigraph_portchannels.keys() %} -interface {{ interface }} +{% for pc in PORTCHANNEL %} +interface {{ pc }} link-detect ! {% endfor %} @@ -28,26 +28,34 @@ link-detect ! {% block default_route %} ! set static default route to mgmt gateway as a backup to learned default -ip route 0.0.0.0/0 {{ minigraph_mgmt_interface['gwaddr'] }} 200 +{% for (name, prefix) in MGMT_INTERFACE %} +{% if prefix | ipv4 %} +ip route 0.0.0.0/0 {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} 200 +{% endif %} +{% endfor %} {% endblock default_route %} ! {% block source_loopback %} -! Set ip source to loopback for bgp learned routes -route-map RM_SET_SRC permit 10 - set src {{ minigraph_lo_interfaces[0]['addr'] }} -! +{% set lo_ipv4_addrs = [] %} {% set lo_ipv6_addrs = [] %} -{% if minigraph_lo_interfaces is defined %} -{% for interface in minigraph_lo_interfaces %} -{% if interface['addr'] is defined and interface['addr']|ipv6 %} -{% if lo_ipv6_addrs.append(interface['addr']) %} +{% if LOOPBACK_INTERFACE %} +{% for (name, prefix) in LOOPBACK_INTERFACE %} +{% if prefix | ipv6 %} +{% if lo_ipv6_addrs.append(prefix) %} +{% endif %} +{% else %} +{% if lo_ipv4_addrs.append(prefix) %} {% endif %} {% endif %} {% endfor %} {% endif %} +! Set ip source to loopback for bgp learned routes +route-map RM_SET_SRC permit 10 + set src {{ lo_ipv4_addrs[0] | ip }} +! {% if lo_ipv6_addrs|length > 0 %} route-map RM_SET_SRC6 permit 10 - set src {{ lo_ipv6_addrs[0] }} + set src {{ lo_ipv6_addrs[0] | ip }} ! {% endif %} ip protocol bgp route-map RM_SET_SRC diff --git a/dockers/docker-fpm-gobgp/gobgpd.conf.j2 b/dockers/docker-fpm-gobgp/gobgpd.conf.j2 index c6ec7a4fd166..c51c10563b59 100644 --- a/dockers/docker-fpm-gobgp/gobgpd.conf.j2 +++ b/dockers/docker-fpm-gobgp/gobgpd.conf.j2 @@ -1,6 +1,6 @@ [global.config] as = {{ DEVICE_METADATA['localhost']['bgp_asn'] }} - router-id = "{{ minigraph_lo_interfaces[0]['addr'] }}" + router-id = "{{ LOOPBACK_INTERFACE.keys()[0][1] }}" {% for neighbor_addr, bgp_session in BGP_NEIGHBOR.iteritems() %} {% if bgp_session['asn'] != 0 %} [[neighbors]] diff --git a/dockers/docker-fpm-gobgp/start.sh b/dockers/docker-fpm-gobgp/start.sh index 636fceea0cbd..83afbda4f736 100755 --- a/dockers/docker-fpm-gobgp/start.sh +++ b/dockers/docker-fpm-gobgp/start.sh @@ -1,14 +1,14 @@ #!/usr/bin/env bash mkdir -p /etc/quagga -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/gobgpd.conf.j2 > /etc/gobgp/gobgpd.conf -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/zebra.conf.j2 > /etc/quagga/zebra.conf +sonic-cfggen -d -t /usr/share/sonic/templates/gobgpd.conf.j2 > /etc/gobgp/gobgpd.conf +sonic-cfggen -d -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 +sonic-cfggen -d -t /usr/share/sonic/templates/isolate.j2 > /usr/sbin/bgp-isolate chown root:root /usr/sbin/bgp-isolate chmod 0755 /usr/sbin/bgp-isolate -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/unisolate.j2 > /usr/sbin/bgp-unisolate +sonic-cfggen -d -t /usr/share/sonic/templates/unisolate.j2 > /usr/sbin/bgp-unisolate chown root:root /usr/sbin/bgp-unisolate chmod 0755 /usr/sbin/bgp-unisolate diff --git a/dockers/docker-fpm-gobgp/zebra.conf.j2 b/dockers/docker-fpm-gobgp/zebra.conf.j2 index 1ce06eecd2d9..8b967f98671c 100644 --- a/dockers/docker-fpm-gobgp/zebra.conf.j2 +++ b/dockers/docker-fpm-gobgp/zebra.conf.j2 @@ -1,26 +1,26 @@ ! {% block banner %} ! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== -! generated by templates/quagga/zebra.conf.j2 using minigraph_facts.py +! generated by templates/quagga/zebra.conf.j2 using config DB data ! file: zebra.conf ! {% endblock banner %} ! {% block sys_init %} -hostname {{ inventory_hostname }} +hostname {{ DEVICE_METADATA['localhost']['hostname'] }} password zebra enable password zebra {% endblock sys_init %} ! {% block interfaces %} ! Enable link-detect (default disabled) -{% for interface in minigraph_interfaces %} -interface {{ interface['attachto'] }} +{% for (name, prefix) in INTERFACE %} +interface {{ name }} link-detect ! {% endfor %} -{% for interface in minigraph_portchannels.keys() %} -interface {{ interface }} +{% for pc in PORTCHANNEL %} +interface {{ pc }} link-detect ! {% endfor %} @@ -28,26 +28,34 @@ link-detect ! {% block default_route %} ! set static default route to mgmt gateway as a backup to learned default -ip route 0.0.0.0/0 {{ minigraph_mgmt_interface['gwaddr'] }} 200 +{% for (name, prefix) in MGMT_INTERFACE %} +{% if prefix | ipv4 %} +ip route 0.0.0.0/0 {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} 200 +{% endif %} +{% endfor %} {% endblock default_route %} ! {% block source_loopback %} -! Set ip source to loopback for bgp learned routes -route-map RM_SET_SRC permit 10 - set src {{ minigraph_lo_interfaces[0]['addr'] }} -! +{% set lo_ipv4_addrs = [] %} {% set lo_ipv6_addrs = [] %} -{% if minigraph_lo_interfaces is defined %} -{% for interface in minigraph_lo_interfaces %} -{% if interface['addr'] is defined and interface['addr']|ipv6 %} -{% if lo_ipv6_addrs.append(interface['addr']) %} +{% if LOOPBACK_INTERFACE %} +{% for (name, prefix) in LOOPBACK_INTERFACE %} +{% if prefix | ipv6 %} +{% if lo_ipv6_addrs.append(prefix) %} +{% endif %} +{% else %} +{% if lo_ipv4_addrs.append(prefix) %} {% endif %} {% endif %} {% endfor %} {% endif %} +! Set ip source to loopback for bgp learned routes +route-map RM_SET_SRC permit 10 + set src {{ lo_ipv4_addrs[0] | ip }} +! {% if lo_ipv6_addrs|length > 0 %} route-map RM_SET_SRC6 permit 10 - set src {{ lo_ipv6_addrs[0] }} + set src {{ lo_ipv6_addrs[0] | ip }} ! {% endif %} ip protocol bgp route-map RM_SET_SRC diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index 02cf40fa8b47..295cb2563aff 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -1,13 +1,13 @@ ! {% block banner %} ! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== -! generated by templates/quagga/bgpd.conf.j2 using minigraph_facts.py +! generated by templates/quagga/bgpd.conf.j2 with config DB data ! file: bgpd.conf ! {% endblock banner %} ! {% block system_init %} -hostname {{ inventory_hostname }} +hostname {{ DEVICE_METADATA['localhost']['hostname'] }} password zebra log syslog informational log facility local4 @@ -28,30 +28,34 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp bestpath as-path multipath-relax no bgp default ipv4-unicast {# Advertise graceful restart capability for ToR #} -{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} +{% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} bgp graceful-restart {% endif %} -{# TODO: use lo[0] for backward compatibility, will revisit the case with multiple lo interfaces #} - bgp router-id {{ minigraph_lo_interfaces[0]['addr'] }} +{% for (name, prefix) in LOOPBACK_INTERFACE %} +{# TODO: use v4 lo for backward compatibility, will revisit the case with multiple lo interfaces #} +{% if prefix | ipv4 %} + bgp router-id {{ prefix | ip }} +{% endif %} +{% endfor %} {# advertise loopback #} -{% for lo in minigraph_lo_interfaces %} -{% if lo['addr'] | ipv4 %} - network {{ lo['addr'] }}/32 -{% elif lo['addr'] | ipv6 %} +{% for (name, prefix) in LOOPBACK_INTERFACE %} +{% if prefix | ipv4 %} + network {{ prefix | ip }}/32 +{% elif prefix | ipv6 %} address-family ipv6 - network {{ lo['addr'] }}/128 + network {{ prefix | ip }}/128 exit-address-family {% endif %} {% endfor %} {% endblock bgp_init %} {% endif %} {% block vlan_advertisement %} -{% for vlan_interface in minigraph_vlan_interfaces %} -{% if vlan_interface['addr'] | ipv4 %} - network {{ vlan_interface['subnet'] }} -{% elif vlan_interface['addr'] | ipv6 %} +{% for (name, prefix) in VLAN_INTERFACE %} +{% if prefix | ipv4 %} + network {{ prefix }} +{% elif prefix | ipv6 %} address-family ipv6 - network {{ vlan_interface['subnet'] }} + network {{ prefix }} exit-address-family {% endif %} {% endfor %} @@ -66,7 +70,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% endif %} {% if neighbor_addr | ipv4 %} address-family ipv4 -{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} +{% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} neighbor {{ neighbor_addr }} activate @@ -75,7 +79,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% endif %} {% if neighbor_addr | ipv6 %} address-family ipv6 -{% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} +{% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} neighbor {{ neighbor_addr }} activate @@ -86,6 +90,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% endfor %} {% endblock bgp_sessions %} {% block bgp_peers_with_range %} +{% if BGP_PEER_RANGE %} {% for bgp_peer in BGP_PEER_RANGE.values() %} neighbor {{ bgp_peer['name'] }} peer-group neighbor {{ bgp_peer['name'] }} passive @@ -107,6 +112,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} maximum-paths 64 exit-address-family {% endfor %} +{% endif %} {% endblock bgp_peers_with_range %} ! {% if DEVICE_METADATA['localhost'].has_key('bgp_asn') %} diff --git a/dockers/docker-fpm-quagga/zebra.conf.j2 b/dockers/docker-fpm-quagga/zebra.conf.j2 index 1ce06eecd2d9..8b967f98671c 100644 --- a/dockers/docker-fpm-quagga/zebra.conf.j2 +++ b/dockers/docker-fpm-quagga/zebra.conf.j2 @@ -1,26 +1,26 @@ ! {% block banner %} ! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== -! generated by templates/quagga/zebra.conf.j2 using minigraph_facts.py +! generated by templates/quagga/zebra.conf.j2 using config DB data ! file: zebra.conf ! {% endblock banner %} ! {% block sys_init %} -hostname {{ inventory_hostname }} +hostname {{ DEVICE_METADATA['localhost']['hostname'] }} password zebra enable password zebra {% endblock sys_init %} ! {% block interfaces %} ! Enable link-detect (default disabled) -{% for interface in minigraph_interfaces %} -interface {{ interface['attachto'] }} +{% for (name, prefix) in INTERFACE %} +interface {{ name }} link-detect ! {% endfor %} -{% for interface in minigraph_portchannels.keys() %} -interface {{ interface }} +{% for pc in PORTCHANNEL %} +interface {{ pc }} link-detect ! {% endfor %} @@ -28,26 +28,34 @@ link-detect ! {% block default_route %} ! set static default route to mgmt gateway as a backup to learned default -ip route 0.0.0.0/0 {{ minigraph_mgmt_interface['gwaddr'] }} 200 +{% for (name, prefix) in MGMT_INTERFACE %} +{% if prefix | ipv4 %} +ip route 0.0.0.0/0 {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} 200 +{% endif %} +{% endfor %} {% endblock default_route %} ! {% block source_loopback %} -! Set ip source to loopback for bgp learned routes -route-map RM_SET_SRC permit 10 - set src {{ minigraph_lo_interfaces[0]['addr'] }} -! +{% set lo_ipv4_addrs = [] %} {% set lo_ipv6_addrs = [] %} -{% if minigraph_lo_interfaces is defined %} -{% for interface in minigraph_lo_interfaces %} -{% if interface['addr'] is defined and interface['addr']|ipv6 %} -{% if lo_ipv6_addrs.append(interface['addr']) %} +{% if LOOPBACK_INTERFACE %} +{% for (name, prefix) in LOOPBACK_INTERFACE %} +{% if prefix | ipv6 %} +{% if lo_ipv6_addrs.append(prefix) %} +{% endif %} +{% else %} +{% if lo_ipv4_addrs.append(prefix) %} {% endif %} {% endif %} {% endfor %} {% endif %} +! Set ip source to loopback for bgp learned routes +route-map RM_SET_SRC permit 10 + set src {{ lo_ipv4_addrs[0] | ip }} +! {% if lo_ipv6_addrs|length > 0 %} route-map RM_SET_SRC6 permit 10 - set src {{ lo_ipv6_addrs[0] }} + set src {{ lo_ipv6_addrs[0] | ip }} ! {% endif %} ip protocol bgp route-map RM_SET_SRC diff --git a/dockers/docker-lldp-sv2/lldpd.conf.j2 b/dockers/docker-lldp-sv2/lldpd.conf.j2 index 4cfe48065e11..ffbf7e6993e9 100644 --- a/dockers/docker-lldp-sv2/lldpd.conf.j2 +++ b/dockers/docker-lldp-sv2/lldpd.conf.j2 @@ -1,5 +1,3 @@ -{% for member in minigraph_ports.keys() %} -{% if member in minigraph_neighbors %} -configure ports {{ member }} lldp portidsubtype local {{ minigraph_ports[member]['alias'] }} description {{ minigraph_neighbors[member]['name'] }}:{{ minigraph_neighbors[member]['port'] }} -{% endif %} +{% for neighbor in DEVICE_NEIGHBOR %} +configure ports {{ DEVICE_NEIGHBOR[neighbor]['local_port'] }} lldp portidsubtype local {{ PORT[DEVICE_NEIGHBOR[neighbor]['local_port']]['alias'] }} description {{ neighbor }}:{{ DEVICE_NEIGHBOR[neighbor]['port'] }} {% endfor %} diff --git a/dockers/docker-lldp-sv2/start.sh b/dockers/docker-lldp-sv2/start.sh index 63c8d32c34e6..3a765c6f5482 100755 --- a/dockers/docker-lldp-sv2/start.sh +++ b/dockers/docker-lldp-sv2/start.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/lldpd.conf.j2 > /etc/lldpd.conf +sonic-cfggen -d -t /usr/share/sonic/templates/lldpd.conf.j2 > /etc/lldpd.conf mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status diff --git a/dockers/docker-orchagent/arp_update b/dockers/docker-orchagent/arp_update index 8291818e50fb..cfd87c1dc51f 100755 --- a/dockers/docker-orchagent/arp_update +++ b/dockers/docker-orchagent/arp_update @@ -4,7 +4,7 @@ # arp_update: Send gratuitous ARP requests to VLAN member neighbors to refresh # the neighbors state. -VLAN=`sonic-cfggen -m /etc/sonic/minigraph.xml -v 'minigraph_vlans.keys() | join(" ")'` +VLAN=`sonic-cfggen -d -v 'VLAN.keys() | join(" ") if VLAN'` for vlan in $VLAN; do # generate a list of arping commands: # arping -q -w 0 -c 1 -i ; diff --git a/dockers/docker-orchagent/ipinip.json.j2 b/dockers/docker-orchagent/ipinip.json.j2 index 6ffafd297496..2f411b088e6d 100644 --- a/dockers/docker-orchagent/ipinip.json.j2 +++ b/dockers/docker-orchagent/ipinip.json.j2 @@ -2,8 +2,8 @@ { "TUNNEL_DECAP_TABLE:IPINIP_TUNNEL" : { "tunnel_type":"IPINIP", - "src_ip":"{{ minigraph_lo_interfaces[0]['addr'] }}", - "dst_ip":"{{ minigraph_lo_interfaces[0]['addr'] }}", + "src_ip":"{{ LOOPBACK_INTERFACE.keys()[0][1] | ip }}", + "dst_ip":"{{ LOOPBACK_INTERFACE.keys()[0][1] | ip }}", {% if onie_switch_asic == "mlnx" %} "dscp_mode":"uniform", "ecn_mode":"standard", diff --git a/dockers/docker-orchagent/mirror.json.j2 b/dockers/docker-orchagent/mirror.json.j2 index 4aa710cfcb71..3a3fc6eed079 100644 --- a/dockers/docker-orchagent/mirror.json.j2 +++ b/dockers/docker-orchagent/mirror.json.j2 @@ -1,9 +1,10 @@ [ -{% if erspan_dst %} +{% if MIRROR_SESSION %} +{% for session in MIRROR_SESSION %} { - "MIRROR_SESSION_TABLE:everflow": { - "src_ip": "{{ minigraph_lo_interfaces[0]['addr'] }}", - "dst_ip": "{{ erspan_dst[0] }}", + "MIRROR_SESSION_TABLE:{{session}}": { + "src_ip": "{{ MIRROR_SESSION[session]['src_ip'] }}", + "dst_ip": "{{ MIRROR_SESSION[session]['dst_ip'] }}", {% if onie_switch_asic == "mlnx" %} "gre_type": "0x6558", "queue": "1", @@ -15,7 +16,9 @@ "ttl": "255" }, "OP": "SET" - } + }{% if not loop.last %},{% endif %} + +{% endfor %} {% endif %} ] diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index 328ce8fc053d..7103afcb81e9 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -2,7 +2,7 @@ # Export platform information. Required to be able to write # vendor specific code. -export platform=`sonic-cfggen -m /etc/sonic/minigraph.xml -v onie_switch_asic` +export platform=`sonic-cfggen -v onie_switch_asic` ASIC=`sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type` diff --git a/dockers/docker-orchagent/ports.json.j2 b/dockers/docker-orchagent/ports.json.j2 index f59ee993eead..48be831025f8 100644 --- a/dockers/docker-orchagent/ports.json.j2 +++ b/dockers/docker-orchagent/ports.json.j2 @@ -1,11 +1,15 @@ [ -{% for interface in ethernet_interfaces %} +{% if PORT %} +{% for port in PORT %} +{% if PORT[port].has_key('speed') %} { - "PORT_TABLE:{{ interface['name'] }}": { - "speed": "{{ interface['speed'] }}" + "PORT_TABLE:{{ port }}": { + "speed": "{{ PORT[port]['speed'] }}" }, "OP": "SET" }{% if not loop.last %},{% endif %} +{% endif %} {% endfor %} +{% endif %} ] diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 5f961a8bd294..1eba99192b21 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -2,11 +2,11 @@ mkdir -p /etc/swss/config.d/ -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/mirror.json.j2 > /etc/swss/config.d/mirror.json -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/ports.json.j2 > /etc/swss/config.d/ports.json +sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json +sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/mirror.json.j2 > /etc/swss/config.d/mirror.json +sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ports.json.j2 > /etc/swss/config.d/ports.json -export platform=`sonic-cfggen -m /etc/sonic/minigraph.xml -v platform` +export platform=`sonic-cfggen -v platform` rm -f /var/run/rsyslogd.pid @@ -34,7 +34,7 @@ supervisorctl start neighsyncd supervisorctl start swssconfig # Start arp_update when VLAN exists -VLAN=`sonic-cfggen -m /etc/sonic/minigraph.xml -v 'minigraph_vlans.keys() | join(" ")'` +VLAN=`sonic-cfggen -d -v 'VLAN.keys() | join(" ") if VLAN'` if [ "$VLAN" != "" ]; then supervisorctl start arp_update fi diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index 2530aca06bb3..c4043bd86de7 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -36,7 +36,7 @@ function fast_reboot { # Restore FDB and ARP table ASAP fast_reboot -HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` +HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -d -v DEVICE_METADATA["localhost"]["hwsku"]` SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json ports.json " diff --git a/dockers/docker-snmp-sv2/alias_map.j2 b/dockers/docker-snmp-sv2/alias_map.j2 index 0f91fa26eabe..bd68353a91e3 100644 --- a/dockers/docker-snmp-sv2/alias_map.j2 +++ b/dockers/docker-snmp-sv2/alias_map.j2 @@ -1,5 +1,5 @@ { -{% for member in minigraph_ports.keys() %} - "{{member}}": "{{minigraph_ports[member]['alias']}}"{% if not loop.last %},{% endif %} +{% for member in PORT %} + "{{member}}": "{{PORT[member]['alias']}}"{% if not loop.last %},{% endif %} {% endfor %} } diff --git a/dockers/docker-snmp-sv2/snmpd.conf.j2 b/dockers/docker-snmp-sv2/snmpd.conf.j2 index c5d299af05ef..246924cfd387 100644 --- a/dockers/docker-snmp-sv2/snmpd.conf.j2 +++ b/dockers/docker-snmp-sv2/snmpd.conf.j2 @@ -13,18 +13,22 @@ # AGENT BEHAVIOUR # -{% if minigraph_mgmt_interface.addr | ipv4 %} +{% if MGMT_INTERFACE %} # Listen for connections on localhost, loopback ip and mgmt (eth0) ip agentAddress udp:127.0.0.1:161 -agentAddress udp:{{ minigraph_mgmt_interface.addr }}:161 -{% for minigraph_lo_interface in minigraph_lo_interfaces %} +{% for (name, prefix) in MGMT_INTERFACE %} +{% if prefix | ipv4 %} +agentAddress udp:{{ prefix | ip }}:161 +{% endif %} +{% endfor %} # TODO: only support ipv4 lo addresses, add ipv6 support later -{% if minigraph_lo_interface.addr | ipv4 %} -agentAddress udp:{{ minigraph_lo_interface.addr }}:161 +{% for (name, prefix) in LOOPBACK_INTERFACE %} +{% if prefix | ipv4 %} +agentAddress udp:{{ prefix | ip }}:161 {% endif %} {% endfor %} {% else %} -# Listen on all addresses as mgmt ip not specified in minigraph +# Listen on all addresses as mgmt ip not specified agentAddress udp:161 {% endif %} diff --git a/dockers/docker-snmp-sv2/start.sh b/dockers/docker-snmp-sv2/start.sh index ffbe8f196722..201239b1e7db 100755 --- a/dockers/docker-snmp-sv2/start.sh +++ b/dockers/docker-snmp-sv2/start.sh @@ -1,11 +1,11 @@ #!/usr/bin/env bash mkdir -p /etc/ssw -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/sonic_version.yml -t /usr/share/sonic/templates/sysDescription.j2 > /etc/ssw/sysDescription +sonic-cfggen -d -y /etc/sonic/sonic_version.yml -t /usr/share/sonic/templates/sysDescription.j2 > /etc/ssw/sysDescription mkdir -p /etc/snmp -sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/snmp.yml -t /usr/share/sonic/templates/snmpd.conf.j2 > /etc/snmp/snmpd.conf -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/alias_map.j2 > /etc/snmp/alias_map.json +sonic-cfggen -d -y /etc/sonic/snmp.yml -t /usr/share/sonic/templates/snmpd.conf.j2 > /etc/snmp/snmpd.conf +sonic-cfggen -d -t /usr/share/sonic/templates/alias_map.j2 > /etc/snmp/alias_map.json mkdir -p /var/sonic echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status diff --git a/dockers/docker-snmp-sv2/sysDescription.j2 b/dockers/docker-snmp-sv2/sysDescription.j2 index 648ed161046e..207a8bf7de9a 100644 --- a/dockers/docker-snmp-sv2/sysDescription.j2 +++ b/dockers/docker-snmp-sv2/sysDescription.j2 @@ -1 +1 @@ -SONiC Software Version: SONiC.{{ build_version }} - HwSku: {{ minigraph_hwsku }} - Distribution: Debian {{ debian_version }} - Kernel: {{ kernel_version }} +SONiC Software Version: SONiC.{{ build_version }} - HwSku: {{ DEVICE_METADATA['localhost']['hwsku'] }} - Distribution: Debian {{ debian_version }} - Kernel: {{ kernel_version }} diff --git a/dockers/docker-teamd/start.sh b/dockers/docker-teamd/start.sh index fe4bfe1c584f..6b0a3d785894 100755 --- a/dockers/docker-teamd/start.sh +++ b/dockers/docker-teamd/start.sh @@ -15,8 +15,8 @@ if [ "$SONIC_ASIC_TYPE" == "mellanox" -o "$SONIC_ASIC_TYPE" == "centec" ]; then MAC_ADDRESS=$(python -c "print '$MAC_ADDRESS'[:-2] + '$aligned_last_byte'") # put aligned byte into the end of MAC fi -for pc in `sonic-cfggen -m /etc/sonic/minigraph.xml -v "minigraph_portchannels.keys() | join(' ')"`; do - sonic-cfggen -m /etc/sonic/minigraph.xml -a '{"pc":"'$pc'","hwaddr":"'$MAC_ADDRESS'"}' -t /usr/share/sonic/templates/teamd.j2 > $TEAMD_CONF_PATH/$pc.conf +for pc in `sonic-cfggen -d -v "PORTCHANNEL.keys() | join(' ') if PORTCHANNEL"`; do + sonic-cfggen -d -a '{"pc":"'$pc'","hwaddr":"'$MAC_ADDRESS'"}' -t /usr/share/sonic/templates/teamd.j2 > $TEAMD_CONF_PATH/$pc.conf done mkdir -p /var/sonic diff --git a/dockers/docker-teamd/teamd.j2 b/dockers/docker-teamd/teamd.j2 index d6693719f1ad..d9ea1b790f89 100644 --- a/dockers/docker-teamd/teamd.j2 +++ b/dockers/docker-teamd/teamd.j2 @@ -5,14 +5,14 @@ "name": "lacp", "active": true, {# Use 75% links upperbound as min-links #} - "min_ports": {{ (minigraph_portchannels[pc]['members'] | length * 0.75) | round(0, 'ceil') | int }}, + "min_ports": {{ (PORTCHANNEL[pc]['members'] | length * 0.75) | round(0, 'ceil') | int }}, "tx_hash": ["eth", "ipv4", "ipv6"] }, "link_watch": { "name": "ethtool" }, "ports": { -{% for member in minigraph_portchannels[pc]['members'] %} +{% for member in PORTCHANNEL[pc]['members'] %} "{{ member }}": {}{% if not loop.last %},{% endif %} {% endfor %} diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 3ae3acaed33b..042db764df97 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -2,7 +2,9 @@ # Obtain our platform and HWSKU as we will mount directories with these names in each docker PLATFORM=`sonic-cfggen -v platform` -HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v minigraph_hwsku` +{%- if docker_container_name != "database" %} +HWSKU=`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["hwsku"]'` +{%- endif %} start() { docker inspect --type container {{docker_container_name}} &>/dev/null @@ -16,9 +18,19 @@ start() { {%- endif %} -v /var/run/redis:/var/run/redis:rw \ -v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \ +{%- if docker_container_name != "database" %} -v /usr/share/sonic/device/$PLATFORM/$HWSKU:/usr/share/sonic/hwsku:ro \ +{%- endif %} --name={{docker_container_name}} {{docker_image_name}}:latest fi +{%- if docker_container_name == "database" %} + while true; do + if [[ "$(docker exec -i database redis-cli ping)" =~ PONG.* ]]; then + break + fi + sleep 1 + done +{%- endif %} } attach() { diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index ed6b852f18f9..af922530d8a2 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -5,6 +5,7 @@ Requires=database.service Requires=opennsl-modules-3.16.0-4-amd64.service {% endif %} After=database.service +After=interfaces-config.service {% if sonic_asic_platform == 'broadcom' %} After=opennsl-modules-3.16.0-4-amd64.service {% endif %} diff --git a/files/image_config/interfaces/interfaces-config.service b/files/image_config/interfaces/interfaces-config.service index 0cc7f2981505..86706da22518 100644 --- a/files/image_config/interfaces/interfaces-config.service +++ b/files/image_config/interfaces/interfaces-config.service @@ -1,6 +1,7 @@ [Unit] Description=Update interfaces configuration -Before=database.service +Requires=database.service +After=database.service [Service] Type=oneshot diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index d2b42051cc8d..400b89a594c7 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -1,6 +1,6 @@ #!/bin/bash -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/interfaces.j2 >/etc/network/interfaces +sonic-cfggen -d -t /usr/share/sonic/templates/interfaces.j2 >/etc/network/interfaces [ -f /var/run/dhclient.eth0.pid ] && kill `cat /var/run/dhclient.eth0.pid` && rm -f /var/run/dhclient.eth0.pid service networking restart ifdown lo && ifup lo diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 425badf7f21f..f96c0740c572 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -10,34 +10,36 @@ auto lo iface lo inet loopback # Use command 'ip addr list dev lo' to check all addresses -{% for minigraph_lo_interface in minigraph_lo_interfaces %} -iface lo {{ 'inet' if minigraph_lo_interface['addr'] | ipv4 else 'inet6' }} static - address {{ minigraph_lo_interface['addr'] }} - netmask {{ minigraph_lo_interface['mask'] }} +{% for (name, prefix) in LOOPBACK_INTERFACE %} +iface lo {{ 'inet' if prefix | ipv4 else 'inet6' }} static + address {{ prefix | ip }} + netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} # {% endfor %} {% endblock loopback %} {% block mgmt_interface %} # The management network interface auto eth0 -{% if minigraph_mgmt_interface['addr'] %} -iface eth0 inet static - address {{ minigraph_mgmt_interface['addr'] }} - netmask {{ minigraph_mgmt_interface['mask'] }} +{% if MGMT_INTERFACE %} +{% for (name, prefix) in MGMT_INTERFACE %} +iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static + address {{ prefix | ip }} + netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} ########## management network policy routing rules # management port up rules - up ip route add default via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 table default - up ip rule add from {{ minigraph_mgmt_interface['addr'] }}/32 table default -{% for prefix in forced_mgmt_routes %} - up ip rule add to {{ prefix }} table default + up ip route add default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table default + up ip rule add from {{ prefix | ip }}/32 table default +{% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} + up ip rule add to {{ route }} table default {% endfor %} # management port down rules - down ip route delete default via {{ minigraph_mgmt_interface['gwaddr'] }} dev eth0 table default - down ip rule delete from {{ minigraph_mgmt_interface['addr'] }}/32 table default -{% for prefix in forced_mgmt_routes %} - down ip rule delete to {{ prefix }} table default + down ip route delete default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table default + down ip rule delete from {{ prefix | ip }}/32 table default +{% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} + down ip rule delete to {{ route }} table default {% endfor %} {# TODO: COPP policy type rules #} +{% endfor %} {% else %} iface eth0 inet dhcp {% endif %} @@ -45,19 +47,18 @@ iface eth0 inet dhcp {% endblock mgmt_interface %} {% block front_panel_interfaces %} # The switch front panel interfaces -{% for interface in minigraph_interfaces %} -allow-hotplug {{ interface['attachto'] }} -iface {{ interface['attachto'] }} {{ 'inet' if interface['addr'] | ipv4 else 'inet6' }} static +{% for (name, prefix) in INTERFACE %} +allow-hotplug {{ name }} +iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static mtu 9216 - address {{ interface['addr'] }} - netmask {{ interface['mask'] }} + address {{ prefix | ip }} + netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} # {% endfor %} -{% if minigraph_vlans.keys() | length %} +{% if VLAN %} # "|| true" is added to suppress the error when interface is already a member of VLAN -{% endif %} -{% for vlan in minigraph_vlans.keys()|sort %} -{% for member in minigraph_vlans[vlan]['members'] %} +{% for vlan in VLAN.keys()|sort %} +{% for member in VLAN[vlan]['members'] %} allow-hotplug {{ member }} iface {{ member }} inet manual pre-up ifconfig {{ member }} up mtu 9216 @@ -66,12 +67,12 @@ iface {{ member }} inet manual # {% endfor %} {% endfor %} -{% if minigraph_portchannels.keys() | length %} +{% endif %} +{% if PORTCHANNEL %} # "|| true" is added to suppress the error when interface is already a member of LAG # "ip link show | grep -q master" is added to ensure interface is enslaved -{% endif %} -{% for pc in minigraph_portchannels.keys()|sort %} -{% for member in minigraph_portchannels[pc]['members'] %} +{% for pc in PORTCHANNEL.keys()|sort %} +{% for member in PORTCHANNEL[pc]['members'] %} allow-hotplug {{ member }} iface {{ member }} inet manual pre-up teamdctl {{ pc }} port add {{ member }} || true @@ -80,30 +81,31 @@ iface {{ member }} inet manual # {% endfor %} {% endfor %} +{% endif %} {% endblock front_panel_interfaces %} -{% if minigraph_vlans.keys() | length %} {% block vlan_interfaces %} +{% if VLAN_INTERFACE %} # Vlan interfaces -{% for vlan_interface in minigraph_vlan_interfaces %} -auto {{ vlan_interface['attachto'] }} -iface {{ vlan_interface['attachto'] }} {{ 'inet' if vlan_interface['addr'] | ipv4 else 'inet6' }} static +{% for (name, prefix) in VLAN_INTERFACE.keys() | sort %} +auto {{ name }} +iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static bridge_ports none - address {{ vlan_interface['addr'] }} - netmask {{ vlan_interface['mask'] }} + address {{ prefix | ip }} + netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} {% endfor %} # -{% endblock vlan_interfaces %} {% endif %} -{% if minigraph_portchannels.keys() | length %} +{% endblock vlan_interfaces %} {% block pc_interfaces %} +{% if PORTCHANNEL_INTERFACE %} # Portchannel interfaces -{% for pc_interface in minigraph_portchannel_interfaces %} -allow-hotplug {{ pc_interface['attachto'] }} -iface {{ pc_interface['attachto'] }} {{ 'inet' if pc_interface['addr'] | ipv4 else 'inet6' }} static +{% for (name, prefix) in PORTCHANNEL_INTERFACE.keys() | sort %} +allow-hotplug {{ name }} +iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static mtu 9216 - address {{ pc_interface['addr'] }} - netmask {{ pc_interface['mask'] }} + address {{ prefix | ip }} + netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} # {% endfor %} -{% endblock pc_interfaces %} {% endif %} +{% endblock pc_interfaces %} diff --git a/files/image_config/ntp/ntp-config.service b/files/image_config/ntp/ntp-config.service index 948e7f4953c8..05e6211b9782 100644 --- a/files/image_config/ntp/ntp-config.service +++ b/files/image_config/ntp/ntp-config.service @@ -1,6 +1,8 @@ [Unit] Description=Update NTP configuration Before=ntp.service +Requires=database.service +After=database.service [Service] Type=oneshot diff --git a/files/image_config/ntp/ntp-config.sh b/files/image_config/ntp/ntp-config.sh index 2465058ba021..7c79a16c0ef3 100755 --- a/files/image_config/ntp/ntp-config.sh +++ b/files/image_config/ntp/ntp-config.sh @@ -1,3 +1,3 @@ #!/bin/bash -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/ntp.conf.j2 >/etc/ntp.conf +sonic-cfggen -d -t /usr/share/sonic/templates/ntp.conf.j2 >/etc/ntp.conf diff --git a/files/image_config/ntp/ntp.conf.j2 b/files/image_config/ntp/ntp.conf.j2 index 3ae0c1804e52..ae72820339be 100644 --- a/files/image_config/ntp/ntp.conf.j2 +++ b/files/image_config/ntp/ntp.conf.j2 @@ -23,13 +23,15 @@ filegen clockstats file clockstats type day enable # pool.ntp.org maps to about 1000 low-stratum NTP servers. Your server will # pick a different set every time it starts up. Please consider joining the # pool: -{% for ntp_server in ntp_servers %} +{% for ntp_server in NTP_SERVER %} server {{ ntp_server }} iburst {% endfor %} #only listen on localhost and eth0 ips (default is to listen on all ip addresses) interface ignore wildcard -interface listen {{ minigraph_mgmt_interface.addr }} +{% for (mgmt_intf, mgmt_prefix) in MGMT_INTERFACE %} +interface listen {{ mgmt_prefix | ip }} +{% endfor %} interface listen 127.0.0.1 # Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for diff --git a/files/image_config/rsyslog/rsyslog-config.service b/files/image_config/rsyslog/rsyslog-config.service index be3c209e7560..e013b992030d 100644 --- a/files/image_config/rsyslog/rsyslog-config.service +++ b/files/image_config/rsyslog/rsyslog-config.service @@ -1,5 +1,7 @@ [Unit] Description=Update rsyslog configuration +Requires=database.service +After=database.service [Service] Type=oneshot diff --git a/files/image_config/rsyslog/rsyslog-config.sh b/files/image_config/rsyslog/rsyslog-config.sh index 06a4934a4be5..c8ba7b99453c 100755 --- a/files/image_config/rsyslog/rsyslog-config.sh +++ b/files/image_config/rsyslog/rsyslog-config.sh @@ -1,4 +1,4 @@ #!/bin/bash -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/rsyslog.conf.j2 >/etc/rsyslog.conf +sonic-cfggen -d -t /usr/share/sonic/templates/rsyslog.conf.j2 >/etc/rsyslog.conf systemctl restart rsyslog diff --git a/files/image_config/rsyslog/rsyslog.conf.j2 b/files/image_config/rsyslog/rsyslog.conf.j2 index 264ddd8dd7bf..063f119f6bdd 100644 --- a/files/image_config/rsyslog/rsyslog.conf.j2 +++ b/files/image_config/rsyslog/rsyslog.conf.j2 @@ -41,7 +41,7 @@ $template SONiCFileFormat,"%timegenerated%.%timegenerated:::date-subseconds% %HO $ActionFileDefaultTemplate SONiCFileFormat #Set remote syslog server -{% for server in syslog_servers %} +{% for server in SYSLOG_SERVER %} *.* @{{ server }}:514;SONiCFileFormat {% endfor %} diff --git a/files/image_config/updategraph/updategraph.service b/files/image_config/updategraph/updategraph.service index ba0b5dcb85e2..c66e9be75702 100644 --- a/files/image_config/updategraph/updategraph.service +++ b/files/image_config/updategraph/updategraph.service @@ -1,8 +1,6 @@ [Unit] Description=download minigraph from graph service -Before=ntp-config.service -Before=rsyslog-config.service -Before=interfaces-config.service +Before=database.service [Service] Type=oneshot diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 1877e552858e..565a1a43d060 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -91,18 +91,20 @@ def parse_png(png, hname): if enddevice == hname: if port_alias_map.has_key(endport): endport = port_alias_map[endport] - neighbors[endport] = {'name': startdevice, 'port': startport} + neighbors[startdevice] = {'local_port': endport, 'port': startport} else: if port_alias_map.has_key(startport): startport = port_alias_map[startport] - neighbors[startport] = {'name': enddevice, 'port': endport} + neighbors[enddevice] = {'local_port': startport, 'port': endport} if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): (lo_prefix, mgmt_prefix, name, hwsku, d_type) = parse_device(device) - lo_addr = None if not lo_prefix else lo_prefix.split('/')[0] - mgmt_addr = None if not mgmt_prefix else mgmt_prefix.split('/')[0] - devices[name] = {'lo_addr': lo_addr, 'type': d_type, 'mgmt_addr': mgmt_addr, 'hwsku': hwsku} + device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku } + if neighbors.has_key(name): + neighbors[name].update(device_data) + else: + devices[name] = device_data if child.tag == str(QName(ns, "DeviceInterfaceLinks")): for if_link in child.findall(str(QName(ns, 'DeviceLinkBase'))): @@ -131,71 +133,28 @@ def parse_dpg(dpg, hname): continue ipintfs = child.find(str(QName(ns, "IPInterfaces"))) - intfs = [] + intfs = {} for ipintf in ipintfs.findall(str(QName(ns, "IPInterface"))): intfalias = ipintf.find(str(QName(ns, "AttachTo"))).text intfname = port_alias_map.get(intfalias, intfalias) ipprefix = ipintf.find(str(QName(ns, "Prefix"))).text - ipn = ipaddress.IPNetwork(ipprefix) - ipaddr = ipn.ip - prefix_len = ipn.prefixlen - addr_bits = ipn.max_prefixlen - subnet = ipaddress.IPNetwork(str(ipn.network) + '/' + str(prefix_len)) - ipmask = ipn.netmask - - intf = {'addr': ipaddr, 'subnet': subnet} - if isinstance(ipn, ipaddress.IPv4Network): - intf['mask'] = ipmask - else: - intf['mask'] = str(prefix_len) - intf.update({'attachto': intfname, 'prefixlen': int(prefix_len)}) - - # TODO: remove peer_addr after dependency removed - ipaddr_val = int(ipn.ip) - peer_addr_val = None - if int(prefix_len) == addr_bits - 2: - if ipaddr_val & 0x3 == 1: - peer_addr_val = ipaddr_val + 1 - else: - peer_addr_val = ipaddr_val - 1 - elif int(prefix_len) == addr_bits - 1: - if ipaddr_val & 0x1 == 0: - peer_addr_val = ipaddr_val + 1 - else: - peer_addr_val = ipaddr_val - 1 - if peer_addr_val is not None: - intf['peer_addr'] = ipaddress.IPAddress(peer_addr_val) - intfs.append(intf) + intfs[(intfname, ipprefix)] = {} lointfs = child.find(str(QName(ns, "LoopbackIPInterfaces"))) - lo_intfs = [] + lo_intfs = {} for lointf in lointfs.findall(str(QName(ns1, "LoopbackIPInterface"))): intfname = lointf.find(str(QName(ns, "AttachTo"))).text ipprefix = lointf.find(str(QName(ns1, "PrefixStr"))).text - ipn = ipaddress.IPNetwork(ipprefix) - ipaddr = ipn.ip - prefix_len = ipn.prefixlen - ipmask = ipn.netmask - lo_intf = {'name': intfname, 'addr': ipaddr, 'prefixlen': prefix_len} - if isinstance(ipn, ipaddress.IPv4Network): - lo_intf['mask'] = ipmask - else: - lo_intf['mask'] = str(prefix_len) - lo_intfs.append(lo_intf) - + lo_intfs[(intfname, ipprefix)] = {} + mgmtintfs = child.find(str(QName(ns, "ManagementIPInterfaces"))) - mgmt_intf = None + mgmt_intf = {} for mgmtintf in mgmtintfs.findall(str(QName(ns1, "ManagementIPInterface"))): + intfname = mgmtintf.find(str(QName(ns, "AttachTo"))).text ipprefix = mgmtintf.find(str(QName(ns1, "PrefixStr"))).text mgmtipn = ipaddress.IPNetwork(ipprefix) - # Ignore IPv6 management address - if mgmtipn.version == 6: - continue - ipaddr = mgmtipn.ip - prefix_len = str(mgmtipn.prefixlen) - ipmask = mgmtipn.netmask gwaddr = ipaddress.IPAddress(int(mgmtipn.network) + 1) - mgmt_intf = {'addr': ipaddr, 'prefixlen': prefix_len, 'mask': ipmask, 'gwaddr': gwaddr} + mgmt_intf[(intfname, ipprefix)] = {'gwaddr': gwaddr} pcintfs = child.find(str(QName(ns, "PortChannelInterfaces"))) pc_intfs = [] @@ -206,7 +165,7 @@ def parse_dpg(dpg, hname): pcmbr_list = pcintfmbr.split(';') for i, member in enumerate(pcmbr_list): pcmbr_list[i] = port_alias_map.get(member, member) - pcs[pcintfname] = {'name': pcintfname, 'members': pcmbr_list} + pcs[pcintfname] = {'members': pcmbr_list} vlanintfs = child.find(str(QName(ns, "VlanInterfaces"))) vlan_intfs = [] @@ -218,7 +177,7 @@ def parse_dpg(dpg, hname): vmbr_list = vintfmbr.split(';') for i, member in enumerate(vmbr_list): vmbr_list[i] = port_alias_map.get(member, member) - vlan_attributes = {'name': vintfname, 'members': vmbr_list, 'vlanid': vlanid} + vlan_attributes = {'members': vmbr_list, 'vlanid': vlanid} sonic_vlan_name = "Vlan%s" % vlanid vlans[sonic_vlan_name] = vlan_attributes @@ -243,7 +202,7 @@ def parse_dpg(dpg, hname): acl_intfs = port_alias_map.values() break; if acl_intfs: - acls[aclname] = { 'AttachTo': acl_intfs, 'IsMirror': is_mirror } + acls[aclname] = { 'policy_desc': aclname, 'ports': acl_intfs, 'type': 'mirror' if is_mirror else 'L3'} return intfs, lo_intfs, mgmt_intf, vlans, pcs, acls return None, None, None, None, None, None @@ -326,51 +285,17 @@ def parse_meta(meta, hname): return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst, deployment_id def parse_deviceinfo(meta, hwsku): - ethernet_interfaces = [] - + ethernet_interfaces = {} for device_info in meta.findall(str(QName(ns, "DeviceInfo"))): dev_sku = device_info.find(str(QName(ns, "HwSku"))).text if dev_sku == hwsku: interfaces = device_info.find(str(QName(ns, "EthernetInterfaces"))) for interface in interfaces.findall(str(QName(ns1, "EthernetInterface"))): - name = interface.find(str(QName(ns, "InterfaceName"))).text + alias = interface.find(str(QName(ns, "InterfaceName"))).text speed = interface.find(str(QName(ns, "Speed"))).text - ethernet_interfaces.append({ 'name':name, 'speed':speed }) - + ethernet_interfaces[port_alias_map.get(alias, alias)] = speed return ethernet_interfaces -def get_console_info(devices, dev, port): - for k, v in devices.items(): - if k == dev: - break - else: - return {} - - ret_val = v - ret_val.update({ - 'ts_port': port, - 'ts_dev': dev - }) - - return ret_val - - -def get_mgmt_info(devices, dev, port): - for k, v in devices.items(): - if k == dev: - break - else: - return {} - - ret_val = v - ret_val.update({ - 'mgmt_port': port, - 'mgmt_dev': dev - }) - - return ret_val - - def parse_port_config(hwsku, platform=None, port_config_file=None): port_config_candidates = [] if port_config_file != None: @@ -401,7 +326,7 @@ def parse_port_config(hwsku, platform=None, port_config_file=None): alias = name else: alias = tokens[2].strip() - ports[name] = {'name': name, 'alias': alias} + ports[name] = {'alias': alias} port_alias_map[alias] = name return ports @@ -424,7 +349,7 @@ def parse_xml(filename, platform=None, port_config_file=None): neighbors = None devices = None hostname = None - ethernet_interfaces = [] + port_speeds = {} syslog_servers = [] dhcp_servers = [] ntp_servers = [] @@ -455,93 +380,91 @@ def parse_xml(filename, platform=None, port_config_file=None): elif child.tag == str(QName(ns, "MetadataDeclaration")): (syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst, deployment_id) = parse_meta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): - ethernet_interfaces = parse_deviceinfo(child, hwsku) + port_speeds = parse_deviceinfo(child, hwsku) results = {} - results['minigraph_hwsku'] = hwsku - # sorting by lambdas are not easily done without custom filters. - # TODO: add jinja2 filter to accept a lambda to sort a list of dictionaries by attribute. - # TODO: alternatively (preferred), implement class containers for multiple-attribute entries, enabling sort by attr + results['DEVICE_METADATA'] = {'localhost': { + 'bgp_asn': bgp_asn, + 'deployment_id': deployment_id, + 'hostname': hostname, + 'hwsku': hwsku, + 'type': devices[hostname]['type'] + }} results['BGP_NEIGHBOR'] = bgp_sessions - results['DEVICE_METADATA'] = {'localhost': { 'bgp_asn': bgp_asn }} results['BGP_PEER_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 = [] - vlan_intfs = [] - pc_intfs = [] + if mgmt_routes: + # TODO: differentiate v4 and v6 + mgmt_intf.itervalues().next()['forced_mgmt_routes'] = mgmt_routes + results['MGMT_INTERFACE'] = mgmt_intf + results['LOOPBACK_INTERFACE'] = lo_intfs + + phyport_intfs = {} + vlan_intfs = {} + pc_intfs = {} for intf in intfs: - intfname = intf['attachto'] - if intfname[0:4] == 'Vlan': - vlan_intfs.append(intf) - elif intfname[0:11] == 'PortChannel': - pc_intfs.append(intf) + if intf[0][0:4] == 'Vlan': + vlan_intfs[intf] = {} + elif intf[0][0:11] == 'PortChannel': + pc_intfs[intf] = {} else: - phyport_intfs.append(intf) - - results['minigraph_interfaces'] = sorted(phyport_intfs, key=lambda x: x['attachto']) - results['minigraph_vlan_interfaces'] = sorted(vlan_intfs, key=lambda x: x['attachto']) - results['minigraph_portchannel_interfaces'] = sorted(pc_intfs, key=lambda x: x['attachto']) - results['minigraph_ports'] = ports - results['minigraph_vlans'] = vlans - results['minigraph_portchannels'] = pcs - results['minigraph_mgmt_interface'] = mgmt_intf - results['minigraph_lo_interfaces'] = lo_intfs - results['minigraph_acls'] = acls - results['minigraph_neighbors'] = neighbors - results['minigraph_devices'] = devices - results['minigraph_underlay_neighbors'] = u_neighbors - results['minigraph_underlay_devices'] = u_devices - results['minigraph_as_xml'] = mini_graph_path - if devices != None: - results['minigraph_console'] = get_console_info(devices, console_dev, console_port) - results['minigraph_mgmt'] = get_mgmt_info(devices, mgmt_dev, mgmt_port) - results['minigraph_hostname'] = hostname - results['inventory_hostname'] = hostname - results['syslog_servers'] = syslog_servers - results['dhcp_servers'] = dhcp_servers - results['ntp_servers'] = ntp_servers - results['forced_mgmt_routes'] = mgmt_routes - results['erspan_dst'] = erspan_dst - results['deployment_id'] = deployment_id - results['ethernet_interfaces'] = ethernet_interfaces + phyport_intfs[intf] = {} + + results['INTERFACE'] = phyport_intfs + results['VLAN_INTERFACE'] = vlan_intfs + results['PORTCHANNEL_INTERFACE'] = pc_intfs + + for port_name in port_speeds: + ports.setdefault(port_name, {})['speed'] = port_speeds[port_name] + results['PORT'] = ports + results['PORTCHANNEL'] = pcs + results['VLAN'] = vlans + + results['DEVICE_NEIGHBOR'] = neighbors + results['SYSLOG_SERVER'] = dict((item, {}) for item in syslog_servers) + results['DHCP_SERVER'] = dict((item, {}) for item in dhcp_servers) + results['NTP_SERVER'] = dict((item, {}) for item in ntp_servers) + + results['ACL_TABLE'] = acls + mirror_sessions = {} + if erspan_dst: + lo_addr = '0.0.0.0' + for lo in lo_intfs: + lo_network = ipaddress.IPNetwork(lo[1]) + if lo_network.version == 4: + lo_addr = str(lo_network.ip) + break + count = 0 + for dst in erspan_dst: + mirror_sessions['everflow{}'.format(count)] = {"dst_ip": dst, "src_ip": lo_addr} + count += 1 + results['MIRROR_SESSION'] = mirror_sessions return results + def parse_device_desc_xml(filename): root = ET.parse(filename).getroot() (lo_prefix, mgmt_prefix, hostname, hwsku, d_type) = parse_device(root) results = {} - results['minigraph_hwsku'] = hwsku - results['minigraph_hostname'] = hostname - results['inventory_hostname'] = hostname - - lo_intfs = [] - ipn = ipaddress.IPNetwork(lo_prefix) - ipaddr = ipn.ip - prefix_len = ipn.prefixlen - ipmask = ipn.netmask - lo_intf = {'name': None, 'addr': ipaddr, 'prefixlen': prefix_len} - if isinstance(ipn, ipaddress.IPv4Network): - lo_intf['mask'] = ipmask - else: - lo_intf['mask'] = str(prefix_len) - lo_intfs.append(lo_intf) - results['minigraph_lo_interfaces'] = lo_intfs + results['DEVICE_METADATA'] = {'localhost': { + 'hostname': hostname, + 'hwsku': hwsku, + }} + + results['LOOPBACK_INTERFACE'] = {('lo', lo_prefix): {}} + + mgmt_intf = {} + mgmtipn = ipaddress.IPNetwork(mgmt_prefix) + gwaddr = ipaddress.IPAddress(int(mgmtipn.network) + 1) + results['MGMT_INTERFACE'] = {('eth0', mgmt_prefix): {'gwaddr': gwaddr}} - mgmt_intf = None - mgmt_ipn = ipaddress.IPNetwork(mgmt_prefix) - ipaddr = mgmt_ipn.ip - prefix_len = str(mgmt_ipn.prefixlen) - ipmask = mgmt_ipn.netmask - gwaddr = ipaddress.IPAddress(int(mgmt_ipn.network) + 1) - mgmt_intf = {'addr': ipaddr, 'prefixlen': prefix_len, 'mask': ipmask, 'gwaddr': gwaddr} - results['minigraph_mgmt_interface'] = mgmt_intf return results + port_alias_map = {} + def print_parse_xml(filename): results = parse_xml(filename) print(json.dumps(results, indent=3, cls=minigraph_encoder)) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 070b3100ea5a..5303557c4fb4 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -22,6 +22,7 @@ import yaml import jinja2 import netaddr import json +from functools import partial from minigraph import minigraph_encoder from minigraph import parse_xml from minigraph import parse_device_desc_xml @@ -32,11 +33,11 @@ from swsssdk import ConfigDBConnector def is_ipv4(value): if not value: return False - if isinstance(value, netaddr.IPAddress): + if isinstance(value, netaddr.IPNetwork): addr = value else: try: - addr = netaddr.IPAddress(str(value)) + addr = netaddr.IPNetwork(str(value)) except: return False return addr.version == 4 @@ -44,15 +45,25 @@ def is_ipv4(value): def is_ipv6(value): if not value: return False - if isinstance(value, netaddr.IPAddress): + if isinstance(value, netaddr.IPNetwork): addr = value else: try: - addr = netaddr.IPAddress(str(value)) + addr = netaddr.IPNetwork(str(value)) except: return False return addr.version == 6 +def prefix_attr(attr, value): + if not value: + return None + else: + try: + prefix = netaddr.IPNetwork(str(value)) + except: + return None + return str(getattr(prefix, attr)) + def unique_name(l): name_list = [] new_list = [] @@ -79,10 +90,31 @@ TODO(taoyl): Current version of config db only supports BGP admin states. def output_to_db(output_data): db_data = {} for table_name in output_data: - if table_name == 'BGP_NEIGHBOR' or table_name == 'BGP_PEER_RANGE' or table_name == 'DEVICE_METADATA': + if table_name[0].isupper(): db_data[table_name] = output_data[table_name] return db_data + @staticmethod + def to_serialized(data): + for table in data: + if type(data[table]) is dict: + for key in data[table].keys(): + new_key = ConfigDBConnector.serialize_key(key) + if new_key != key: + data[table][new_key] = data[table].pop(key) + return data + + @staticmethod + def to_deserialized(data): + for table in data: + if type(data[table]) is dict: + for key in data[table].keys(): + new_key = ConfigDBConnector.deserialize_key(key) + if new_key != key: + data[table][new_key] = data[table].pop(key) + return data + + def deep_update(dst, src): for key, value in src.iteritems(): if isinstance(value, dict): @@ -138,11 +170,11 @@ def main(): for yaml_file in args.yaml: with open(yaml_file, 'r') as stream: additional_data = yaml.load(stream) - deep_update(data, additional_data) + deep_update(data, FormatConverter.to_deserialized(additional_data)) for json_file in args.json: with open(json_file, 'r') as stream: - deep_update(data, json.load(stream)) + deep_update(data, FormatConverter.to_deserialized(json.load(stream))) if args.additional_data != None: deep_update(data, json.loads(args.additional_data)) @@ -158,6 +190,8 @@ def main(): env.filters['ipv4'] = is_ipv4 env.filters['ipv6'] = is_ipv6 env.filters['unique_name'] = unique_name + for attr in ['ip', 'network', 'prefixlen', 'netmask']: + env.filters[attr] = partial(prefix_attr, attr) template = env.get_template(template_file) print template.render(data) @@ -174,7 +208,7 @@ def main(): configdb.set_config(FormatConverter.output_to_db(data)) if args.print_data: - print json.dumps(data, indent=4, cls=minigraph_encoder) + print json.dumps(FormatConverter.to_serialized(data), indent=4, cls=minigraph_encoder) if __name__ == "__main__": diff --git a/src/sonic-config-engine/tests/sample_output/interfaces b/src/sonic-config-engine/tests/sample_output/interfaces index 5c57bf8fac85..aed23f8a5c26 100644 --- a/src/sonic-config-engine/tests/sample_output/interfaces +++ b/src/sonic-config-engine/tests/sample_output/interfaces @@ -27,6 +27,16 @@ iface eth0 inet static # management port down rules down ip route delete default via 10.0.0.1 dev eth0 table default down ip rule delete from 10.0.0.100/32 table default +iface eth0 inet6 static + address 2603:10e2:0:2902::8 + netmask 64 + ########## management network policy routing rules + # management port up rules + up ip route add default via 2603:10e2:0:2902::1 dev eth0 table default + up ip rule add from 2603:10e2:0:2902::8/32 table default + # management port down rules + down ip route delete default via 2603:10e2:0:2902::1 dev eth0 table default + down ip rule delete from 2603:10e2:0:2902::8/32 table default # # The switch front panel interfaces # "|| true" is added to suppress the error when interface is already a member of VLAN diff --git a/src/sonic-config-engine/tests/sample_output/mirror.json b/src/sonic-config-engine/tests/sample_output/mirror.json index 54065700a282..225235067e23 100644 --- a/src/sonic-config-engine/tests/sample_output/mirror.json +++ b/src/sonic-config-engine/tests/sample_output/mirror.json @@ -1,6 +1,6 @@ [ { - "MIRROR_SESSION_TABLE:everflow": { + "MIRROR_SESSION_TABLE:everflow0": { "src_ip": "10.1.0.32", "dst_ip": "2.2.2.2", "gre_type": "0x88be", diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 153b0bb14f36..cf0eb4d8cc5c 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -31,17 +31,17 @@ def test_dummy_run(self): self.assertEqual(output, '') def test_device_desc(self): - argument = '-v minigraph_hwsku -M "' + self.sample_device_desc + '"' + argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -M "' + self.sample_device_desc + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'ACS-MSN2700') def test_device_desc_mgmt_ip(self): - argument = '-v "minigraph_mgmt_interface[\'addr\']" -M "' + self.sample_device_desc + '"' + argument = '-v "MGMT_INTERFACE.keys()[0]" -M "' + self.sample_device_desc + '"' output = self.run_script(argument) - self.assertEqual(output.strip(), '10.0.1.5') + self.assertEqual(output.strip(), "('eth0', '10.0.1.5/28')") def test_minigraph_sku(self): - argument = '-v minigraph_hwsku -m "' + self.sample_graph + '"' + argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -m "' + self.sample_graph + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'Force10-Z9100') @@ -51,7 +51,7 @@ def test_print_data(self): self.assertTrue(len(output.strip()) > 0) def test_jinja_expression(self): - argument = '-m "' + self.sample_graph + '" -v "minigraph_devices[minigraph_hostname][\'type\']"' + argument = '-m "' + self.sample_graph + '" -v "DEVICE_METADATA[\'localhost\'][\'type\']"' output = self.run_script(argument) self.assertEqual(output.strip(), 'LeafRouter') @@ -71,44 +71,44 @@ def test_render_template(self): self.assertEqual(output.strip(), 'value1\nvalue2') def test_minigraph_acl(self): - argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v minigraph_acls' + argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v ACL_TABLE' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'dataacl': {'IsMirror': False, 'AttachTo': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}}") + self.assertEqual(output.strip(), "{'dataacl': {'type': 'L3', 'policy_desc': 'dataacl', 'ports': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}}") def test_minigraph_interfaces(self): - argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_interfaces' + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v \'INTERFACE.keys()\'' output = self.run_script(argument) - self.assertEqual(output.strip(), "[{'subnet': IPv4Network('10.0.0.58/31'), 'peer_addr': IPv4Address('10.0.0.59'), 'addr': IPv4Address('10.0.0.58'), 'mask': IPv4Address('255.255.255.254'), 'attachto': 'Ethernet0', 'prefixlen': 31}, {'subnet': IPv6Network('fc00::74/126'), 'peer_addr': IPv6Address('fc00::76'), 'addr': IPv6Address('fc00::75'), 'mask': '126', 'attachto': 'Ethernet0', 'prefixlen': 126}]") + self.assertEqual(output.strip(), "[('Ethernet0', '10.0.0.58/31'), ('Ethernet0', 'FC00::75/126')]") def test_minigraph_vlans(self): - argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_vlans' + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v VLAN' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'Vlan1000': {'name': 'Vlan1000', 'members': ['Ethernet8'], 'vlanid': '1000'}}") + self.assertEqual(output.strip(), "{'Vlan1000': {'members': ['Ethernet8'], 'vlanid': '1000'}}") def test_minigraph_vlan_interfaces(self): - argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_vlan_interfaces' + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v "VLAN_INTERFACE.keys()"' output = self.run_script(argument) - self.assertEqual(output.strip(), "[{'prefixlen': 27, 'subnet': IPv4Network('192.168.0.0/27'), 'mask': IPv4Address('255.255.255.224'), 'addr': IPv4Address('192.168.0.1'), 'attachto': 'Vlan1000'}]") + self.assertEqual(output.strip(), "[('Vlan1000', '192.168.0.1/27')]") def test_minigraph_portchannels(self): - argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_portchannels' + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v PORTCHANNEL' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'PortChannel01': {'name': 'PortChannel01', 'members': ['Ethernet4']}}") + self.assertEqual(output.strip(), "{'PortChannel01': {'members': ['Ethernet4']}}") def test_minigraph_portchannels_more_member(self): - argument = '-m "' + self.sample_graph_pc_test + '" -p "' + self.port_config + '" -v minigraph_portchannels' + argument = '-m "' + self.sample_graph_pc_test + '" -p "' + self.port_config + '" -v PORTCHANNEL' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'PortChannel01': {'name': 'PortChannel01', 'members': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}}") + self.assertEqual(output.strip(), "{'PortChannel01': {'members': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}}") def test_minigraph_portchannel_interfaces(self): - argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v minigraph_portchannel_interfaces' + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v "PORTCHANNEL_INTERFACE.keys()"' output = self.run_script(argument) - self.assertEqual(output.strip(), "[{'subnet': IPv4Network('10.0.0.56/31'), 'peer_addr': IPv4Address('10.0.0.57'), 'addr': IPv4Address('10.0.0.56'), 'mask': IPv4Address('255.255.255.254'), 'attachto': 'PortChannel01', 'prefixlen': 31}, {'subnet': IPv6Network('fc00::70/126'), 'peer_addr': IPv6Address('fc00::72'), 'addr': IPv6Address('fc00::71'), 'mask': '126', 'attachto': 'PortChannel01', 'prefixlen': 126}]") + self.assertEqual(output.strip(), "[('PortChannel01', 'FC00::71/126'), ('PortChannel01', '10.0.0.56/31')]") def test_minigraph_neighbors(self): - argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v minigraph_neighbors' + argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v "DEVICE_NEIGHBOR[\'ARISTA01T1\']"' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'Ethernet116': {'name': 'ARISTA02T1', 'port': 'Ethernet1/1'}, 'Ethernet124': {'name': 'ARISTA04T1', 'port': 'Ethernet1/1'}, 'Ethernet112': {'name': 'ARISTA01T1', 'port': 'Ethernet1/1'}, 'Ethernet120': {'name': 'ARISTA03T1', 'port': 'Ethernet1/1'}}") + self.assertEqual(output.strip(), "{'mgmt_addr': None, 'hwsku': 'Arista', 'lo_addr': None, 'local_port': 'Ethernet112', 'type': 'LeafRouter', 'port': 'Ethernet1/1'}") def test_minigraph_peers_with_range(self): argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v BGP_PEER_RANGE.values\(\)' @@ -116,11 +116,11 @@ def test_minigraph_peers_with_range(self): self.assertEqual(output.strip(), "[{'name': 'BGPSLBPassive', 'ip_range': ['10.10.10.10/26', '100.100.100.100/26']}]") def test_minigraph_deployment_id(self): - argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v deployment_id' + argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v "DEVICE_METADATA[\'localhost\'][\'deployment_id\']"' output = self.run_script(argument) self.assertEqual(output.strip(), "1") def test_minigraph_ethernet_interfaces(self): - argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v ethernet_interfaces' + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v "PORT[\'Ethernet8\']"' output = self.run_script(argument) - self.assertEqual(output.strip(), "[{'speed': '10000', 'name': 'fortyGigE0/0'}, {'speed': '25000', 'name': 'fortyGigE0/4'}, {'speed': '40000', 'name': 'fortyGigE0/8'}, {'speed': '1000000', 'name': 'fortyGigE0/12'}]") + self.assertEqual(output.strip(), "{'alias': 'fortyGigE0/8', 'speed': '40000'}") diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 0f9264eb1d3b..9b71fc72b932 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -40,7 +40,7 @@ def test_render_teamd(self, pc, minigraph, sample_output): self.assertTrue(filecmp.cmp(sample_output, self.output_file)) # Test T0 minigraph - argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -v "minigraph_portchannels.keys() | join(\' \')"' + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -v "PORTCHANNEL.keys() | join(\' \') if PORTCHANNEL"' output = self.run_script(argument) # Mock the output via config.sh in docker-teamd pc_list = output.split() @@ -51,7 +51,7 @@ def test_render_teamd(self, pc, minigraph, sample_output): test_render_teamd(self, pc_name, self.t0_minigraph, sample_output) # Test port channel test minigraph - argument = '-m ' + self.pc_minigraph + ' -p ' + self.t0_port_config + ' -v "minigraph_portchannels.keys() | join(\' \')"' + argument = '-m ' + self.pc_minigraph + ' -p ' + self.t0_port_config + ' -v "PORTCHANNEL.keys() | join(\' \') if PORTCHANNEL"' output = self.run_script(argument) # Mock the output via config.sh in docker-teamd pc_list = output.split() diff --git a/src/sonic-config-engine/translate_acl b/src/sonic-config-engine/translate_acl index 5525eff96774..b8138cf36b18 100755 --- a/src/sonic-config-engine/translate_acl +++ b/src/sonic-config-engine/translate_acl @@ -110,13 +110,14 @@ def generate_rule_json(table_name, rule, max_priority, mirror): rule_props["TCP_FLAGS"] = '0x{:02x}/0x{:02x}'.format(tcp_flags, tcp_flags) return rule_data -def generate_table_json(aclset, aclname, ports, mirror, max_priority, output_path='.'): +def generate_table_json(aclset, aclname, ports, t_type, max_priority, output_path='.'): table_name = aclname.replace(" ", "_").replace("-", "_") #table_name = generate_random_table_name() + mirror = (t_type == 'mirror') table_props = {} table_props["policy_desc"] = table_name - table_props["type"] = "mirror" if mirror else "L3" + table_props["type"] = t_type table_props["ports"] = ports table_data = [{}] @@ -138,7 +139,7 @@ def translate_acl_fixed_port(filename, output_path, port, max_priority): yang_acl = pybindJSON.load(filename, openconfig_acl, "openconfig_acl") for aclsetname in yang_acl.acl.acl_sets.acl_set: aclset = yang_acl.acl.acl_sets.acl_set[aclsetname] - generate_table_json(aclset, aclsetname, port, max_priority, output_path) + generate_table_json(aclset, aclsetname, port, 'l3', max_priority, output_path) return def translate_acl(filename, output_path, mini_acl, max_priority): @@ -146,10 +147,10 @@ def translate_acl(filename, output_path, mini_acl, max_priority): for aclsetname in yang_acl.acl.acl_sets.acl_set: tablename = aclsetname.replace(" ", "_").replace("-", "_") if mini_acl.has_key(tablename): - is_mirror = mini_acl[tablename]['IsMirror'] - ports = ','.join(mini_acl[tablename]['AttachTo']) + t_type = mini_acl[tablename]['type'] + ports = ','.join(mini_acl[tablename]['ports']) aclset = yang_acl.acl.acl_sets.acl_set[aclsetname] - generate_table_json(aclset, aclsetname, ports, is_mirror, max_priority, output_path) + generate_table_json(aclset, aclsetname, ports, t_type, max_priority, output_path) return def main(): @@ -166,8 +167,8 @@ def main(): translate_acl_fixed_port(args.input, args.output_path, args.port, args.max_priority) elif args.minigraph: mini_data = parse_xml(args.minigraph, port_config_file=args.port_config) - if mini_data['minigraph_acls']: - translate_acl(args.input, args.output_path, mini_data['minigraph_acls'], args.max_priority) + if mini_data['ACL_TABLE']: + translate_acl(args.input, args.output_path, mini_data['ACL_TABLE'], args.max_priority) if __name__ == "__main__": main() diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 9b54b80f1783..7f8e7c5ad974 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 9b54b80f1783808c5ae2a30e189f24a7404a8c95 +Subproject commit 7f8e7c5ad9747af1d8ce5317eb1ece65ed4c0c7a From 686e227dcccabdf9c3ed8bffec2e0c2a026ccbf4 Mon Sep 17 00:00:00 2001 From: nikos-li <31227248+nikos-li@users.noreply.github.com> Date: Tue, 12 Sep 2017 15:48:38 -0700 Subject: [PATCH 0770/1011] [frr]: RR client support in minigraph for FRR (#923) --- dockers/docker-fpm-frr/bgpd.conf.j2 | 6 ++++++ src/sonic-config-engine/minigraph.py | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/dockers/docker-fpm-frr/bgpd.conf.j2 b/dockers/docker-fpm-frr/bgpd.conf.j2 index 0f1e255b5cd1..f17464e3f893 100644 --- a/dockers/docker-fpm-frr/bgpd.conf.j2 +++ b/dockers/docker-fpm-frr/bgpd.conf.j2 @@ -57,12 +57,18 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% if neighbor_addr | ipv4 %} address-family ipv4 neighbor {{ neighbor_addr }} activate +{% if bgp_session['rrclient'] != 0 %} + neighbor {{ neighbor_addr }} route-reflector-client +{% endif %} maximum-paths 64 exit-address-family {% endif %} {% if neighbor_addr | ipv6 %} address-family ipv6 neighbor {{ neighbor_addr }} activate +{% if bgp_session['rrclient'] != 0 %} + neighbor {{ neighbor_addr }} route-reflector-client +{% endif %} maximum-paths 64 exit-address-family {% endif %} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 565a1a43d060..7cf4d2f829cc 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -233,6 +233,10 @@ def parse_cpg(cpg, hname): for router in child.findall(str(QName(ns1, "BGPRouterDeclaration"))): asn = router.find(str(QName(ns1, "ASN"))).text hostname = router.find(str(QName(ns1, "Hostname"))).text + if router.find(str(QName(ns1, "RRClient"))): + rrclient = '1' + else: + rrclient = '0' if hostname == hname: myasn = int(asn) peers = router.find(str(QName(ns1, "Peers"))) @@ -251,6 +255,7 @@ def parse_cpg(cpg, hname): bgp_session = bgp_sessions[peer] if hostname == bgp_session['name']: bgp_session['asn'] = int(asn) + bgp_session['rrclient'] = int(rrclient) return bgp_sessions, myasn, bgp_peers_with_range From e4cae4e8897b7f613365d9242df17f30a742dc78 Mon Sep 17 00:00:00 2001 From: cytsai0409 Date: Thu, 14 Sep 2017 10:18:26 +0800 Subject: [PATCH 0771/1011] [Ingrasys] update port_config.ini and sfputil for ingrasys platforms (#952) * [Ingrasys] update port_config.ini and sfputil for ingrasys platforms - What I did Update port_config.ini on S8810-32Q/S8900-54XC/S8900-64XC/S9100-C32 platforms - How I did it Update alias field and add port field in port_config.ini - How to verify it Check with the "sfputil show eeprom" command. If no error occurs, it is passed. - Description for the changelog Update port_config.ini on S8810-32Q/S8900-54XC/S8900-64XC/S9100-C32 platforms * [Ingrasys] remove debug message in sfputil.py on S8810-32Q - What I did remove debug message in sfputil.py on S8810-32Q - How I did it remove print in get_low_power_mode() and set_low_power_mode() - How to verify it There should be no debug message when executing "sfputil show lpmode" and "sfputil lpmode on Ethernet0"command. - Description for the changelog remove debug message in sfputil.py on S8810-32Q - A picture of a cute animal (not mandatory but encouraged) --- .../INGRASYS-S8810-32Q/port_config.ini | 66 ++--- .../plugins/sfputil.py | 200 +++++++++++----- .../INGRASYS-S8900-54XC/port_config.ini | 110 ++++----- .../plugins/sfputil.py | 225 ++++++++++++++++-- .../INGRASYS-S8900-64XC/port_config.ini | 130 +++++----- .../INGRASYS-S9100-C32/port_config.ini | 66 ++--- 6 files changed, 540 insertions(+), 257 deletions(-) diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini index fb9235101108..a313c9cda21f 100644 --- a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini @@ -1,33 +1,33 @@ -# name lanes alias -Ethernet0 37,38,39,40 -Ethernet4 33,34,35,36 -Ethernet8 45,46,47,48 -Ethernet12 41,42,43,44 -Ethernet16 53,54,55,56 -Ethernet20 49,50,51,52 -Ethernet24 61,62,63,64 -Ethernet28 57,58,59,60 -Ethernet32 69,70,71,72 -Ethernet36 65,66,67,68 -Ethernet40 77,78,79,80 -Ethernet44 73,74,75,76 -Ethernet48 85,86,87,88 -Ethernet52 81,82,83,84 -Ethernet56 93,94,95,96 -Ethernet60 89,90,91,92 -Ethernet64 101,102,103,104 -Ethernet68 97,98,99,100 -Ethernet72 109,110,111,112 -Ethernet76 105,106,107,108 -Ethernet80 117,118,119,120 -Ethernet84 113,114,115,116 -Ethernet88 125,126,127,128 -Ethernet92 121,122,123,124 -Ethernet96 5,6,7,8 -Ethernet100 1,2,3,4 -Ethernet104 13,14,15,16 -Ethernet108 9,10,11,12 -Ethernet112 21,22,23,24 -Ethernet116 17,18,19,20 -Ethernet120 29,30,31,32 -Ethernet124 25,26,27,28 +# name lanes alias port +Ethernet0 37,38,39,40 Ethernet1/1 0 +Ethernet4 33,34,35,36 Ethernet2/1 1 +Ethernet8 45,46,47,48 Ethernet3/1 2 +Ethernet12 41,42,43,44 Ethernet4/1 3 +Ethernet16 53,54,55,56 Ethernet5/1 4 +Ethernet20 49,50,51,52 Ethernet6/1 5 +Ethernet24 61,62,63,64 Ethernet7/1 6 +Ethernet28 57,58,59,60 Ethernet8/1 7 +Ethernet32 69,70,71,72 Ethernet9/1 8 +Ethernet36 65,66,67,68 Ethernet10/1 9 +Ethernet40 77,78,79,80 Ethernet11/1 10 +Ethernet44 73,74,75,76 Ethernet12/1 11 +Ethernet48 85,86,87,88 Ethernet13/1 12 +Ethernet52 81,82,83,84 Ethernet14/1 13 +Ethernet56 93,94,95,96 Ethernet15/1 14 +Ethernet60 89,90,91,92 Ethernet16/1 15 +Ethernet64 101,102,103,104 Ethernet17/1 16 +Ethernet68 97,98,99,100 Ethernet18/1 17 +Ethernet72 109,110,111,112 Ethernet19/1 18 +Ethernet76 105,106,107,108 Ethernet20/1 19 +Ethernet80 117,118,119,120 Ethernet21/1 20 +Ethernet84 113,114,115,116 Ethernet22/1 21 +Ethernet88 125,126,127,128 Ethernet23/1 22 +Ethernet92 121,122,123,124 Ethernet24/1 23 +Ethernet96 5,6,7,8 Ethernet25/1 24 +Ethernet100 1,2,3,4 Ethernet26/1 25 +Ethernet104 13,14,15,16 Ethernet27/1 26 +Ethernet108 9,10,11,12 Ethernet28/1 27 +Ethernet112 21,22,23,24 Ethernet29/1 28 +Ethernet116 17,18,19,20 Ethernet30/1 29 +Ethernet120 29,30,31,32 Ethernet31/1 30 +Ethernet124 25,26,27,28 Ethernet32/1 31 diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/sfputil.py index 7bc71c27eeb6..bef254484ac4 100644 --- a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/sfputil.py +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/plugins/sfputil.py @@ -1,61 +1,147 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") - - -class sfputil(sfputilbase): - """Platform specific sfputil class""" - - port_start = 0 - port_end = 31 - ports_in_block = 32 - - port_to_eeprom_mapping = {} - #FIXME - port_to_i2c_mapping = { - 0: 18, - 1: 19, - 2: 20, - 3: 21, - 4: 22, - 5: 23, - 6: 24, - 7: 25, - 8: 26, - 9: 27, - 10: 28, - 11: 29, - 12: 30, - 13: 31, - 14: 32, - 15: 33, - 16: 34, - 17: 35, - 18: 36, - 19: 37, - 20: 38, - 21: 39, - 22: 40, - 23: 41, - 24: 42, - 25: 43, - 26: 44, - 27: 45, - 28: 46, - 29: 47, - 30: 48, - 31: 49 - } - - _qsfp_ports = range(0, ports_in_block + 1) - - def __init__(self, port_num): + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 + + EEPROM_OFFSET = 18 + + ABS_GPIO_BASE = 224 + #INT_GPIO_BASE = 192 + LP_GPIO_BASE = 160 + RST_GPIO_BASE = 128 + + BASE_DIR_PATH = "/sys/class/gpio/gpio{0}/direction" + BASE_VAL_PATH = "/sys/class/gpio/gpio{0}/value" + + _port_to_eeprom_mapping = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + for x in range(self.port_start, self.port_end + 1): - port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) - self.port_to_eeprom_mapping[x] = port_eeprom_path - sfputilbase.__init__(self, port_num) + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + abs_device_file = self.BASE_VAL_PATH.format( + port_num + self.ABS_GPIO_BASE) + val_file = open(abs_device_file) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + + # content is a string, either "0" or "1" + if content == "1": + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + lpmode_val_device_file = self.BASE_VAL_PATH.format( + port_num + self.LP_GPIO_BASE) + val_file = open(lpmode_val_device_file) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + + # content is a string, either "0" or "1" + if content == "1": + return True + + return False + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + lpmode_val_device_file = self.BASE_VAL_PATH.format( + port_num + self.LP_GPIO_BASE) + val_file = open(lpmode_val_device_file, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + val_file.write("1" if lpmode is True else "0") + val_file.close() + + return True + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reset_val_device_file = self.BASE_VAL_PATH.format( + port_num + self.RST_GPIO_BASE) + val_file = open(reset_val_device_file, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + val_file.write("1") + val_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + try: + reset_val_device_file = self.BASE_VAL_PATH.format( + port_num + self.RST_GPIO_BASE) + val_file = open(reset_val_device_file, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + val_file.write("0") + val_file.close() + + return True diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini index 24a2b8e29222..c1243db622f6 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini @@ -1,55 +1,55 @@ -# name lanes alias -Ethernet0 1 -Ethernet1 2 -Ethernet2 3 -Ethernet3 4 -Ethernet4 5 -Ethernet5 6 -Ethernet6 7 -Ethernet7 8 -Ethernet8 9 -Ethernet9 10 -Ethernet10 11 -Ethernet11 12 -Ethernet12 21 -Ethernet13 22 -Ethernet14 23 -Ethernet15 24 -Ethernet16 33 -Ethernet17 34 -Ethernet18 35 -Ethernet19 36 -Ethernet20 37 -Ethernet21 38 -Ethernet22 39 -Ethernet23 40 -Ethernet24 41 -Ethernet25 42 -Ethernet26 43 -Ethernet27 44 -Ethernet28 49 -Ethernet29 50 -Ethernet30 51 -Ethernet31 52 -Ethernet32 53 -Ethernet33 54 -Ethernet34 55 -Ethernet35 56 -Ethernet36 65 -Ethernet37 66 -Ethernet38 67 -Ethernet39 68 -Ethernet40 69 -Ethernet41 70 -Ethernet42 71 -Ethernet43 72 -Ethernet44 81 -Ethernet45 82 -Ethernet46 83 -Ethernet47 84 -Ethernet48 85,86,87,88 -Ethernet52 97,98,99,100 -Ethernet56 101,102,103,104 -Ethernet60 105,106,107,108 -Ethernet64 109,110,111,112 -Ethernet68 117,118,119,120 +# name lanes alias port +Ethernet0 1 Ethernet1 0 +Ethernet1 2 Ethernet2 1 +Ethernet2 3 Ethernet3 2 +Ethernet3 4 Ethernet4 3 +Ethernet4 5 Ethernet5 4 +Ethernet5 6 Ethernet6 5 +Ethernet6 7 Ethernet7 6 +Ethernet7 8 Ethernet8 7 +Ethernet8 9 Ethernet9 8 +Ethernet9 10 Ethernet10 9 +Ethernet10 11 Ethernet11 10 +Ethernet11 12 Ethernet12 11 +Ethernet12 21 Ethernet13 12 +Ethernet13 22 Ethernet14 13 +Ethernet14 23 Ethernet15 14 +Ethernet15 24 Ethernet16 15 +Ethernet16 33 Ethernet17 16 +Ethernet17 34 Ethernet18 17 +Ethernet18 35 Ethernet19 18 +Ethernet19 36 Ethernet20 19 +Ethernet20 37 Ethernet21 20 +Ethernet21 38 Ethernet22 21 +Ethernet22 39 Ethernet23 22 +Ethernet23 40 Ethernet24 23 +Ethernet24 41 Ethernet25 24 +Ethernet25 42 Ethernet26 25 +Ethernet26 43 Ethernet27 26 +Ethernet27 44 Ethernet28 27 +Ethernet28 49 Ethernet29 28 +Ethernet29 50 Ethernet30 29 +Ethernet30 51 Ethernet31 30 +Ethernet31 52 Ethernet32 31 +Ethernet32 53 Ethernet33 32 +Ethernet33 54 Ethernet34 33 +Ethernet34 55 Ethernet35 34 +Ethernet35 56 Ethernet36 35 +Ethernet36 65 Ethernet37 36 +Ethernet37 66 Ethernet38 37 +Ethernet38 67 Ethernet39 38 +Ethernet39 68 Ethernet40 39 +Ethernet40 69 Ethernet41 40 +Ethernet41 70 Ethernet42 41 +Ethernet42 71 Ethernet43 42 +Ethernet43 72 Ethernet44 43 +Ethernet44 81 Ethernet45 44 +Ethernet45 82 Ethernet46 45 +Ethernet46 83 Ethernet47 46 +Ethernet47 84 Ethernet48 47 +Ethernet48 85,86,87,88 Ethernet49/1 48 +Ethernet52 97,98,99,100 Ethernet50/1 49 +Ethernet56 101,102,103,104 Ethernet51/1 50 +Ethernet60 105,106,107,108 Ethernet52/1 51 +Ethernet64 109,110,111,112 Ethernet53/1 52 +Ethernet68 117,118,119,120 Ethernet54/1 53 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py index 96fa0fca86ce..0bb52e88616a 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py @@ -1,19 +1,27 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -class sfputil(sfputilbase): - """Platform specific sfputil class""" +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" - port_start = 0 - port_end = 53 - ports_in_block = 54 + PORT_START = 0 + PORT_END = 53 + QSFP_PORT_START = 48 + PORTS_IN_BLOCK = 54 + + BASE_DIR_PATH = "/sys/class/gpio/gpio{0}/direction" + BASE_VAL_PATH = "/sys/class/gpio/gpio{0}/value" - port_to_eeprom_mapping = {} + _port_to_eeprom_mapping = {} port_to_i2c_mapping = { 0: 18, 1: 19, @@ -71,12 +79,201 @@ class sfputil(sfputilbase): 53: 71 } - _qsfp_ports = range(0, ports_in_block + 1) + abs_to_gpio_mapping = { + 0: 192, + 1: 193, + 2: 194, + 3: 195, + 4: 196, + 5: 197, + 6: 198, + 7: 199, + 8: 200, + 9: 201, + 10: 202, + 11: 203, + 12: 204, + 13: 205, + 14: 206, + 15: 207, + 16: 176, + 17: 177, + 18: 178, + 19: 179, + 20: 180, + 21: 181, + 22: 182, + 23: 183, + 24: 184, + 25: 185, + 26: 186, + 27: 187, + 28: 188, + 29: 189, + 30: 190, + 31: 191, + 32: 160, + 33: 161, + 34: 162, + 35: 163, + 36: 164, + 37: 165, + 38: 166, + 39: 167, + 40: 168, + 41: 169, + 42: 170, + 43: 171, + 44: 172, + 45: 173, + 46: 174, + 47: 175, + 48: 240, + 49: 241, + 50: 242, + 51: 243, + 52: 244, + 53: 245 + } + + lpmode_to_gpio_mapping = { + 48: 224, + 49: 225, + 50: 226, + 51: 227, + 52: 228, + 53: 229 + } + + reset_to_gpio_mapping = { + 48: 208, + 49: 209, + 50: 210, + 51: 211, + 52: 212, + 53: 213 + } + + @property + def port_start(self): + return self.PORT_START + + @property + def qsfp_port_start(self): + return self.QSFP_PORT_START - def __init__(self, port_num): + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + for x in range(self.port_start, self.port_end + 1): port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) self.port_to_eeprom_mapping[x] = port_eeprom_path - sfputilbase.__init__(self, port_num) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + abs_device_file = self.BASE_VAL_PATH.format( + self.abs_to_gpio_mapping[port_num]) + val_file = open(abs_device_file) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + + # content is a string, either "0" or "1" + if content == "1": + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.qsfp_port_start or port_num > self.port_end: + return False + + try: + lpmode_val_device_file = self.BASE_VAL_PATH.format( + self.lpmode_to_gpio_mapping[port_num]) + val_file = open(lpmode_val_device_file) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + + # content is a string, either "0" or "1" + if content == "1": + return True + + return False + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.qsfp_port_start or port_num > self.port_end: + return False + + try: + lpmode_val_device_file = self.BASE_VAL_PATH.format( + self.lpmode_to_gpio_mapping[port_num]) + val_file = open(lpmode_val_device_file, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + val_file.write("1" if lpmode is True else "0") + val_file.close() + + return True + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self.qsfp_port_start or port_num > self.port_end: + print "Error: unable to reset non-QSFP module: port %s" % str(port_num) + return False + + try: + print "port %s" % str(port_num) + reset_val_device_file = self.BASE_VAL_PATH.format( + self.reset_to_gpio_mapping[port_num]) + val_file = open(reset_val_device_file, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + val_file.write("1") + val_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + try: + reset_val_device_file = self.BASE_VAL_PATH.format( + self.reset_to_gpio_mapping[port_num]) + val_file = open(reset_val_device_file, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + val_file.write("0") + val_file.close() + + return True diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini index 3e5c7be570e1..20c2138dfeb3 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini @@ -1,65 +1,65 @@ -# name lanes alias -Ethernet0 17 -Ethernet1 18 -Ethernet2 19 -Ethernet3 20 -Ethernet4 24 -Ethernet5 23 -Ethernet6 22 -Ethernet7 21 -Ethernet8 28 -Ethernet9 27 -Ethernet10 26 -Ethernet11 25 -Ethernet12 32 -Ethernet13 31 -Ethernet14 30 -Ethernet15 29 -Ethernet16 1 -Ethernet17 2 -Ethernet18 3 -Ethernet19 4 -Ethernet20 8 -Ethernet21 7 -Ethernet22 6 -Ethernet23 5 -Ethernet24 12 -Ethernet25 11 -Ethernet26 10 -Ethernet27 9 -Ethernet28 13 -Ethernet29 14 -Ethernet30 15 -Ethernet31 16 -Ethernet32 33 -Ethernet33 34 -Ethernet34 35 -Ethernet35 36 -Ethernet36 38 -Ethernet37 39 -Ethernet38 40 -Ethernet39 37 -Ethernet40 41 -Ethernet41 42 -Ethernet42 43 -Ethernet43 44 -Ethernet44 48 -Ethernet45 45 -Ethernet46 46 -Ethernet47 47 -Ethernet48 49,50,51,52 -Ethernet52 53,54,55,56 -Ethernet56 57,58,59,60 -Ethernet60 61,62,63,64 -Ethernet64 65,66,67,68 -Ethernet68 69,70,71,72 -Ethernet72 73,74,75,76 -Ethernet76 77,78,79,80 -Ethernet80 81,82,83,84 -Ethernet84 85,86,87,88 -Ethernet88 89,90,91,92 -Ethernet92 93,94,95,96 -Ethernet96 97,98,99,100 -Ethernet100 101,102,103,104 -Ethernet104 105,106,107,108 -Ethernet108 109,110,111,112 +# name lanes alias port +Ethernet0 17 Ethernet1 0 +Ethernet1 18 Ethernet2 1 +Ethernet2 19 Ethernet3 2 +Ethernet3 20 Ethernet4 3 +Ethernet4 24 Ethernet5 4 +Ethernet5 23 Ethernet6 5 +Ethernet6 22 Ethernet7 6 +Ethernet7 21 Ethernet8 7 +Ethernet8 28 Ethernet9 8 +Ethernet9 27 Ethernet10 9 +Ethernet10 26 Ethernet11 10 +Ethernet11 25 Ethernet12 11 +Ethernet12 32 Ethernet13 12 +Ethernet13 31 Ethernet14 13 +Ethernet14 30 Ethernet15 14 +Ethernet15 29 Ethernet16 15 +Ethernet16 1 Ethernet17 16 +Ethernet17 2 Ethernet18 17 +Ethernet18 3 Ethernet19 18 +Ethernet19 4 Ethernet20 19 +Ethernet20 8 Ethernet21 20 +Ethernet21 7 Ethernet22 21 +Ethernet22 6 Ethernet23 22 +Ethernet23 5 Ethernet24 23 +Ethernet24 12 Ethernet25 24 +Ethernet25 11 Ethernet26 25 +Ethernet26 10 Ethernet27 26 +Ethernet27 9 Ethernet28 27 +Ethernet28 13 Ethernet29 28 +Ethernet29 14 Ethernet30 29 +Ethernet30 15 Ethernet31 30 +Ethernet31 16 Ethernet32 31 +Ethernet32 33 Ethernet33 32 +Ethernet33 34 Ethernet34 33 +Ethernet34 35 Ethernet35 34 +Ethernet35 36 Ethernet36 35 +Ethernet36 38 Ethernet37 36 +Ethernet37 39 Ethernet38 37 +Ethernet38 40 Ethernet39 38 +Ethernet39 37 Ethernet40 39 +Ethernet40 41 Ethernet41 40 +Ethernet41 42 Ethernet42 41 +Ethernet42 43 Ethernet43 42 +Ethernet43 44 Ethernet44 43 +Ethernet44 48 Ethernet45 44 +Ethernet45 45 Ethernet46 45 +Ethernet46 46 Ethernet47 46 +Ethernet47 47 Ethernet48 47 +Ethernet48 49,50,51,52 Ethernet49/1 48 +Ethernet52 53,54,55,56 Ethernet50/1 49 +Ethernet56 57,58,59,60 Ethernet51/1 50 +Ethernet60 61,62,63,64 Ethernet52/1 51 +Ethernet64 65,66,67,68 Ethernet53/1 52 +Ethernet68 69,70,71,72 Ethernet54/1 53 +Ethernet72 73,74,75,76 Ethernet55/1 54 +Ethernet76 77,78,79,80 Ethernet56/1 55 +Ethernet80 81,82,83,84 Ethernet57/1 56 +Ethernet84 85,86,87,88 Ethernet58/1 57 +Ethernet88 89,90,91,92 Ethernet59/1 58 +Ethernet92 93,94,95,96 Ethernet60/1 59 +Ethernet96 97,98,99,100 Ethernet61/1 60 +Ethernet100 101,102,103,104 Ethernet62/1 61 +Ethernet104 105,106,107,108 Ethernet63/1 62 +Ethernet108 109,110,111,112 Ethernet64/1 63 diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini index d70c717fe4e2..6c62497b8927 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini @@ -1,33 +1,33 @@ -# name lanes alias -Ethernet0 5,6,7,8 -Ethernet4 1,2,3,4 -Ethernet8 13,14,15,16 -Ethernet12 9,10,11,12 -Ethernet16 21,22,23,24 -Ethernet20 17,18,19,20 -Ethernet24 29,30,31,32 -Ethernet28 25,26,27,28 -Ethernet32 37,38,39,40 -Ethernet36 33,34,35,36 -Ethernet40 45,46,47,48 -Ethernet44 41,42,43,44 -Ethernet48 53,54,55,56 -Ethernet52 49,50,51,52 -Ethernet56 61,62,63,64 -Ethernet60 57,58,59,60 -Ethernet64 69,70,71,72 -Ethernet68 65,66,67,68 -Ethernet72 77,78,79,80 -Ethernet76 73,74,75,76 -Ethernet80 85,86,87,88 -Ethernet84 81,82,83,84 -Ethernet88 93,94,95,96 -Ethernet92 89,90,91,92 -Ethernet96 101,102,103,104 -Ethernet100 97,98,99,100 -Ethernet104 109,110,111,112 -Ethernet108 105,106,107,108 -Ethernet112 117,118,119,120 -Ethernet116 113,114,115,116 -Ethernet120 125,126,127,128 -Ethernet124 121,122,123,124 +# name lanes alias port +Ethernet0 5,6,7,8 Ethernet1/1 0 +Ethernet4 1,2,3,4 Ethernet2/1 1 +Ethernet8 13,14,15,16 Ethernet3/1 2 +Ethernet12 9,10,11,12 Ethernet4/1 3 +Ethernet16 21,22,23,24 Ethernet5/1 4 +Ethernet20 17,18,19,20 Ethernet6/1 5 +Ethernet24 29,30,31,32 Ethernet7/1 6 +Ethernet28 25,26,27,28 Ethernet8/1 7 +Ethernet32 37,38,39,40 Ethernet9/1 8 +Ethernet36 33,34,35,36 Ethernet10/1 9 +Ethernet40 45,46,47,48 Ethernet11/1 10 +Ethernet44 41,42,43,44 Ethernet12/1 11 +Ethernet48 53,54,55,56 Ethernet13/1 12 +Ethernet52 49,50,51,52 Ethernet14/1 13 +Ethernet56 61,62,63,64 Ethernet15/1 14 +Ethernet60 57,58,59,60 Ethernet16/1 15 +Ethernet64 69,70,71,72 Ethernet17/1 16 +Ethernet68 65,66,67,68 Ethernet18/1 17 +Ethernet72 77,78,79,80 Ethernet19/1 18 +Ethernet76 73,74,75,76 Ethernet20/1 19 +Ethernet80 85,86,87,88 Ethernet21/1 20 +Ethernet84 81,82,83,84 Ethernet22/1 21 +Ethernet88 93,94,95,96 Ethernet23/1 22 +Ethernet92 89,90,91,92 Ethernet24/1 23 +Ethernet96 101,102,103,104 Ethernet25/1 24 +Ethernet100 97,98,99,100 Ethernet26/1 25 +Ethernet104 109,110,111,112 Ethernet27/1 26 +Ethernet108 105,106,107,108 Ethernet28/1 27 +Ethernet112 117,118,119,120 Ethernet29/1 28 +Ethernet116 113,114,115,116 Ethernet30/1 29 +Ethernet120 125,126,127,128 Ethernet31/1 30 +Ethernet124 121,122,123,124 Ethernet32/1 31 From 72412797ff911dee502df40f2a26e635012cad76 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 14 Sep 2017 04:11:08 +0000 Subject: [PATCH 0772/1011] [mellanox]: Update Mellanox SAI version ansd SDK version --- platform/mellanox/mlnx-sai.mk | 4 ++-- platform/mellanox/sdk.mk | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index fbf4f94b590e..d9ee588a0dfe 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI -MLNX_SAI_VERSION = SAIRel1.8.2-master -MLNX_SAI_REVISION = 6b094746adc7ef2321701b4868806bc54a95bbd1 +MLNX_SAI_VERSION = sonic1.9.1fixes-master +MLNX_SAI_REVISION = 4ebc01e95b754c56da7f8b5fb45b82fbe661d05a export MLNX_SAI_VERSION MLNX_SAI_REVISION diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index 56e3145945f8..7c517627c23d 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,5 +1,5 @@ -MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/sonicv1.0.2/sdk -MLNX_SDK_VERSION = 4.2.5008 +MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/4ebc01e95b754c56da7f8b5fb45b82fbe661d05a/sdk +MLNX_SDK_VERSION = 4.2.5010 MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2) $(SX_ACL_RM) $(SX_COMPLIB) \ $(SX_EXAMPLES) $(SX_GEN_UTILS) $(SX_SCEW) $(SX_SDN_HAL) \ $(SXD_LIBS) $(TESTX) From 2e3975d6ed76fe674bcb3fa88f493d913acacccd Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 13 Sep 2017 21:23:06 -0700 Subject: [PATCH 0773/1011] [config] Fix an issue that bgp asn data type is not consistent (#953) * Fix an issue that bgp asn data type is not consistent from minigraph parser and DB * Fix test typo --- dockers/docker-fpm-frr/bgpd.conf.j2 | 6 +++--- dockers/docker-fpm-gobgp/gobgpd.conf.j2 | 2 +- dockers/docker-fpm-quagga/bgpd.conf.j2 | 2 +- src/sonic-config-engine/minigraph.py | 6 +++--- src/sonic-config-engine/tests/test_cfggen.py | 5 +++++ 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/dockers/docker-fpm-frr/bgpd.conf.j2 b/dockers/docker-fpm-frr/bgpd.conf.j2 index f17464e3f893..5452a976368a 100644 --- a/dockers/docker-fpm-frr/bgpd.conf.j2 +++ b/dockers/docker-fpm-frr/bgpd.conf.j2 @@ -48,7 +48,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% endblock vlan_advertisement %} {% block bgp_sessions %} {% for neighbor_addr, bgp_session in BGP_NEIGHBOR.iteritems() %} -{% if bgp_session['asn'] != 0 %} +{% if bgp_session['asn'] | int != 0 %} neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }} neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} {% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} @@ -57,7 +57,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% if neighbor_addr | ipv4 %} address-family ipv4 neighbor {{ neighbor_addr }} activate -{% if bgp_session['rrclient'] != 0 %} +{% if bgp_session['rrclient'] | int != 0 %} neighbor {{ neighbor_addr }} route-reflector-client {% endif %} maximum-paths 64 @@ -66,7 +66,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% if neighbor_addr | ipv6 %} address-family ipv6 neighbor {{ neighbor_addr }} activate -{% if bgp_session['rrclient'] != 0 %} +{% if bgp_session['rrclient'] | int != 0 %} neighbor {{ neighbor_addr }} route-reflector-client {% endif %} maximum-paths 64 diff --git a/dockers/docker-fpm-gobgp/gobgpd.conf.j2 b/dockers/docker-fpm-gobgp/gobgpd.conf.j2 index c51c10563b59..a4fb80bf11ca 100644 --- a/dockers/docker-fpm-gobgp/gobgpd.conf.j2 +++ b/dockers/docker-fpm-gobgp/gobgpd.conf.j2 @@ -2,7 +2,7 @@ as = {{ DEVICE_METADATA['localhost']['bgp_asn'] }} router-id = "{{ LOOPBACK_INTERFACE.keys()[0][1] }}" {% for neighbor_addr, bgp_session in BGP_NEIGHBOR.iteritems() %} -{% if bgp_session['asn'] != 0 %} +{% if bgp_session['asn'] | int != 0 %} [[neighbors]] [neighbors.config] peer-as = {{ bgp_session['asn'] }} diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index 295cb2563aff..61d8f8ef3159 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -62,7 +62,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% endblock vlan_advertisement %} {% block bgp_sessions %} {% for neighbor_addr, bgp_session in BGP_NEIGHBOR.iteritems() %} -{% if bgp_session['asn'] != 0 %} +{% if bgp_session['asn'] | int != 0 %} neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }} neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} {% if bgp_session.has_key('admin_status') and bgp_session['admin_status'] == 'down' or not bgp_session.has_key('admin_status') and DEVICE_METADATA['localhost'].has_key('default_bgp_status') and DEVICE_METADATA['localhost']['default_bgp_status'] == 'down' %} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 7cf4d2f829cc..b5e97b485b44 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -238,7 +238,7 @@ def parse_cpg(cpg, hname): else: rrclient = '0' if hostname == hname: - myasn = int(asn) + myasn = 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 @@ -254,8 +254,8 @@ def parse_cpg(cpg, hname): for peer in bgp_sessions: bgp_session = bgp_sessions[peer] if hostname == bgp_session['name']: - bgp_session['asn'] = int(asn) - bgp_session['rrclient'] = int(rrclient) + bgp_session['asn'] = asn + bgp_session['rrclient'] = rrclient return bgp_sessions, myasn, bgp_peers_with_range diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index cf0eb4d8cc5c..4303f5a2492d 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -110,6 +110,11 @@ def test_minigraph_neighbors(self): output = self.run_script(argument) self.assertEqual(output.strip(), "{'mgmt_addr': None, 'hwsku': 'Arista', 'lo_addr': None, 'local_port': 'Ethernet112', 'type': 'LeafRouter', 'port': 'Ethernet1/1'}") + def test_minigraph_bgp(self): + argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v "BGP_NEIGHBOR[\'10.0.0.59\']"' + output = self.run_script(argument) + self.assertEqual(output.strip(), "{'rrclient': '0', 'local_addr': '10.0.0.58', 'asn': '64600', 'name': 'ARISTA02T1'}") + def test_minigraph_peers_with_range(self): argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v BGP_PEER_RANGE.values\(\)' output = self.run_script(argument) From 56ae5edc7f6ee26926bad236378f55a45b72d083 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 14 Sep 2017 08:43:02 -0700 Subject: [PATCH 0774/1011] [service template] Starting new docker when HWSKU change is detected (#946) Existing dockers has paths mounted according to the HWSKU. When HWSKU changes, these dockers need to be destroyed and recreated with the correct paths mounted. --- files/build_templates/docker_image_ctl.j2 | 72 ++++++++++++++++------- 1 file changed, 52 insertions(+), 20 deletions(-) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 042db764df97..a7aee83c70e6 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -1,36 +1,68 @@ #!/bin/bash -# Obtain our platform and HWSKU as we will mount directories with these names in each docker -PLATFORM=`sonic-cfggen -v platform` +function getMountPoint() +{ + echo $1 | python -c "import sys, json, os; mnts = [x for x in json.load(sys.stdin)[0]['Mounts'] if x['Destination'] == '/usr/share/sonic/hwsku']; print '' if len(mnts) == 0 else os.path.basename(mnts[0]['Source'])" 2>/dev/null +} + +function postStartAction() +{ {%- if docker_container_name != "database" %} + : +{%- else %} + while true; do + if [[ "$(docker exec -i database redis-cli ping)" =~ PONG.* ]]; then + break + fi + sleep 1 + done +{%- endif %} +} + +# Obtain our platform as we will mount directories with these names in each docker +PLATFORM=`sonic-cfggen -v platform` + +{%- if docker_container_name == "database" %} +# Don't mount HWSKU in {{docker_container_name}} container. +HWSKU="" +{%- else %} +# Obtain our HWSKU as we will mount directories with these names in each docker HWSKU=`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["hwsku"]'` {%- endif %} start() { - docker inspect --type container {{docker_container_name}} &>/dev/null + DOCKERCHECK=`docker inspect --type container {{docker_container_name}} 2>/dev/null` if [ "$?" -eq "0" ]; then - docker start {{docker_container_name}} - else + DOCKERMOUNT=`getMountPoint "$DOCKERCHECK"` + if [ "$DOCKERMOUNT" == "$HWSKU" ]; then + echo "Starting existing {{docker_container_name}} container with HWSKU $HWSKU" + docker start {{docker_container_name}} + postStartAction + exit 0 + fi + + # docker created with a different HWSKU, remove and recreate + echo "Removing obsolete {{docker_container_name}} container with HWSKU $DOCKERMOUNT" + docker rm {{docker_container_name}} + fi - docker run -d {{docker_image_run_opt}} \ +{%- if docker_container_name == "database" %} + echo "Starting new {{docker_container_name}} container" +{%- else %} + echo "Starting new {{docker_container_name}} container with HWSKU $HWSKU" +{%- endif %} + docker run -d {{docker_image_run_opt}} \ {%- if '--log-driver=json-file' in docker_image_run_opt or '--log-driver' not in docker_image_run_opt %} - --log-opt max-size=2M --log-opt max-file=5 \ + --log-opt max-size=2M --log-opt max-file=5 \ {%- endif %} - -v /var/run/redis:/var/run/redis:rw \ - -v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \ + -v /var/run/redis:/var/run/redis:rw \ + -v /usr/share/sonic/device/$PLATFORM:/usr/share/sonic/platform:ro \ {%- if docker_container_name != "database" %} - -v /usr/share/sonic/device/$PLATFORM/$HWSKU:/usr/share/sonic/hwsku:ro \ -{%- endif %} - --name={{docker_container_name}} {{docker_image_name}}:latest - fi -{%- if docker_container_name == "database" %} - while true; do - if [[ "$(docker exec -i database redis-cli ping)" =~ PONG.* ]]; then - break - fi - sleep 1 - done + -v /usr/share/sonic/device/$PLATFORM/$HWSKU:/usr/share/sonic/hwsku:ro \ {%- endif %} + --name={{docker_container_name}} {{docker_image_name}}:latest + + postStartAction } attach() { From 3cbc080f7b3f4b65662795de4bdf832676bc8d7f Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 15 Sep 2017 11:15:04 -0700 Subject: [PATCH 0775/1011] [sairedis]: update sairedis submodule head (#956) This submodule update includes the deadlock fixes. --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 7e70b4d63020..4d7deba9354c 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 7e70b4d63020fc9ea1aa009c264e4effab7bcda0 +Subproject commit 4d7deba9354c922d18d75325dcd4255f4096560f From 48fd6fb4ec7f8111573131a3c57e7670ad29238e Mon Sep 17 00:00:00 2001 From: Shu0T1an ChenG Date: Thu, 14 Sep 2017 15:26:26 -0700 Subject: [PATCH 0776/1011] [swss]: Move swss/common/sairedis submodule to 201709 tag --- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-swss b/src/sonic-swss index eaccf67cabd2..7f5eca5e858f 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit eaccf67cabd22df0ff7d0117fe55f4261bc961d9 +Subproject commit 7f5eca5e858f6a82966eed4564ded4c3646424bf diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 4f917f2cc345..96018b55e29a 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 4f917f2cc345c54d1bf9d9f01d96e4c01071ac9a +Subproject commit 96018b55e29a31ff22c50db30843d98eff847c35 From 034b47df6c9becc615bfbef5ec28bc55044d8cbe Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 15 Sep 2017 11:39:29 -0700 Subject: [PATCH 0777/1011] [Broadcom]: Update OpenNSL/SAI version (#959) --- platform/broadcom/sai.mk | 6 ++---- platform/broadcom/sdk.mk | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 60a1d1f15eb7..7118da438b22 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,11 +1,9 @@ BRCM_SAI = libsaibcm_3.0.3.2_amd64.deb -# TODO: upload new SAI build to blob -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2_amd64.deb" +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2_amd64.deb?sv=2015-04-05&sr=b&sig=d50c3WTnlQGVgybK4RyNFWqvXPHPpAotNSongSABpWg%3D&se=2031-05-25T18%3A52%3A35Z&sp=r" BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -# TODO: upload new SAI build to blob -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2_amd64.deb" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2_amd64.deb?sv=2015-04-05&sr=b&sig=psB%2BzhbludRstCuuGncrMOg5oETOY13U26yEXyR2yWc%3D&se=2031-05-25T18%3A50%3A38Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 76a7671599f2..701994c81073 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,5 +1,4 @@ BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.3.3_amd64.deb -# TODO: upload new SDK build to blob -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.3_amd64.deb" +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.3_amd64.deb?sv=2015-04-05&sr=b&sig=Qjb29DKq2%2FAvRJAju%2FU91Gu5orJC0R5LTJ%2BwYm%2BYFiA%3D&se=2031-05-25T18%3A36%3A33Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL_KERNEL) From 9d321fade60e6f55f1c17d693032530c81434ed4 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 15 Sep 2017 23:17:32 -0700 Subject: [PATCH 0778/1011] [syncd]: Comment out unused docker-ptf-brcm.mk --- platform/broadcom/rules.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index 21af44775dd3..b52118570251 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -15,7 +15,7 @@ include $(PLATFORM_PATH)/raw-image.mk include $(PLATFORM_PATH)/one-aboot.mk include $(PLATFORM_PATH)/libsaithrift-dev.mk include $(PLATFORM_PATH)/python-saithrift.mk -include $(PLATFORM_PATH)/docker-ptf-brcm.mk +#include $(PLATFORM_PATH)/docker-ptf-brcm.mk BCMCMD = bcmcmd $(BCMCMD)_URL = "https://sonicstorage.blob.core.windows.net/packages/20170518/bcmcmd?sv=2015-04-05&sr=b&sig=OCW4mfmbQ6D0BH8nllpAWrS8XL9uczrw32w3XgL4jws%3D&se=2030-03-31T23%3A06%3A15Z&sp=r" From 6935e00909d521a6ecb2cdf7ec04a31131f86a53 Mon Sep 17 00:00:00 2001 From: padmanarayana Date: Mon, 18 Sep 2017 00:11:30 +0530 Subject: [PATCH 0779/1011] [build/onie installer] Install grub for SONiC post migration from another NOS (#949) * Install grub for SONiC post migration from another NOS * Install grub from bundled debian package instead of using ONIE's. Address review comments --- build_debian.sh | 9 ++- files/image_config/platform/rc.local | 106 ++++++++++++++++++++++++++- installer/x86_64/install.sh | 11 ++- 3 files changed, 121 insertions(+), 5 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 21c370753592..9bdda3451009 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -63,6 +63,7 @@ if [[ -d $FILESYSTEM_ROOT ]]; then fi mkdir -p $FILESYSTEM_ROOT mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR +mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/x86_64-grub touch $FILESYSTEM_ROOT/$PLATFORM_DIR/firsttime ## Build a basic Debian system by debootstrap @@ -205,7 +206,13 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in curl \ kexec-tools \ less \ - unzip + unzip \ + gdisk + +sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y download \ + grub-pc-bin + +sudo mv $FILESYSTEM_ROOT/grub-pc-bin*.deb $FILESYSTEM_ROOT/$PLATFORM_DIR/x86_64-grub ## Disable kexec supported reboot which was installed by default sudo sed -i 's/LOAD_KEXEC=true/LOAD_KEXEC=false/' $FILESYSTEM_ROOT/etc/default/kexec diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index 8b8db4a261c3..d3ecba7d8518 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -29,6 +29,7 @@ if [ ! -e /host/machine.conf ]; then done fi + migration="TRUE" umount /mnt/onie-boot fi @@ -36,6 +37,26 @@ fi echo "install platform dependent packages at the first boot time" +firsttime_exit() +{ + rm /host/image-$sonic_version/platform/firsttime + exit 0 +} + +# Given a string of tuples of the form field=value, extract the value for a field +# In : $string, $field +# Out: $value +value_extract() +{ +set -- $string +for x in "$@"; do + case "$x" in + $field=*) + value="${x#$field=}" + esac +done +} + sonic_version=$(cat /etc/sonic/sonic_version.yml | grep build_version | cut -f2 -d" ") if [ -f /host/image-$sonic_version/platform/firsttime ]; then @@ -46,8 +67,7 @@ if [ -f /host/image-$sonic_version/platform/firsttime ]; then platform=$onie_platform else echo "Unknown sonic platform" - rm /host/image-$sonic_version/platform/firsttime - exit 0 + firsttime_exit fi # Try to take old configuration saved during installation @@ -76,6 +96,88 @@ if [ -f /host/image-$sonic_version/platform/firsttime ]; then dpkg -i /host/image-$sonic_version/platform/$platform/*.deb fi + # If the unit booted into SONiC from another NOS's grub, + # we now install a grub for SONiC. + if [ -n "$onie_platform" ] && [ -n "$migration" ]; then + + grub_bin=$(ls /host/image-$sonic_version/platform/x86_64-grub/grub-pc-bin*.deb 2> /dev/null) + if [ -z "$grub_bin" ]; then + echo "Unable to locate grub package !" >> /etc/migration.log + firsttime_exit + fi + + dpkg -i $grub_bin > /dev/null 2>&1 + if [ $? != 0 ]; then + echo "Unable to install grub package !" >> /etc/migration.log + firsttime_exit + fi + + # Determine the block device to install grub + sonic_dev=$(blkid | grep SONiC-OS | head -n 1 | awk '{print $1}' | sed -e 's/[0-9]:.*$//') + if [ -z "$sonic_dev" ]; then + echo "Unable to determine sonic partition !" >> /etc/migration.log + firsttime_exit + fi + + grub-install --boot-directory=/host --recheck $sonic_dev 2>/dev/null + if [ $? != 0 ]; then + echo "grub install failed !" >> /etc/migration.log + firsttime_exit + fi + + # The SONiC "raw" build mode has already generated a proto grub.cfg + # as part of the migration. Platform specific constants need to be + # retrieved from installer.conf (if present) and assigned. + . /usr/share/sonic/device/$platform/installer.conf + + if [ ! -z "$CONSOLE_PORT" ]; then + field="\-\-port" + string=$(grep $field /host/grub.cfg) + value_extract $string $field + console_port=$value + if [ ! -z "$console_port" ] && [ "$console_port" != "$CONSOLE_PORT" ]; then + sed -i -e "s/\-\-port=$console_port/\-\-port=$CONSOLE_PORT/g" /host/grub.cfg + fi + echo "grub.cfg console port=$console_port & installer.conf CONSOLE_PORT=$CONSOLE_PORT" >> /etc/migration.log + fi + + if [ ! -z "$CONSOLE_DEV" ]; then + field="console" + string=$(grep $field /host/grub.cfg) + value_extract $string $field + console_dev_name=$(echo $value | sed -e "s/^.*=//" -e "s/,.*//") + console_dev="${console_dev_name#ttyS}" + if [ "$console_dev" != "$CONSOLE_DEV" ]; then + sed -i -e "s/console=ttyS$console_dev/console=ttyS$CONSOLE_DEV/g" /host/grub.cfg + fi + echo "grub.cfg console dev=$console_dev & installer.conf CONSOLE_DEV=$CONSOLE_DEV" >> /etc/migration.log + fi + + if [ ! -z "$VAR_LOG_SIZE" ]; then + field="var_log_size" + string=$(grep $field /host/grub.cfg) + value_extract $string $field + var_log_size=$value + if [ ! -z "$var_log_size" ] && [ "$var_log_size" != "$VAR_LOG_SIZE" ]; then + sed -i -e "s/var_log_size=$var_log_size/var_log_size=$VAR_LOG_SIZE/g" /host/grub.cfg + fi + echo "grub.cfg var_log_size=$var_log_size & installer.conf VAR_LOG_SIZE=$VAR_LOG_SIZE" >> /etc/migration.log + fi + + # Set the root based on the label + sonic_root=$(blkid | grep SONiC-OS | head -n 1 | awk '{print $1}' | sed -e 's/:.*$//') + sonic_root=$(echo "$sonic_root" | sed 's/\//\\\//g') + sed -i -e "s/%%SONIC_ROOT%%/$sonic_root/g" /host/grub.cfg + + # Add the Diag and ONIE entries + mount $onie_dev /mnt/onie-boot + . /mnt/onie-boot/onie/grub.d/50_onie_grub >> /host/grub.cfg + umount /mnt/onie-boot + + # Initialize the SONiC's grub config + mv /host/grub.cfg /host/grub/grub.cfg + fi + rm /host/image-$sonic_version/platform/firsttime fi diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 46942d6d58c3..358da41071b5 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -423,7 +423,7 @@ else demo_mnt="build_raw_image_mnt" demo_dev=$cur_wd/"%%OUTPUT_RAW_IMAGE%%" - mkfs.ext4 $demo_dev + mkfs.ext4 -L $demo_volume_label $demo_dev echo "Mounting $demo_dev on $demo_mnt..." mkdir $demo_mnt @@ -535,6 +535,12 @@ if [ "$install_env" = "sonic" ]; then onie_menuentry=$(cat /host/grub/grub.cfg | sed "/menuentry ONIE/,/}/!d") fi +if [ "$install_env" = "build" ]; then + grub_cfg_root=%%SONIC_ROOT%% +else + grub_cfg_root=$demo_dev +fi + cat <> $grub_cfg menuentry '$demo_grub_entry' { search --no-floppy --label --set=root $demo_volume_label @@ -543,7 +549,7 @@ menuentry '$demo_grub_entry' { if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi insmod part_msdos insmod ext2 - linux /$image_dir/boot/vmlinuz-3.16.0-4-amd64 root=$demo_dev rw $GRUB_CMDLINE_LINUX \ + linux /$image_dir/boot/vmlinuz-3.16.0-4-amd64 root=$grub_cfg_root rw $GRUB_CMDLINE_LINUX \ loop=$image_dir/$FILESYSTEM_SQUASHFS loopfstype=squashfs \ apparmor=1 security=apparmor varlog_size=$VAR_LOG_SIZE $ONIE_PLATFORM_EXTRA_CMDLINE_LINUX echo 'Loading $demo_volume_label $demo_type initial ramdisk ...' @@ -564,6 +570,7 @@ EOF fi if [ "$install_env" = "build" ]; then + cp $grub_cfg $demo_mnt/grub.cfg umount $demo_mnt else cp $grub_cfg $onie_initrd_tmp/$demo_mnt/grub/grub.cfg From aa55b832a4c09da21d6c46a628581282e2a0cec6 Mon Sep 17 00:00:00 2001 From: wadelnn Date: Mon, 18 Sep 2017 06:38:51 +0800 Subject: [PATCH 0780/1011] [Ingrasys] Update Ingrasys submodule for S8900-54XC (#954) - What I did Update Ingrasys submodule for S8900-54XC QSFP reset function. - How I did it Add reset init scripts in S8900-54XC init function. - How to verify it Used the command "sfputil reset Ethernet48" to verify reset function. If no error occurs, it is passed. - Description for the changelog Update Ingrasys submodule for S8900-54XC QSFP reset function - A picture of a cute animal (not mandatory but encouraged) --- platform/broadcom/sonic-platform-modules-ingrasys | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-ingrasys b/platform/broadcom/sonic-platform-modules-ingrasys index 00ea01132665..2725c0f1d1db 160000 --- a/platform/broadcom/sonic-platform-modules-ingrasys +++ b/platform/broadcom/sonic-platform-modules-ingrasys @@ -1 +1 @@ -Subproject commit 00ea0113266590a5b17b923f017b52cab373234e +Subproject commit 2725c0f1d1db4a3301c00fac8d7e3bc028a37bce From aa549f208c78959aa09c3b3346d27fbfc1d11ed4 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 18 Sep 2017 13:04:29 -0700 Subject: [PATCH 0781/1011] [bgp]: Fix the deployment_id with DEVICE_METADATA (#962) --- 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 61d8f8ef3159..0ef144016246 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -94,7 +94,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% for bgp_peer in BGP_PEER_RANGE.values() %} neighbor {{ bgp_peer['name'] }} peer-group neighbor {{ bgp_peer['name'] }} passive - neighbor {{ bgp_peer['name'] }} remote-as {{deployment_id_asn_map[deployment_id] }} + neighbor {{ bgp_peer['name'] }} remote-as {{ deployment_id_asn_map[DEVICE_METADATA['localhost']['deployment_id']] }} neighbor {{ bgp_peer['name'] }} ebgp-multihop 255 neighbor {{ bgp_peer['name'] }} soft-reconfiguration inbound neighbor {{ bgp_peer['name'] }} update-source Loopback0 From a376c86b5c1d24bb1ffacc063a66418aba4dd596 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 18 Sep 2017 17:23:19 -0700 Subject: [PATCH 0782/1011] [swss]: Fix the command to get HWSKU with sonic-cfggen (#964) --- dockers/docker-orchagent/swssconfig.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index ff2953f94730..f075ca4f22ac 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -35,7 +35,7 @@ function fast_reboot { # Restore FDB and ARP table ASAP fast_reboot -HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -d -v DEVICE_METADATA["localhost"]["hwsku"]` +HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -d -v "DEVICE_METADATA['localhost']['hwsku']"` SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json ports.json " From 5ba6f53eedb2f804567cdd696f95f880860875fd Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 18 Sep 2017 18:46:51 -0700 Subject: [PATCH 0783/1011] Update sonic-utilities to be compatible with #942 (#965) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index a7be3b7ed905..b48573fce38a 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit a7be3b7ed905c753f785629ab85007008214ba62 +Subproject commit b48573fce38ad476fd9dccb11f57099085cc87d5 From 9139c7fe64108722770529d22e3d18102dad2bab Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Tue, 19 Sep 2017 12:27:18 -0700 Subject: [PATCH 0784/1011] Always start with Forwarding State flag set for bgpd (#963) --- dockers/docker-fpm-quagga/supervisord.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-fpm-quagga/supervisord.conf b/dockers/docker-fpm-quagga/supervisord.conf index 5a310a790f18..92d806ff281c 100644 --- a/dockers/docker-fpm-quagga/supervisord.conf +++ b/dockers/docker-fpm-quagga/supervisord.conf @@ -36,7 +36,7 @@ stdout_logfile=syslog stderr_logfile=syslog [program:bgpd] -command=/usr/lib/quagga/bgpd -A 127.0.0.1 +command=/usr/lib/quagga/bgpd -A 127.0.0.1 -F priority=5 autostart=false autorestart=false From 458093fee5a53105e937612b38a15f38966a89dc Mon Sep 17 00:00:00 2001 From: ravijo2 Date: Tue, 19 Sep 2017 16:23:31 -0700 Subject: [PATCH 0785/1011] Framework to plugin Organization specific scripts during ONIE Image build (#951) * Framework to plugin Organization specific scripts * Framework to plugin Organization specific scripts * Framework to plugin Organization specific scripts * add getopt option to organization script --- build_debian.sh | 8 +++ .../organization_extensions.sh | 52 +++++++++++++++++++ rules/config | 3 ++ slave.mk | 2 + 4 files changed, 65 insertions(+) create mode 100755 files/build_templates/organization_extensions.sh diff --git a/build_debian.sh b/build_debian.sh index 9bdda3451009..a21cdada0243 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -322,6 +322,14 @@ if [ -f sonic_debian_extension.sh ]; then ./sonic_debian_extension.sh $FILESYSTEM_ROOT $PLATFORM_DIR fi +## Organization specific extensions such as Configuration & Scripts for features like AAA, ZTP... +if [ "${enable_organization_extensions}" = "y" ]; then + if [ -f files/build_templates/organization_extensions.sh ]; then + sudo chmod 755 files/build_templates/organization_extensions.sh + ./files/build_templates/organization_extensions.sh -f $FILESYSTEM_ROOT -h $HOSTNAME + fi +fi + ## Clean up apt sudo LANG=C chroot $FILESYSTEM_ROOT apt-get autoremove sudo LANG=C chroot $FILESYSTEM_ROOT apt-get autoclean diff --git a/files/build_templates/organization_extensions.sh b/files/build_templates/organization_extensions.sh new file mode 100755 index 000000000000..db05a4e3f59d --- /dev/null +++ b/files/build_templates/organization_extensions.sh @@ -0,0 +1,52 @@ +#!/bin/bash +######################################################################### +## This script is to automate Orignaization specific extensions # +## such as Configuration & Scripts for features like AAA, ZTP, etc. # +## to include in ONIE installer image # +## # +## USAGE: # +## ./organization_extensions.sh -f -n # +## ./organization_extensions.sh \ # +## --fsroot \ # +## --hostname # +## PARAMETERS: # +## -f FILESYSTEM_ROOT # +## The location of the root file system # +## -h HOSTNAME # +## The hostname of the target system # +######################################################################### + +## Initialize the arguments to default values. +## The values get updated to user provided value, if supplied +FILESYSTEM_ROOT=./fsroot +HOSTNAME=sonic + +# read the options +TEMP=`getopt -o f:h: --long fsroot:,hostname: -- "$@"` +eval set -- "$TEMP" + +# extract options and their arguments into variables. +while true ; do + case "$1" in + -f|--fsroot) + case "$2" in + "") shift 2 ;; + *) FILESYSTEM_ROOT=$2 ; shift 2 ;; + esac ;; + -h|--hostname) + case "$2" in + "") shift 2 ;; + *) HOSTNAME=$2 ; shift 2 ;; + esac ;; + --) shift ; break ;; + *) echo "Internal error!" ; exit 1 ;; + esac +done + +echo "Executing SONIC Organization Extensions" + +## Place your Organization specific code / scipts here ... + + +echo "SONIC Organization Extensions - Done" + diff --git a/rules/config b/rules/config index 2d6e6a82b6a8..ad13ad047e04 100644 --- a/rules/config +++ b/rules/config @@ -48,3 +48,6 @@ SONIC_ROUTING_STACK = quagga # ENABLE_SYNCD_RPC - build docker-syncd with rpc packages for testing purposes. # Uncomment to enable: # ENABLE_SYNCD_RPC = y + +# Enable Origanization Extensions - Specific to the deployment scenarios of the Organization +ENABLE_ORGANIZATION_EXTENSIONS = y diff --git a/slave.mk b/slave.mk index caed4279dcc3..4e76661588fb 100644 --- a/slave.mk +++ b/slave.mk @@ -99,6 +99,7 @@ $(info "SHUTDOWN_BGP_ON_START" : "$(SHUTDOWN_BGP_ON_START)") $(info "SONIC_CONFIG_DEBUG" : "$(SONIC_CONFIG_DEBUG)") $(info "ROUTING_STACK" : "$(SONIC_ROUTING_STACK)") $(info "ENABLE_SYNCD_RPC" : "$(ENABLE_SYNCD_RPC)") +$(info "ENABLE_ORGANIZATION_EXTENSIONS" : "$(ENABLE_ORGANIZATION_EXTENSIONS)") $(info ) ############################################################################### @@ -388,6 +389,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export image_type="$($*_IMAGE_TYPE)" export sonicadmin_user="$(USERNAME)" export sonic_asic_platform="$(CONFIGURED_PLATFORM)" + export enable_organization_extensions="$(ENABLE_ORGANIZATION_EXTENSIONS)" 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))" From 72f5d6bcb76dbec35e22c496af776a8b8da35a1a Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Tue, 19 Sep 2017 19:29:00 -0700 Subject: [PATCH 0786/1011] [interfaces]: Change MTU value to 9100 (#967) * Updated MTU to the widely used value with other devices --- files/image_config/interfaces/interfaces.j2 | 6 +- .../tests/sample_output/interfaces | 64 +++++++++---------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index f96c0740c572..fe1fac2cc77e 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -50,7 +50,7 @@ iface eth0 inet dhcp {% for (name, prefix) in INTERFACE %} allow-hotplug {{ name }} iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static - mtu 9216 + mtu 9100 address {{ prefix | ip }} netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} # @@ -61,7 +61,7 @@ iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static {% for member in VLAN[vlan]['members'] %} allow-hotplug {{ member }} iface {{ member }} inet manual - pre-up ifconfig {{ member }} up mtu 9216 + pre-up ifconfig {{ member }} up mtu 9100 post-up brctl addif {{ vlan }} {{ member }} || true post-down ifconfig {{ member }} down # @@ -102,7 +102,7 @@ iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static {% for (name, prefix) in PORTCHANNEL_INTERFACE.keys() | sort %} allow-hotplug {{ name }} iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static - mtu 9216 + mtu 9100 address {{ prefix | ip }} netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} # diff --git a/src/sonic-config-engine/tests/sample_output/interfaces b/src/sonic-config-engine/tests/sample_output/interfaces index aed23f8a5c26..9f262a7f6b05 100644 --- a/src/sonic-config-engine/tests/sample_output/interfaces +++ b/src/sonic-config-engine/tests/sample_output/interfaces @@ -42,145 +42,145 @@ iface eth0 inet6 static # "|| true" is added to suppress the error when interface is already a member of VLAN allow-hotplug fortyGigE0/4 iface fortyGigE0/4 inet manual - pre-up ifconfig fortyGigE0/4 up mtu 9216 + pre-up ifconfig fortyGigE0/4 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/4 || true post-down ifconfig fortyGigE0/4 down # allow-hotplug fortyGigE0/8 iface fortyGigE0/8 inet manual - pre-up ifconfig fortyGigE0/8 up mtu 9216 + pre-up ifconfig fortyGigE0/8 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/8 || true post-down ifconfig fortyGigE0/8 down # allow-hotplug fortyGigE0/12 iface fortyGigE0/12 inet manual - pre-up ifconfig fortyGigE0/12 up mtu 9216 + pre-up ifconfig fortyGigE0/12 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/12 || true post-down ifconfig fortyGigE0/12 down # allow-hotplug fortyGigE0/16 iface fortyGigE0/16 inet manual - pre-up ifconfig fortyGigE0/16 up mtu 9216 + pre-up ifconfig fortyGigE0/16 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/16 || true post-down ifconfig fortyGigE0/16 down # allow-hotplug fortyGigE0/20 iface fortyGigE0/20 inet manual - pre-up ifconfig fortyGigE0/20 up mtu 9216 + pre-up ifconfig fortyGigE0/20 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/20 || true post-down ifconfig fortyGigE0/20 down # allow-hotplug fortyGigE0/24 iface fortyGigE0/24 inet manual - pre-up ifconfig fortyGigE0/24 up mtu 9216 + pre-up ifconfig fortyGigE0/24 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/24 || true post-down ifconfig fortyGigE0/24 down # allow-hotplug fortyGigE0/28 iface fortyGigE0/28 inet manual - pre-up ifconfig fortyGigE0/28 up mtu 9216 + pre-up ifconfig fortyGigE0/28 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/28 || true post-down ifconfig fortyGigE0/28 down # allow-hotplug fortyGigE0/32 iface fortyGigE0/32 inet manual - pre-up ifconfig fortyGigE0/32 up mtu 9216 + pre-up ifconfig fortyGigE0/32 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/32 || true post-down ifconfig fortyGigE0/32 down # allow-hotplug fortyGigE0/36 iface fortyGigE0/36 inet manual - pre-up ifconfig fortyGigE0/36 up mtu 9216 + pre-up ifconfig fortyGigE0/36 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/36 || true post-down ifconfig fortyGigE0/36 down # allow-hotplug fortyGigE0/40 iface fortyGigE0/40 inet manual - pre-up ifconfig fortyGigE0/40 up mtu 9216 + pre-up ifconfig fortyGigE0/40 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/40 || true post-down ifconfig fortyGigE0/40 down # allow-hotplug fortyGigE0/44 iface fortyGigE0/44 inet manual - pre-up ifconfig fortyGigE0/44 up mtu 9216 + pre-up ifconfig fortyGigE0/44 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/44 || true post-down ifconfig fortyGigE0/44 down # allow-hotplug fortyGigE0/48 iface fortyGigE0/48 inet manual - pre-up ifconfig fortyGigE0/48 up mtu 9216 + pre-up ifconfig fortyGigE0/48 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/48 || true post-down ifconfig fortyGigE0/48 down # allow-hotplug fortyGigE0/52 iface fortyGigE0/52 inet manual - pre-up ifconfig fortyGigE0/52 up mtu 9216 + pre-up ifconfig fortyGigE0/52 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/52 || true post-down ifconfig fortyGigE0/52 down # allow-hotplug fortyGigE0/56 iface fortyGigE0/56 inet manual - pre-up ifconfig fortyGigE0/56 up mtu 9216 + pre-up ifconfig fortyGigE0/56 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/56 || true post-down ifconfig fortyGigE0/56 down # allow-hotplug fortyGigE0/60 iface fortyGigE0/60 inet manual - pre-up ifconfig fortyGigE0/60 up mtu 9216 + pre-up ifconfig fortyGigE0/60 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/60 || true post-down ifconfig fortyGigE0/60 down # allow-hotplug fortyGigE0/64 iface fortyGigE0/64 inet manual - pre-up ifconfig fortyGigE0/64 up mtu 9216 + pre-up ifconfig fortyGigE0/64 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/64 || true post-down ifconfig fortyGigE0/64 down # allow-hotplug fortyGigE0/68 iface fortyGigE0/68 inet manual - pre-up ifconfig fortyGigE0/68 up mtu 9216 + pre-up ifconfig fortyGigE0/68 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/68 || true post-down ifconfig fortyGigE0/68 down # allow-hotplug fortyGigE0/72 iface fortyGigE0/72 inet manual - pre-up ifconfig fortyGigE0/72 up mtu 9216 + pre-up ifconfig fortyGigE0/72 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/72 || true post-down ifconfig fortyGigE0/72 down # allow-hotplug fortyGigE0/76 iface fortyGigE0/76 inet manual - pre-up ifconfig fortyGigE0/76 up mtu 9216 + pre-up ifconfig fortyGigE0/76 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/76 || true post-down ifconfig fortyGigE0/76 down # allow-hotplug fortyGigE0/80 iface fortyGigE0/80 inet manual - pre-up ifconfig fortyGigE0/80 up mtu 9216 + pre-up ifconfig fortyGigE0/80 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/80 || true post-down ifconfig fortyGigE0/80 down # allow-hotplug fortyGigE0/84 iface fortyGigE0/84 inet manual - pre-up ifconfig fortyGigE0/84 up mtu 9216 + pre-up ifconfig fortyGigE0/84 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/84 || true post-down ifconfig fortyGigE0/84 down # allow-hotplug fortyGigE0/88 iface fortyGigE0/88 inet manual - pre-up ifconfig fortyGigE0/88 up mtu 9216 + pre-up ifconfig fortyGigE0/88 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/88 || true post-down ifconfig fortyGigE0/88 down # allow-hotplug fortyGigE0/92 iface fortyGigE0/92 inet manual - pre-up ifconfig fortyGigE0/92 up mtu 9216 + pre-up ifconfig fortyGigE0/92 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/92 || true post-down ifconfig fortyGigE0/92 down # allow-hotplug fortyGigE0/96 iface fortyGigE0/96 inet manual - pre-up ifconfig fortyGigE0/96 up mtu 9216 + pre-up ifconfig fortyGigE0/96 up mtu 9100 post-up brctl addif Vlan1000 fortyGigE0/96 || true post-down ifconfig fortyGigE0/96 down # @@ -220,49 +220,49 @@ iface Vlan1000 inet static # Portchannel interfaces allow-hotplug PortChannel01 iface PortChannel01 inet static - mtu 9216 + mtu 9100 address 10.0.0.56 netmask 255.255.255.254 # allow-hotplug PortChannel01 iface PortChannel01 inet6 static - mtu 9216 + mtu 9100 address fc00::71 netmask 126 # allow-hotplug PortChannel02 iface PortChannel02 inet static - mtu 9216 + mtu 9100 address 10.0.0.58 netmask 255.255.255.254 # allow-hotplug PortChannel02 iface PortChannel02 inet6 static - mtu 9216 + mtu 9100 address fc00::75 netmask 126 # allow-hotplug PortChannel03 iface PortChannel03 inet static - mtu 9216 + mtu 9100 address 10.0.0.60 netmask 255.255.255.254 # allow-hotplug PortChannel03 iface PortChannel03 inet6 static - mtu 9216 + mtu 9100 address fc00::79 netmask 126 # allow-hotplug PortChannel04 iface PortChannel04 inet static - mtu 9216 + mtu 9100 address 10.0.0.62 netmask 255.255.255.254 # allow-hotplug PortChannel04 iface PortChannel04 inet6 static - mtu 9216 + mtu 9100 address fc00::7d netmask 126 # From 0c6fba69935907d92ba6b45dd19fa84df9c9c1a5 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 20 Sep 2017 12:39:36 -0700 Subject: [PATCH 0787/1011] [utilities]: Update sonic-utilities (#968) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index b48573fce38a..0338eee64574 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit b48573fce38ad476fd9dccb11f57099085cc87d5 +Subproject commit 0338eee645741937603c5686bb86b22cb5ab5322 From d117f093430de0915b3b59dffe2835ab470aeaf5 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 20 Sep 2017 15:18:11 -0700 Subject: [PATCH 0788/1011] [Broadcom]: Update OpenNSL modules (#970) - Increase the rx_buffer_size to 9238, the same MTU szie as in the hardware --- platform/broadcom/sdk.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 701994c81073..04d540c64582 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,4 +1,4 @@ -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.3.3_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.3_amd64.deb?sv=2015-04-05&sr=b&sig=Qjb29DKq2%2FAvRJAju%2FU91Gu5orJC0R5LTJ%2BwYm%2BYFiA%3D&se=2031-05-25T18%3A36%3A33Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.3.3-1_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.3-1_amd64.deb?sv=2015-04-05&sr=b&sig=Uepf4z2wOadX%2F6OR%2BCoQzjv2tkwEZ2AspBiuo5sb25s%3D&se=2031-05-30T19%3A37%3A19Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL_KERNEL) From 763205ff7d767c77ccb3945b7cd64f176482e648 Mon Sep 17 00:00:00 2001 From: Volodymyr Samotiy Date: Thu, 21 Sep 2017 09:55:50 +0300 Subject: [PATCH 0789/1011] [config]: Fix management interface configuration (#966) * [config]: Fix management interface configuration * [config]: Fix management interface configuration * Fix comments --- files/image_config/interfaces/interfaces.j2 | 8 ++++---- .../tests/sample_output/interfaces | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index fe1fac2cc77e..6521eb7a67e1 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -27,14 +27,14 @@ iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} ########## management network policy routing rules # management port up rules - up ip route add default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table default - up ip rule add from {{ prefix | ip }}/32 table default + up ip {{ '-4' if prefix | ipv4 else '-6' }} route add default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table default + up ip {{ '-4' if prefix | ipv4 else '-6' }} rule add from {{ prefix | ip }}/{{ '32' if prefix | ipv4 else '128' }} table default {% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} up ip rule add to {{ route }} table default {% endfor %} # management port down rules - down ip route delete default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table default - down ip rule delete from {{ prefix | ip }}/32 table default + down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table default + down ip {{ '-4' if prefix | ipv4 else '-6' }} rule delete from {{ prefix | ip }}/{{ '32' if prefix | ipv4 else '128' }} table default {% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} down ip rule delete to {{ route }} table default {% endfor %} diff --git a/src/sonic-config-engine/tests/sample_output/interfaces b/src/sonic-config-engine/tests/sample_output/interfaces index 9f262a7f6b05..ec3b6f740bc4 100644 --- a/src/sonic-config-engine/tests/sample_output/interfaces +++ b/src/sonic-config-engine/tests/sample_output/interfaces @@ -22,21 +22,21 @@ iface eth0 inet static netmask 255.255.255.0 ########## management network policy routing rules # management port up rules - up ip route add default via 10.0.0.1 dev eth0 table default - up ip rule add from 10.0.0.100/32 table default + up ip -4 route add default via 10.0.0.1 dev eth0 table default + up ip -4 rule add from 10.0.0.100/32 table default # management port down rules - down ip route delete default via 10.0.0.1 dev eth0 table default - down ip rule delete from 10.0.0.100/32 table default + down ip -4 route delete default via 10.0.0.1 dev eth0 table default + down ip -4 rule delete from 10.0.0.100/32 table default iface eth0 inet6 static address 2603:10e2:0:2902::8 netmask 64 ########## management network policy routing rules # management port up rules - up ip route add default via 2603:10e2:0:2902::1 dev eth0 table default - up ip rule add from 2603:10e2:0:2902::8/32 table default + up ip -6 route add default via 2603:10e2:0:2902::1 dev eth0 table default + up ip -6 rule add from 2603:10e2:0:2902::8/128 table default # management port down rules - down ip route delete default via 2603:10e2:0:2902::1 dev eth0 table default - down ip rule delete from 2603:10e2:0:2902::8/32 table default + down ip -6 route delete default via 2603:10e2:0:2902::1 dev eth0 table default + down ip -6 rule delete from 2603:10e2:0:2902::8/128 table default # # The switch front panel interfaces # "|| true" is added to suppress the error when interface is already a member of VLAN From e0513d213bb6fa014262d24be265af93bba495e9 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Thu, 21 Sep 2017 09:17:29 -0700 Subject: [PATCH 0790/1011] lacp runner will send lacp update right after it received SIGINT (#969) --- ...r-will-send-lacp-update-right-after-.patch | 98 +++++++++++++++++++ src/libteam/Makefile | 1 + 2 files changed, 99 insertions(+) create mode 100644 src/libteam/0003-teamd-lacp-runner-will-send-lacp-update-right-after-.patch diff --git a/src/libteam/0003-teamd-lacp-runner-will-send-lacp-update-right-after-.patch b/src/libteam/0003-teamd-lacp-runner-will-send-lacp-update-right-after-.patch new file mode 100644 index 000000000000..1cae8bad21aa --- /dev/null +++ b/src/libteam/0003-teamd-lacp-runner-will-send-lacp-update-right-after-.patch @@ -0,0 +1,98 @@ +From 417e9dfdccbbee2cf86e46e994e8ece3433b46a4 Mon Sep 17 00:00:00 2001 +From: Pavel Shirshov +Date: Wed, 20 Sep 2017 00:34:07 +0000 +Subject: [PATCH] [teamd] lacp runner will send lacp update right after it + received SIGINT signal + +--- + teamd/teamd.c | 1 + + teamd/teamd.h | 3 +++ + teamd/teamd_events.c | 13 +++++++++++++ + teamd/teamd_runner_lacp.c | 10 ++++++++++ + 4 files changed, 27 insertions(+) + +diff --git a/teamd/teamd.c b/teamd/teamd.c +index aac2511..c987333 100644 +--- a/teamd/teamd.c ++++ b/teamd/teamd.c +@@ -386,6 +386,7 @@ static int teamd_run_loop_run(struct teamd_context *ctx) + case 'q': + if (quit_in_progress) + return -EBUSY; ++ teamd_refresh_ports(ctx); + err = teamd_flush_ports(ctx); + if (err) + return err; +diff --git a/teamd/teamd.h b/teamd/teamd.h +index 5dbfb9b..ef0fb1c 100644 +--- a/teamd/teamd.h ++++ b/teamd/teamd.h +@@ -189,11 +189,14 @@ struct teamd_event_watch_ops { + struct teamd_port *tdport, void *priv); + int (*port_ifname_changed)(struct teamd_context *ctx, + struct teamd_port *tdport, void *priv); ++ void (*refresh)(struct teamd_context *ctx, ++ struct teamd_port *tdport, void *priv); + int (*option_changed)(struct teamd_context *ctx, + struct team_option *option, void *priv); + char *option_changed_match_name; + }; + ++void teamd_refresh_ports(struct teamd_context *ctx); + int teamd_event_port_added(struct teamd_context *ctx, + struct teamd_port *tdport); + void teamd_event_port_removed(struct teamd_context *ctx, +diff --git a/teamd/teamd_events.c b/teamd/teamd_events.c +index 1a95974..5c2ef56 100644 +--- a/teamd/teamd_events.c ++++ b/teamd/teamd_events.c +@@ -34,6 +34,19 @@ struct event_watch_item { + void *priv; + }; + ++void teamd_refresh_ports(struct teamd_context *ctx) ++{ ++ struct teamd_port *tdport; ++ struct event_watch_item *watch; ++ ++ teamd_for_each_tdport(tdport, ctx) { ++ list_for_each_node_entry(watch, &ctx->event_watch_list, list) { ++ if (!watch->ops->refresh) continue; ++ watch->ops->refresh(ctx, tdport, watch->priv); ++ } ++ } ++} ++ + int teamd_event_port_added(struct teamd_context *ctx, + struct teamd_port *tdport) + { +diff --git a/teamd/teamd_runner_lacp.c b/teamd/teamd_runner_lacp.c +index 9c77fae..e38c291 100644 +--- a/teamd/teamd_runner_lacp.c ++++ b/teamd/teamd_runner_lacp.c +@@ -1383,12 +1383,22 @@ static int lacp_event_watch_port_changed(struct teamd_context *ctx, + return lacp_port_link_update(lacp_port); + } + ++static void lacp_event_watch_refresh(struct teamd_context *ctx, struct teamd_port *tdport, void *priv) ++{ ++ struct lacp *lacp = priv; ++ ++ struct lacp_port *lacp_port = lacp_port_get(lacp, tdport); ++ if (lacp_port_selected(lacp_port)) ++ (void) lacpdu_send(lacp_port); ++} ++ + static const struct teamd_event_watch_ops lacp_event_watch_ops = { + .hwaddr_changed = lacp_event_watch_hwaddr_changed, + .port_added = lacp_event_watch_port_added, + .port_removed = lacp_event_watch_port_removed, + .port_changed = lacp_event_watch_port_changed, + .admin_state_changed = lacp_event_watch_admin_state_changed, ++ .refresh = lacp_event_watch_refresh, + }; + + static int lacp_carrier_init(struct teamd_context *ctx, struct lacp *lacp) +-- +2.7.4 + diff --git a/src/libteam/Makefile b/src/libteam/Makefile index 283a6b56fbec..c84250749477 100644 --- a/src/libteam/Makefile +++ b/src/libteam/Makefile @@ -17,6 +17,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Apply patch git apply ../0001-libteam-Add-team_get_port_enabled-function.patch git apply ../0002-libteam-Temporarily-remove-redundant-debug-mes.patch + git apply ../0003-teamd-lacp-runner-will-send-lacp-update-right-after-.patch popd # Obtain debian packaging From 0d978b5b21bb6a2876aa34e0b7334536c71a63f4 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 21 Sep 2017 12:31:02 -0700 Subject: [PATCH 0791/1011] [sairedis]: update sairedis submodule (#974) --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 3cbff4026f2b..79bd891ca533 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 3cbff4026f2bb1afda1c5965db60d30666980675 +Subproject commit 79bd891ca5337222701cd51ee5b266d2e485c492 From 69ff2241699ad37e31f7c2953d748ab7397f9d80 Mon Sep 17 00:00:00 2001 From: Polly Hsu Date: Fri, 22 Sep 2017 03:37:22 +0800 Subject: [PATCH 0792/1011] [device/accton]: Add a new supported device, AS7312-54X (#955) * [device/accton]: Add a new supported device and platform, AS7312-54X Switch Vendor: Edge-core Switch SKU: AS7312-54X ASIC Vendor: Broadcom Swich ASIC: Tomahawk Port Configuration: 48x25G + 6x100G SONiC Image: SONiC-ONIE-Broadcom Signed-off-by: polly_hsu@accton.com * Update port_config.ini * Update sai.profile * Update installer.conf * Update led_proc_init.soc * Update minigraph.xml --- .../Accton-AS7312-54X/port_config.ini | 55 + .../Accton-AS7312-54X/sai.profile | 1 + .../installer.conf | 3 + .../led_proc_init.soc | 79 ++ .../x86_64-accton_as7312_54x-r0/minigraph.xml | 1184 +++++++++++++++++ 5 files changed, 1322 insertions(+) create mode 100644 device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini create mode 100644 device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/sai.profile create mode 100644 device/accton/x86_64-accton_as7312_54x-r0/installer.conf create mode 100755 device/accton/x86_64-accton_as7312_54x-r0/led_proc_init.soc create mode 100644 device/accton/x86_64-accton_as7312_54x-r0/minigraph.xml diff --git a/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini b/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini new file mode 100644 index 000000000000..8eeb6a993cb5 --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini @@ -0,0 +1,55 @@ +# name lanes alias +Ethernet0 41 twentyfiveGigE1 +Ethernet1 42 twentyfiveGigE2 +Ethernet2 43 twentyfiveGigE3 +Ethernet3 44 twentyfiveGigE4 +Ethernet4 49 twentyfiveGigE5 +Ethernet5 50 twentyfiveGigE6 +Ethernet6 51 twentyfiveGigE7 +Ethernet7 52 twentyfiveGigE8 +Ethernet8 53 twentyfiveGigE9 +Ethernet9 54 twentyfiveGigE10 +Ethernet10 55 twentyfiveGigE11 +Ethernet11 56 twentyfiveGigE12 +Ethernet12 65 twentyfiveGigE13 +Ethernet13 66 twentyfiveGigE14 +Ethernet14 67 twentyfiveGigE15 +Ethernet15 68 twentyfiveGigE16 +Ethernet16 33 twentyfiveGigE17 +Ethernet17 34 twentyfiveGigE18 +Ethernet18 35 twentyfiveGigE19 +Ethernet19 36 twentyfiveGigE20 +Ethernet20 37 twentyfiveGigE21 +Ethernet21 38 twentyfiveGigE22 +Ethernet22 39 twentyfiveGigE23 +Ethernet23 40 twentyfiveGigE24 +Ethernet24 69 twentyfiveGigE25 +Ethernet25 70 twentyfiveGigE26 +Ethernet26 71 twentyfiveGigE27 +Ethernet27 72 twentyfiveGigE28 +Ethernet28 81 twentyfiveGigE29 +Ethernet29 82 twentyfiveGigE30 +Ethernet30 83 twentyfiveGigE31 +Ethernet31 84 twentyfiveGigE32 +Ethernet32 85 twentyfiveGigE33 +Ethernet33 86 twentyfiveGigE34 +Ethernet34 87 twentyfiveGigE35 +Ethernet35 88 twentyfiveGigE36 +Ethernet36 97 twentyfiveGigE37 +Ethernet37 98 twentyfiveGigE38 +Ethernet38 99 twentyfiveGigE39 +Ethernet39 100 twentyfiveGigE40 +Ethernet40 101 twentyfiveGigE41 +Ethernet41 102 twentyfiveGigE42 +Ethernet42 103 twentyfiveGigE43 +Ethernet43 104 twentyfiveGigE44 +Ethernet44 105 twentyfiveGigE45 +Ethernet45 106 twentyfiveGigE46 +Ethernet46 107 twentyfiveGigE47 +Ethernet47 108 twentyfiveGigE48 +Ethernet48 5,6,7,8 hundredGigE49 +Ethernet52 1,2,3,4 hundredGigE50 +Ethernet56 109,110,111,112 hundredGigE51 +Ethernet60 21,22,23,24 hundredGigE52 +Ethernet64 9,10,11,12 hundredGigE53 +Ethernet68 117,118,119,120 hundredGigE54 diff --git a/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/sai.profile b/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/sai.profile new file mode 100644 index 000000000000..f239b822834b --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-as7312-48x25G+6x100G.config.bcm diff --git a/device/accton/x86_64-accton_as7312_54x-r0/installer.conf b/device/accton/x86_64-accton_as7312_54x-r0/installer.conf new file mode 100644 index 000000000000..14404194ef53 --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x2f8 +CONSOLE_DEV=1 +CONSOLE_SPEED=115200 diff --git a/device/accton/x86_64-accton_as7312_54x-r0/led_proc_init.soc b/device/accton/x86_64-accton_as7312_54x-r0/led_proc_init.soc new file mode 100755 index 000000000000..3074649497e0 --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/led_proc_init.soc @@ -0,0 +1,79 @@ +# accton_as7312_54x 48x25G+6x100G SDK port LED macro init SOC +s CMIC_LEDUP0_DATA_RAM 0 +s CMIC_LEDUP1_DATA_RAM 0 + +m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=63 REMAP_PORT_1=63 REMAP_PORT_2=63 REMAP_PORT_3=63 +m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=63 REMAP_PORT_5=63 REMAP_PORT_6=63 REMAP_PORT_7=63 +m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=27 REMAP_PORT_9=26 REMAP_PORT_10=25 REMAP_PORT_11=24 +m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=63 REMAP_PORT_13=63 REMAP_PORT_14=63 REMAP_PORT_15=63 +m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=63 REMAP_PORT_17=63 REMAP_PORT_18=63 REMAP_PORT_19=63 +m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=31 REMAP_PORT_21=30 REMAP_PORT_22=29 REMAP_PORT_23=28 +m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=15 REMAP_PORT_25=14 REMAP_PORT_26=13 REMAP_PORT_27=12 +m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=19 REMAP_PORT_29=18 REMAP_PORT_30=17 REMAP_PORT_31=16 +m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=63 REMAP_PORT_33=63 REMAP_PORT_34=63 REMAP_PORT_35=63 +m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=63 REMAP_PORT_37=63 REMAP_PORT_38=63 REMAP_PORT_39=63 +m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=35 REMAP_PORT_41=34 REMAP_PORT_42=33 REMAP_PORT_43=32 +m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=63 REMAP_PORT_45=63 REMAP_PORT_46=63 REMAP_PORT_47=63 +m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=23 REMAP_PORT_49=22 REMAP_PORT_50=21 REMAP_PORT_51=20 +m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=11 REMAP_PORT_53=10 REMAP_PORT_54=9 REMAP_PORT_55=8 +m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=7 REMAP_PORT_57=6 REMAP_PORT_58=5 REMAP_PORT_59=4 +m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=3 REMAP_PORT_61=2 REMAP_PORT_62=1 REMAP_PORT_63=0 + +m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=19 REMAP_PORT_1=18 REMAP_PORT_2=17 REMAP_PORT_3=16 +m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=23 REMAP_PORT_5=22 REMAP_PORT_6=21 REMAP_PORT_7=20 +m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=3 REMAP_PORT_9=2 REMAP_PORT_10=1 REMAP_PORT_11=0 +m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=63 REMAP_PORT_13=63 REMAP_PORT_14=63 REMAP_PORT_15=63 +m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=7 REMAP_PORT_17=6 REMAP_PORT_18=5 REMAP_PORT_19=4 +m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=11 REMAP_PORT_21=10 REMAP_PORT_22=9 REMAP_PORT_23=8 +m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=63 REMAP_PORT_25=63 REMAP_PORT_26=63 REMAP_PORT_27=63 +m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=63 REMAP_PORT_29=63 REMAP_PORT_30=63 REMAP_PORT_31=63 +m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=15 REMAP_PORT_33=14 REMAP_PORT_34=13 REMAP_PORT_35=12 +m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=27 REMAP_PORT_37=26 REMAP_PORT_38=25 REMAP_PORT_39=24 +m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=63 REMAP_PORT_41=63 REMAP_PORT_42=63 REMAP_PORT_43=63 +m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=63 REMAP_PORT_45=63 REMAP_PORT_46=63 REMAP_PORT_47=63 +m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=31 REMAP_PORT_49=30 REMAP_PORT_50=29 REMAP_PORT_51=28 +m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=35 REMAP_PORT_53=34 REMAP_PORT_54=33 REMAP_PORT_55=32 +m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=63 REMAP_PORT_57=63 REMAP_PORT_58=63 REMAP_PORT_59=63 +m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=63 REMAP_PORT_61=63 REMAP_PORT_62=63 REMAP_PORT_63=63 + +led 0 stop +led 0 prog \ + 02 FD 42 80 02 FF 42 00 02 FE 42 00 02 FA 42 7E \ + 02 FB 42 24 06 F9 D2 00 74 1E 02 F9 42 03 67 AC \ + 67 C3 67 52 86 FE 67 C3 67 52 86 FE 67 C3 67 52 \ + 86 FE 67 C3 67 52 86 FE 06 FB D6 FE 74 1E 86 FC \ + 3E FA 06 FE 88 4A 03 71 4C 67 84 57 67 84 57 67 \ + 98 57 06 FE 88 80 4A 00 27 97 75 4F 90 4A 00 27 \ + 4A 01 27 B7 97 71 69 77 42 06 F9 D6 FC 74 7C 02 \ + F9 4A 07 37 4E 07 02 FC 42 00 4E 07 06 F9 0A 07 \ + 71 4F 77 42 16 FF 06 FD 17 4D DA 07 74 95 12 FF \ + 52 00 86 FD 57 86 FF 57 16 FF 06 FD 07 4D DA 07 \ + 74 A9 12 FF 52 00 86 FD 57 86 FF 57 06 FE C2 FC \ + 98 98 12 F4 50 C2 FC 98 98 F2 F0 14 06 F4 C2 03 \ + 88 77 D1 06 FE C2 FC 98 98 F2 E0 14 06 FE C2 03 \ + 88 18 71 E2 80 18 71 DD 67 98 67 98 57 67 98 67 \ + 84 57 80 18 71 EB 67 84 67 98 57 67 84 67 84 57 \ + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +led 0 start +led auto on + +led 1 stop +led 1 prog \ + 02 FD 42 80 02 FF 42 00 02 FE 42 00 02 FA 42 7E \ + 02 FB 42 24 06 F9 D2 00 74 1E 02 F9 42 03 67 AC \ + 67 C3 67 52 86 FE 67 C3 67 52 86 FE 67 C3 67 52 \ + 86 FE 67 C3 67 52 86 FE 06 FB D6 FE 74 1E 86 FC \ + 3E FA 06 FE 88 4A 03 71 4C 67 84 57 67 84 57 67 \ + 98 57 06 FE 88 80 4A 00 27 97 75 4F 90 4A 00 27 \ + 4A 01 27 B7 97 71 69 77 42 06 F9 D6 FC 74 7C 02 \ + F9 4A 07 37 4E 07 02 FC 42 00 4E 07 06 F9 0A 07 \ + 71 4F 77 42 16 FF 06 FD 17 4D DA 07 74 95 12 FF \ + 52 00 86 FD 57 86 FF 57 16 FF 06 FD 07 4D DA 07 \ + 74 A9 12 FF 52 00 86 FD 57 86 FF 57 06 FE C2 FC \ + 98 98 12 F4 50 C2 FC 98 98 F2 F0 14 06 F4 C2 03 \ + 88 77 D1 06 FE C2 FC 98 98 F2 E0 14 06 FE C2 03 \ + 88 18 71 E2 80 18 71 DD 67 98 67 98 57 67 98 67 \ + 84 57 80 18 71 EB 67 84 67 98 57 67 84 67 84 57 \ + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +led 1 start +led auto on diff --git a/device/accton/x86_64-accton_as7312_54x-r0/minigraph.xml b/device/accton/x86_64-accton_as7312_54x-r0/minigraph.xml new file mode 100644 index 000000000000..8547ceacbc58 --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/minigraph.xml @@ -0,0 +1,1184 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet1 + 10.0.0.2/31 + + + + Ethernet2 + 10.0.0.4/31 + + + + Ethernet3 + 10.0.0.6/31 + + + + Ethernet4 + 10.0.0.8/31 + + + + Ethernet5 + 10.0.0.10/31 + + + + Ethernet6 + 10.0.0.12/31 + + + + Ethernet7 + 10.0.0.14/31 + + + + Ethernet8 + 10.0.0.16/31 + + + + Ethernet9 + 10.0.0.18/31 + + + + Ethernet10 + 10.0.0.20/31 + + + + Ethernet11 + 10.0.0.22/31 + + + + Ethernet12 + 10.0.0.24/31 + + + + Ethernet13 + 10.0.0.26/31 + + + + Ethernet14 + 10.0.0.28/31 + + + + Ethernet15 + 10.0.0.30/31 + + + + Ethernet16 + 10.0.0.32/31 + + + + Ethernet17 + 10.0.0.34/31 + + + + Ethernet18 + 10.0.0.36/31 + + + + Ethernet19 + 10.0.0.38/31 + + + + Ethernet20 + 10.0.0.40/31 + + + + Ethernet21 + 10.0.0.42/31 + + + + Ethernet22 + 10.0.0.44/31 + + + + Ethernet23 + 10.0.0.46/31 + + + + Ethernet24 + 10.0.0.48/31 + + + + Ethernet25 + 10.0.0.50/31 + + + + Ethernet26 + 10.0.0.52/31 + + + + Ethernet27 + 10.0.0.54/31 + + + + Ethernet28 + 10.0.0.56/31 + + + + Ethernet29 + 10.0.0.58/31 + + + + Ethernet30 + 10.0.0.60/31 + + + + Ethernet31 + 10.0.0.62/31 + + + + Ethernet32 + 10.0.0.64/31 + + + + Ethernet33 + 10.0.0.66/31 + + + + Ethernet34 + 10.0.0.68/31 + + + + Ethernet35 + 10.0.0.70/31 + + + + Ethernet36 + 10.0.0.72/31 + + + + Ethernet37 + 10.0.0.74/31 + + + + Ethernet38 + 10.0.0.76/31 + + + + Ethernet39 + 10.0.0.78/31 + + + + Ethernet40 + 10.0.0.80/31 + + + + Ethernet41 + 10.0.0.82/31 + + + + Ethernet42 + 10.0.0.84/31 + + + + Ethernet43 + 10.0.0.86/31 + + + + Ethernet44 + 10.0.0.88/31 + + + + Ethernet45 + 10.0.0.90/31 + + + + Ethernet46 + 10.0.0.92/31 + + + + Ethernet47 + 10.0.0.94/31 + + + + Ethernet48 + 10.0.0.96/31 + + + + Ethernet52 + 10.0.0.98/31 + + + + Ethernet56 + 10.0.0.100/31 + + + + Ethernet60 + 10.0.0.102/31 + + + + Ethernet64 + 10.0.0.104/31 + + + + Ethernet68 + 10.0.0.106/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet1 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet2 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet3 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet4 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet5 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet6 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet7 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet8 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet9 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet10 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet11 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet12 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet13 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet14 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet15 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet16 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet17 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet18 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet19 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet20 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet21 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet22 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet23 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet24 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet25 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet26 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet27 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet28 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet29 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet30 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet31 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Accton-AS7312-54X + + + + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + + switch1 + Accton-AS7312-54X +
From 7a9894a99cc5992f96b7f046032de5bdb8072806 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 21 Sep 2017 13:19:44 -0700 Subject: [PATCH 0793/1011] [Broadcom]: Update libsai version to 3.0.3.2-2 (#973) Update Ingrasys/Accton config.bcm files --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 7118da438b22..ca1c76a32ff8 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2_amd64.deb?sv=2015-04-05&sr=b&sig=d50c3WTnlQGVgybK4RyNFWqvXPHPpAotNSongSABpWg%3D&se=2031-05-25T18%3A52%3A35Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-2_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-2_amd64.deb?sv=2015-04-05&sr=b&sig=A9GjUgI9%2B7kRQHsCFqH07iRQLhdkwSH5tvSXepb3b%2BA%3D&se=2031-05-30T22%3A47%3A47Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-2_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2_amd64.deb?sv=2015-04-05&sr=b&sig=psB%2BzhbludRstCuuGncrMOg5oETOY13U26yEXyR2yWc%3D&se=2031-05-25T18%3A50%3A38Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-2_amd64.deb?sv=2015-04-05&sr=b&sig=lDIwnDNHIA0WKc5ggTA4x3pVmBIM%2Bdib0hR7H1qyTe0%3D&se=2031-05-30T22%3A48%3A07Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From 0f6c8c14e8ed38bcceb6bc31c990dc0a177e0ceb Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 21 Sep 2017 14:56:16 -0700 Subject: [PATCH 0794/1011] [teamd]: Remove deprecated blocking logic before starting teamd (#976) With the fixes in /etc/network/interfaces file, host interfaces could be added into the corresponding LAGs automatically. Thus, the logic of checking if port initialization is ready is no longer needed. Signed-off-by: Shu0T1an ChenG --- dockers/docker-teamd/teamd.sh | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/dockers/docker-teamd/teamd.sh b/dockers/docker-teamd/teamd.sh index 37b617150a04..2b6d9fb53970 100755 --- a/dockers/docker-teamd/teamd.sh +++ b/dockers/docker-teamd/teamd.sh @@ -24,15 +24,5 @@ function clean_up { trap clean_up SIGTERM SIGKILL -# Before teamd could automatically add newly created host interfaces into the -# LAG, this workaround will wait until the host interfaces are created and then -# the processes will be started. -while true; do - # Check if front-panel ports are configured - result=`echo -en "SELECT 0\nHGETALL PORT_TABLE:ConfigDone" | redis-cli | sed -n 3p` - if [ "$result" == "0" ]; then - start_app - read - fi - sleep 1 -done +start_app +read From bec99f257a0af3fe60e441704cf5b43377249ec6 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 21 Sep 2017 17:31:39 -0700 Subject: [PATCH 0795/1011] Disable snmpd module disk_hw, so no syslog messages about unavailable disks (#977) * Revert "snmpd ignores unavailable disks (#607)" This reverts commit d70e9734966e542e0a0ed0f29eb5d128931f7b8f. * Disable snmpd module disk_hw, so no syslog messages about unavailable disks Signed-off-by: Qi Luo * Strip white spaces Signed-off-by: Qi Luo --- dockers/docker-snmp-sv2/snmpd.conf.j2 | 11 +++-------- dockers/docker-snmp-sv2/supervisord.conf | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/dockers/docker-snmp-sv2/snmpd.conf.j2 b/dockers/docker-snmp-sv2/snmpd.conf.j2 index 246924cfd387..b46871dfd6f8 100644 --- a/dockers/docker-snmp-sv2/snmpd.conf.j2 +++ b/dockers/docker-snmp-sv2/snmpd.conf.j2 @@ -28,7 +28,7 @@ agentAddress udp:{{ prefix | ip }}:161 {% endif %} {% endfor %} {% else %} -# Listen on all addresses as mgmt ip not specified +# Listen on all addresses as mgmt ip not specified agentAddress udp:161 {% endif %} @@ -61,7 +61,7 @@ sysServices 72 # # Process Monitoring # -# TODO: should we enable snmp based monitoring of sswsyncd and other processes? +# todo: should we enable snmp based monitoring of sswsyncd and other processes? # At least one 'sendmail' process, but no more than 10 #proc sendmail 10 1 @@ -76,12 +76,7 @@ sysServices 72 # 10MBs required on root disk, 5% free on /var, 10% free on all other disks disk / 10000 disk /var 5% - -# Note: includeAllDisks will conflict with ignoredisk -# TODO: /root/* are introduced by aufs union mount, happening in initramfs stage. Clean them in the mount list. -ignoredisk /root/host -ignoredisk /root/dev -ignoredisk /root/dev/pts +includeAllDisks 10% # Walk the UCD-SNMP-MIB::dskTable to see the resulting output # Note that this table will be empty if there are no "disk" entries in the snmpd.conf file diff --git a/dockers/docker-snmp-sv2/supervisord.conf b/dockers/docker-snmp-sv2/supervisord.conf index 60313c57f813..d80579506100 100644 --- a/dockers/docker-snmp-sv2/supervisord.conf +++ b/dockers/docker-snmp-sv2/supervisord.conf @@ -20,7 +20,7 @@ stdout_logfile=syslog stderr_logfile=syslog [program:snmpd] -command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable,inetCidrRouteTable,ipCidrRouteTable,ip -p /run/snmpd.pid +command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable,inetCidrRouteTable,ipCidrRouteTable,ip,disk_hw -p /run/snmpd.pid priority=3 autostart=false autorestart=false From 1ac10dfc6f42836730d986e3966a05e98b26bc9e Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 22 Sep 2017 00:52:15 -0700 Subject: [PATCH 0796/1011] [snmp]: Update sonic-snmpagent submodule (#978) Introducing the fix for SAI 1.0 FDB entry fix --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 186a4f65fbdd..45e4e7826bf3 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 186a4f65fbdde9d277d0aeef562e1fc196266fdb +Subproject commit 45e4e7826bf34850d8cc12861259c5f388e1102e From b5eb0c2ce2f0fd080c2d4f9bc05f0206a26e59f5 Mon Sep 17 00:00:00 2001 From: Rodny Molina Date: Fri, 22 Sep 2017 00:57:23 -0700 Subject: [PATCH 0797/1011] [Makefile] Allowing interactive session with the slave docker-container (#903) * Fixing a couple of issues to enable FRR to run with latest SONiC code. * Adjusting FRR's jinja template to meet latest sonic-cfgen requirements. Basically, i'm just extending #448 changes into FRR. * Eliminate FRR's integrated-config file to prevent daemons from bypassing their own config files. FRR daemons now default to an integrated-config file for config-parsing purposes. But we are still interested in having each daemon looking in their specific config file (bgpd.conf, zebra.conf, etc). So here i'm just deleting this integrating-config file to prevent FRR from running from a bogus config-file. * Allows interactive session with the slave docker-container after conclusion of the building process. Proposed changes provide a more direct access to the building pipeline, by allowing users to launch consecutive compilation tasks from the same slave container. --- Makefile | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 7240237c2744..d672edc6836a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,18 @@ ############################################################################### ## Wrapper for starting make inside sonic-slave container +# +# Supported parameters: +# +# * PLATFORM: Specific platform we wish to build images for. +# * BUILD_NUMBER: Desired version-number to pass to the building-system. +# * ENABLE_DHCP_GRAPH_SERVICE: Enables get-graph service to fetch minigraph files +# through http. +# * SHUTDOWN_BGP_ON_START: Sets admin-down state for all bgp peerings after restart. +# * SONIC_ENABLE_SYNCD_RPC: Enables rpc-based syncd builds. +# * USERNAME: Desired username -- default at rules/config +# * PASSWORD: Desired password -- default at rules/config +# * KEEP_SLAVE_ON: Keeps slave container up after building-process concludes. +# ############################################################################### SHELL = /bin/bash @@ -37,6 +50,16 @@ DOCKER_BUILD = docker build --no-cache \ sonic-slave && \ docker tag $(SLAVE_IMAGE):latest $(SLAVE_IMAGE):$(SLAVE_TAG) +SONIC_BUILD_INSTRUCTION := make \ + -f slave.mk \ + 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) + .PHONY: sonic-slave-build sonic-slave-bash .DEFAULT_GOAL := all @@ -48,16 +71,11 @@ DOCKER_BUILD = docker build --no-cache \ @docker inspect --type image $(SLAVE_IMAGE):$(SLAVE_TAG) &> /dev/null || \ { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ $(DOCKER_BUILD) ; } - @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) make \ - -f slave.mk \ - 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) \ - $@ +ifeq "$(KEEP_SLAVE_ON)" "yes" + @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; /bin/bash" +else + @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) $(SONIC_BUILD_INSTRUCTION) $@ +endif sonic-slave-build : $(DOCKER_BASE_BUILD) From f570616b0dca24d0c38550e5c946e7e9bf00b342 Mon Sep 17 00:00:00 2001 From: Jason Tsai Date: Sat, 23 Sep 2017 03:58:10 +0800 Subject: [PATCH 0798/1011] [Ingrasys]: Change hwmon kernel modules installation order (#980) change hwmon kernel modules installation order on S8810-32Q/S8900-54XC/S8900-64XC/S9100-32X change hwmon kernel modules installation order in i2c_utils.sh and update related fancontrol file Check the hwmon kernel module insertion order in /sys/class/hwmon/hwmonX. w83795 should be in /sys/class/hwmon/hwmon1, and jc42 should be the last one. change hwmon kernel modules installation order on S8810-32Q/S8900-54XC/S8900-64XC/S9100-32X --- .../x86_64-ingrasys_s8810_32q-r0/fancontrol | 17 ++++++++--------- .../x86_64-ingrasys_s8900_54xc-r0/fancontrol | 17 ++++++++--------- .../x86_64-ingrasys_s8900_64xc-r0/fancontrol | 16 ++++++++-------- .../x86_64-ingrasys_s9100-r0/fancontrol | 17 ++++++++--------- .../broadcom/sonic-platform-modules-ingrasys | 2 +- 5 files changed, 33 insertions(+), 36 deletions(-) diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/fancontrol index 05a71e8d999c..8c378371a9a2 100644 --- a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/fancontrol +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/fancontrol @@ -1,12 +1,11 @@ # Configuration file generated by pwmconfig, changes will be lost INTERVAL=10 -DEVPATH=hwmon2=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f -DEVNAME=hwmon2=w83795adg -FCTEMPS=hwmon2/device/pwm2=hwmon2/device/temp2_input hwmon2/device/pwm1=hwmon2/device/temp2_input -#FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input+hwmon2/device/fan7_input+hwmon2/device/fan6_input+hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input+hwmon2/device/fan3_input+hwmon2/device/fan2_input+hwmon2/device/fan1_input -FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input hwmon2/device/pwm2=hwmon2/device/fan7_input hwmon2/device/pwm2=hwmon2/device/fan6_input hwmon2/device/pwm2=hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input hwmon2/device/pwm1=hwmon2/device/fan3_input hwmon2/device/pwm1=hwmon2/device/fan2_input hwmon2/device/pwm1=hwmon2/device/fan1_input -MINTEMP=hwmon2/device/pwm2=20 hwmon2/device/pwm1=20 -MAXTEMP=hwmon2/device/pwm2=60 hwmon2/device/pwm1=60 -MINSTART=hwmon2/device/pwm2=75 hwmon2/device/pwm1=75 -MINSTOP=hwmon2/device/pwm2=22 hwmon2/device/pwm1=22 +DEVPATH=hwmon1=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f +DEVNAME=hwmon1=w83795adg +FCTEMPS=hwmon1/device/pwm2=hwmon1/device/temp2_input hwmon1/device/pwm1=hwmon1/device/temp2_input +FCFANS=hwmon1/device/pwm2=hwmon1/device/fan8_input hwmon1/device/pwm2=hwmon1/device/fan7_input hwmon1/device/pwm2=hwmon1/device/fan6_input hwmon1/device/pwm2=hwmon1/device/fan5_input hwmon1/device/pwm1=hwmon1/device/fan4_input hwmon1/device/pwm1=hwmon1/device/fan3_input hwmon1/device/pwm1=hwmon1/device/fan2_input hwmon1/device/pwm1=hwmon1/device/fan1_input +MINTEMP=hwmon1/device/pwm2=20 hwmon1/device/pwm1=20 +MAXTEMP=hwmon1/device/pwm2=60 hwmon1/device/pwm1=60 +MINSTART=hwmon1/device/pwm2=75 hwmon1/device/pwm1=75 +MINSTOP=hwmon1/device/pwm2=22 hwmon1/device/pwm1=22 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol index 827b0539546f..e1f88f6b79c5 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/fancontrol @@ -1,11 +1,10 @@ # Configuration file generated by pwmconfig, changes will be lost INTERVAL=10 -DEVPATH=hwmon2=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f -DEVNAME=hwmon2=w83795adg -FCTEMPS=hwmon2/device/pwm2=hwmon2/device/temp2_input hwmon2/device/pwm1=hwmon2/device/temp2_input -#FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input+hwmon2/device/fan7_input+hwmon2/device/fan6_input+hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input+hwmon2/device/fan3_input+hwmon2/device/fan2_input+hwmon2/device/fan1_input -FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input hwmon2/device/pwm2=hwmon2/device/fan7_input hwmon2/device/pwm2=hwmon2/device/fan6_input hwmon2/device/pwm2=hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input hwmon2/device/pwm1=hwmon2/device/fan3_input hwmon2/device/pwm1=hwmon2/device/fan2_input hwmon2/device/pwm1=hwmon2/device/fan1_input -MINTEMP=hwmon2/device/pwm2=20 hwmon2/device/pwm1=20 -MAXTEMP=hwmon2/device/pwm2=60 hwmon2/device/pwm1=60 -MINSTART=hwmon2/device/pwm2=75 hwmon2/device/pwm1=75 -MINSTOP=hwmon2/device/pwm2=22 hwmon2/device/pwm1=22 +DEVPATH=hwmon1=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f +DEVNAME=hwmon1=w83795adg +FCTEMPS=hwmon1/device/pwm2=hwmon1/device/temp2_input hwmon1/device/pwm1=hwmon1/device/temp2_input +FCFANS=hwmon1/device/pwm2=hwmon1/device/fan8_input hwmon1/device/pwm2=hwmon1/device/fan7_input hwmon1/device/pwm2=hwmon1/device/fan6_input hwmon1/device/pwm2=hwmon1/device/fan5_input hwmon1/device/pwm1=hwmon1/device/fan4_input hwmon1/device/pwm1=hwmon1/device/fan3_input hwmon1/device/pwm1=hwmon1/device/fan2_input hwmon1/device/pwm1=hwmon1/device/fan1_input +MINTEMP=hwmon1/device/pwm2=20 hwmon1/device/pwm1=20 +MAXTEMP=hwmon1/device/pwm2=60 hwmon1/device/pwm1=60 +MINSTART=hwmon1/device/pwm2=75 hwmon1/device/pwm1=75 +MINSTOP=hwmon1/device/pwm2=22 hwmon1/device/pwm1=22 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol index cb07a7a07f4a..4819fe113172 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/fancontrol @@ -1,10 +1,10 @@ # Configuration file generated by pwmconfig, changes will be lost INTERVAL=10 -DEVPATH=hwmon2=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f -DEVNAME=hwmon2=w83795adg -FCTEMPS=hwmon2/device/pwm1=hwmon2/device/temp2_input hwmon2/device/pwm2=hwmon2/device/temp2_input -FCFANS=hwmon2/device/pwm2=hwmon2/device/fan10_input hwmon2/device/pwm2=hwmon2/device/fan9_input hwmon2/device/pwm2=hwmon2/device/fan8_input hwmon2/device/pwm2=hwmon2/device/fan7_input hwmon2/device/pwm2=hwmon2/device/fan6_input hwmon2/device/pwm2=hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input hwmon2/device/pwm1=hwmon2/device/fan3_input hwmon2/device/pwm1=hwmon2/device/fan2_input hwmon2/device/pwm1=hwmon2/device/fan1_input -MINTEMP=hwmon2/device/pwm1=20 hwmon2/device/pwm2=20 -MAXTEMP=hwmon2/device/pwm1=60 hwmon2/device/pwm2=60 -MINSTART=hwmon2/device/pwm1=150 hwmon2/device/pwm2=150 -MINSTOP=hwmon2/device/pwm1=0 hwmon2/device/pwm2=0 +DEVPATH=hwmon1=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f +DEVNAME=hwmon1=w83795adg +FCTEMPS=hwmon1/device/pwm1=hwmon1/device/temp2_input hwmon1/device/pwm2=hwmon1/device/temp2_input +FCFANS=hwmon1/device/pwm2=hwmon1/device/fan10_input hwmon1/device/pwm2=hwmon1/device/fan9_input hwmon1/device/pwm2=hwmon1/device/fan8_input hwmon1/device/pwm2=hwmon1/device/fan7_input hwmon1/device/pwm2=hwmon1/device/fan6_input hwmon1/device/pwm2=hwmon1/device/fan5_input hwmon1/device/pwm1=hwmon1/device/fan4_input hwmon1/device/pwm1=hwmon1/device/fan3_input hwmon1/device/pwm1=hwmon1/device/fan2_input hwmon1/device/pwm1=hwmon1/device/fan1_input +MINTEMP=hwmon1/device/pwm1=20 hwmon1/device/pwm2=20 +MAXTEMP=hwmon1/device/pwm1=60 hwmon1/device/pwm2=60 +MINSTART=hwmon1/device/pwm1=150 hwmon1/device/pwm2=150 +MINSTOP=hwmon1/device/pwm1=0 hwmon1/device/pwm2=0 diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol index 827b0539546f..e1f88f6b79c5 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/fancontrol @@ -1,11 +1,10 @@ # Configuration file generated by pwmconfig, changes will be lost INTERVAL=10 -DEVPATH=hwmon2=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f -DEVNAME=hwmon2=w83795adg -FCTEMPS=hwmon2/device/pwm2=hwmon2/device/temp2_input hwmon2/device/pwm1=hwmon2/device/temp2_input -#FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input+hwmon2/device/fan7_input+hwmon2/device/fan6_input+hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input+hwmon2/device/fan3_input+hwmon2/device/fan2_input+hwmon2/device/fan1_input -FCFANS=hwmon2/device/pwm2=hwmon2/device/fan8_input hwmon2/device/pwm2=hwmon2/device/fan7_input hwmon2/device/pwm2=hwmon2/device/fan6_input hwmon2/device/pwm2=hwmon2/device/fan5_input hwmon2/device/pwm1=hwmon2/device/fan4_input hwmon2/device/pwm1=hwmon2/device/fan3_input hwmon2/device/pwm1=hwmon2/device/fan2_input hwmon2/device/pwm1=hwmon2/device/fan1_input -MINTEMP=hwmon2/device/pwm2=20 hwmon2/device/pwm1=20 -MAXTEMP=hwmon2/device/pwm2=60 hwmon2/device/pwm1=60 -MINSTART=hwmon2/device/pwm2=75 hwmon2/device/pwm1=75 -MINSTOP=hwmon2/device/pwm2=22 hwmon2/device/pwm1=22 +DEVPATH=hwmon1=devices/pci0000:00/0000:00:1f.3/i2c-0/0-002f +DEVNAME=hwmon1=w83795adg +FCTEMPS=hwmon1/device/pwm2=hwmon1/device/temp2_input hwmon1/device/pwm1=hwmon1/device/temp2_input +FCFANS=hwmon1/device/pwm2=hwmon1/device/fan8_input hwmon1/device/pwm2=hwmon1/device/fan7_input hwmon1/device/pwm2=hwmon1/device/fan6_input hwmon1/device/pwm2=hwmon1/device/fan5_input hwmon1/device/pwm1=hwmon1/device/fan4_input hwmon1/device/pwm1=hwmon1/device/fan3_input hwmon1/device/pwm1=hwmon1/device/fan2_input hwmon1/device/pwm1=hwmon1/device/fan1_input +MINTEMP=hwmon1/device/pwm2=20 hwmon1/device/pwm1=20 +MAXTEMP=hwmon1/device/pwm2=60 hwmon1/device/pwm1=60 +MINSTART=hwmon1/device/pwm2=75 hwmon1/device/pwm1=75 +MINSTOP=hwmon1/device/pwm2=22 hwmon1/device/pwm1=22 diff --git a/platform/broadcom/sonic-platform-modules-ingrasys b/platform/broadcom/sonic-platform-modules-ingrasys index 2725c0f1d1db..458829af29cc 160000 --- a/platform/broadcom/sonic-platform-modules-ingrasys +++ b/platform/broadcom/sonic-platform-modules-ingrasys @@ -1 +1 @@ -Subproject commit 2725c0f1d1db4a3301c00fac8d7e3bc028a37bce +Subproject commit 458829af29ccbaf71ddc70db292e6a468e0e564c From 948f3ad3ecf4575d3e6d41c772a97e5a545f252f Mon Sep 17 00:00:00 2001 From: Volodymyr Samotiy Date: Mon, 25 Sep 2017 23:22:02 +0300 Subject: [PATCH 0799/1011] [mellanox]: Update Mellanox SAI version (#979) Signed-off-by: Volodymyr Samotiy --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index d9ee588a0dfe..bba10132160d 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = sonic1.9.1fixes-master -MLNX_SAI_REVISION = 4ebc01e95b754c56da7f8b5fb45b82fbe661d05a +MLNX_SAI_REVISION = dc0e84b3762f847369524a917e271ceb2878b4d3 export MLNX_SAI_VERSION MLNX_SAI_REVISION From 8143cb34f23abba3396bc9c8499f697a9a8a05bf Mon Sep 17 00:00:00 2001 From: wadelnn Date: Tue, 26 Sep 2017 08:54:17 +0800 Subject: [PATCH 0800/1011] [Ingrasys]: Add Ingrasys S8900-64XC sfputil function and update submodule (#984) * Add S8900-64XC SFP QSFP CPLD kernel module. * Fixed QSFP function call in i2c_utils.sh. * Add QSFP monitor service for SFP and QSFP SI. Signed-off-by: Wade He --- .../plugins/sfputil.py | 283 +++++++++++++----- .../broadcom/sonic-platform-modules-ingrasys | 2 +- 2 files changed, 217 insertions(+), 68 deletions(-) diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py index d6573d20d72f..0b1ae8d3bc8e 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py @@ -1,24 +1,30 @@ -#!/usr/bin/env python - -import subprocess +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import time + import subprocess + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + i2c_set = 'i2cset' +i2c_get = 'i2cget' cpld_addr = '0x33' mux_reg = '0x4A' -class sfputil(sfputilbase): - """Platform specific sfputil class""" +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" - port_start = 0 - port_end = 63 - ports_in_block = 64 + PORT_START = 0 + PORT_END = 63 + QSFP_PORT_START = 48 + PORTS_IN_BLOCK = 64 - port_to_eeprom_mapping = {} + _port_to_eeprom_mapping = {} port_to_i2c_mapping = { 0: [2,1], 1: [2,2], @@ -44,64 +50,207 @@ class sfputil(sfputilbase): 21: [2,22], 22: [2,23], 23: [2,24], - 24: [3,1], - 25: [3,2], - 26: [3,3], - 27: [3,4], - 28: [3,5], - 29: [3,6], - 30: [3,7], - 31: [3,8], - 32: [3,9], - 33: [3,10], - 34: [3,11], - 35: [3,12], - 36: [3,13], - 37: [3,14], - 38: [3,15], - 39: [3,16], - 40: [3,17], - 41: [3,18], - 42: [3,19], - 43: [3,20], - 44: [3,21], - 45: [3,22], - 46: [3,23], - 47: [3,24], - 48: [4,1], - 49: [4,2], - 50: [4,3], - 51: [4,4], - 52: [4,5], - 53: [4,6], - 54: [4,7], - 55: [4,8], - 56: [4,9], - 57: [4,10], - 58: [4,11], - 59: [4,12], - 60: [4,13], - 61: [4,14], - 62: [4,15], - 63: [4,16] + 24: [3,25], + 25: [3,26], + 26: [3,27], + 27: [3,28], + 28: [3,29], + 29: [3,30], + 30: [3,31], + 31: [3,32], + 32: [3,33], + 33: [3,34], + 34: [3,35], + 35: [3,36], + 36: [3,37], + 37: [3,38], + 38: [3,39], + 39: [3,40], + 40: [3,41], + 41: [3,42], + 42: [3,43], + 43: [3,44], + 44: [3,45], + 45: [3,46], + 46: [3,47], + 47: [3,48], + 48: [4,49], + 49: [4,50], + 50: [4,51], + 51: [4,52], + 52: [4,53], + 53: [4,54], + 54: [4,55], + 55: [4,56], + 56: [4,57], + 57: [4,58], + 58: [4,59], + 59: [4,60], + 60: [4,61], + 61: [4,62], + 62: [4,63], + 63: [4,64] } + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END - _qsfp_ports = range(0, ports_in_block + 1) + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - i2c_bus = self.port_to_i2c_mapping[port_num][0] - sfp_idx = self.port_to_i2c_mapping[port_num][1] - proc = subprocess.Popen([i2c_set, '-y', str(i2c_bus), cpld_addr, mux_reg, str(sfp_idx)], - stdout=subprocess.PIPE, - shell=False, - stderr=subprocess.STDOUT) - stdout = proc.communicate()[0] - proc.wait() + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping - eeprom_path = '/sys/class/i2c-adapter/i2c-{0[0]}/{0[0]}-0050/eeprom' - for x in range(self.port_start, self.port_end + 1): - port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + @property + def qsfp_port_start(self): + return self.QSFP_PORT_START + + def __init__(self): + + sfp_eeprom_path = '/sys/bus/i2c/devices/{0[0]}-0050/sfp{0[1]}' + qsfp_eeprom_path = '/sys/bus/i2c/devices/{0[0]}-0050/qsfp{0[1]}' + for x in range(self.port_start, self.qsfp_port_start): + port_eeprom_path = sfp_eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + for x in range(self.qsfp_port_start, self.port_end + 1): + port_eeprom_path = qsfp_eeprom_path.format(self.port_to_i2c_mapping[x]) self.port_to_eeprom_mapping[x] = port_eeprom_path - sfputilbase.__init__(self, port_num) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/ingrasys-s8900-64xc-cpld.0/qsfp_modprs") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # content is a string, either "0" or "1" + if reg_value & mask == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.qsfp_port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/ingrasys-s8900-64xc-cpld.0/qsfp_lpmode") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << (port_num - self.qsfp_port_start) ) + + # LPMode is active high + if reg_value & mask == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.qsfp_port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/ingrasys-s8900-64xc-cpld.0/qsfp_lpmode", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << (port_num - self.qsfp_port_start) ) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = hex(reg_value) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/devices/platform/ingrasys-s8900-64xc-cpld.0/qsfp_reset" + + # Check for invalid port_num + if port_num < self.qsfp_port_start or port_num > self.port_end: + return False + + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # File content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << (port_num - self.qsfp_port_start)) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_value | mask + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + return True diff --git a/platform/broadcom/sonic-platform-modules-ingrasys b/platform/broadcom/sonic-platform-modules-ingrasys index 458829af29cc..e66b8839da21 160000 --- a/platform/broadcom/sonic-platform-modules-ingrasys +++ b/platform/broadcom/sonic-platform-modules-ingrasys @@ -1 +1 @@ -Subproject commit 458829af29ccbaf71ddc70db292e6a468e0e564c +Subproject commit e66b8839da2180fd586aae040701faf180d59477 From a4ceff728414726f91f6267d154d78c80b592e48 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 25 Sep 2017 17:54:46 -0700 Subject: [PATCH 0801/1011] [Broadcom]: Update SAI version to 3.0.3.2-4 (#983) - Update Seastone config.bcm files - bugfix: Fix set attribute for ipv6 neighbor --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index ca1c76a32ff8..1bee2d9aa5de 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-2_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-2_amd64.deb?sv=2015-04-05&sr=b&sig=A9GjUgI9%2B7kRQHsCFqH07iRQLhdkwSH5tvSXepb3b%2BA%3D&se=2031-05-30T22%3A47%3A47Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-4_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-4_amd64.deb?sv=2015-04-05&sr=b&sig=8LE5JB9YlYHVWFf0QF5vFF7fCUbpo14OXokBi%2BKb9GI%3D&se=2031-06-04T20%3A15%3A13Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-2_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-4_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-2_amd64.deb?sv=2015-04-05&sr=b&sig=lDIwnDNHIA0WKc5ggTA4x3pVmBIM%2Bdib0hR7H1qyTe0%3D&se=2031-05-30T22%3A48%3A07Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-4_amd64.deb?sv=2015-04-05&sr=b&sig=UGqSnxGtIxFBdO%2FDcFbZdPFgBPN695JQ6hLP5mBOt7g%3D&se=2031-06-04T20%3A15%3A26Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From cce2a365280150019a2a313567bdd21e9f98f666 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 25 Sep 2017 20:01:42 -0700 Subject: [PATCH 0802/1011] [snmp]: Update sonic-snmpagent submodule (#986) [rfc4363]: Add key check logic for SAI bridge port objects (#38) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 45e4e7826bf3..8dfcbd2be6ba 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 45e4e7826bf34850d8cc12861259c5f388e1102e +Subproject commit 8dfcbd2be6ba5e2e08c68f748a5f22739fe0f560 From 0db870475468f768493485d89ce7e033b90f3bd8 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 26 Sep 2017 21:22:00 +0300 Subject: [PATCH 0803/1011] [Mellanox]: Remove FW upgrade procedure in docker (#989) FW upgrade is done outside the container. This piece of code was left accidentally during the merge. --- platform/mellanox/docker-syncd-mlnx/start.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/platform/mellanox/docker-syncd-mlnx/start.sh b/platform/mellanox/docker-syncd-mlnx/start.sh index 0ad00c6fc252..623316050475 100755 --- a/platform/mellanox/docker-syncd-mlnx/start.sh +++ b/platform/mellanox/docker-syncd-mlnx/start.sh @@ -4,8 +4,4 @@ rm -f /var/run/rsyslogd.pid supervisorctl start rsyslogd -# mlnx-fw-upgrade.sh will exit if firmware was actually upgraded -# or if some error occurs -. mlnx-fw-upgrade.sh - supervisorctl start syncd From 9b249ceb59c745306d4e4365d87e1b608ba2040b Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Wed, 27 Sep 2017 10:04:34 +0300 Subject: [PATCH 0804/1011] Add time stamp suffix to the dirty images version string (#958) * Add timestamp suffix to the dirty images version string This will allow to build different debug images without having to update BUILD_NUMBER variable before the build * Changed timestamp format to YYYYMMDD.HHMMSS --- functions.sh | 2 +- slave.mk | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/functions.sh b/functions.sh index c73aeb45d649..01f645ca72c7 100644 --- a/functions.sh +++ b/functions.sh @@ -55,7 +55,7 @@ sonic_get_version() { local latest_tag=$(git describe --tags --abbrev=0) local branch_name=$(git rev-parse --abbrev-ref HEAD) if [ -n "$(git status --untracked-files=no -s --ignore-submodules)" ]; then - local dirty="-dirty" + local dirty="-dirty-$DIRTY_SUFFIX" fi BUILD_NUMBER=${BUILD_NUMBER:-0} ## Check if we are on tagged commit diff --git a/slave.mk b/slave.mk index 4e76661588fb..c26e4932f05a 100644 --- a/slave.mk +++ b/slave.mk @@ -423,6 +423,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform chmod +x sonic_debian_extension.sh, ) + DIRTY_SUFFIX="$(shell date +%Y%m%d\.%H%M%S)" + export DIRTY_SUFFIX ./build_debian.sh "$(USERNAME)" "$(shell perl -e 'print crypt("$(PASSWORD)", "salt"),"\n"')" $(LOG) TARGET_MACHINE=$($*_MACHINE) IMAGE_TYPE=$($*_IMAGE_TYPE) ./build_image.sh $(LOG) From 59c03083d39f496c6e55dfb33edb2d3533d5f7df Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Fri, 29 Sep 2017 03:04:27 +0800 Subject: [PATCH 0805/1011] [Mellanox]: Update outdated MSN2410 minigraph (#995) update the minigraph to the latest. the previous one causes MSN2410 failing to start up properly. --- .../x86_64-mlnx_msn2410-r0/minigraph.xml | 676 +++++++++++++++++- 1 file changed, 675 insertions(+), 1 deletion(-) diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml b/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml index ed21b8d6eeb9..ea765fab814d 100644 --- a/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/minigraph.xml @@ -2,11 +2,461 @@ + + ARISTA01T0 + 10.0.0.33 + switch2 + 10.0.0.32 + 1 + 180 + 60 + + + switch2 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch2 + 10.0.0.34 + 1 + 180 + 60 + + + switch2 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch2 + 10.0.0.36 + 1 + 180 + 60 + + + switch2 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch2 + 10.0.0.38 + 1 + 180 + 60 + + + switch2 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch2 + 10.0.0.40 + 1 + 180 + 60 + + + switch2 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch2 + 10.0.0.42 + 1 + 180 + 60 + + + switch2 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch2 + 10.0.0.44 + 1 + 180 + 60 + + + switch2 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch2 + 10.0.0.46 + 1 + 180 + 60 + + + switch2 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch2 + 10.0.0.48 + 1 + 180 + 60 + + + switch2 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch2 + 10.0.0.50 + 1 + 180 + 60 + + + switch2 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch2 + 10.0.0.52 + 1 + 180 + 60 + + + switch2 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch2 + 10.0.0.54 + 1 + 180 + 60 + + + switch2 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch2 + 10.0.0.56 + 1 + 180 + 60 + + + switch2 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch2 + 10.0.0.58 + 1 + 180 + 60 + + + switch2 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch2 + 10.0.0.60 + 1 + 180 + 60 + + + switch2 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch2 + 10.0.0.62 + 1 + 180 + 60 + + + switch2 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + 65100 switch2 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
@@ -482,13 +932,237 @@ + + DeviceInterfaceLink + switch2 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet60 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet64 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet68 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet72 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet76 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet80 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet84 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet88 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet92 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet96 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet100 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet104 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet108 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet112 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet116 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet120 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch2 + Ethernet124 + ARISTA16T0 + Ethernet1 + switch2 ACS-MSN2410 - ` + From 6483919852ade151b6c02c8c932b5cbce2260fb8 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 28 Sep 2017 20:29:31 -0700 Subject: [PATCH 0806/1011] [Broadcom]: Update SAI version to 3.0.3.2-5 (#997) - Add additional DropCancel and CopyToCpuCancel action rules for every redirect --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 1bee2d9aa5de..ea804a69c0eb 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-4_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-4_amd64.deb?sv=2015-04-05&sr=b&sig=8LE5JB9YlYHVWFf0QF5vFF7fCUbpo14OXokBi%2BKb9GI%3D&se=2031-06-04T20%3A15%3A13Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-5_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-5_amd64.deb?sv=2015-04-05&sr=b&sig=MQE6FrxHs%2BIUPjRaSpWagcSjY6bbHLCUYasusxILkEs%3D&se=2031-06-07T21%3A50%3A36Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-4_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-5_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-4_amd64.deb?sv=2015-04-05&sr=b&sig=UGqSnxGtIxFBdO%2FDcFbZdPFgBPN695JQ6hLP5mBOt7g%3D&se=2031-06-04T20%3A15%3A26Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-5_amd64.deb?sv=2015-04-05&sr=b&sig=o8bjWlxxYAM%2F95aSshRFJE57JwKVjRaH4jDU2lDEoMg%3D&se=2031-06-07T21%3A50%3A19Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From f7a38e1f65fdd44980ab552bbfb1f443dc15f5ae Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 28 Sep 2017 21:01:41 -0700 Subject: [PATCH 0807/1011] [snmp]: Update py-swsssdk/snmpagent submodules (#996) sonic-py-swsssdk - Commond utility functions for bridge/port mapping snmp - Update the code to use common library API for bridge/port mapping --- src/sonic-py-swsssdk | 2 +- src/sonic-snmpagent | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 7f8e7c5ad974..96b4928e790b 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 7f8e7c5ad9747af1d8ce5317eb1ece65ed4c0c7a +Subproject commit 96b4928e790bbce7c959f0b5cbb0510e5954afb1 diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 8dfcbd2be6ba..6996123be4f0 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 8dfcbd2be6ba5e2e08c68f748a5f22739fe0f560 +Subproject commit 6996123be4f0a1d44aab7e23ac6ff15e7bb82b1b From 9efcc9c3338e7609d5ac374c7cc33cacdf4d6b7a Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Sat, 30 Sep 2017 00:44:55 +0300 Subject: [PATCH 0808/1011] [swss]: Update swss/common submodules (#988) * Update swss submodule reference * Update swss-common submodule reference This pull request introduces changes including 1. Use unified buffer configurations fro all Mellanox 27xx platforms 2. Refactor TableConsumable and optimize popping empty logics 3. Add SwitchOrch to deal with switch attributes changes 4. Refactor doAclTableTask and doAclRuleTask 5. Add PFC watchdog tables and runRedisScript function in common library Signed-off-by: Andriy Moroz --- dockers/docker-orchagent/swssconfig.sh | 7 +++---- src/sonic-config-engine/minigraph.py | 1 + src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index f075ca4f22ac..7b22fe7d190d 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -45,10 +45,9 @@ elif [ "$HWSKU" == "Force10-S6000-Q32" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [ "$HWSKU" == "Arista-7050-QX32" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " -elif [ "$HWSKU" == "ACS-MSN2700" ]; then - SWSSCONFIG_ARGS+="msn2700.32ports.buffers.json msn2700.32ports.qos.json " -elif [ "$HWSKU" == "ACS-MSN2740" ]; then - SWSSCONFIG_ARGS+="msn2740.32ports.buffers.json msn2740.32ports.qos.json " +elif [[ "$HWSKU" == "ACS-MSN27"* ]]; then + sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/msn27xx.32ports.buffers.json.j2 > /etc/swss/config.d/msn27xx.32ports.buffers.json + SWSSCONFIG_ARGS+="msn27xx.32ports.buffers.json msn2700.32ports.qos.json " fi for file in $SWSSCONFIG_ARGS; do diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index b5e97b485b44..95a45b8530de 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -101,6 +101,7 @@ def parse_png(png, hname): for device in child.findall(str(QName(ns, "Device"))): (lo_prefix, mgmt_prefix, name, hwsku, d_type) = parse_device(device) device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku } + name = name.replace('"', '') if neighbors.has_key(name): neighbors[name].update(device_data) else: diff --git a/src/sonic-swss b/src/sonic-swss index 4c56d23b9ff4..770a8f33c1bf 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 4c56d23b9ff4940bdf576cf7c9e5aa77adcbbdcc +Subproject commit 770a8f33c1bff299be683bfc7f8e07a2d65f9ef3 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index d4adb725ae6d..53bb53179d91 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit d4adb725ae6d7cbfcff939b1e3b6a4a544bd4de3 +Subproject commit 53bb53179d916a45eafa75e1e958f1432d2a716e From bbf1d6624bcec3ba9de96cbee835430230e446d6 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Sat, 30 Sep 2017 10:55:03 -0700 Subject: [PATCH 0809/1011] [docker-platform-monitor]: Remove stale fancontrol.pid file (if exists) before starting fancontrol (#1002) --- dockers/docker-platform-monitor/start.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dockers/docker-platform-monitor/start.sh b/dockers/docker-platform-monitor/start.sh index fb87083f5cc6..b4023c16367a 100755 --- a/dockers/docker-platform-monitor/start.sh +++ b/dockers/docker-platform-monitor/start.sh @@ -18,6 +18,9 @@ fi # If this platform has a fancontrol config file, copy it to it's proper place # and start fancontrol if [ -e /usr/share/sonic/platform/fancontrol ]; then + # Remove stale pid file if it exists + rm -f /var/run/fancontrol.pid + /bin/cp -f /usr/share/sonic/platform/fancontrol /etc/ supervisorctl start fancontrol fi From 002aabe8ba5e59e6ab2a9fc7f0db48371150ec74 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Sat, 30 Sep 2017 11:02:18 -0700 Subject: [PATCH 0810/1011] Change all port_config.ini column headers from 'port' to 'index' (#1001) --- .../x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini | 2 +- .../x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini | 2 +- .../x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini | 2 +- .../x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini | 2 +- .../x86_64-arista_7260cx3_64/Arista-7260CX3-C64/port_config.ini | 2 +- .../Arista-7260CX3-D108C8/port_config.ini | 2 +- .../INGRASYS-S8810-32Q/port_config.ini | 2 +- .../INGRASYS-S8900-54XC/port_config.ini | 2 +- .../INGRASYS-S8900-64XC/port_config.ini | 2 +- .../x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini b/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini index dea477b26152..1cc6c91b1308 100644 --- a/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-Q16S64/port_config.ini @@ -1,4 +1,4 @@ -# name lanes alias port +# name lanes alias index Ethernet0 125,126,127,128 Ethernet1/1 1 Ethernet4 121,122,123,124 Ethernet2/1 2 Ethernet8 13,14,15,16 Ethernet3/1 3 diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini index 32fa6885fa93..b57f14497e39 100644 --- a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/port_config.ini @@ -1,4 +1,4 @@ -# name lanes alias port +# name lanes alias index Ethernet0 125,126,127,128 Ethernet1/1 1 Ethernet4 121,122,123,124 Ethernet2/1 2 Ethernet8 13,14,15,16 Ethernet3/1 3 diff --git a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini index cb36404ac44f..fda62e998c1a 100644 --- a/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini +++ b/device/arista/x86_64-arista_7050_qx32s/Arista-7050-QX-32S/port_config.ini @@ -1,4 +1,4 @@ -# name lanes alias port +# name lanes alias index Ethernet0 9,10,11,12 Ethernet5/1 5 Ethernet4 13,14,15,16 Ethernet6/1 6 Ethernet8 17,18,19,20 Ethernet7/1 7 diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini index c1dbcfabd9e3..bfe4a721141d 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini @@ -1,4 +1,4 @@ -# name lanes alias port +# name lanes alias index Ethernet0 33,34,35,36 Ethernet1/1 1 Ethernet4 37,38,39,40 Ethernet2/1 2 Ethernet8 41,42,43,44 Ethernet3/1 3 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/port_config.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/port_config.ini index 4f073e46dce3..1119dfd231c6 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/port_config.ini +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-C64/port_config.ini @@ -1,4 +1,4 @@ -# name lanes alias port +# name lanes alias index Ethernet0 77,78,79,80 Ethernet1/1 1 Ethernet4 65,66,67,68 Ethernet2/1 2 Ethernet8 85,86,87,88 Ethernet3/1 3 diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini index b06d1c7575d4..35a2175cf21d 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini @@ -1,4 +1,4 @@ -# name lanes alias port +# name lanes alias index Ethernet0 77,78 Ethernet1/1 1 Ethernet2 79,80 Ethernet1/3 2 Ethernet4 65,66 Ethernet2/1 3 diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini index a313c9cda21f..bf87e1402ab1 100644 --- a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/INGRASYS-S8810-32Q/port_config.ini @@ -1,4 +1,4 @@ -# name lanes alias port +# name lanes alias index Ethernet0 37,38,39,40 Ethernet1/1 0 Ethernet4 33,34,35,36 Ethernet2/1 1 Ethernet8 45,46,47,48 Ethernet3/1 2 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini index c1243db622f6..3350b68172cb 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini @@ -1,4 +1,4 @@ -# name lanes alias port +# name lanes alias index Ethernet0 1 Ethernet1 0 Ethernet1 2 Ethernet2 1 Ethernet2 3 Ethernet3 2 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini index 20c2138dfeb3..b950538edba7 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini @@ -1,4 +1,4 @@ -# name lanes alias port +# name lanes alias index Ethernet0 17 Ethernet1 0 Ethernet1 18 Ethernet2 1 Ethernet2 19 Ethernet3 2 diff --git a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini index 6c62497b8927..ab0202011576 100644 --- a/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini +++ b/device/ingrasys/x86_64-ingrasys_s9100-r0/INGRASYS-S9100-C32/port_config.ini @@ -1,4 +1,4 @@ -# name lanes alias port +# name lanes alias index Ethernet0 5,6,7,8 Ethernet1/1 0 Ethernet4 1,2,3,4 Ethernet2/1 1 Ethernet8 13,14,15,16 Ethernet3/1 2 From 486dfef732481269fd72f20e51b6404e30dd2b44 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Sat, 30 Sep 2017 11:03:32 -0700 Subject: [PATCH 0811/1011] [swss]: Update the ipinip.j2 template to specify the IPv4 loopback address (#998) Use ipv4_loopback_addresses variable to store all IPv4 loopback addresses. The source IP for encapsulation is chosen from one of the addresses. The destination IPs for decapsulation is the list of the addresses. Signed-off-by: Shu0T1an ChenG --- dockers/docker-orchagent/ipinip.json.j2 | 12 +++++++++--- .../tests/sample_output/ipinip.json | 1 - 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/dockers/docker-orchagent/ipinip.json.j2 b/dockers/docker-orchagent/ipinip.json.j2 index 2f411b088e6d..2554755c701d 100644 --- a/dockers/docker-orchagent/ipinip.json.j2 +++ b/dockers/docker-orchagent/ipinip.json.j2 @@ -1,9 +1,16 @@ +{# only IPv4 decapsulation is supported #} +{% set ipv4_loopback_addresses = [] %} +{% for (name, prefix) in LOOPBACK_INTERFACE %} + {%- if prefix | ipv4 %} + {%- set ipv4_loopback_addresses = ipv4_loopback_addresses.append(prefix) %} + {%- endif %} +{% endfor %} [ { "TUNNEL_DECAP_TABLE:IPINIP_TUNNEL" : { "tunnel_type":"IPINIP", - "src_ip":"{{ LOOPBACK_INTERFACE.keys()[0][1] | ip }}", - "dst_ip":"{{ LOOPBACK_INTERFACE.keys()[0][1] | ip }}", + "src_ip":"{{ ipv4_loopback_addresses | first | ip }}", + "dst_ip":"{% for prefix in ipv4_loopback_addresses %}{{ prefix | ip }}{% if not loop.last %},{% endif %}{% endfor %}", {% if onie_switch_asic == "mlnx" %} "dscp_mode":"uniform", "ecn_mode":"standard", @@ -16,4 +23,3 @@ "OP": "SET" } ] - diff --git a/src/sonic-config-engine/tests/sample_output/ipinip.json b/src/sonic-config-engine/tests/sample_output/ipinip.json index 00862a379281..5a7ac1b6063b 100644 --- a/src/sonic-config-engine/tests/sample_output/ipinip.json +++ b/src/sonic-config-engine/tests/sample_output/ipinip.json @@ -11,4 +11,3 @@ "OP": "SET" } ] - From b81f2f2fa39647d981f5fb02b5c3bd5584081e37 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 2 Oct 2017 13:56:16 -0700 Subject: [PATCH 0812/1011] [snmpagent]: Update sonic-snmpagent submodule (#1004) * [mibs]: Fix bug module has no attribute 'get_index_from_str' Signed-off-by: Shu0T1an ChenG --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 6996123be4f0..bc4becf97ea6 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 6996123be4f0a1d44aab7e23ac6ff15e7bb82b1b +Subproject commit bc4becf97ea69c15315414e8c7cba44067af2461 From 7c326e3f1edb0804220f0eee19e49ab51bb3fd65 Mon Sep 17 00:00:00 2001 From: Rodny Molina Date: Tue, 3 Oct 2017 09:26:07 -0700 Subject: [PATCH 0813/1011] [utilities]: Update sonic-utilities submodule (#1006) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 0338eee64574..b27d4f9e976f 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 0338eee645741937603c5686bb86b22cb5ab5322 +Subproject commit b27d4f9e976f944f50d81e2354ba826194971774 From 72e947621c413b6069b719f6bbad05c8abbdf1df Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 3 Oct 2017 16:23:19 -0700 Subject: [PATCH 0814/1011] [config-engine]: Fix bug multiple ports connecting to same neighbor (#1005) The current DEVICE_NEIGHBOR format doesn't support multiple different ports connecting with same neighbor. Thus the lldpd.conf file is not generated correctly, causing missing information for LAG members. This fix reverts the data structure in the previous version of minigraph parser - using local port as the key and remote port/device as the value of the map. Sample format is: DEVICE_NEIGHBOR['Ethernet124'] = { 'name': 'ARISTA04T1', 'port': 'Ethernet1/1' } The corresponding unit test in test_cfggen is updated. Add one more unit test for lldpd.conf.j2 verification. Signed-off-by: Shu0T1an ChenG --- dockers/docker-lldp-sv2/lldpd.conf.j2 | 4 ++-- src/sonic-config-engine/minigraph.py | 10 +++------- src/sonic-config-engine/tests/sample_output/lldpd.conf | 5 +++++ src/sonic-config-engine/tests/test_cfggen.py | 4 ++-- src/sonic-config-engine/tests/test_j2files.py | 8 +++++++- 5 files changed, 19 insertions(+), 12 deletions(-) create mode 100644 src/sonic-config-engine/tests/sample_output/lldpd.conf diff --git a/dockers/docker-lldp-sv2/lldpd.conf.j2 b/dockers/docker-lldp-sv2/lldpd.conf.j2 index ffbf7e6993e9..eb7202df7c67 100644 --- a/dockers/docker-lldp-sv2/lldpd.conf.j2 +++ b/dockers/docker-lldp-sv2/lldpd.conf.j2 @@ -1,3 +1,3 @@ -{% for neighbor in DEVICE_NEIGHBOR %} -configure ports {{ DEVICE_NEIGHBOR[neighbor]['local_port'] }} lldp portidsubtype local {{ PORT[DEVICE_NEIGHBOR[neighbor]['local_port']]['alias'] }} description {{ neighbor }}:{{ DEVICE_NEIGHBOR[neighbor]['port'] }} +{% for local_port in DEVICE_NEIGHBOR %} +configure ports {{ local_port }} lldp portidsubtype local {{ PORT[local_port]['alias'] }} description {{ DEVICE_NEIGHBOR[local_port]['name'] }}:{{ DEVICE_NEIGHBOR[local_port]['port'] }} {% endfor %} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 95a45b8530de..997008af5cee 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -91,21 +91,17 @@ def parse_png(png, hname): if enddevice == hname: if port_alias_map.has_key(endport): endport = port_alias_map[endport] - neighbors[startdevice] = {'local_port': endport, 'port': startport} + neighbors[endport] = {'name': startdevice, 'port': startport} else: if port_alias_map.has_key(startport): startport = port_alias_map[startport] - neighbors[enddevice] = {'local_port': startport, 'port': endport} + neighbors[startport] = {'name': enddevice, 'port': endport} if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): (lo_prefix, mgmt_prefix, name, hwsku, d_type) = parse_device(device) device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku } - name = name.replace('"', '') - if neighbors.has_key(name): - neighbors[name].update(device_data) - else: - devices[name] = device_data + devices[name] = device_data if child.tag == str(QName(ns, "DeviceInterfaceLinks")): for if_link in child.findall(str(QName(ns, 'DeviceLinkBase'))): diff --git a/src/sonic-config-engine/tests/sample_output/lldpd.conf b/src/sonic-config-engine/tests/sample_output/lldpd.conf new file mode 100644 index 000000000000..0328385cf307 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/lldpd.conf @@ -0,0 +1,5 @@ +configure ports Ethernet116 lldp portidsubtype local fortyGigE0/116 description ARISTA02T1:Ethernet1/1 +configure ports Ethernet124 lldp portidsubtype local fortyGigE0/124 description ARISTA04T1:Ethernet1/1 +configure ports Ethernet112 lldp portidsubtype local fortyGigE0/112 description ARISTA01T1:Ethernet1/1 +configure ports Ethernet120 lldp portidsubtype local fortyGigE0/120 description ARISTA03T1:Ethernet1/1 + diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 4303f5a2492d..d78b19d88ba7 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -106,9 +106,9 @@ def test_minigraph_portchannel_interfaces(self): self.assertEqual(output.strip(), "[('PortChannel01', 'FC00::71/126'), ('PortChannel01', '10.0.0.56/31')]") def test_minigraph_neighbors(self): - argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v "DEVICE_NEIGHBOR[\'ARISTA01T1\']"' + argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v "DEVICE_NEIGHBOR[\'Ethernet124\']"' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'mgmt_addr': None, 'hwsku': 'Arista', 'lo_addr': None, 'local_port': 'Ethernet112', 'type': 'LeafRouter', 'port': 'Ethernet1/1'}") + self.assertEqual(output.strip(), "{'name': 'ARISTA04T1', 'port': 'Ethernet1/1'}") def test_minigraph_bgp(self): argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v "BGP_NEIGHBOR[\'10.0.0.59\']"' diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 9b71fc72b932..4bdc1b41f5b4 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -26,10 +26,16 @@ def test_interfaces(self): def test_alias_map(self): alias_map_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-snmp-sv2', 'alias_map.j2') - argument = '-m "' + self.t0_minigraph + '" -p "' + self.t0_port_config + '" -t "' + alias_map_template + '"' + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + alias_map_template output = self.run_script(argument) data = json.loads(output) self.assertEqual(data["Ethernet4"], "fortyGigE0/4") + + def test_lldp(self): + lldpd_conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-lldp-sv2', 'lldpd.conf.j2') + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + lldpd_conf_template + ' > ' + self.output_file + self.run_script(argument) + self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'lldpd.conf'), self.output_file)) def test_teamd(self): From 646e8364713cecdb50e95c237b7473d2f7a81544 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 3 Oct 2017 23:07:05 -0700 Subject: [PATCH 0815/1011] [swss]: Update swss-common/sairedis/swss submodules (#1008) Signed-off-by: Qi Luo --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 79bd891ca533..e4d24276cb6f 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 79bd891ca5337222701cd51ee5b266d2e485c492 +Subproject commit e4d24276cb6fc7122f756c637f30ddea27487c70 diff --git a/src/sonic-swss b/src/sonic-swss index 770a8f33c1bf..bcdea1323e70 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 770a8f33c1bff299be683bfc7f8e07a2d65f9ef3 +Subproject commit bcdea1323e70c73fa0a85c6df55eaed886bded81 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 53bb53179d91..f6ff19bee131 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 53bb53179d916a45eafa75e1e958f1432d2a716e +Subproject commit f6ff19bee131048f2274a21ea1064a8493a7fd8b From 554114cfaa4b55a85e3a74b169bfcf1a394accdd Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 4 Oct 2017 01:02:30 -0700 Subject: [PATCH 0816/1011] Make swssconfig status FATAL when it fails (#1009) * Make supervisor controlled one-shot program autorestart 0 time, so the status will become FATAL instead of EXITED if failure happens Signed-off-by: Qi Luo * Make swssconfig.sh strictly exit on any failure Signed-off-by: Qi Luo * Tune startretries, tested in supervisor 3.3.2-1 Signed-off-by: Qi Luo --- dockers/docker-orchagent/supervisord.conf | 3 ++- dockers/docker-orchagent/swssconfig.sh | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/dockers/docker-orchagent/supervisord.conf b/dockers/docker-orchagent/supervisord.conf index a04238472c4c..09850b13d4a1 100644 --- a/dockers/docker-orchagent/supervisord.conf +++ b/dockers/docker-orchagent/supervisord.conf @@ -55,7 +55,8 @@ stderr_logfile=syslog command=/usr/bin/swssconfig.sh priority=7 autostart=false -autorestart=false +autorestart=unexpected +startretries=0 stdout_logfile=syslog stderr_logfile=syslog diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index 7b22fe7d190d..55a22c5353c8 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash +set -e + function config_acl { if [ -f "/etc/sonic/acl.json" ]; then mkdir -p /etc/swss/config.d/acl From 1cd9818fe9a801a2f03f0ff80d2cffa1b3e25171 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 4 Oct 2017 19:50:39 -0700 Subject: [PATCH 0817/1011] [build]: sonic-utilities package depends on swsssdk; build as wheel and add build dependency (#1011) * [build]: sonic-utilities package now depends on swsssdk; add build dependency * Now building sonic-utilities Python package in wheel format * Update sonic-utilities submodule * Change output wheel name to match proper format --- files/build_templates/sonic_debian_extension.j2 | 8 +++++--- rules/sonic-utilities.mk | 8 +++++--- slave.mk | 3 ++- src/sonic-utilities | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 04f5181ff610..a08872c4ea42 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -77,9 +77,11 @@ sudo cp {{swsssdk_py2_wheel_path}} $FILESYSTEM_ROOT/$SWSSSDK_PY2_WHEEL_NAME sudo LANG=C chroot $FILESYSTEM_ROOT pip install $SWSSSDK_PY2_WHEEL_NAME sudo rm -rf $FILESYSTEM_ROOT/$SWSSSDK_PY2_WHEEL_NAME -# Install SONiC Utilities (and its dependencies via 'apt-get -y install -f') -sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/python-sonic-utilities_*.deb || \ - sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f +# Install SONiC Utilities Python package +SONIC_UTILITIES_WHEEL_NAME=$(basename {{sonic_utilities_wheel_path}}) +sudo cp {{sonic_utilities_wheel_path}} $FILESYSTEM_ROOT/$SONIC_UTILITIES_WHEEL_NAME +sudo LANG=C chroot $FILESYSTEM_ROOT pip install $SONIC_UTILITIES_WHEEL_NAME +sudo rm -rf $FILESYSTEM_ROOT/$SONIC_UTILITIES_WHEEL_NAME # SONiC utilities installs bash-completion as a dependency. However, it is disabled by default # in bash.bashrc, so we copy a version of the file with it enabled here. diff --git a/rules/sonic-utilities.mk b/rules/sonic-utilities.mk index 9349813f5c4e..1634ab88f46a 100644 --- a/rules/sonic-utilities.mk +++ b/rules/sonic-utilities.mk @@ -1,5 +1,7 @@ # sonic utilities package -SONIC_UTILS = python-sonic-utilities_1.1-1_all.deb -$(SONIC_UTILS)_SRC_PATH = $(SRC_PATH)/sonic-utilities -SONIC_PYTHON_STDEB_DEBS += $(SONIC_UTILS) +SONIC_UTILITIES = sonic_utilities-1.1-py2-none-any.whl +$(SONIC_UTILITIES)_SRC_PATH = $(SRC_PATH)/sonic-utilities +$(SONIC_UTILITIES)_PYTHON_VERSION = 2 +$(SONIC_UTILITIES)_DEPENDS += $(SWSSSDK_PY2) +SONIC_PYTHON_WHEELS += $(SONIC_UTILITIES) diff --git a/slave.mk b/slave.mk index c26e4932f05a..16fea944853e 100644 --- a/slave.mk +++ b/slave.mk @@ -380,7 +380,7 @@ $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TA ############################################################################### # targets for building installers with base image -$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) $$(addprefix $(FILES_PATH)/,$$($$*_FILES)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_DEVICE_DATA) $(SONIC_UTILS)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) +$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) $$(addprefix $(FILES_PATH)/,$$($$*_FILES)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_DEVICE_DATA)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_UTILITIES)) $(HEADER) # Pass initramfs and linux kernel explicitly. They are used for all platforms export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" @@ -397,6 +397,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export installer_images="$(addprefix $(TARGET_PATH)/,$($*_DOCKERS))" export config_engine_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE))" export swsssdk_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SWSSSDK_PY2))" + export sonic_utilities_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_UTILITIES))" $(foreach docker, $($*_DOCKERS),\ export docker_image="$(docker)" diff --git a/src/sonic-utilities b/src/sonic-utilities index b27d4f9e976f..2c63a413cd48 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit b27d4f9e976f944f50d81e2354ba826194971774 +Subproject commit 2c63a413cd48f4d73e149bb594dd5ead5dd6e2db From 1d16a37d48fcee31f81897a6dff8c83e8bed8851 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 4 Oct 2017 23:35:43 -0700 Subject: [PATCH 0818/1011] [DHCP Relay]: Support Multiple VLANs (Separate DHCP Relay Agents, One Per VLAN) (#999) * [DHCP Relay]: Support new minigraph tag; support multiple VLANs * Don't start dhcrelay in quiet mode so as to get startup output in syslog * Update sonic-cfggen tests to support new '' tag * tag is only present for VLANs which require a DHCP relay agent -- only parse if present * Don't attempt to configure a DHCP relay agent for VLANs without specified DHCP servers * Modify to work with Taoyu's minigraph/DB changes (#942) * Reduce number of DHCP servers in sonic-cfggen unit tests from 4 to 2 * Remove isc-dhcp-relay sample output file from sonic-cfggen test, as we no longer generate that file * Update Option 82 isc-dhcp-relay patch to load all interface name-alias maps into memory once at start instead of calling sonic-cfggen on each packet we relay * Remove executable permission from Jinja2 template * Set max hop count to 1 so that DHCP relay will only relay packets with a hop count of zero * Replace tabs with spaces * Modify overlooked sonic-cfggen call, use Config DB instead of minigraph * Also ensure > 1 VLAN requires a DHCP relay agent before outputting to template * Generate port name-alias map file using sonic-cfggen and parse that in lieu of parsing port_config.ini directly * No longer drop packets with hop count > 0; Instead, drop packets which already contain agent info --- dockers/docker-dhcp-relay/Dockerfile.j2 | 8 +- .../docker-dhcp-relay.supervisord.conf.j2 | 67 +++++ dockers/docker-dhcp-relay/docker_init.sh | 18 ++ dockers/docker-dhcp-relay/isc-dhcp-relay.j2 | 28 -- dockers/docker-dhcp-relay/isc-dhcp-relay.sh | 18 -- dockers/docker-dhcp-relay/start.sh | 13 +- dockers/docker-dhcp-relay/supervisord.conf | 28 -- dockers/docker-dhcp-relay/wait_for_intf.sh.j2 | 1 - ...d-remote_id-and-bridge-iface-support.patch | 247 ++++++++++++++---- src/sonic-config-engine/minigraph.py | 8 + .../tests/pc-test-graph.xml | 1 + .../tests/sample_output/isc-dhcp-relay | 7 - .../tests/simple-sample-graph.xml | 1 + .../tests/t0-sample-bgp-speaker.xml | 1 + .../tests/t0-sample-graph-everflow.xml | 1 + .../tests/t0-sample-graph.xml | 1 + src/sonic-config-engine/tests/test_cfggen.py | 2 +- 17 files changed, 307 insertions(+), 143 deletions(-) create mode 100644 dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 create mode 100755 dockers/docker-dhcp-relay/docker_init.sh delete mode 100644 dockers/docker-dhcp-relay/isc-dhcp-relay.j2 delete mode 100755 dockers/docker-dhcp-relay/isc-dhcp-relay.sh delete mode 100644 dockers/docker-dhcp-relay/supervisord.conf mode change 100755 => 100644 dockers/docker-dhcp-relay/wait_for_intf.sh.j2 delete mode 100644 src/sonic-config-engine/tests/sample_output/isc-dhcp-relay diff --git a/dockers/docker-dhcp-relay/Dockerfile.j2 b/dockers/docker-dhcp-relay/Dockerfile.j2 index 3c6614c4921f..2c2bdcaecbf7 100644 --- a/dockers/docker-dhcp-relay/Dockerfile.j2 +++ b/dockers/docker-dhcp-relay/Dockerfile.j2 @@ -22,9 +22,7 @@ RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -COPY ["start.sh", "isc-dhcp-relay.sh", "/usr/bin/"] -COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] -COPY ["isc-dhcp-relay.j2", "/usr/share/sonic/templates/"] -COPY ["wait_for_intf.sh.j2", "/usr/share/sonic/templates/"] +COPY ["docker_init.sh", "start.sh", "/usr/bin/"] +COPY ["docker-dhcp-relay.supervisord.conf.j2", "wait_for_intf.sh.j2", "/usr/share/sonic/templates/"] -ENTRYPOINT ["/usr/bin/supervisord"] +ENTRYPOINT ["/usr/bin/docker_init.sh"] diff --git a/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 b/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 new file mode 100644 index 000000000000..747f65a3aaf6 --- /dev/null +++ b/dockers/docker-dhcp-relay/docker-dhcp-relay.supervisord.conf.j2 @@ -0,0 +1,67 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +{# If our configuration has VLANs... #} +{% if VLAN %} +{# Count how many VLANs require a DHCP relay agent... #} +{% set num_relays = { 'count': 0 } %} +{% for vlan_name in VLAN %} +{% if VLAN[vlan_name]['dhcp_servers'] %} +{% set _dummy = num_relays.update({'count': num_relays.count + 1}) %} +{% endif %} +{% endfor %} +{# If one or more of the VLANs require a DHCP relay agent... #} +{% if num_relays.count > 0 %} +[group:isc-dhcp-relay] +programs= +{%- set add_preceding_comma = { 'flag': False } -%} +{%- for vlan_name in VLAN -%} +{%- if VLAN[vlan_name]['dhcp_servers'] -%} +{%- if add_preceding_comma.flag %},{% endif -%} +{%- set _dummy = add_preceding_comma.update({'flag': True}) -%} +isc-dhcp-relay-{{ vlan_name }} +{%- endif %} +{% endfor %} + + +{# Create a program entry for each DHCP relay agent instance #} +{% for vlan_name in VLAN -%} +{%- if VLAN[vlan_name]['dhcp_servers'] -%} +[program:isc-dhcp-relay-{{ vlan_name }}] +command=/usr/sbin/dhcrelay -d -m discard -a %%h:%%p %%P --name-alias-map-file /tmp/port-name-alias-map.txt -i {{ vlan_name }} +{%- for (name, prefix) in INTERFACE -%} +{%- if prefix | ipv4 %} -i {{ name }}{% endif -%} +{%- endfor -%} +{%- for (name, prefix) in PORTCHANNEL_INTERFACE -%} +{%- if prefix | ipv4 %} -i {{ name }}{% endif -%} +{%- endfor -%} +{%- for dhcp_server in VLAN[vlan_name]['dhcp_servers'] %} {{ dhcp_server }}{% endfor %} + +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +{% endif %} +{% endfor %} +{% endif %} +{% endif %} diff --git a/dockers/docker-dhcp-relay/docker_init.sh b/dockers/docker-dhcp-relay/docker_init.sh new file mode 100755 index 000000000000..f6d402e6f780 --- /dev/null +++ b/dockers/docker-dhcp-relay/docker_init.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +# Generate supervisord config file +mkdir -p /etc/supervisor/conf.d/ +sonic-cfggen -d -t /usr/share/sonic/templates/docker-dhcp-relay.supervisord.conf.j2 > /etc/supervisor/conf.d/docker-dhcp-relay.supervisord.conf + +# Generate the script that waits for all interfaces to come up and make it executable +sonic-cfggen -d -t /usr/share/sonic/templates/wait_for_intf.sh.j2 > /usr/bin/wait_for_intf.sh +chmod +x /usr/bin/wait_for_intf.sh + +# Generate port name-alias map for isc-dhcp-relay to parse. Each line contains one +# name-alias pair of the form " " +sonic-cfggen -d --var-json "PORT" | python -c "import sys, json, os; [sys.stdout.write('%s %s\n' % (k, v['alias'] if 'alias' in v else k)) for (k, v) in json.load(sys.stdin).iteritems()]" > /tmp/port-name-alias-map.txt + +# The docker container should start this script as PID 1, so now that supervisord is +# properly configured, we exec supervisord so that it runs as PID 1 for the +# duration of the container's lifetime +exec /usr/bin/supervisord diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 b/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 deleted file mode 100644 index cdedfcf9692b..000000000000 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay.j2 +++ /dev/null @@ -1,28 +0,0 @@ -SERVERS="{{ DHCP_SERVER | join(' ') }}" - -INTERFACES=" -{%- set add_preceding_space = { 'flag': False } %} -{%- for (name, prefix) in INTERFACE %} -{%- if prefix | ipv4 %} -{%- if add_preceding_space.flag %} {% endif %} -{{ name }} -{%- set _dummy = add_preceding_space.update({'flag': True}) %} -{%- endif %} -{%- endfor %} -{%- for (name, prefix) in VLAN_INTERFACE %} -{%- if prefix | ipv4 %} -{%- if add_preceding_space.flag %} {% endif %} -{{ name }} -{%- set _dummy = add_preceding_space.update({'flag': True}) %} -{%- endif %} -{%- endfor %} -{%- for (name, prefix) in PORTCHANNEL_INTERFACE %} -{%- if prefix | ipv4 %} -{%- if add_preceding_space.flag %} {% endif %} -{{ name }} -{%- set _dummy = add_preceding_space.update({'flag': True}) %} -{%- endif %} -{%- endfor %}" - -# '-a' option provides option 82 circuit_id and remote_id information -OPTIONS="-a %h:%p %P" diff --git a/dockers/docker-dhcp-relay/isc-dhcp-relay.sh b/dockers/docker-dhcp-relay/isc-dhcp-relay.sh deleted file mode 100755 index 2224b8a0fe00..000000000000 --- a/dockers/docker-dhcp-relay/isc-dhcp-relay.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -# -# Based off /etc/init.d/isc-dhcp-relay -# - -# Read init script configuration (interfaces the daemon should listen on -# and the DHCP server we should forward requests to.) -[ -f /etc/default/isc-dhcp-relay ] && . /etc/default/isc-dhcp-relay - -# Build command line for interfaces (will be passed to dhrelay below.) -IFCMD="" -if test "$INTERFACES" != ""; then - for I in $INTERFACES; do - IFCMD=${IFCMD}"-i "${I}" " - done -fi - -exec /usr/sbin/dhcrelay -d -q ${OPTIONS} ${IFCMD} ${SERVERS} diff --git a/dockers/docker-dhcp-relay/start.sh b/dockers/docker-dhcp-relay/start.sh index 37c3f488a5c7..b53d7e4e238a 100755 --- a/dockers/docker-dhcp-relay/start.sh +++ b/dockers/docker-dhcp-relay/start.sh @@ -1,16 +1,13 @@ #!/usr/bin/env bash -# Create isc-dhcp-relay config file -sonic-cfggen -d -t /usr/share/sonic/templates/isc-dhcp-relay.j2 > /etc/default/isc-dhcp-relay - +# Remove stale rsyslog PID file if it exists rm -f /var/run/rsyslogd.pid +# Start rsyslog supervisorctl start rsyslogd -# Wait for all interfaces to come up before starting the DHCP relay -sonic-cfggen -d -t /usr/share/sonic/templates/wait_for_intf.sh.j2 > /usr/bin/wait_for_intf.sh -chmod +x /usr/bin/wait_for_intf.sh +# Wait for all interfaces to come up before starting the DHCP relay agent(s) /usr/bin/wait_for_intf.sh -# Start the DHCP relay -supervisorctl start isc-dhcp-relay +# Start the DHCP relay agent(s) +supervisorctl start isc-dhcp-relay:* diff --git a/dockers/docker-dhcp-relay/supervisord.conf b/dockers/docker-dhcp-relay/supervisord.conf deleted file mode 100644 index ed1f75d1aed6..000000000000 --- a/dockers/docker-dhcp-relay/supervisord.conf +++ /dev/null @@ -1,28 +0,0 @@ -[supervisord] -logfile_maxbytes=1MB -logfile_backups=2 -nodaemon=true - -[program:start.sh] -command=/usr/bin/start.sh -priority=1 -autostart=true -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n -priority=2 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -[program:isc-dhcp-relay] -command=/usr/bin/isc-dhcp-relay.sh -priority=3 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog diff --git a/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 old mode 100755 new mode 100644 index b859a43b07b1..1524b3221312 --- a/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 +++ b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 @@ -25,4 +25,3 @@ wait_until_iface_exists {{ name }} {% for (name, prefix) in PORTCHANNEL_INTERFACE %} wait_until_iface_exists {{ name }} {% endfor %} - diff --git a/src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch b/src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch index 8d28751da63c..4dee30238acd 100644 --- a/src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch +++ b/src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch @@ -1,10 +1,10 @@ This patch adds the following functionality to dhcrelay in isc-dhcp v4.3.1-6: * Add customizable Circuit ID and Remote ID fields -* Support for obtaining name of physical interface of interfaces that are part of a bridge interface +* Support for obtaining name of physical interfaces that are part of a bridge interface diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c ---- a/isc-dhcp/relay/dhcrelay.c 2014-08-06 22:35:02.000000000 +0000 -+++ b/isc-dhcp/relay/dhcrelay.c 2017-06-08 21:39:53.856192546 +0000 +--- a/isc-dhcp/relay/dhcrelay.c 2017-10-03 01:46:19.811524700 +0000 ++++ b/isc-dhcp/relay/dhcrelay.c 2017-10-03 01:45:50.699524700 +0000 @@ -73,6 +73,8 @@ did not match any known circuit ID. */ int missing_circuit_id = 0; /* Circuit ID option in matching RAI option @@ -14,7 +14,33 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c int max_hop_count = 10; /* Maximum hop count */ #ifdef DHCPv6 -@@ -140,9 +142,19 @@ +@@ -120,6 +122,14 @@ + char *dhcrelay_sub_id = NULL; + #endif + ++struct interface_name_alias_tuple { ++ char if_name[IFNAMSIZ + 1]; ++ char if_alias[IFNAMSIZ + 1]; ++}; ++ ++static struct interface_name_alias_tuple *g_interface_name_alias_map = NULL; ++static size_t g_interface_name_alias_map_size = 0; ++ + static void do_relay4(struct interface_info *, struct dhcp_packet *, + unsigned int, unsigned int, struct iaddr, + struct hardware *); +@@ -132,6 +142,10 @@ + struct interface_info **, + struct dhcp_packet *, unsigned); + ++static int load_interface_alias_map(const char *port_alias_map_file_path); ++static int get_interface_alias_by_name(const char *if_name, char *if_alias_out); ++static void free_interface_alias_map(void); ++ + static const char copyright[] = + "Copyright 2004-2014 Internet Systems Consortium."; + static const char arr[] = "All rights reserved."; +@@ -140,28 +154,42 @@ static const char url[] = "For info, please visit https://www.isc.org/software/dhcp/"; @@ -23,7 +49,7 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c +"\n" \ +" %%%% A single %%\n" \ +" %%h Hostname of device\n" \ -+" %%p Name of interface that generated the request\n" \ ++" %%p Alias of interface that generated the request\n" \ +" %%P Hardware address of interface that generated the request\n" \ +" %%C Client hardware address\n" \ +" %%I DHCP relay agent IP Address\n" \ @@ -35,7 +61,13 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c " [-A ] [-c ] [-p ]\n" \ " [-pf ] [--no-pid]\n"\ " [-m append|replace|forward|discard]\n" \ -@@ -154,14 +166,15 @@ ++" [--name-alias-map-file ]\n" \ + " [-i interface0 [ ... -i interfaceN]\n" \ + " server0 [ ... serverN]\n\n" \ + " dhcrelay -6 [-d] [-q] [-I] [-c ] [-p ]\n" \ + " [-pf ] [--no-pid]\n" \ ++" [--name-alias-map-file ]\n" \ + " [-s ]\n" \ " -l lower0 [ ... -l lowerN]\n" \ " -u upper0 [ ... -u upperN]\n" \ " lower (client link): [address%%]interface[#index]\n" \ @@ -49,13 +81,14 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c +" [-A ] [-c ] [-p ]\n" \ +" [-pf ] [--no-pid]\n"\ " [-m append|replace|forward|discard]\n" \ ++" [--name-alias-map-file ]\n" \ " [-i interface0 [ ... -i interfaceN]\n" \ -" server0 [ ... serverN]\n\n" +" server0 [ ... serverN]\n\n" DHCRELAY_OPTION82_USAGE #endif static void usage() { -@@ -287,6 +300,15 @@ +@@ -287,6 +315,15 @@ local_family_set = 1; local_family = AF_INET; #endif @@ -71,7 +104,59 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c add_agent_options = 1; } else if (!strcmp(argv[i], "-A")) { #ifdef DHCPv6 -@@ -937,6 +959,166 @@ +@@ -383,6 +420,13 @@ + no_dhcrelay_pid = ISC_TRUE; + } else if (!strcmp(argv[i], "--no-pid")) { + no_pid_file = ISC_TRUE; ++ } else if (!strcmp(argv[i], "--name-alias-map-file")) { ++ if (++i == argc) ++ usage(); ++ if (load_interface_alias_map(argv[i]) != 0) ++ log_fatal("Failed to load interface name-alias map."); ++ path_dhcrelay_pid = argv[i]; ++ no_dhcrelay_pid = ISC_TRUE; + } else if (!strcmp(argv[i], "--version")) { + log_info("isc-dhcrelay-%s", PACKAGE_VERSION); + exit(0); +@@ -602,6 +646,8 @@ + dispatch(); + + /* In fact dispatch() never returns. */ ++ free_interface_alias_map(); ++ + return (0); + } + +@@ -690,10 +736,9 @@ + &to, htop) < 0) { + ++server_packet_errors; + } else { +- log_debug("Forwarded BOOTREPLY for %s to %s", +- print_hw_addr(packet->htype, packet->hlen, +- packet->chaddr), +- inet_ntoa(to.sin_addr)); ++ //log_debug("Forwarded BOOTREPLY for %s to %s", ++ // print_hw_addr(packet->htype, packet->hlen, packet->chaddr), ++ // inet_ntoa(to.sin_addr)); + + ++server_packets_relayed; + } +@@ -732,10 +777,10 @@ + &sp->to, NULL) < 0) { + ++client_packet_errors; + } else { +- log_debug("Forwarded BOOTREQUEST for %s to %s", +- print_hw_addr(packet->htype, packet->hlen, +- packet->chaddr), +- inet_ntoa(sp->to.sin_addr)); ++ //log_debug("Forwarded BOOTREQUEST for %s to %s", ++ // print_hw_addr(packet->htype, packet->hlen, packet->chaddr), ++ // inet_ntoa(sp->to.sin_addr)); ++ + ++client_packets_relayed; + } + } +@@ -937,6 +982,152 @@ return (-1); } @@ -106,9 +191,8 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c + if (cmd != NULL) { + while (fgets(buf, sizeof(buf), cmd)) { + sscanf(buf, FDB_LINE_FORMAT, macAddr, interface, vlanid); -+ log_debug ("bridgefdbquery: macAddr:%s interface: %s vlanid %d", -+ macAddr, -+ interface, *vlanid); ++ //log_debug("bridgefdbquery: macAddr:%s interface: %s vlanid %d", ++ // macAddr, interface, *vlanid); + } + pclose(cmd); + return 0; @@ -149,7 +233,7 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c + + case 'p': /* Name of interface that we received the request from */ + /* -+ * Query FDB to identify the exact physical interface only when source MAC address ++ * Query FDB to identify the exact physical interface only when source MAC address + * is present and '20: DHCP relay agent IP address' (giaddr) is not present + */ + if (packet->htype && !packet->giaddr.s_addr) { @@ -160,42 +244,29 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c + &vlanid); + + if (ret < 0) { -+ log_debug("MAC Address: %s (interface:%s vlan:%d) not found in bridge fdb show", -+ print_hw_addr (packet->htype, packet->hlen, packet->chaddr), -+ ip->name, -+ vlanid); ++ //log_debug("MAC Address: %s (interface:%s vlan:%d) not found in bridge fdb show", ++ // print_hw_addr (packet->htype, packet->hlen, packet->chaddr), ++ // ip->name, ++ // vlanid); ++ + strncpy(ifname, ip->name, IFNAMSIZ); + } + else if (strlen(ip->name) > 0) { -+ char cmdstr[256] = { 0 }; -+ char cmdout[256] = { 0 }; -+ -+ log_debug("Adding option 82 interface name for MAC Address: %s as %s", -+ print_hw_addr (packet->htype, packet->hlen, packet->chaddr), -+ ip->name); -+ -+ // Translate SONiC interface name to vendor alias -+ sprintf(cmdstr, "sonic-cfggen -m /etc/sonic/minigraph.xml -v \"minigraph_ports['%s'].alias\"", ip->name); -+ -+ FILE *cmd = popen(cmdstr, "r"); -+ -+ if (cmd != NULL) { -+ while (fgets(cmdout, sizeof(cmdout), cmd)) { -+ // Strip any trailing newline -+ if (cmdout[strlen(cmdout) - 1] == '\n') -+ cmdout[strlen(cmdout) - 1] = '\0'; -+ -+ log_debug ("Retrieved alias %s for interface %s", buf, ip->name); ++ // Translate SONiC interface name to vendor alias ++ if (get_interface_alias_by_name(ip->name, ifname) < 0) { ++ log_error("Failed to retrieve alias for interface name '%s'. Defaulting to interface name.", ip->name); ++ strncpy(ifname, ip->name, IFNAMSIZ); + } + -+ pclose(cmd); ++ //log_debug("Mapped interface name '%s' to alias '%s'", ip->name, ifname); ++ ++ //log_debug("Adding option 82 interface alias for MAC Address %s as '%s'", ++ // print_hw_addr (packet->htype, packet->hlen, packet->chaddr), ++ // ifname); + } + -+ strncpy(ifname, cmdout, IFNAMSIZ); ++ str = ifname; + } -+ -+ str = ifname; -+ } + break; + + case 'P': /* Physical address of interface that we received the request from */ @@ -238,7 +309,7 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c /* * Examine a packet to see if it's a candidate to have a Relay * Agent Information option tacked onto its tail. If it is, tack -@@ -948,6 +1130,8 @@ +@@ -948,6 +1139,8 @@ int is_dhcp = 0, mms; unsigned optlen; u_int8_t *op, *nextop, *sp, *max, *end_pad = NULL; @@ -247,7 +318,7 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c /* If we're not adding agent options to packets, we can skip this. */ -@@ -1077,6 +1261,38 @@ +@@ -1077,6 +1270,38 @@ op = sp; #endif @@ -262,8 +333,8 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c + ip->circuit_id = (uint8_t *)circuit_id_buf; + ip->circuit_id_len = len; + -+ log_debug("sending on %s option82:circuit_id='%s'(%d)", -+ ip->name, (char *)ip->circuit_id, ip->circuit_id_len); ++ //log_debug("Sending on %s option82:circuit_id='%s' (%d)", ++ // ip->name, (char *)ip->circuit_id, ip->circuit_id_len); + } + } + @@ -278,12 +349,94 @@ diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c + ip->remote_id = (uint8_t *)remote_id_buf; + ip->remote_id_len = len; + -+ log_debug("sending on %s option82:remote_id='%s'(%d)", -+ ip->name, (char *)ip->remote_id, ip->remote_id_len); ++ //log_debug("Sending on %s option82:remote_id='%s' (%d)", ++ // ip->name, (char *)ip->remote_id, ip->remote_id_len); + } + } + /* Sanity check. Had better not ever happen. */ if ((ip->circuit_id_len > 255) ||(ip->circuit_id_len < 1)) log_fatal("Circuit ID length %d out of range [1-255] on " - +@@ -1102,7 +1327,7 @@ + * If not, forward without adding the option. + */ + if (max - sp >= optlen + 3) { +- log_debug("Adding %d-byte relay agent option", optlen + 3); ++ //log_debug("Adding %d-byte relay agent option", optlen + 3); + + /* Okay, cons up *our* Relay Agent Information option. */ + *sp++ = DHO_DHCP_AGENT_OPTIONS; +@@ -1726,3 +1951,73 @@ + + exit(0); + } ++ ++#define MAX_PORT_CONFIG_LINE_LEN 1024 ++ ++// Allocates and loads global map g_interface_name_alias_map ++// Also sets global g_interface_name_alias_map_size ++static int ++load_interface_alias_map(const char *port_alias_map_file_path) { ++ int i = 0; ++ FILE *fp = NULL; ++ char line[MAX_PORT_CONFIG_LINE_LEN] = { 0 }; ++ ++ fp = fopen(port_alias_map_file_path,"r"); ++ if (fp == NULL) { ++ log_error("Unable to open %s", port_alias_map_file_path); ++ return -1; ++ } ++ ++ g_interface_name_alias_map_size = 0; ++ ++ // Count the number of interfaces listed in the file ++ while (fgets(line, sizeof(line), fp)) { ++ g_interface_name_alias_map_size++; ++ } ++ ++ // Allocate our map accordingly ++ g_interface_name_alias_map = ((struct interface_name_alias_tuple *) ++ dmalloc((sizeof(struct interface_name_alias_tuple) * g_interface_name_alias_map_size), ++ MDL)); ++ ++ // Reset file position indicator to beginning of file ++ fseek(fp, 0, SEEK_SET); ++ ++ // Every line should contain exactly one name-alias pair ++ while (fgets(line, sizeof(line), fp)) { ++ // Each line should read as "" ++ sscanf(line, "%s %s", g_interface_name_alias_map[i].if_name, g_interface_name_alias_map[i].if_alias); ++ i++; ++ } ++ ++ fclose(fp); ++ ++ log_info("Loaded %d interface name-alias mappings", i); ++ ++ return 0; ++} ++ ++// Locates alias for port named if_name, copies alias into if_alias_out, up to a ++// max of IFNAMSIZ bytes. ++// Returns 0 on success, -1 on failure ++static int ++get_interface_alias_by_name(const char *if_name, char *if_alias_out) { ++ int i = 0; ++ ++ for (i = 0; i < g_interface_name_alias_map_size; i++) { ++ if (strncmp(if_name, g_interface_name_alias_map[i].if_name, IFNAMSIZ) == 0) { ++ strncpy(if_alias_out, g_interface_name_alias_map[i].if_alias, IFNAMSIZ); ++ return 0; ++ } ++ } ++ ++ return -1; ++} ++ ++// Frees global map g_interface_name_alias_map ++// Sets g_interface_name_alias_map_size to 0 ++static void ++free_interface_alias_map(void) { ++ free(g_interface_name_alias_map); ++ g_interface_name_alias_map_size = 0; ++} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 997008af5cee..e6533ce7beeb 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -175,6 +175,14 @@ def parse_dpg(dpg, hname): for i, member in enumerate(vmbr_list): vmbr_list[i] = port_alias_map.get(member, member) vlan_attributes = {'members': vmbr_list, 'vlanid': vlanid} + + # If this VLAN requires a DHCP relay agent, it will contain a element + # containing a list of DHCP server IPs + if vintf.find(str(QName(ns, "DhcpRelays"))) is not None: + vintfdhcpservers = vintf.find(str(QName(ns, "DhcpRelays"))).text + vdhcpserver_list = vintfdhcpservers.split(';') + vlan_attributes['dhcp_servers'] = vdhcpserver_list + sonic_vlan_name = "Vlan%s" % vlanid vlans[sonic_vlan_name] = vlan_attributes diff --git a/src/sonic-config-engine/tests/pc-test-graph.xml b/src/sonic-config-engine/tests/pc-test-graph.xml index 7d7ec74a8631..2cb281b879cb 100644 --- a/src/sonic-config-engine/tests/pc-test-graph.xml +++ b/src/sonic-config-engine/tests/pc-test-graph.xml @@ -108,6 +108,7 @@ False 0.0.0.0/0 + 192.0.0.1;192.0.0.2 1000 1000 192.168.0.0/27 diff --git a/src/sonic-config-engine/tests/sample_output/isc-dhcp-relay b/src/sonic-config-engine/tests/sample_output/isc-dhcp-relay deleted file mode 100644 index 4a851af34eb9..000000000000 --- a/src/sonic-config-engine/tests/sample_output/isc-dhcp-relay +++ /dev/null @@ -1,7 +0,0 @@ -SERVERS="192.0.0.1 192.0.0.2 192.0.0.3 192.0.0.4 192.0.0.5 192.0.0.6 192.0.0.7 192.0.0.8 192.0.0.9 192.0.0.10 192.0.0.11 192.0.0.12 192.0.0.13 192.0.0.14 192.0.0.15 192.0.0.16 192.0.0.17 192.0.0.18 192.0.0.19 192.0.0.20 192.0.0.21 192.0.0.22 192.0.0.23 192.0.0.24 192.0.0.25 192.0.0.26 192.0.0.27 192.0.0.28 192.0.0.29 192.0.0.30 192.0.0.31 192.0.0.32 192.0.0.33 192.0.0.34 192.0.0.35 192.0.0.36 192.0.0.37 192.0.0.38 192.0.0.39 192.0.0.40 192.0.0.41 192.0.0.42 192.0.0.43 192.0.0.44 192.0.0.45 192.0.0.46 192.0.0.47 192.0.0.48" - -INTERFACES="Vlan1000 PortChannel01 PortChannel02 PortChannel03 PortChannel04" - -# '-a' option provides option 82 circuit id information -OPTIONS="-a" - diff --git a/src/sonic-config-engine/tests/simple-sample-graph.xml b/src/sonic-config-engine/tests/simple-sample-graph.xml index 7daae24f49a6..89f53af83e41 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph.xml @@ -130,6 +130,7 @@ Vlan1000 fortyGigE0/8 + 192.0.0.1;192.0.0.2 1000 1000 192.168.0.0/27 diff --git a/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml b/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml index 8a21c041c80e..18a8baccdae2 100644 --- a/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml +++ b/src/sonic-config-engine/tests/t0-sample-bgp-speaker.xml @@ -203,6 +203,7 @@ False 0.0.0.0/0 + 192.0.0.1;192.0.0.2 1000 1000 192.168.0.0/27 diff --git a/src/sonic-config-engine/tests/t0-sample-graph-everflow.xml b/src/sonic-config-engine/tests/t0-sample-graph-everflow.xml index 355f01122f0d..6a078b48cf99 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph-everflow.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph-everflow.xml @@ -198,6 +198,7 @@ False 0.0.0.0/0 + 192.0.0.1;192.0.0.2 1000 1000 192.168.0.0/27 diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml index 62a41105f937..fe0b1a1e2500 100644 --- a/src/sonic-config-engine/tests/t0-sample-graph.xml +++ b/src/sonic-config-engine/tests/t0-sample-graph.xml @@ -206,6 +206,7 @@ False 0.0.0.0/0 + 192.0.0.1;192.0.0.2 1000 1000 192.168.0.0/27 diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index d78b19d88ba7..23256079856b 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -83,7 +83,7 @@ def test_minigraph_interfaces(self): def test_minigraph_vlans(self): argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v VLAN' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'Vlan1000': {'members': ['Ethernet8'], 'vlanid': '1000'}}") + self.assertEqual(output.strip(), "{'Vlan1000': {'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'members': ['Ethernet8'], 'vlanid': '1000'}}") def test_minigraph_vlan_interfaces(self): argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v "VLAN_INTERFACE.keys()"' From 60339dc27d2a5f33544e5b369d5ad87e51fe8c25 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 5 Oct 2017 11:30:31 -0700 Subject: [PATCH 0819/1011] [sonic-utilities]: Update submodule to fix broken 'show' command (#1013) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 2c63a413cd48..ddadc2b2c358 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 2c63a413cd48f4d73e149bb594dd5ead5dd6e2db +Subproject commit ddadc2b2c3586130117f0ceea19e5aed428d4157 From bea7476aa8a43934de348512b610b57bb37d8f52 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 5 Oct 2017 21:01:08 -0700 Subject: [PATCH 0820/1011] Update sonic-utilities pointer (#1017) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index ddadc2b2c358..3a40ff94dc24 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit ddadc2b2c3586130117f0ceea19e5aed428d4157 +Subproject commit 3a40ff94dc240a751d77547eb91083a5f7a6f7a3 From b07886ec3c64dfc2559585206f5f69c78ff29f97 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 5 Oct 2017 21:43:25 -0700 Subject: [PATCH 0821/1011] [build_debian]: Install grub-common in the base image (#1014) --- build_debian.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index a21cdada0243..3c6673a53ec4 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -207,7 +207,8 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in kexec-tools \ less \ unzip \ - gdisk + gdisk \ + grub2-common sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y download \ grub-pc-bin From 7fa502a45e3d0ba873f89494c8973a49919a7b74 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 5 Oct 2017 21:45:34 -0700 Subject: [PATCH 0822/1011] [cfggen] Fix a bug in --var-json option with multi-keys (#1015) --- src/sonic-config-engine/sonic-cfggen | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 5303557c4fb4..9f1323dab2eb 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -200,7 +200,7 @@ def main(): print template.render(data) if args.var_json != None: - print json.dumps(data[args.var_json], indent=4, cls=minigraph_encoder) + print json.dumps(FormatConverter.to_serialized(data[args.var_json]), indent=4, cls=minigraph_encoder) if args.write_to_db: configdb = ConfigDBConnector() From 8a305ce9c9e9a79b1b3038075fead50ad369b49c Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 6 Oct 2017 12:46:47 -0700 Subject: [PATCH 0823/1011] [sonic-utilities]: Build as Debian package once again (revert change to wheel) (#1018) --- files/build_templates/sonic_debian_extension.j2 | 8 +++----- rules/sonic-utilities.mk | 8 +++----- slave.mk | 3 +-- src/sonic-utilities | 2 +- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index a08872c4ea42..04f5181ff610 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -77,11 +77,9 @@ sudo cp {{swsssdk_py2_wheel_path}} $FILESYSTEM_ROOT/$SWSSSDK_PY2_WHEEL_NAME sudo LANG=C chroot $FILESYSTEM_ROOT pip install $SWSSSDK_PY2_WHEEL_NAME sudo rm -rf $FILESYSTEM_ROOT/$SWSSSDK_PY2_WHEEL_NAME -# Install SONiC Utilities Python package -SONIC_UTILITIES_WHEEL_NAME=$(basename {{sonic_utilities_wheel_path}}) -sudo cp {{sonic_utilities_wheel_path}} $FILESYSTEM_ROOT/$SONIC_UTILITIES_WHEEL_NAME -sudo LANG=C chroot $FILESYSTEM_ROOT pip install $SONIC_UTILITIES_WHEEL_NAME -sudo rm -rf $FILESYSTEM_ROOT/$SONIC_UTILITIES_WHEEL_NAME +# Install SONiC Utilities (and its dependencies via 'apt-get -y install -f') +sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/python-sonic-utilities_*.deb || \ + sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f # SONiC utilities installs bash-completion as a dependency. However, it is disabled by default # in bash.bashrc, so we copy a version of the file with it enabled here. diff --git a/rules/sonic-utilities.mk b/rules/sonic-utilities.mk index 1634ab88f46a..9349813f5c4e 100644 --- a/rules/sonic-utilities.mk +++ b/rules/sonic-utilities.mk @@ -1,7 +1,5 @@ # sonic utilities package -SONIC_UTILITIES = sonic_utilities-1.1-py2-none-any.whl -$(SONIC_UTILITIES)_SRC_PATH = $(SRC_PATH)/sonic-utilities -$(SONIC_UTILITIES)_PYTHON_VERSION = 2 -$(SONIC_UTILITIES)_DEPENDS += $(SWSSSDK_PY2) -SONIC_PYTHON_WHEELS += $(SONIC_UTILITIES) +SONIC_UTILS = python-sonic-utilities_1.1-1_all.deb +$(SONIC_UTILS)_SRC_PATH = $(SRC_PATH)/sonic-utilities +SONIC_PYTHON_STDEB_DEBS += $(SONIC_UTILS) diff --git a/slave.mk b/slave.mk index 16fea944853e..c26e4932f05a 100644 --- a/slave.mk +++ b/slave.mk @@ -380,7 +380,7 @@ $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TA ############################################################################### # targets for building installers with base image -$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) $$(addprefix $(FILES_PATH)/,$$($$*_FILES)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_DEVICE_DATA)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_UTILITIES)) +$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) $$(addprefix $(FILES_PATH)/,$$($$*_FILES)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_DEVICE_DATA) $(SONIC_UTILS)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) $(HEADER) # Pass initramfs and linux kernel explicitly. They are used for all platforms export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" @@ -397,7 +397,6 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export installer_images="$(addprefix $(TARGET_PATH)/,$($*_DOCKERS))" export config_engine_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE))" export swsssdk_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SWSSSDK_PY2))" - export sonic_utilities_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_UTILITIES))" $(foreach docker, $($*_DOCKERS),\ export docker_image="$(docker)" diff --git a/src/sonic-utilities b/src/sonic-utilities index 3a40ff94dc24..77c9f811d23d 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 3a40ff94dc240a751d77547eb91083a5f7a6f7a3 +Subproject commit 77c9f811d23dd83abc4bc429b329a5e50a2abba6 From 758c5e9a2e31c42645f00ecebdf960750e57e464 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 6 Oct 2017 23:37:35 -0700 Subject: [PATCH 0824/1011] [submodule]: update sonic-utilities (#1020) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 77c9f811d23d..6103ce8f21a0 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 77c9f811d23dd83abc4bc429b329a5e50a2abba6 +Subproject commit 6103ce8f21a0d4b5177ac5449f68f77ac179c7db From dc0f3ceb5c742c4e588388fe4f506b2728343d7e Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 8 Oct 2017 02:10:14 -0700 Subject: [PATCH 0825/1011] add version tag for the docker images (#1021) docker images are also tagged with the same image version. --- files/build_templates/sonic_debian_extension.j2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 04f5181ff610..8270af923078 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -193,7 +193,10 @@ sudo cp $IMAGE_CONFIGS/platform/rc.local $FILESYSTEM_ROOT/etc/ {% if installer_images.strip() -%} {% for image in installer_images.strip().split(' ') -%} +{% set imagefilename = image.split('/')|last -%} +{% set imagename = imagefilename.split('.')|first -%} sudo LANG=C chroot $FILESYSTEM_ROOT docker load < {{image}} +sudo LANG=C chroot $FILESYSTEM_ROOT docker tag {{imagename}}:latest {{imagename}}:$(sonic_get_version) {% endfor %} sudo chroot $FILESYSTEM_ROOT service docker stop {% for script in installer_start_scripts.split(' ') -%} From 04814cb135b18018eaffbfa4cbeee175cc97cd3d Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 9 Oct 2017 22:50:08 -0700 Subject: [PATCH 0826/1011] [dockers]: Remove deprecated sswsyncd dockers (#1026) --- dockers/docker-mlnx-sswsyncd-rpc/Dockerfile | 38 --------------------- dockers/docker-mlnx-sswsyncd/Dockerfile | 33 ------------------ dockers/docker-sswsyncd/Dockerfile | 27 --------------- 3 files changed, 98 deletions(-) delete mode 100644 dockers/docker-mlnx-sswsyncd-rpc/Dockerfile delete mode 100755 dockers/docker-mlnx-sswsyncd/Dockerfile delete mode 100755 dockers/docker-sswsyncd/Dockerfile diff --git a/dockers/docker-mlnx-sswsyncd-rpc/Dockerfile b/dockers/docker-mlnx-sswsyncd-rpc/Dockerfile deleted file mode 100644 index 4d1b3e49bcda..000000000000 --- a/dockers/docker-mlnx-sswsyncd-rpc/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -FROM docker-base - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -## Pre-install the fundamental packages -RUN apt-get update \ - && apt-get -y install \ - net-tools - -COPY deps /deps -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/python-tabulate_*.deb \ - && dpkg_apt /deps/applibs_*.deb \ - && dpkg_apt /deps/applibs-dev_*.deb \ - && dpkg_apt /deps/sx-complib_*.deb \ - && dpkg_apt /deps/sxd-libs_*.deb \ - && dpkg_apt /deps/sx-scew_*.deb \ - && dpkg_apt /deps/sx-examples_*.deb \ - && dpkg_apt /deps/sx-gen-utils_*.deb \ - && dpkg_apt /deps/python-sdk-api_*.deb \ - && dpkg_apt /deps/sx-libnl_*.deb \ - && dpkg_apt /deps/iproute2_*.deb \ - && dpkg_apt /deps/libsswsdk_*.deb \ - && dpkg_apt /deps/libthrift-0.9.3_*.deb \ - && dpkg_apt /deps/libthrift-dev_*.deb - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; \ - dpkg_apt /deps/mlnx-sai_*.deb \ - && dpkg_apt /deps/sswsyncd-saithrift_*.deb - -## Clean up -RUN apt-get clean -y ; apt-get autoclean -y ; apt-get autoremove -y ; rm -rf /deps - -ENTRYPOINT service rsyslog start \ - && mkdir -p /dev/sxdevs && ( [ -e /dev/sxdevs/sxcdev ] || mknod /dev/sxdevs/sxcdev c 231 193 ) \ - && service sswsyncd start \ - && /bin/bash diff --git a/dockers/docker-mlnx-sswsyncd/Dockerfile b/dockers/docker-mlnx-sswsyncd/Dockerfile deleted file mode 100755 index 631ff2e18030..000000000000 --- a/dockers/docker-mlnx-sswsyncd/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM docker-base - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -RUN apt-get update - -## Pre-install the fundamental packages -RUN apt-get update \ - && apt-get -y install \ - net-tools - -COPY deps /deps -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/python-tabulate_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/applibs_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/applibs-dev_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sx-complib_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sxd-libs_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sx-scew_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sx-examples_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sx-gen-utils_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/python-sdk-api_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sx-libnl_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/iproute2_*.deb - -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/mlnx-sai_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/libsswsdk_*.deb -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /deps/sswsyncd_*.deb - -ENTRYPOINT service rsyslog start \ - && mkdir -p /dev/sxdevs && ( [ -e /dev/sxdevs/sxcdev ] || mknod /dev/sxdevs/sxcdev c 231 193 ) \ - && sleep 5 && service sswsyncd start \ - && /bin/bash diff --git a/dockers/docker-sswsyncd/Dockerfile b/dockers/docker-sswsyncd/Dockerfile deleted file mode 100755 index 0f555d8b51bf..000000000000 --- a/dockers/docker-sswsyncd/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM docker-base - -COPY \ - deps/python-tabulate_*.deb \ - deps/libopennsl_*.deb \ - deps/libsaibcm_*.deb \ - deps/libsswsdk_*.deb \ - deps/sswsyncd_*.deb \ - /deps/ - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -## Install packages -## Clean up -RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ - dpkg_apt /deps/python-tabulate_*.deb && \ - dpkg_apt /deps/libopennsl_*.deb && \ - dpkg_apt /deps/libsaibcm_*.deb && \ - dpkg_apt /deps/libsswsdk_*.deb && \ - dpkg_apt /deps/sswsyncd_*.deb && \ - apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ - rm -rf /deps - -ENTRYPOINT service rsyslog start \ - && service sswsyncd start \ - && /bin/bash From ecd99c73d1b9174296ec987265fb315eea047fdb Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 10 Oct 2017 22:49:06 +0300 Subject: [PATCH 0827/1011] [swss]: Flush flex counter DB in swss_serivce.j2 (#1029) --- files/build_templates/swss.service.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index af922530d8a2..74fafb003767 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -17,6 +17,7 @@ ExecStartPre=/bin/bash -c "while true; do if [ \"$(/usr/bin/docker exec database ExecStartPre=/usr/bin/docker exec database redis-cli -n 0 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 1 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 2 FLUSHDB +ExecStartPre=/usr/bin/docker exec database redis-cli -n 5 FLUSHDB {% if sonic_asic_platform == 'mellanox' %} TimeoutStartSec=3min From f681fd17eb234533e858b8dc16d2740b78622a05 Mon Sep 17 00:00:00 2001 From: Rodny Molina Date: Tue, 10 Oct 2017 12:58:56 -0700 Subject: [PATCH 0828/1011] [Seastone]: Adjusting Seastone's sfputil plugin to cope with new SfpUtil API. (#1022) There are multiple platforms that need to be transitioned to the new SfpUtilBase interface - I'm only taking care of Celestica-Seastone in this patch. --- .../x86_64-cel_seastone-r0/plugins/sfputil.py | 59 +++++++++++++++---- 1 file changed, 46 insertions(+), 13 deletions(-) mode change 100644 => 100755 device/celestica/x86_64-cel_seastone-r0/plugins/sfputil.py diff --git a/device/celestica/x86_64-cel_seastone-r0/plugins/sfputil.py b/device/celestica/x86_64-cel_seastone-r0/plugins/sfputil.py old mode 100644 new mode 100755 index f3943e734b58..7ff632e152b9 --- a/device/celestica/x86_64-cel_seastone-r0/plugins/sfputil.py +++ b/device/celestica/x86_64-cel_seastone-r0/plugins/sfputil.py @@ -1,25 +1,58 @@ #!/usr/bin/env python +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -class sfputil(sfputilbase): - """Platform specific sfputil class""" +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" - port_start = 0 - port_end = 31 - ports_in_block = 32 + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 - port_to_eeprom_mapping = {} + _port_to_eeprom_mapping = {} + qsfp_ports = range(0, PORTS_IN_BLOCK + 1) - _qsfp_ports = range(0, ports_in_block + 1) + @property + def port_start(self): + return self.PORT_START - def __init__(self, port_num): + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): # Override port_to_eeprom_mapping for class initialization eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' - for x in range(self.port_start, self.port_end + 1): + + for x in range(self.PORT_START, self.PORT_END + 1): self.port_to_eeprom_mapping[x] = eeprom_path.format( x + 26 ) - sfputilbase.__init__(self, port_num) + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + raise NotImplementedError + + def get_low_power_mode(self, port_num): + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + raise NotImplementedError + + def reset(self, port_num): + raise NotImplementedError + From fc7246f418fba64b1370ea5c7a4289bb82c4621b Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Wed, 11 Oct 2017 05:45:17 +0300 Subject: [PATCH 0829/1011] [swss]: Update QoS config file name for Mellanox platform (#1028) Signed-off-by: Andriy Moroz --- dockers/docker-orchagent/swssconfig.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index 55a22c5353c8..f780ae8afb20 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -49,7 +49,7 @@ elif [ "$HWSKU" == "Arista-7050-QX32" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [[ "$HWSKU" == "ACS-MSN27"* ]]; then sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/msn27xx.32ports.buffers.json.j2 > /etc/swss/config.d/msn27xx.32ports.buffers.json - SWSSCONFIG_ARGS+="msn27xx.32ports.buffers.json msn2700.32ports.qos.json " + SWSSCONFIG_ARGS+="msn27xx.32ports.buffers.json msn27xx.32ports.qos.json " fi for file in $SWSSCONFIG_ARGS; do From 6c15acc49b5d0fc654e13bfd1ac004349752a339 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 11 Oct 2017 15:11:26 -0700 Subject: [PATCH 0830/1011] [swss]: Export ASIC as the env variable (#1030) - the env variable 'platform' is not universal across different platforms this line will be removed once the related code in sonic-swss is refactored Signed-off-by: Shu0T1an ChenG --- dockers/docker-orchagent/orchagent.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index 7103afcb81e9..57f28e4e78dc 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -4,7 +4,7 @@ # vendor specific code. export platform=`sonic-cfggen -v onie_switch_asic` -ASIC=`sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type` +export ASIC=`sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type` MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` From 51ebdf43ace288e4e5b38f5b5b8f60cbebd48a14 Mon Sep 17 00:00:00 2001 From: nikos-li <31227248+nikos-li@users.noreply.github.com> Date: Wed, 11 Oct 2017 15:31:38 -0700 Subject: [PATCH 0831/1011] [frr]: Support for nhopself, keepalive and holdtime timers, prefer global ebgp nexthop (#1024) * RR client support in minigraph for FRR * Fix python warning from previous rrclient commit and move config handling to a more relevant place for this cmd * Add config support for nhopself, keepalive and holdtime timers. * Add route-map to prefer global nexthops for ebgp learned prefixes. --- dockers/docker-fpm-frr/bgpd.conf.j2 | 13 ++++++++++ src/sonic-config-engine/minigraph.py | 27 +++++++++++++++----- src/sonic-config-engine/tests/test_cfggen.py | 2 +- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/dockers/docker-fpm-frr/bgpd.conf.j2 b/dockers/docker-fpm-frr/bgpd.conf.j2 index 5452a976368a..07e2dd0c571e 100644 --- a/dockers/docker-fpm-frr/bgpd.conf.j2 +++ b/dockers/docker-fpm-frr/bgpd.conf.j2 @@ -51,6 +51,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} {% if bgp_session['asn'] | int != 0 %} neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }} neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }} + neighbor {{ neighbor_addr }} timers {{ bgp_session['keepalive'] }} {{ bgp_session['holdtime'] }} {% if DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %} neighbor {{ neighbor_addr }} allowas-in 1 {% endif %} @@ -59,6 +60,9 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} neighbor {{ neighbor_addr }} activate {% if bgp_session['rrclient'] | int != 0 %} neighbor {{ neighbor_addr }} route-reflector-client +{% endif %} +{% if bgp_session['nhopself'] | int != 0 %} + neighbor {{ neighbor_addr }} next-hop-self {% endif %} maximum-paths 64 exit-address-family @@ -68,6 +72,12 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} neighbor {{ neighbor_addr }} activate {% if bgp_session['rrclient'] | int != 0 %} neighbor {{ neighbor_addr }} route-reflector-client +{% endif %} +{% if bgp_session['nhopself'] | int != 0 %} + neighbor {{ neighbor_addr }} next-hop-self +{% endif %} +{% if bgp_session['asn'] != DEVICE_METADATA['localhost']['bgp_asn'] %} + neighbor {{ neighbor_addr }} route-map set-next-hop-global-v6 in {% endif %} maximum-paths 64 exit-address-family @@ -81,3 +91,6 @@ maximum-paths 64 route-map ISOLATE permit 10 set as-path prepend {{ DEVICE_METADATA['localhost']['bgp_asn'] }} ! +route-map set-next-hop-global-v6 permit 10 +set ipv6 next-hop prefer-global +! diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index e6533ce7beeb..c38abb051257 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -224,24 +224,38 @@ def parse_cpg(cpg, hname): start_peer = session.find(str(QName(ns, "StartPeer"))).text end_router = session.find(str(QName(ns, "EndRouter"))).text end_peer = session.find(str(QName(ns, "EndPeer"))).text + rrclient = 1 if session.find(str(QName(ns, "RRClient"))) is not None else 0 + if session.find(str(QName(ns, "HoldTime"))) is not None: + holdtime = session.find(str(QName(ns, "HoldTime"))).text + else: + holdtime = 180 + if session.find(str(QName(ns, "KeepAliveTime"))) is not None: + keepalive = session.find(str(QName(ns, "KeepAliveTime"))).text + else: + keepalive = 60 + nhopself = 1 if session.find(str(QName(ns, "NextHopSelf"))) is not None else 0 if end_router == hname: bgp_sessions[start_peer] = { 'name': start_router, - 'local_addr': end_peer + 'local_addr': end_peer, + 'rrclient': rrclient, + 'holdtime': holdtime, + 'keepalive': keepalive, + 'nhopself': nhopself } else: bgp_sessions[end_peer] = { 'name': end_router, - 'local_addr': start_peer + 'local_addr': start_peer, + 'rrclient': rrclient, + 'holdtime': holdtime, + 'keepalive': keepalive, + 'nhopself': nhopself } elif child.tag == str(QName(ns, "Routers")): for router in child.findall(str(QName(ns1, "BGPRouterDeclaration"))): asn = router.find(str(QName(ns1, "ASN"))).text hostname = router.find(str(QName(ns1, "Hostname"))).text - if router.find(str(QName(ns1, "RRClient"))): - rrclient = '1' - else: - rrclient = '0' if hostname == hname: myasn = asn peers = router.find(str(QName(ns1, "Peers"))) @@ -260,7 +274,6 @@ def parse_cpg(cpg, hname): bgp_session = bgp_sessions[peer] if hostname == bgp_session['name']: bgp_session['asn'] = asn - bgp_session['rrclient'] = rrclient return bgp_sessions, myasn, bgp_peers_with_range diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 23256079856b..91d14a043042 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -113,7 +113,7 @@ def test_minigraph_neighbors(self): def test_minigraph_bgp(self): argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v "BGP_NEIGHBOR[\'10.0.0.59\']"' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'rrclient': '0', 'local_addr': '10.0.0.58', 'asn': '64600', 'name': 'ARISTA02T1'}") + self.assertEqual(output.strip(), "{'rrclient': 0, 'name': 'ARISTA02T1', 'local_addr': '10.0.0.58', 'nhopself': 0, 'holdtime': '180', 'asn': '64600', 'keepalive': '60'}") def test_minigraph_peers_with_range(self): argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v BGP_PEER_RANGE.values\(\)' From 27cac94da7c052af3f0b10c99a563f0bf7fa88ad Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 11 Oct 2017 17:46:26 -0700 Subject: [PATCH 0832/1011] [Makefile]: Fix unmatched variable name ENABLE_SYNCD_RPC (#1032) Signed-off-by: Shu0T1an ChenG --- Makefile | 2 +- slave.mk | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Makefile b/Makefile index d672edc6836a..b5bd895b37ad 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,7 @@ SONIC_BUILD_INSTRUCTION := make \ 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) \ + ENABLE_SYNCD_RPC=$(ENABLE_SYNCD_RPC) \ PASSWORD=$(PASSWORD) \ USERNAME=$(USERNAME) diff --git a/slave.mk b/slave.mk index c26e4932f05a..bbcdf4bc3599 100644 --- a/slave.mk +++ b/slave.mk @@ -59,10 +59,6 @@ list : ## Include other rules ############################################################################### -ifeq ($(SONIC_ENABLE_SYNCD_RPC),y) -ENABLE_SYNCD_RPC = y -endif - include $(RULES_PATH)/config include $(RULES_PATH)/functions include $(RULES_PATH)/*.mk From dbced4fb7728484ec6e70560067dedf505926042 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 12 Oct 2017 00:28:16 -0700 Subject: [PATCH 0833/1011] [snmp]: Add swss dependency for snmp service (#1034) - snmp service needs swss to be ready to get the port counter map Signed-off-by: Shu0T1an ChenG --- files/build_templates/snmp.service.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/build_templates/snmp.service.j2 b/files/build_templates/snmp.service.j2 index 493d6bd8fcfd..08c41a52a5f7 100644 --- a/files/build_templates/snmp.service.j2 +++ b/files/build_templates/snmp.service.j2 @@ -1,7 +1,7 @@ [Unit] Description=SNMP container -Requires=database.service -After=database.service +Requires=database.service swss.service +After=database.service swss.service [Service] User={{ sonicadmin_user }} From 6eab72011be4ed8ef915ae26c7c44533b208ab56 Mon Sep 17 00:00:00 2001 From: Xin Liu Date: Thu, 12 Oct 2017 18:20:46 -0700 Subject: [PATCH 0834/1011] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c3d58ae1b538..0ac233452718 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Any server can be a build image server. We are using a server with 1T hard disk. # Prerequisites ## SAI Version -SONiC V2 is using [SAI 0.9.4](https://github.com/opencomputeproject/SAI/tree/v0.9.4). +Please refer to [SONiC roadmap](https://github.com/Azure/SONiC/wiki/Sonic-Roadmap-Planning) on the SAI version for each SONiC release. ## Clone or fetch the code repository with all git submodules To clone the code repository recursively, assuming git version 1.9 or newer: From 9e44d14197032a8cfb070742afa2ca356f798077 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 12 Oct 2017 20:58:16 -0700 Subject: [PATCH 0835/1011] [Dell]: Add Force10-S6100-T1 symlink to Force10-S6100 (#1038) --- device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100-T1 | 1 + 1 file changed, 1 insertion(+) create mode 120000 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100-T1 diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100-T1 b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100-T1 new file mode 120000 index 000000000000..36b1b840b83e --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100-T1 @@ -0,0 +1 @@ +Force10-S6100 \ No newline at end of file From 1a748ee0bb3643a79fb3af744488e5516da1e825 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 12 Oct 2017 20:59:14 -0700 Subject: [PATCH 0836/1011] Revert "Update QoS config name for Mellanox platform" (#1039) --- dockers/docker-orchagent/swssconfig.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index f780ae8afb20..55a22c5353c8 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -49,7 +49,7 @@ elif [ "$HWSKU" == "Arista-7050-QX32" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [[ "$HWSKU" == "ACS-MSN27"* ]]; then sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/msn27xx.32ports.buffers.json.j2 > /etc/swss/config.d/msn27xx.32ports.buffers.json - SWSSCONFIG_ARGS+="msn27xx.32ports.buffers.json msn27xx.32ports.qos.json " + SWSSCONFIG_ARGS+="msn27xx.32ports.buffers.json msn2700.32ports.qos.json " fi for file in $SWSSCONFIG_ARGS; do From 118c2dd39dea81e7ee4d43645fa6a1621d0db53e Mon Sep 17 00:00:00 2001 From: Hnydyn Nazar Date: Sat, 14 Oct 2017 03:08:35 +0300 Subject: [PATCH 0837/1011] [ntp]: Fix NTP sync while using DHCP (#1035) --- files/image_config/ntp/ntp.conf.j2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/files/image_config/ntp/ntp.conf.j2 b/files/image_config/ntp/ntp.conf.j2 index ae72820339be..d7df6bcd2e04 100644 --- a/files/image_config/ntp/ntp.conf.j2 +++ b/files/image_config/ntp/ntp.conf.j2 @@ -29,9 +29,13 @@ server {{ ntp_server }} iburst #only listen on localhost and eth0 ips (default is to listen on all ip addresses) interface ignore wildcard +{% if MGMT_INTERFACE %} {% for (mgmt_intf, mgmt_prefix) in MGMT_INTERFACE %} interface listen {{ mgmt_prefix | ip }} {% endfor %} +{% else %} +interface listen eth0 +{% endif %} interface listen 127.0.0.1 # Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for From b89555ed2f773ebd6a902a96e774df5abf7f1b08 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 13 Oct 2017 20:18:29 -0700 Subject: [PATCH 0838/1011] [Dell]: Update sonic-platform-modules-dell submodule (#1041) Including the following commits: Add support for Dell S6100 and Z9100 module deinit (#18) Disable S6100 low power mode by default (#19) Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sonic-platform-modules-dell | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-dell b/platform/broadcom/sonic-platform-modules-dell index 1abd4e6c41f6..0b9a92290080 160000 --- a/platform/broadcom/sonic-platform-modules-dell +++ b/platform/broadcom/sonic-platform-modules-dell @@ -1 +1 @@ -Subproject commit 1abd4e6c41f633272667a5833a63ab6f8da15199 +Subproject commit 0b9a92290080910b675b454fbd65171a93504df6 From f7cdca42ce0253745e0a35817781bf0f6872a3dc Mon Sep 17 00:00:00 2001 From: Xin Liu Date: Sun, 15 Oct 2017 22:18:54 -0700 Subject: [PATCH 0839/1011] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0ac233452718..5edaf3ae7f89 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ To build SONiC installer image and docker images, run the following commands: The SONiC installer contains all docker images needed. SONiC uses one image for all devices of a same ASIC vendor. The supported ASIC vendors are: - PLATFORM=broadcom -- PLATFORM=marvell (*pending*) +- PLATFORM=marvell - PLATFORM=mellanox - PLATFORM=cavium - PLATFORM=centec From 463c5e46ba127efdb4a88632a6f2be1d329c2ac7 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 16 Oct 2017 14:38:59 -0700 Subject: [PATCH 0840/1011] [Dell]: Update sonic-platform-modules-dell submodule (#1043) Including the following commit: depmod to ensure that modules get loaded after ONIE install / image upgrade Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sonic-platform-modules-dell | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-dell b/platform/broadcom/sonic-platform-modules-dell index 0b9a92290080..8c330a508f78 160000 --- a/platform/broadcom/sonic-platform-modules-dell +++ b/platform/broadcom/sonic-platform-modules-dell @@ -1 +1 @@ -Subproject commit 0b9a92290080910b675b454fbd65171a93504df6 +Subproject commit 8c330a508f7860082ed4f6259fe8df4c5b4c9c92 From 37dc7bd4786c793796530e53da304b5e68b7ed16 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 16 Oct 2017 17:36:21 -0700 Subject: [PATCH 0841/1011] [interfaces]: Set hwaddr of VLAN interfaces to system MAC upon creation (#1042) --- .../interfaces/interfaces-config.sh | 17 +++++++++++++++-- files/image_config/interfaces/interfaces.j2 | 1 + .../tests/sample_output/interfaces | 1 + src/sonic-config-engine/tests/test_j2files.py | 2 +- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index 400b89a594c7..bd5111a01f73 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -1,6 +1,19 @@ #!/bin/bash -sonic-cfggen -d -t /usr/share/sonic/templates/interfaces.j2 >/etc/network/interfaces +SONIC_ASIC_TYPE=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type) +SYSTEM_MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') + +# Align last byte of MAC if necessary +if [ "$SONIC_ASIC_TYPE" == "mellanox" -o "$SONIC_ASIC_TYPE" == "centec" ]; then + last_byte=$(python -c "print '$SYSTEM_MAC_ADDRESS'[-2:]") + aligned_last_byte=$(python -c "print format(int(int('$last_byte', 16) & 0b11000000), '02x')") # put mask and take away the 0x prefix + SYSTEM_MAC_ADDRESS=$(python -c "print '$SYSTEM_MAC_ADDRESS'[:-2] + '$aligned_last_byte'") # put aligned byte into the end of MAC +fi + +sonic-cfggen -d -a '{"hwaddr":"'$SYSTEM_MAC_ADDRESS'"}' -t /usr/share/sonic/templates/interfaces.j2 > /etc/network/interfaces + [ -f /var/run/dhclient.eth0.pid ] && kill `cat /var/run/dhclient.eth0.pid` && rm -f /var/run/dhclient.eth0.pid -service networking restart + +systemctl restart networking + ifdown lo && ifup lo diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 6521eb7a67e1..2fdd04804ca4 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -90,6 +90,7 @@ iface {{ member }} inet manual auto {{ name }} iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static bridge_ports none + hwaddress ether {{ hwaddr }} address {{ prefix | ip }} netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} {% endfor %} diff --git a/src/sonic-config-engine/tests/sample_output/interfaces b/src/sonic-config-engine/tests/sample_output/interfaces index ec3b6f740bc4..89a23471a7ee 100644 --- a/src/sonic-config-engine/tests/sample_output/interfaces +++ b/src/sonic-config-engine/tests/sample_output/interfaces @@ -214,6 +214,7 @@ iface fortyGigE0/124 inet manual auto Vlan1000 iface Vlan1000 inet static bridge_ports none + hwaddress ether e4:1d:2d:a5:f3:ad address 192.168.0.1 netmask 255.255.255.224 # diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 4bdc1b41f5b4..7e948f8b6a2a 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -20,7 +20,7 @@ def run_script(self, argument): def test_interfaces(self): interfaces_template = os.path.join(self.test_dir, '..', '..', '..', 'files', 'image_config', 'interfaces', 'interfaces.j2') - argument = '-m ' + self.t0_minigraph + ' -t ' + interfaces_template + ' > ' + self.output_file + argument = '-m ' + self.t0_minigraph + ' -a \'{\"hwaddr\":\"e4:1d:2d:a5:f3:ad\"}\' -t ' + interfaces_template + ' > ' + self.output_file self.run_script(argument) self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'interfaces'), self.output_file)) From 60a4d75b0786505e136be2af65732261643d160f Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 16 Oct 2017 19:46:44 -0700 Subject: [PATCH 0842/1011] [Broadcom]: Update Broadcom SAI package to 3.0.3.2-6 (#1044) msft patch: Trap all ARP packets including unicast/broadcast Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index ea804a69c0eb..459c02f824ce 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-5_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-5_amd64.deb?sv=2015-04-05&sr=b&sig=MQE6FrxHs%2BIUPjRaSpWagcSjY6bbHLCUYasusxILkEs%3D&se=2031-06-07T21%3A50%3A36Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-6_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-6_amd64.deb?sv=2015-04-05&sr=b&sig=78jpXMULiubmup2PBYzM5MCrt7KIHA913FlDOsdgmGY%3D&se=2031-06-25T21%3A52%3A36Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-5_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-6_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-5_amd64.deb?sv=2015-04-05&sr=b&sig=o8bjWlxxYAM%2F95aSshRFJE57JwKVjRaH4jDU2lDEoMg%3D&se=2031-06-07T21%3A50%3A19Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-6_amd64.deb?sv=2015-04-05&sr=b&sig=Vg%2BjJpwyJ3smRBaNVkbWH4xkNGOn%2BOxI0w3VcDgAxV0%3D&se=2031-06-25T21%3A52%3A54Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From b14c03a14d0da3b789aab6511c1ae29e56fe961a Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 17 Oct 2017 09:28:27 -0700 Subject: [PATCH 0843/1011] [utilities]: Update sonic-utilities submodule (#1045) [portstat]: Combine ADMIN and OPER fields Signed-off-by: Shu0T1an ChenG --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 6103ce8f21a0..99131067dc9b 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 6103ce8f21a0d4b5177ac5449f68f77ac179c7db +Subproject commit 99131067dc9bafe231ec064bb5b27ccc7fefe237 From e5c68d3bfe4784132438b2799987b7670546fdda Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 17 Oct 2017 09:28:35 -0700 Subject: [PATCH 0844/1011] [snmp]: Update sonic-snmpagent submodule (#1046) Signed-off-by: Qi Luo --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index bc4becf97ea6..d9d85a1383d7 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit bc4becf97ea69c15315414e8c7cba44067af2461 +Subproject commit d9d85a1383d752220054a714487899c06b697863 From ee168b0c09e5f99e7155457478a0d8da8fe6c886 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 17 Oct 2017 14:49:20 -0700 Subject: [PATCH 0845/1011] [py-swsssdk]: Update sonic-py-swsssdk submodule (#1048) Including this commit: [port_util]: Return empty dictionary instead of a NoneType in get_bridge_port_map Signed-off-by: Shu0T1an ChenG --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 96b4928e790b..a21b7a929ab6 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 96b4928e790bbce7c959f0b5cbb0510e5954afb1 +Subproject commit a21b7a929ab63f027e4a0d2f919145d8054b8011 From 03e532aa816cdbc6700985cec2dc599cb68db774 Mon Sep 17 00:00:00 2001 From: Shu0T1an ChenG Date: Tue, 17 Oct 2017 16:33:16 -0700 Subject: [PATCH 0846/1011] [utilities]: Update sonic-utilities submodule [portstat]: Fix typo Signed-off-by: Shu0T1an ChenG --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 99131067dc9b..8e20a3dc90fd 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 99131067dc9bafe231ec064bb5b27ccc7fefe237 +Subproject commit 8e20a3dc90fdfe86d3a74675c24de91b97e9d3c7 From 7a0a2ea5d0924d6d587a69687e3945fd941cd64e Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 17 Oct 2017 18:28:27 -0700 Subject: [PATCH 0847/1011] [bgpd.conf] Advertise /64 prefix for ipv6 lo addresses (#1050) --- 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 0ef144016246..3d01d9d52714 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -43,7 +43,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} network {{ prefix | ip }}/32 {% elif prefix | ipv6 %} address-family ipv6 - network {{ prefix | ip }}/128 + network {{ prefix | ip }}/64 exit-address-family {% endif %} {% endfor %} From 834890f192d89874eab02293fc316f91546e393f Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 18 Oct 2017 01:14:15 -0700 Subject: [PATCH 0848/1011] [Broadcom]: Update Broadcom SAI package to 3.0.3.2-7 (#1049) Update Accton config.bcm files Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 459c02f824ce..bf20f0dc706f 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-6_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-6_amd64.deb?sv=2015-04-05&sr=b&sig=78jpXMULiubmup2PBYzM5MCrt7KIHA913FlDOsdgmGY%3D&se=2031-06-25T21%3A52%3A36Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-7_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-7_amd64.deb?sv=2015-04-05&sr=b&sig=RUUm3WJuGYmtIatkKtR5iAuI%2FG2KM9hMXewAEnR2AKY%3D&se=2031-06-26T21%3A45%3A55Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-6_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-7_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-6_amd64.deb?sv=2015-04-05&sr=b&sig=Vg%2BjJpwyJ3smRBaNVkbWH4xkNGOn%2BOxI0w3VcDgAxV0%3D&se=2031-06-25T21%3A52%3A54Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-7_amd64.deb?sv=2015-04-05&sr=b&sig=hTQZeaqa7oiR9YTIuUGG1DGYNg8bwlWKB2J2r46Mq%2BE%3D&se=2031-06-26T21%3A46%3A16Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From d302d713a69d73b0becaab3489e7efd2872c07a8 Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Wed, 18 Oct 2017 19:43:46 -0700 Subject: [PATCH 0849/1011] [Arista]: Extra space in filename resulted in initialization failure (#1053) * Extra space removed --- .../x86_64-arista_7060_cx32s/Arista-7060-CX32S/sai.profile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/sai.profile b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/sai.profile index 29a42f07a734..c04ad3498582 100644 --- a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/sai.profile +++ b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/sai.profile @@ -1 +1 @@ -SAI_INIT_CONFIG_FILE=/etc/bcm/th-a7060-cx32s-32x100G.config.bcm +SAI_INIT_CONFIG_FILE=/etc/bcm/th-a7060-cx32s-32x100G.config.bcm From 2a564791875aeceb101db378c54c5fe9dadeab97 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 19 Oct 2017 00:38:25 -0700 Subject: [PATCH 0850/1011] [sonic-cfggen]: Add DEVICE_NEIGHBOR_METADATA field and move msn27xx template (#1025) This field contains all neighbor devices information using the device hostname as the key and having lo_addr, mgmt_addr, hwsku, type as the attributes. Move the file msn27xx.32ports.buffers.json.j2 from sonic-swss repository to this repository so that we could add unit test for this file. Unit test is added for platform ACS-MSN2700. Signed-off-by: Shu0T1an ChenG --- dockers/docker-orchagent/Dockerfile.j2 | 1 + .../msn27xx.32ports.buffers.json.j2 | 294 +++ src/sonic-config-engine/minigraph.py | 1 + .../tests/sample-port-config-mlnx.ini | 33 + .../tests/sample_output/msn27.32ports.json | 349 +++ .../tests/t1-sample-graph-mlnx.xml | 2240 +++++++++++++++++ src/sonic-config-engine/tests/test_j2files.py | 11 + 7 files changed, 2929 insertions(+) create mode 100644 dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 create mode 100644 src/sonic-config-engine/tests/sample-port-config-mlnx.ini create mode 100644 src/sonic-config-engine/tests/sample_output/msn27.32ports.json create mode 100644 src/sonic-config-engine/tests/t1-sample-graph-mlnx.xml diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 587d8f4db2ee..b2d20383e38e 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -31,5 +31,6 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] COPY ["ipinip.json.j2", "/usr/share/sonic/templates/"] COPY ["mirror.json.j2", "/usr/share/sonic/templates/"] COPY ["ports.json.j2", "/usr/share/sonic/templates/"] +COPY ["msn27xx.32ports.buffers.json.j2", "/usr/share/sonic/templates/"] ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 b/dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 new file mode 100644 index 000000000000..075385079a0d --- /dev/null +++ b/dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 @@ -0,0 +1,294 @@ +[ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') %} + { + "BUFFER_POOL_TABLE:ingress_lossless_pool": { + "size": "3024486", + "type": "ingress", + "mode": "dynamic" + }, + "OP": "SET" + }, + { + "BUFFER_POOL_TABLE:ingress_lossy_pool": { + "size": "6422528", + "type": "ingress", + "mode": "dynamic" + }, + "OP": "SET" + }, + { + "BUFFER_POOL_TABLE:egress_lossless_pool": { + "size": "7291456", + "type": "egress", + "mode": "dynamic" + }, + "OP": "SET" + }, + { + "BUFFER_POOL_TABLE:egress_lossy_pool": { + "size": "8254464", + "type": "egress", + "mode": "dynamic" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:ingress_lossless_profile": { + "pool":"[BUFFER_POOL_TABLE:ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:ingress_lossy_profile": { + "pool":"[BUFFER_POOL_TABLE:ingress_lossy_pool]", + "size":"0", + "dynamic_th":"7" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:egress_lossless_profile": { + "pool":"[BUFFER_POOL_TABLE:egress_lossless_pool]", + "size":"1518", + "dynamic_th":"7" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:egress_lossy_profile": { + "pool":"[BUFFER_POOL_TABLE:egress_lossy_pool]", + "size":"4096", + "dynamic_th":"7" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:pg_lossy_profile": { + "pool":"[BUFFER_POOL_TABLE:ingress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:q_lossless_profile": { + "pool":"[BUFFER_POOL_TABLE:egress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:q_lossy_profile": { + "pool":"[BUFFER_POOL_TABLE:egress_lossy_pool]", + "size":"0", + "dynamic_th":"1" + }, + "OP": "SET" + }, + { + "BUFFER_PORT_INGRESS_PROFILE_LIST:{{ port_names }}": { + "profile_list" : "[BUFFER_PROFILE_TABLE:ingress_lossless_profile],[BUFFER_PROFILE_TABLE:ingress_lossy_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PORT_EGRESS_PROFILE_LIST:{{ port_names }}": { + "profile_list" : "[BUFFER_PROFILE_TABLE:egress_lossless_profile],[BUFFER_PROFILE_TABLE:egress_lossy_profile]" + }, + "OP": "SET" + }, + +{# The following template part is for variable PG profile configuration #} +{% set pg_range = '3-4' %} +{# Lists of supported speed and cable length #} +{% set supported_speed = [10000, 25000, 40000, 50000, 100000] %} +{% set supported_cable = [5, 40, 300] %} + +{# The key in this lictionary consist of two parts: (port speed)_(cable length) #} +{%- set portconfig2profile = { + '10000_5' : 'pg_lossless_10G_5m_profile', + '25000_5' : 'pg_lossless_25G_5m_profile', + '40000_5' : 'pg_lossless_40G_5m_profile', + '50000_5' : 'pg_lossless_50G_5m_profile', + '100000_5' : 'pg_lossless_100G_5m_profile', + + '10000_40' : 'pg_lossless_10G_40m_profile', + '25000_40' : 'pg_lossless_25G_40m_profile', + '40000_40' : 'pg_lossless_40G_40m_profile', + '50000_40' : 'pg_lossless_50G_40m_profile', + '100000_40' : 'pg_lossless_100G_40m_profile', + + '10000_300' : 'pg_lossless_10G_300m_profile', + '25000_300' : 'pg_lossless_25G_300m_profile', + '40000_300' : 'pg_lossless_40G_300m_profile', + '50000_300' : 'pg_lossless_50G_300m_profile', + '100000_300': 'pg_lossless_100G_300m_profile' + } +-%} + +{# PG profiles. All profiles reffered in portconfig2profile dictionary should be declared here #} +{# Only those which were actually used will be created in SAI #} +{%- set pg_profiles = { + 'pg_lossless_10G_5m_profile': { 'xon': 18432, 'xoff': 16384, 'size': 34816, 'dynamic_th': 1 }, + 'pg_lossless_25G_5m_profile': { 'xon': 18432, 'xoff': 16384, 'size': 34816, 'dynamic_th': 1 }, + 'pg_lossless_40G_5m_profile': { 'xon': 18432, 'xoff': 16384, 'size': 34816, 'dynamic_th': 1 }, + 'pg_lossless_50G_5m_profile': { 'xon': 18432, 'xoff': 16384, 'size': 34816, 'dynamic_th': 1 }, + 'pg_lossless_100G_5m_profile': { 'xon': 18432, 'xoff': 18432, 'size': 36864, 'dynamic_th': 1 }, + + 'pg_lossless_10G_40m_profile': { 'xon': 18432, 'xoff': 18432, 'size': 36864, 'dynamic_th': 1 }, + 'pg_lossless_25G_40m_profile': { 'xon': 18432, 'xoff': 21504, 'size': 39936, 'dynamic_th': 1 }, + 'pg_lossless_40G_40m_profile': { 'xon': 18432, 'xoff': 23552, 'size': 41984, 'dynamic_th': 1 }, + 'pg_lossless_50G_40m_profile': { 'xon': 18432, 'xoff': 23552, 'size': 41984, 'dynamic_th': 1 }, + 'pg_lossless_100G_40m_profile': { 'xon': 18432, 'xoff': 35840, 'size': 54272, 'dynamic_th': 1 }, + + 'pg_lossless_10G_300m_profile': { 'xon': 18432, 'xoff': 30720, 'size': 49152, 'dynamic_th': 1 }, + 'pg_lossless_25G_300m_profile': { 'xon': 18432, 'xoff': 53248, 'size': 71680, 'dynamic_th': 1 }, + 'pg_lossless_40G_300m_profile': { 'xon': 18432, 'xoff': 75776, 'size': 94208, 'dynamic_th': 1 }, + 'pg_lossless_50G_300m_profile': { 'xon': 18432, 'xoff': 75776, 'size': 94208, 'dynamic_th': 1 }, + 'pg_lossless_100G_300m_profile':{ 'xon': 18432, 'xoff': 165888,'size': 184320,'dynamic_th': 1 }, + } +-%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'ToRRouter_Server' : '5', + 'LeafRouter_ToRRouter' : '40', + 'SpineRouter_LeafRouter' : '300' + } +%} + +{% set switch_role = DEVICE_METADATA['localhost']['type'] %} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {% endif %} + {% endif %} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ supported_cable | last }} + {%- endif -%} +{% endmacro %} + +{%- macro find_closest_greater_config(speed, cable) -%} +{%- set new_speed = [] -%} +{%- for std_speed in supported_speed -%} + {%- if std_speed | int >= speed | int -%} + {%- if new_speed.append(std_speed) -%}{%- endif -%} + {% endif -%} +{%- endfor -%} +{%- set new_cable = [] -%} +{%- for std_cable in supported_cable -%} + {% if std_cable | int >= cable | int -%} + {%- if new_cable.append(std_cable) -%}{%- endif -%} + {% endif %} +{%- endfor -%} +{{ new_speed.0 }}_{{ new_cable.0 }} +{%- endmacro -%} + +{% set ingress_lossless_pg_pool_size = [] %} +{% set used_pg_profiles = [] %} +{% for port in PORT %} + {%- if PORT[port].speed -%} + {%- set speed = PORT[port]['speed'] -%} + {% else %} + {%- set speed = supported_speed|last -%} + {%- endif -%} + {%- set cable = cable_length(port) -%} + {%- set port_config = speed|string + '_' + cable -%} + {%- if not port_config in portconfig2profile -%} + {% set port_config = find_closest_greater_config(speed, cable) -%} + {%- endif -%} + {% set profile = portconfig2profile[port_config] -%} + {% if ingress_lossless_pg_pool_size.append(pg_profiles[profile]['size']) %}{% endif %} + {# add to list profiles which were actually used #} + {%- if profile not in used_pg_profiles and used_pg_profiles.append(profile) %}{% endif -%} + { + "BUFFER_PG_TABLE:{{ port }}:{{ pg_range }}": { + "profile" : "[BUFFER_PROFILE_TABLE:{{ profile }}]" + }, + "OP": "SET" + }, +{% endfor -%} + +{# PG profiles declaration #} + +{% for profile_name in used_pg_profiles %} + {%- set profile_config = pg_profiles[profile_name] %} + { + "BUFFER_PROFILE_TABLE:{{ profile_name }}": { + "pool":"[BUFFER_POOL_TABLE:ingress_lossless_pg_pool]", + "xon":"{{ profile_config['xon'] }}", + "xoff":"{{ profile_config['xoff'] }}", + "size":"{{ profile_config['size'] }}", + "dynamic_th":"{{ profile_config['dynamic_th'] }}" + }, + "OP": "SET" + }, +{% endfor -%} + + {# Pool declaration #} + { + "BUFFER_POOL_TABLE:ingress_lossless_pg_pool": { + "size": "{{ ingress_lossless_pg_pool_size | sum }}", + "type": "ingress", + "mode": "dynamic" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:{{ port_names }}:0-1": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossy_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_QUEUE_TABLE:{{ port_names }}:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:q_lossless_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_QUEUE_TABLE:{{ port_names }}:0-1": { + "profile" : "[BUFFER_PROFILE_TABLE:q_lossy_profile]" + }, + "OP": "SET" + }, + { + "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_TABLE:AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + }, + "OP": "SET" + }, + { + "PORT_QOS_MAP_TABLE:{{ port_names }}": { + "pfc_to_pg_map" : "[PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_TABLE:AZURE]" + }, + "OP": "SET" + } +] diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index c38abb051257..69299ce3c50a 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -443,6 +443,7 @@ def parse_xml(filename, platform=None, port_config_file=None): results['VLAN'] = vlans results['DEVICE_NEIGHBOR'] = neighbors + results['DEVICE_NEIGHBOR_METADATA'] = { key:devices[key] for key in devices if key != hostname } results['SYSLOG_SERVER'] = dict((item, {}) for item in syslog_servers) results['DHCP_SERVER'] = dict((item, {}) for item in dhcp_servers) results['NTP_SERVER'] = dict((item, {}) for item in ntp_servers) diff --git a/src/sonic-config-engine/tests/sample-port-config-mlnx.ini b/src/sonic-config-engine/tests/sample-port-config-mlnx.ini new file mode 100644 index 000000000000..816bb0e94a70 --- /dev/null +++ b/src/sonic-config-engine/tests/sample-port-config-mlnx.ini @@ -0,0 +1,33 @@ +# name lanes +Ethernet0 0,1,2,3 +Ethernet4 4,5,6,7 +Ethernet8 8,9,10,11 +Ethernet12 12,13,14,15 +Ethernet16 16,17,18,19 +Ethernet20 20,21,22,23 +Ethernet24 24,25,26,27 +Ethernet28 28,29,30,31 +Ethernet32 32,33,34,35 +Ethernet36 36,37,38,39 +Ethernet40 40,41,42,43 +Ethernet44 44,45,46,47 +Ethernet48 48,49,50,51 +Ethernet52 52,53,54,55 +Ethernet56 56,57,58,59 +Ethernet60 60,61,62,63 +Ethernet64 64,65,66,67 +Ethernet68 68,69,70,71 +Ethernet72 72,73,74,75 +Ethernet76 76,77,78,79 +Ethernet80 80,81,82,83 +Ethernet84 84,85,86,87 +Ethernet88 88,89,90,91 +Ethernet92 92,93,94,95 +Ethernet96 96,97,98,99 +Ethernet100 100,101,102,103 +Ethernet104 104,105,106,107 +Ethernet108 108,109,110,111 +Ethernet112 112,113,114,115 +Ethernet116 116,117,118,119 +Ethernet120 120,121,122,123 +Ethernet124 124,125,126,127 diff --git a/src/sonic-config-engine/tests/sample_output/msn27.32ports.json b/src/sonic-config-engine/tests/sample_output/msn27.32ports.json new file mode 100644 index 000000000000..876706b5de13 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/msn27.32ports.json @@ -0,0 +1,349 @@ +[ + { + "BUFFER_POOL_TABLE:ingress_lossless_pool": { + "size": "3024486", + "type": "ingress", + "mode": "dynamic" + }, + "OP": "SET" + }, + { + "BUFFER_POOL_TABLE:ingress_lossy_pool": { + "size": "6422528", + "type": "ingress", + "mode": "dynamic" + }, + "OP": "SET" + }, + { + "BUFFER_POOL_TABLE:egress_lossless_pool": { + "size": "7291456", + "type": "egress", + "mode": "dynamic" + }, + "OP": "SET" + }, + { + "BUFFER_POOL_TABLE:egress_lossy_pool": { + "size": "8254464", + "type": "egress", + "mode": "dynamic" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:ingress_lossless_profile": { + "pool":"[BUFFER_POOL_TABLE:ingress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:ingress_lossy_profile": { + "pool":"[BUFFER_POOL_TABLE:ingress_lossy_pool]", + "size":"0", + "dynamic_th":"7" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:egress_lossless_profile": { + "pool":"[BUFFER_POOL_TABLE:egress_lossless_pool]", + "size":"1518", + "dynamic_th":"7" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:egress_lossy_profile": { + "pool":"[BUFFER_POOL_TABLE:egress_lossy_pool]", + "size":"4096", + "dynamic_th":"7" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:pg_lossy_profile": { + "pool":"[BUFFER_POOL_TABLE:ingress_lossy_pool]", + "size":"0", + "dynamic_th":"3" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:q_lossless_profile": { + "pool":"[BUFFER_POOL_TABLE:egress_lossless_pool]", + "size":"0", + "dynamic_th":"7" + }, + "OP": "SET" + }, + { + "BUFFER_PROFILE_TABLE:q_lossy_profile": { + "pool":"[BUFFER_POOL_TABLE:egress_lossy_pool]", + "size":"0", + "dynamic_th":"1" + }, + "OP": "SET" + }, + { + "BUFFER_PORT_INGRESS_PROFILE_LIST:Ethernet8,Ethernet0,Ethernet4,Ethernet108,Ethernet100,Ethernet104,Ethernet68,Ethernet96,Ethernet124,Ethernet92,Ethernet120,Ethernet52,Ethernet56,Ethernet76,Ethernet72,Ethernet64,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet88,Ethernet116,Ethernet80,Ethernet112,Ethernet84,Ethernet48,Ethernet44,Ethernet40,Ethernet28,Ethernet60,Ethernet20,Ethernet24": { + "profile_list" : "[BUFFER_PROFILE_TABLE:ingress_lossless_profile],[BUFFER_PROFILE_TABLE:ingress_lossy_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PORT_EGRESS_PROFILE_LIST:Ethernet8,Ethernet0,Ethernet4,Ethernet108,Ethernet100,Ethernet104,Ethernet68,Ethernet96,Ethernet124,Ethernet92,Ethernet120,Ethernet52,Ethernet56,Ethernet76,Ethernet72,Ethernet64,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet88,Ethernet116,Ethernet80,Ethernet112,Ethernet84,Ethernet48,Ethernet44,Ethernet40,Ethernet28,Ethernet60,Ethernet20,Ethernet24": { + "profile_list" : "[BUFFER_PROFILE_TABLE:egress_lossless_profile],[BUFFER_PROFILE_TABLE:egress_lossy_profile]" + }, + "OP": "SET" + }, + + + + { + "BUFFER_PG_TABLE:Ethernet8:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet0:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet4:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet108:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet100:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet104:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet68:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet96:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet124:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet92:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet120:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet52:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet56:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet76:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet72:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet64:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet32:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet16:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet36:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet12:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet88:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet116:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet80:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet112:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet84:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet48:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet44:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet40:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet28:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet60:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet20:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet24:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile]" + }, + "OP": "SET" + }, + + { + "BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile": { + "pool":"[BUFFER_POOL_TABLE:ingress_lossless_pg_pool]", + "xon":"18432", + "xoff":"75776", + "size":"94208", + "dynamic_th":"1" + }, + "OP": "SET" + }, + { + "BUFFER_POOL_TABLE:ingress_lossless_pg_pool": { + "size": "3014656", + "type": "ingress", + "mode": "dynamic" + }, + "OP": "SET" + }, + { + "BUFFER_PG_TABLE:Ethernet8,Ethernet0,Ethernet4,Ethernet108,Ethernet100,Ethernet104,Ethernet68,Ethernet96,Ethernet124,Ethernet92,Ethernet120,Ethernet52,Ethernet56,Ethernet76,Ethernet72,Ethernet64,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet88,Ethernet116,Ethernet80,Ethernet112,Ethernet84,Ethernet48,Ethernet44,Ethernet40,Ethernet28,Ethernet60,Ethernet20,Ethernet24:0-1": { + "profile" : "[BUFFER_PROFILE_TABLE:pg_lossy_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_QUEUE_TABLE:Ethernet8,Ethernet0,Ethernet4,Ethernet108,Ethernet100,Ethernet104,Ethernet68,Ethernet96,Ethernet124,Ethernet92,Ethernet120,Ethernet52,Ethernet56,Ethernet76,Ethernet72,Ethernet64,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet88,Ethernet116,Ethernet80,Ethernet112,Ethernet84,Ethernet48,Ethernet44,Ethernet40,Ethernet28,Ethernet60,Ethernet20,Ethernet24:3-4": { + "profile" : "[BUFFER_PROFILE_TABLE:q_lossless_profile]" + }, + "OP": "SET" + }, + { + "BUFFER_QUEUE_TABLE:Ethernet8,Ethernet0,Ethernet4,Ethernet108,Ethernet100,Ethernet104,Ethernet68,Ethernet96,Ethernet124,Ethernet92,Ethernet120,Ethernet52,Ethernet56,Ethernet76,Ethernet72,Ethernet64,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet88,Ethernet116,Ethernet80,Ethernet112,Ethernet84,Ethernet48,Ethernet44,Ethernet40,Ethernet28,Ethernet60,Ethernet20,Ethernet24:0-1": { + "profile" : "[BUFFER_PROFILE_TABLE:q_lossy_profile]" + }, + "OP": "SET" + }, + { + "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_TABLE:AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + }, + "OP": "SET" + }, + { + "PORT_QOS_MAP_TABLE:Ethernet8,Ethernet0,Ethernet4,Ethernet108,Ethernet100,Ethernet104,Ethernet68,Ethernet96,Ethernet124,Ethernet92,Ethernet120,Ethernet52,Ethernet56,Ethernet76,Ethernet72,Ethernet64,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet88,Ethernet116,Ethernet80,Ethernet112,Ethernet84,Ethernet48,Ethernet44,Ethernet40,Ethernet28,Ethernet60,Ethernet20,Ethernet24": { + "pfc_to_pg_map" : "[PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_TABLE:AZURE]" + }, + "OP": "SET" + } +] diff --git a/src/sonic-config-engine/tests/t1-sample-graph-mlnx.xml b/src/sonic-config-engine/tests/t1-sample-graph-mlnx.xml new file mode 100644 index 000000000000..04fc88c34370 --- /dev/null +++ b/src/sonic-config-engine/tests/t1-sample-graph-mlnx.xml @@ -0,0 +1,2240 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + arc-switch1026 + 10.0.0.32 + 1 + 10 + 3 + + + ARISTA01T0 + FC00::42 + arc-switch1026 + FC00::41 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 10 + 3 + + + arc-switch1026 + FC00::1 + ARISTA01T2 + FC00::2 + 1 + 10 + 3 + + + ARISTA02T0 + 10.0.0.35 + arc-switch1026 + 10.0.0.34 + 1 + 10 + 3 + + + ARISTA02T0 + FC00::46 + arc-switch1026 + FC00::45 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 10 + 3 + + + arc-switch1026 + FC00::5 + ARISTA02T2 + FC00::6 + 1 + 10 + 3 + + + ARISTA03T0 + 10.0.0.37 + arc-switch1026 + 10.0.0.36 + 1 + 10 + 3 + + + ARISTA03T0 + FC00::4A + arc-switch1026 + FC00::49 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 10 + 3 + + + arc-switch1026 + FC00::9 + ARISTA03T2 + FC00::A + 1 + 10 + 3 + + + ARISTA04T0 + 10.0.0.39 + arc-switch1026 + 10.0.0.38 + 1 + 10 + 3 + + + ARISTA04T0 + FC00::4E + arc-switch1026 + FC00::4D + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 10 + 3 + + + arc-switch1026 + FC00::D + ARISTA04T2 + FC00::E + 1 + 10 + 3 + + + ARISTA05T0 + 10.0.0.41 + arc-switch1026 + 10.0.0.40 + 1 + 10 + 3 + + + ARISTA05T0 + FC00::52 + arc-switch1026 + FC00::51 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 10 + 3 + + + arc-switch1026 + FC00::11 + ARISTA05T2 + FC00::12 + 1 + 10 + 3 + + + ARISTA06T0 + 10.0.0.43 + arc-switch1026 + 10.0.0.42 + 1 + 10 + 3 + + + ARISTA06T0 + FC00::56 + arc-switch1026 + FC00::55 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 10 + 3 + + + arc-switch1026 + FC00::15 + ARISTA06T2 + FC00::16 + 1 + 10 + 3 + + + ARISTA07T0 + 10.0.0.45 + arc-switch1026 + 10.0.0.44 + 1 + 10 + 3 + + + ARISTA07T0 + FC00::5A + arc-switch1026 + FC00::59 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 10 + 3 + + + arc-switch1026 + FC00::19 + ARISTA07T2 + FC00::1A + 1 + 10 + 3 + + + ARISTA08T0 + 10.0.0.47 + arc-switch1026 + 10.0.0.46 + 1 + 10 + 3 + + + ARISTA08T0 + FC00::5E + arc-switch1026 + FC00::5D + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 10 + 3 + + + arc-switch1026 + FC00::1D + ARISTA08T2 + FC00::1E + 1 + 10 + 3 + + + ARISTA09T0 + 10.0.0.49 + arc-switch1026 + 10.0.0.48 + 1 + 10 + 3 + + + ARISTA09T0 + FC00::62 + arc-switch1026 + FC00::61 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 10 + 3 + + + arc-switch1026 + FC00::21 + ARISTA09T2 + FC00::22 + 1 + 10 + 3 + + + ARISTA10T0 + 10.0.0.51 + arc-switch1026 + 10.0.0.50 + 1 + 10 + 3 + + + ARISTA10T0 + FC00::66 + arc-switch1026 + FC00::65 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 10 + 3 + + + arc-switch1026 + FC00::25 + ARISTA10T2 + FC00::26 + 1 + 10 + 3 + + + ARISTA11T0 + 10.0.0.53 + arc-switch1026 + 10.0.0.52 + 1 + 10 + 3 + + + ARISTA11T0 + FC00::6A + arc-switch1026 + FC00::69 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 10 + 3 + + + arc-switch1026 + FC00::29 + ARISTA11T2 + FC00::2A + 1 + 10 + 3 + + + ARISTA12T0 + 10.0.0.55 + arc-switch1026 + 10.0.0.54 + 1 + 10 + 3 + + + ARISTA12T0 + FC00::6E + arc-switch1026 + FC00::6D + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 10 + 3 + + + arc-switch1026 + FC00::2D + ARISTA12T2 + FC00::2E + 1 + 10 + 3 + + + ARISTA13T0 + 10.0.0.57 + arc-switch1026 + 10.0.0.56 + 1 + 10 + 3 + + + ARISTA13T0 + FC00::72 + arc-switch1026 + FC00::71 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 10 + 3 + + + arc-switch1026 + FC00::31 + ARISTA13T2 + FC00::32 + 1 + 10 + 3 + + + ARISTA14T0 + 10.0.0.59 + arc-switch1026 + 10.0.0.58 + 1 + 10 + 3 + + + ARISTA14T0 + FC00::76 + arc-switch1026 + FC00::75 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 10 + 3 + + + arc-switch1026 + FC00::35 + ARISTA14T2 + FC00::36 + 1 + 10 + 3 + + + ARISTA15T0 + 10.0.0.61 + arc-switch1026 + 10.0.0.60 + 1 + 10 + 3 + + + ARISTA15T0 + FC00::7A + arc-switch1026 + FC00::79 + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 10 + 3 + + + arc-switch1026 + FC00::39 + ARISTA15T2 + FC00::3A + 1 + 10 + 3 + + + ARISTA16T0 + 10.0.0.63 + arc-switch1026 + 10.0.0.62 + 1 + 10 + 3 + + + ARISTA16T0 + FC00::7E + arc-switch1026 + FC00::7D + 1 + 10 + 3 + + + arc-switch1026 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 10 + 3 + + + arc-switch1026 + FC00::3D + ARISTA16T2 + FC00::3E + 1 + 10 + 3 + + + + + 65100 + arc-switch1026 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + HostIP1 + Loopback0 + + FC00:1::32/128 + + FC00:1::32/128 + + + + + HostIP + eth0 + + 10.224.23.80/24 + + 10.224.23.80/24 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + arc-switch1026 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet0 + FC00::1/126 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet4 + FC00::5/126 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet8 + FC00::9/126 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet12 + FC00::D/126 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet16 + FC00::11/126 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet20 + FC00::15/126 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet24 + FC00::19/126 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet28 + FC00::1D/126 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet32 + FC00::21/126 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet36 + FC00::25/126 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet40 + FC00::29/126 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet44 + FC00::2D/126 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet48 + FC00::31/126 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet52 + FC00::35/126 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet56 + FC00::39/126 + + + + Ethernet60 + 10.0.0.30/31 + + + + Ethernet60 + FC00::3D/126 + + + + Ethernet64 + 10.0.0.32/31 + + + + Ethernet64 + FC00::41/126 + + + + Ethernet68 + 10.0.0.34/31 + + + + Ethernet68 + FC00::45/126 + + + + Ethernet72 + 10.0.0.36/31 + + + + Ethernet72 + FC00::49/126 + + + + Ethernet76 + 10.0.0.38/31 + + + + Ethernet76 + FC00::4D/126 + + + + Ethernet80 + 10.0.0.40/31 + + + + Ethernet80 + FC00::51/126 + + + + Ethernet84 + 10.0.0.42/31 + + + + Ethernet84 + FC00::55/126 + + + + Ethernet88 + 10.0.0.44/31 + + + + Ethernet88 + FC00::59/126 + + + + Ethernet92 + 10.0.0.46/31 + + + + Ethernet92 + FC00::5D/126 + + + + Ethernet96 + 10.0.0.48/31 + + + + Ethernet96 + FC00::61/126 + + + + Ethernet100 + 10.0.0.50/31 + + + + Ethernet100 + FC00::65/126 + + + + Ethernet104 + 10.0.0.52/31 + + + + Ethernet104 + FC00::69/126 + + + + Ethernet108 + 10.0.0.54/31 + + + + Ethernet108 + FC00::6D/126 + + + + Ethernet112 + 10.0.0.56/31 + + + + Ethernet112 + FC00::71/126 + + + + Ethernet116 + 10.0.0.58/31 + + + + Ethernet116 + FC00::75/126 + + + + Ethernet120 + 10.0.0.60/31 + + + + Ethernet120 + FC00::79/126 + + + + Ethernet124 + 10.0.0.62/31 + + + + Ethernet124 + FC00::7D/126 + + + + + + + + + + + + DeviceInterfaceLink + arc-switch1026 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet60 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet64 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet68 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet72 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet76 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet80 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet84 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet88 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet92 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet96 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet100 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet104 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet108 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet112 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet116 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet120 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + arc-switch1026 + Ethernet124 + ARISTA16T0 + Ethernet1 + + + + + arc-switch1026 + ACS-MSN2700 + + 10.224.23.80 + + + + "ARISTA01T0" + Arista-VM + + 10.224.23.196 + + + + "ARISTA01T2" + Arista-VM + + 10.224.23.180 + + + + "ARISTA02T0" + Arista-VM + + 10.224.23.197 + + + + "ARISTA02T2" + Arista-VM + + 10.224.23.181 + + + + "ARISTA03T0" + Arista-VM + + 10.224.23.198 + + + + "ARISTA03T2" + Arista-VM + + 10.224.23.182 + + + + "ARISTA04T0" + Arista-VM + + 10.224.23.199 + + + + "ARISTA04T2" + Arista-VM + + 10.224.23.183 + + + + "ARISTA05T0" + Arista-VM + + 10.224.23.200 + + + + "ARISTA05T2" + Arista-VM + + 10.224.23.184 + + + + "ARISTA06T0" + Arista-VM + + 10.224.23.201 + + + + "ARISTA06T2" + Arista-VM + + 10.224.23.185 + + + + "ARISTA07T0" + Arista-VM + + 10.224.23.202 + + + + "ARISTA07T2" + Arista-VM + + 10.224.23.186 + + + + "ARISTA08T0" + Arista-VM + + 10.224.23.203 + + + + "ARISTA08T2" + Arista-VM + + 10.224.23.187 + + + + "ARISTA09T0" + Arista-VM + + 10.224.23.152 + + + + "ARISTA09T2" + Arista-VM + + 10.224.23.188 + + + + "ARISTA10T0" + Arista-VM + + 10.224.23.153 + + + + "ARISTA10T2" + Arista-VM + + 10.224.23.189 + + + + "ARISTA11T0" + Arista-VM + + 10.224.23.154 + + + + "ARISTA11T2" + Arista-VM + + 10.224.23.190 + + + + "ARISTA12T0" + Arista-VM + + 10.224.23.155 + + + + "ARISTA12T2" + Arista-VM + + 10.224.23.191 + + + + "ARISTA13T0" + Arista-VM + + 10.224.23.156 + + + + "ARISTA13T2" + Arista-VM + + 10.224.23.192 + + + + "ARISTA14T0" + Arista-VM + + 10.224.23.157 + + + + "ARISTA14T2" + Arista-VM + + 10.224.23.193 + + + + "ARISTA15T0" + Arista-VM + + 10.224.23.158 + + + + "ARISTA15T2" + Arista-VM + + 10.224.23.194 + + + + "ARISTA16T0" + Arista-VM + + 10.224.23.159 + + + + "ARISTA16T2" + Arista-VM + + 10.224.23.195 + + + + + + + true + + + DeviceInterface + + true + true + 1 + Ethernet0 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet4 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet8 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet12 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet16 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet20 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet24 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet28 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet32 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet36 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet40 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet44 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet48 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet52 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet56 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet60 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet64 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet68 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet72 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet76 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet80 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet84 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet88 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet92 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet96 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet100 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet104 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet108 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet112 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet116 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet120 + + false + 0 + 0 + 40000 + + + DeviceInterface + + true + true + 1 + Ethernet124 + + false + 0 + 0 + 40000 + + + true + 0 + ACS-MSN2700 + + + + + + + arc-switch1026 + + + DhcpResources + + 10.0.0.1 + + + NTPResources + + 10.0.0.1;10.0.0.2 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + RadiusResources + + + + + SnmpResources + + 10.0.0.9 + + + SyslogResources + + 10.0.0.5;10.0.0.6 + + + TacacsGroup + + testlab + + + TacacsServer + + 10.0.0.9;10.0.0.8 + + + ForcedMgmtRoutes + + 10.0.0.100/31;10.250.0.8;10.255.0.0/28 + + + ErspanDestinationIpv4 + + 10.0.0.7 + + + + + + + arc-switch1026 + ACS-MSN2700 +
diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 7e948f8b6a2a..3d4139d0eb20 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -12,6 +12,8 @@ def setUp(self): self.t0_minigraph = os.path.join(self.test_dir, 't0-sample-graph.xml') self.pc_minigraph = os.path.join(self.test_dir, 'pc-test-graph.xml') self.t0_port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') + self.t1_mlnx_minigraph = os.path.join(self.test_dir, 't1-sample-graph-mlnx.xml') + self.mlnx_port_config = os.path.join(self.test_dir, 'sample-port-config-mlnx.ini') self.output_file = os.path.join(self.test_dir, 'output') def run_script(self, argument): @@ -84,6 +86,15 @@ def test_everflow(self): assert filecmp.cmp(sample_output_file, self.output_file) + def test_msn27xx_32ports_buffers(self): + buffer_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'msn27xx.32ports.buffers.json.j2') + argument = '-m ' + self.t1_mlnx_minigraph + ' -p ' + self.mlnx_port_config + ' -t ' + buffer_file + ' > ' + self.output_file + self.run_script(argument) + + sample_output_file = os.path.join(self.test_dir, 'sample_output', 'msn27.32ports.json') + + self.assertTrue(filecmp.cmp(sample_output_file, self.output_file)) + def tearDown(self): try: From 1ee8ed92168b4ce0e95805df89ae169002befd87 Mon Sep 17 00:00:00 2001 From: Balaselvi Date: Thu, 19 Oct 2017 13:06:03 -0700 Subject: [PATCH 0851/1011] [Inventec]: Add Inventec D7054 platform support and update D7032 platform support (#1052) --- .../plugins/eeprom.py | 2 +- .../plugins/sfputil.py | 141 ++- .../INVENTEC-D7054Q28B-S48-Q6/port_config.ini | 56 + .../INVENTEC-D7054Q28B-S48-Q6/sai.profile | 2 + .../installer.conf | 4 + .../minigraph.xml | 146 +++ .../plugins/eeprom.py | 22 + .../plugins/sfputil.py | 209 ++++ platform/broadcom/one-image.mk | 1 + .../broadcom/platform-modules-inventec.mk | 11 +- .../d7032q28b/conf/d7032q28b-modules.conf | 10 - .../d7032q28b/modules/Makefile | 4 + .../d7032q28b/modules/inv_eeprom.c | 181 +++ .../d7032q28b/modules/inv_platform.c | 395 +++---- .../d7032q28b/modules/inv_swps.c | 618 ++++++++++ .../d7032q28b/modules/inv_swps.h | 131 +++ .../d7032q28b/modules/io_expander.c | 887 ++++++++++++++ .../d7032q28b/modules/io_expander.h | 136 +++ .../d7032q28b/modules/transceiver.c | 898 ++++++++++++++ .../d7032q28b/modules/transceiver.h | 167 +++ .../d7032q28b/utils/inventec_d7032_util.py | 217 ++++ .../d7032q28b/utils/onie-syseeprom | Bin 921685 -> 0 bytes .../d7054q28b/modules/Makefile | 6 + .../d7054q28b/modules/inv_cpld.c | 415 +++++++ .../d7054q28b/modules/inv_eeprom.c | 181 +++ .../d7054q28b/modules/inv_platform.c | 219 ++++ .../d7054q28b/modules/inv_psoc.c | 1046 +++++++++++++++++ .../d7054q28b/modules/inv_swps.c | 730 ++++++++++++ .../d7054q28b/modules/inv_swps.h | 170 +++ .../d7054q28b/modules/io_expander.c | 944 +++++++++++++++ .../d7054q28b/modules/io_expander.h | 143 +++ .../d7054q28b/modules/transceiver.c | 906 ++++++++++++++ .../d7054q28b/modules/transceiver.h | 168 +++ .../d7054q28b/utils/inventec_d7054_util.py | 234 ++++ .../debian/changelog | 5 + .../debian/control | 5 + .../debian/platform-modules-d7032q28b.init | 37 +- .../debian/platform-modules-d7032q28b.install | 2 +- .../debian/platform-modules-d7032q28b.upstart | 5 + .../debian/platform-modules-d7054q28b.init | 40 + .../debian/platform-modules-d7054q28b.install | 1 + .../debian/platform-modules-d7054q28b.upstart | 5 + .../debian/rules | 5 +- 43 files changed, 9242 insertions(+), 263 deletions(-) create mode 100644 device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/port_config.ini create mode 100644 device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/sai.profile create mode 100644 device/inventec/x86_64-inventec_d7054q28b-r0/installer.conf create mode 100644 device/inventec/x86_64-inventec_d7054q28b-r0/minigraph.xml create mode 100644 device/inventec/x86_64-inventec_d7054q28b-r0/plugins/eeprom.py create mode 100755 device/inventec/x86_64-inventec_d7054q28b-r0/plugins/sfputil.py delete mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/conf/d7032q28b-modules.conf create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_eeprom.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_swps.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_swps.h create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/io_expander.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/io_expander.h create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/transceiver.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/transceiver.h create mode 100755 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/utils/inventec_d7032_util.py delete mode 100755 platform/broadcom/sonic-platform-modules-inventec/d7032q28b/utils/onie-syseeprom create mode 100755 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_cpld.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_eeprom.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_platform.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_psoc.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_swps.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_swps.h create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/io_expander.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/io_expander.h create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/transceiver.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/transceiver.h create mode 100755 platform/broadcom/sonic-platform-modules-inventec/d7054q28b/utils/inventec_d7054_util.py create mode 100644 platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.upstart create mode 100644 platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.init create mode 100644 platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.install create mode 100644 platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.upstart diff --git a/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/eeprom.py b/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/eeprom.py index ad70e584bb2a..de5c24ba0e6d 100644 --- a/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/eeprom.py +++ b/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/eeprom.py @@ -18,5 +18,5 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self, name, path, cpld_root, ro): - self.eeprom_path = "/tmp/eeprom" + self.eeprom_path = "/sys/class/i2c-adapter/i2c-0/0-0053/eeprom" super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/sfputil.py b/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/sfputil.py index 020faab9db58..645c76b9f0db 100644 --- a/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/sfputil.py +++ b/device/inventec/x86_64-inventec_d7032q28b-r0/plugins/sfputil.py @@ -1,19 +1,23 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) -class sfputil(sfputilbase): - """Platform specific sfputil class""" +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" - port_start = 0 - port_end = 31 - ports_in_block = 32 + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 - port_to_eeprom_mapping = {} + _port_to_eeprom_mapping = {} port_to_i2c_mapping = { 0: 22, 1: 23, @@ -49,12 +53,117 @@ class sfputil(sfputilbase): 31: 21 } - _qsfp_ports = range(0, ports_in_block + 1) + @property + def port_start(self): + return self.PORT_START - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' - for x in range(self.port_start, self.port_end + 1): + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + + for x in range(0, self.port_end + 1): port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) self.port_to_eeprom_mapping[x] = port_eeprom_path - sfputilbase.__init__(self, port_num) + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/class/swps/port"+str(port_num)+"/present") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = int(reg_file.readline().rstrip()) + + if reg_value == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/class/swps/port"+str(port_num)+"/lpmod") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + + reg_value = int(reg_file.readline().rstrip()) + + if reg_value == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/class/swps/port"+str(port_num)+"/lpmod", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = int(reg_file.readline().rstrip()) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = 1 + else: + reg_value = 0 + + reg_file.write(hex(reg_value)) + reg_file.close() + + return True + + def reset(self, port_num): + QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/class/swps/port"+str(port_num)+"/reset" + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = 0 + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 2 second to allow it to settle + time.sleep(2) + + # Flip the value back write back to the register to take port out of reset + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = 1 + reg_file.write(hex(reg_value)) + reg_file.close() + + return True diff --git a/device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/port_config.ini b/device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/port_config.ini new file mode 100644 index 000000000000..a8eaeb1f0665 --- /dev/null +++ b/device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/port_config.ini @@ -0,0 +1,56 @@ +# 48x25G + 6x100G +# name lanes alias +Ethernet0 2 Ethernet0 +Ethernet4 1 Ethernet4 +Ethernet8 4 Ethernet8 +Ethernet12 3 Ethernet12 +Ethernet16 6 Ethernet16 +Ethernet20 5 Ethernet20 +Ethernet24 8 Ethernet24 +Ethernet28 7 Ethernet28 +Ethernet32 10 Ethernet32 +Ethernet36 9 Ethernet36 +Ethernet40 12 Ethernet40 +Ethernet44 11 Ethernet44 +Ethernet48 22 Ethernet48 +Ethernet52 21 Ethernet52 +Ethernet56 24 Ethernet56 +Ethernet60 23 Ethernet60 +Ethernet64 34 Ethernet64 +Ethernet68 33 Ethernet68 +Ethernet72 36 Ethernet72 +Ethernet76 35 Ethernet76 +Ethernet80 38 Ethernet80 +Ethernet84 37 Ethernet84 +Ethernet88 40 Ethernet88 +Ethernet92 39 Ethernet92 +Ethernet96 42 Ethernet96 +Ethernet100 41 Ethernet100 +Ethernet104 44 Ethernet104 +Ethernet108 43 Ethernet108 +Ethernet112 50 Ethernet112 +Ethernet116 49 Ethernet116 +Ethernet120 52 Ethernet120 +Ethernet124 51 Ethernet124 +Ethernet128 54 Ethernet128 +Ethernet132 53 Ethernet132 +Ethernet136 56 Ethernet136 +Ethernet140 55 Ethernet140 +Ethernet144 66 Ethernet144 +Ethernet148 65 Ethernet148 +Ethernet152 68 Ethernet152 +Ethernet156 67 Ethernet156 +Ethernet160 70 Ethernet160 +Ethernet164 69 Ethernet164 +Ethernet168 72 Ethernet168 +Ethernet172 71 Ethernet172 +Ethernet176 82 Ethernet176 +Ethernet180 81 Ethernet180 +Ethernet184 84 Ethernet184 +Ethernet188 83 Ethernet188 +Ethernet192 85,86,87,88 Ethernet192 +Ethernet196 97,98,99,100 Ethernet196 +Ethernet200 105,106,107,108 Ethernet200 +Ethernet204 101,102,103,104 Ethernet204 +Ethernet208 117,118,119,120 Ethernet208 +Ethernet212 109,110,111,112 Ethernet212 diff --git a/device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/sai.profile b/device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/sai.profile new file mode 100644 index 000000000000..6f60cbd6118c --- /dev/null +++ b/device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-d7054q28b-48x10g-6x100g.config.bcm +SAI_NUM_ECMP_MEMBERS=32 diff --git a/device/inventec/x86_64-inventec_d7054q28b-r0/installer.conf b/device/inventec/x86_64-inventec_d7054q28b-r0/installer.conf new file mode 100644 index 000000000000..1db64ba02c38 --- /dev/null +++ b/device/inventec/x86_64-inventec_d7054q28b-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 +VAR_LOG_SIZE=1024 diff --git a/device/inventec/x86_64-inventec_d7054q28b-r0/minigraph.xml b/device/inventec/x86_64-inventec_d7054q28b-r0/minigraph.xml new file mode 100644 index 000000000000..0e579ccbde14 --- /dev/null +++ b/device/inventec/x86_64-inventec_d7054q28b-r0/minigraph.xml @@ -0,0 +1,146 @@ + + + + + + OCPSCH0104001MS + 10.10.1.26 + SONiC-Inventec-d7054 + 10.10.1.25 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.26 + SONiC-Inventec-d7054 + 10.10.2.25 + 1 + 10 + 3 + + + + + 64536 + SONiC-Inventec-d7054 + + +
10.10.1.26
+ + +
+ +
10.10.2.26
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.9/32 + + 100.0.0.9/32 + + + + + + + + SONiC-Inventec-d7054 + + + + + + Ethernet0 + 10.10.1.25/30 + + + + Ethernet4 + 10.10.2.25/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet24 + SONiC-Inventec-d7054 + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104002MS + Ethernet24 + SONiC-Inventec-d7054 + Ethernet4 + + + + + SONiC-Inventec-d7054 + INVENTEC-D7054Q28B-S48-Q6 + + + + + + + SONiC-Inventec-d7054 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + + SONiC-Inventec-d7054 + INVENTEC-D7054Q28B-S48-Q6 +
diff --git a/device/inventec/x86_64-inventec_d7054q28b-r0/plugins/eeprom.py b/device/inventec/x86_64-inventec_d7054q28b-r0/plugins/eeprom.py new file mode 100644 index 000000000000..de5c24ba0e6d --- /dev/null +++ b/device/inventec/x86_64-inventec_d7054q28b-r0/plugins/eeprom.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +############################################################################# +# Inventec d7032q28b +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-0/0-0053/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/inventec/x86_64-inventec_d7054q28b-r0/plugins/sfputil.py b/device/inventec/x86_64-inventec_d7054q28b-r0/plugins/sfputil.py new file mode 100755 index 000000000000..d236146e495e --- /dev/null +++ b/device/inventec/x86_64-inventec_d7054q28b-r0/plugins/sfputil.py @@ -0,0 +1,209 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 53 + PORTS_IN_BLOCK = 54 + QSFP_PORT_START = 48 + QSFP_PORT_END = 53 + + _port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 0: 11, + 1: 10, + 2: 13, + 3: 12, + 4: 15, + 5: 14, + 6: 17, + 7: 16, + 8: 19, + 9: 18, + 10: 21, + 11: 20, + 12: 23, + 13: 22, + 14: 25, + 15: 24, + 16: 27, + 17: 26, + 18: 29, + 19: 28, + 20: 31, + 21: 30, + 22: 33, + 23: 32, + 24: 35, + 25: 34, + 26: 37, + 27: 36, + 28: 39, + 29: 38, + 30: 41, + 31: 40, + 32: 43, + 33: 42, + 34: 45, + 35: 44, + 36: 47, + 37: 46, + 38: 49, + 39: 48, + 40: 51, + 41: 50, + 42: 53, + 43: 52, + 44: 55, + 45: 54, + 46: 57, + 47: 56, + 48: 59, + 49: 58, + 50: 61, + 51: 60, + 52: 63, + 53: 62 + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_port_start(self): + return self.QSFP_PORT_START + + @property + def qsfp_port_end(self): + return self.QSFP_PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/sys/bus/i2c/devices/{0}-0050/eeprom" + + for x in range(0, self.port_end + 1): + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/class/swps/port"+str(port_num)+"/present") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = int(reg_file.readline().rstrip()) + + if reg_value == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + try: + reg_file = open("/sys/class/swps/port"+str(port_num)+"/lpmod") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + + reg_value = int(reg_file.readline().rstrip()) + + if reg_value == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + print "\nError:SFP's don't support this property" + return False + + try: + reg_file = open("/sys/class/swps/port"+str(port_num)+"/lpmod", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = int(reg_file.readline().rstrip()) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = 1 + else: + reg_value = 0 + + reg_file.write(hex(reg_value)) + reg_file.close() + + return True + + def reset(self, port_num): + QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/class/swps/port"+str(port_num)+"/reset" + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + print "\nError:SFP's don't support this property" + return False + + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = 0 + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 2 second to allow it to settle + time.sleep(2) + + # Flip the value back write back to the register to take port out of reset + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = 1 + reg_file.write(hex(reg_value)) + reg_file.close() + + return True diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 2340177fd18b..60305c292b6b 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -13,6 +13,7 @@ $(SONIC_ONE_IMAGE)_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(INGRASYS_S8810_32Q_PLATFORM_MODULE) \ $(ACCTON_AS7712_32X_PLATFORM_MODULE) \ $(INVENTEC_D7032Q28B_PLATFORM_MODULE) \ + $(INVENTEC_D7054Q28B_PLATFORM_MODULE) \ $(CEL_DX010_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/broadcom/platform-modules-inventec.mk b/platform/broadcom/platform-modules-inventec.mk index 0d00fe1f7368..f4a2e65e5147 100755 --- a/platform/broadcom/platform-modules-inventec.mk +++ b/platform/broadcom/platform-modules-inventec.mk @@ -1,12 +1,17 @@ -# Inventec d7032q28b Platform modules +# Inventec d7032q28b and d7054q28b Platform modules -INVENTEC_D7032Q28B_PLATFORM_MODULE_VERSION = 1.0.0 +INVENTEC_D7032Q28B_PLATFORM_MODULE_VERSION = 1.1.0 +INVENTEC_D7054Q28B_PLATFORM_MODULE_VERSION = 1.1.0 export INVENTEC_D7032Q28B_PLATFORM_MODULE_VERSION +export INVENTEC_D7054Q28B_PLATFORM_MODULE_VERSION INVENTEC_D7032Q28B_PLATFORM_MODULE = platform-modules-d7032q28b_$(INVENTEC_D7032Q28B_PLATFORM_MODULE_VERSION)_amd64.deb $(INVENTEC_D7032Q28B_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-inventec $(INVENTEC_D7032Q28B_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) $(INVENTEC_D7032Q28B_PLATFORM_MODULE)_PLATFORM = x86_64-inventec_d7032q28b-r0 SONIC_DPKG_DEBS += $(INVENTEC_D7032Q28B_PLATFORM_MODULE) -$(eval $(call add_extra_package,$(INVENTEC_D7032Q28B_PLATFORM_MODULE))) + +INVENTEC_D7054Q28B_PLATFORM_MODULE = platform-modules-d7054q28b_$(INVENTEC_D7054Q28B_PLATFORM_MODULE_VERSION)_amd64.deb +$(INVENTEC_D7054Q28B_PLATFORM_MODULE)_PLATFORM = x86_64-inventec_d7054q28b-r0 +$(eval $(call add_extra_package,$(INVENTEC_D7032Q28B_PLATFORM_MODULE),$(INVENTEC_D7054Q28B_PLATFORM_MODULE))) diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/conf/d7032q28b-modules.conf b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/conf/d7032q28b-modules.conf deleted file mode 100644 index 29d4d50a4f9a..000000000000 --- a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/conf/d7032q28b-modules.conf +++ /dev/null @@ -1,10 +0,0 @@ -# /etc/modules: kernel modules to load at boot time. -# -# This file contains the names of kernel modules that should be loaded -# at boot time, one per line. Lines beginning with "#" are ignored. - -lpc_ich -i2c-i801 -i2c-mux -i2c-mux-pca954x -i2c-dev diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/Makefile b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/Makefile index cdabd612a66d..c43c47745229 100755 --- a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/Makefile +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/Makefile @@ -1,3 +1,7 @@ obj-m += inv_cpld.o inv_psoc.o obj-m += inv_platform.o +obj-m += inv_eeprom.o +obj-m += swps.o +swps-objs := inv_swps.o io_expander.o transceiver.o + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_eeprom.c b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_eeprom.c new file mode 100644 index 000000000000..b2dde612b610 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_eeprom.c @@ -0,0 +1,181 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include + + +/* Size of EEPROM in bytes */ +#define EEPROM_SIZE 256 + +#define SLICE_BITS (6) +#define SLICE_SIZE (1 << SLICE_BITS) +#define SLICE_NUM (EEPROM_SIZE/SLICE_SIZE) + +/* Each client has this additional data */ +struct eeprom_data { + struct mutex update_lock; + u8 valid; /* bitfield, bit!=0 if slice is valid */ + unsigned long last_updated[SLICE_NUM]; /* In jiffies, 8 slices */ + u8 data[EEPROM_SIZE]; /* Register values */ +}; + + +static void inv_eeprom_update_client(struct i2c_client *client, u8 slice) +{ + struct eeprom_data *data = i2c_get_clientdata(client); + int i, j; + int ret; + int addr; + + + mutex_lock(&data->update_lock); + + if (!(data->valid & (1 << slice)) || + time_after(jiffies, data->last_updated[slice] + 300 * HZ)) { + dev_dbg(&client->dev, "Starting eeprom update, slice %u\n", slice); + + addr = slice << SLICE_BITS; + + ret = i2c_smbus_write_byte_data(client, ((u8)addr >> 8) & 0xFF, (u8)addr & 0xFF); + /* select the eeprom address */ + if (ret < 0) { + dev_err(&client->dev, "address set failed\n"); + goto exit; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE)) { + goto exit; + } + + for (i = slice << SLICE_BITS; i < (slice + 1) << SLICE_BITS; i+= SLICE_SIZE) { + for (j = i; j < (i+SLICE_SIZE); j++) { + int res; + + res = i2c_smbus_read_byte(client); + if (res < 0) { + goto exit; + } + + data->data[j] = res & 0xFF; + } + } + + data->last_updated[slice] = jiffies; + data->valid |= (1 << slice); + } + +exit: + mutex_unlock(&data->update_lock); +} + +static ssize_t inv_eeprom_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + u8 slice; + + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + /* Only refresh slices which contain requested bytes */ + for (slice = off >> SLICE_BITS; slice <= (off + count - 1) >> SLICE_BITS; slice++) { + inv_eeprom_update_client(client, slice); + } + + memcpy(buf, &data->data[off], count); + + return count; +} + +static struct bin_attribute inv_eeprom_attr = { + .attr = { + .name = "eeprom", + .mode = S_IRUGO, + }, + .size = EEPROM_SIZE, + .read = inv_eeprom_read, +}; + +static int inv_eeprom_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct eeprom_data *data; + int err; + + if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) { + err = -ENOMEM; + goto exit; + } + + memset(data->data, 0xff, EEPROM_SIZE); + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* create the sysfs eeprom file */ + err = sysfs_create_bin_file(&client->dev.kobj, &inv_eeprom_attr); + if (err) { + goto exit_kfree; + } + + return 0; + +exit_kfree: + kfree(data); +exit: + return err; +} + +static int inv_eeprom_remove(struct i2c_client *client) +{ + sysfs_remove_bin_file(&client->dev.kobj, &inv_eeprom_attr); + kfree(i2c_get_clientdata(client)); + + return 0; +} + +static const struct i2c_device_id inv_eeprom_id[] = { + { "inv_eeprom", 0 }, + { } +}; + +static struct i2c_driver inv_eeprom_driver = { + .driver = { + .name = "inv_eeprom", + }, + .probe = inv_eeprom_probe, + .remove = inv_eeprom_remove, + .id_table = inv_eeprom_id, +}; + +module_i2c_driver(inv_eeprom_driver); + +MODULE_AUTHOR("Inventec"); +MODULE_DESCRIPTION("Inventec D7032 Mother Board EEPROM driver"); +MODULE_LICENSE("GPL"); + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_platform.c b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_platform.c index 71dda75b252f..52f6a5691d3e 100644 --- a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_platform.c +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_platform.c @@ -1,197 +1,198 @@ -#include -//#include -#include -#include -#include -#include -#include - -#include -#include -#include - -//#include -#define IO_EXPAND_BASE 64 -#define IO_EXPAND_NGPIO 16 - -struct inv_i2c_board_info { - int ch; - int size; - struct i2c_board_info *board_info; -}; - -#define bus_id(id) (id) -static struct pca954x_platform_mode mux_modes_0[] = { - {.adap_id = bus_id(2),}, {.adap_id = bus_id(3),}, - {.adap_id = bus_id(4),}, {.adap_id = bus_id(5),}, -}; -static struct pca954x_platform_mode mux_modes_0_0[] = { - {.adap_id = bus_id(6),}, {.adap_id = bus_id(7),}, - {.adap_id = bus_id(8),}, {.adap_id = bus_id(9),}, - {.adap_id = bus_id(10),}, {.adap_id = bus_id(11),}, - {.adap_id = bus_id(12),}, {.adap_id = bus_id(13),}, -}; - -static struct pca954x_platform_mode mux_modes_0_1[] = { - {.adap_id = bus_id(14),}, {.adap_id = bus_id(15),}, - {.adap_id = bus_id(16),}, {.adap_id = bus_id(17),}, - {.adap_id = bus_id(18),}, {.adap_id = bus_id(19),}, - {.adap_id = bus_id(20),}, {.adap_id = bus_id(21),}, -}; - -static struct pca954x_platform_mode mux_modes_0_2[] = { - {.adap_id = bus_id(22),}, {.adap_id = bus_id(23),}, - {.adap_id = bus_id(24),}, {.adap_id = bus_id(25),}, - {.adap_id = bus_id(26),}, {.adap_id = bus_id(27),}, - {.adap_id = bus_id(28),}, {.adap_id = bus_id(29),}, -}; - -static struct pca954x_platform_mode mux_modes_0_3[] = { - {.adap_id = bus_id(30),}, {.adap_id = bus_id(31),}, - {.adap_id = bus_id(32),}, {.adap_id = bus_id(33),}, - {.adap_id = bus_id(34),}, {.adap_id = bus_id(35),}, - {.adap_id = bus_id(36),}, {.adap_id = bus_id(37),}, -}; - -static struct pca954x_platform_data mux_data_0 = { - .modes = mux_modes_0, - .num_modes = 4, -}; -static struct pca954x_platform_data mux_data_0_0 = { - .modes = mux_modes_0_0, - .num_modes = 8, -}; -static struct pca954x_platform_data mux_data_0_1 = { - .modes = mux_modes_0_1, - .num_modes = 8, -}; -static struct pca954x_platform_data mux_data_0_2 = { - .modes = mux_modes_0_2, - .num_modes = 8, -}; -static struct pca954x_platform_data mux_data_0_3 = { - .modes = mux_modes_0_3, - .num_modes = 8, -}; - -static struct i2c_board_info i2c_device_info0[] __initdata = { - {"inv_psoc", 0, 0x66, 0, 0, 0},//psoc - {"inv_cpld", 0, 0x55, 0, 0, 0},//cpld - {"pca9545", 0, 0x70, &mux_data_0, 0, 0}, -}; - -static struct i2c_board_info i2c_device_info1[] __initdata = { - {"pca9545", 0, 0x70, &mux_data_0, 0, 0}, -}; - -static struct i2c_board_info i2c_device_info2[] __initdata = { - {"pca9548", 0, 0x72, &mux_data_0_0, 0, 0}, -}; - -static struct i2c_board_info i2c_device_info3[] __initdata = { - {"pca9548", 0, 0x72, &mux_data_0_1, 0, 0}, -}; - -static struct i2c_board_info i2c_device_info4[] __initdata = { - {"pca9548", 0, 0x72, &mux_data_0_2, 0, 0}, -}; - -static struct i2c_board_info i2c_device_info5[] __initdata = { - {"pca9548", 0, 0x72, &mux_data_0_3, 0, 0}, -}; - - -static struct inv_i2c_board_info i2cdev_list[] = { - {0, ARRAY_SIZE(i2c_device_info0), i2c_device_info0 }, //smbus 0 - {1, ARRAY_SIZE(i2c_device_info1), i2c_device_info1 }, //smbus 1 or gpio11+12 - - {bus_id(2), ARRAY_SIZE(i2c_device_info2), i2c_device_info2 }, //mux 0 - {bus_id(3), ARRAY_SIZE(i2c_device_info3), i2c_device_info3 }, //mux 1 - {bus_id(4), ARRAY_SIZE(i2c_device_info4), i2c_device_info4 }, //mux 2 - {bus_id(5), ARRAY_SIZE(i2c_device_info5), i2c_device_info5 }, //mux 3 -}; - -///////////////////////////////////////////////////////////////////////////////////////// -static struct i2c_gpio_platform_data i2c_gpio_platdata0 = { - .scl_pin = 8, - .sda_pin = 9, - - .udelay = 5, //5:100kHz - .sda_is_open_drain = 0, - .scl_is_open_drain = 0, - .scl_is_output_only = 0 -}; - -static struct i2c_gpio_platform_data i2c_gpio_platdata1 = { - .scl_pin = 12, - .sda_pin = 11, - - .udelay = 5, //5:100kHz - .sda_is_open_drain = 0, - .scl_is_open_drain = 0, - .scl_is_output_only = 0 -}; - -static struct platform_device device_i2c_gpio0 = { - .name = "i2c-gpio", - .id = 0, // adapter number - .dev.platform_data = &i2c_gpio_platdata0, -}; - -static struct platform_device device_i2c_gpio1 = { - .name = "i2c-gpio", - .id = 1, // adapter number - .dev.platform_data = &i2c_gpio_platdata1, -}; - -static int __init plat_redwood_x86_init(void) -{ - struct i2c_adapter *adap = NULL; - struct i2c_client *e = NULL; - int ret = 0; - int i,j; - - printk("el6661 plat_redwood_x86_init \n"); - -#if 0 //disable for ICOS - //use i2c-gpio - //register i2c gpio - //config gpio8,9 to gpio function - outl( inl(0x500) | (1<<8 | 1<<9), 0x500); - - ret = platform_device_register(&device_i2c_gpio0); - if (ret) { - printk(KERN_ERR "i2c-gpio: device_i2c_gpio0 register fail %d\n", ret); - } - - outl( inl(0x500) | (1<<11 | 1<<12), 0x500); - ret = platform_device_register(&device_i2c_gpio1); - if (ret) { - printk(KERN_ERR "i2c-gpio: device_i2c_gpio1 register fail %d\n", ret); - } -#endif - - for(i=0; i +//#include +#include +#include +#include +#include +#include + +#include +#include +#include + +//#include +#define IO_EXPAND_BASE 64 +#define IO_EXPAND_NGPIO 16 + +struct inv_i2c_board_info { + int ch; + int size; + struct i2c_board_info *board_info; +}; + +#define bus_id(id) (id) +static struct pca954x_platform_mode mux_modes_0[] = { + {.adap_id = bus_id(2),}, {.adap_id = bus_id(3),}, + {.adap_id = bus_id(4),}, {.adap_id = bus_id(5),}, +}; +static struct pca954x_platform_mode mux_modes_0_0[] = { + {.adap_id = bus_id(6),}, {.adap_id = bus_id(7),}, + {.adap_id = bus_id(8),}, {.adap_id = bus_id(9),}, + {.adap_id = bus_id(10),}, {.adap_id = bus_id(11),}, + {.adap_id = bus_id(12),}, {.adap_id = bus_id(13),}, +}; + +static struct pca954x_platform_mode mux_modes_0_1[] = { + {.adap_id = bus_id(14),}, {.adap_id = bus_id(15),}, + {.adap_id = bus_id(16),}, {.adap_id = bus_id(17),}, + {.adap_id = bus_id(18),}, {.adap_id = bus_id(19),}, + {.adap_id = bus_id(20),}, {.adap_id = bus_id(21),}, +}; + +static struct pca954x_platform_mode mux_modes_0_2[] = { + {.adap_id = bus_id(22),}, {.adap_id = bus_id(23),}, + {.adap_id = bus_id(24),}, {.adap_id = bus_id(25),}, + {.adap_id = bus_id(26),}, {.adap_id = bus_id(27),}, + {.adap_id = bus_id(28),}, {.adap_id = bus_id(29),}, +}; + +static struct pca954x_platform_mode mux_modes_0_3[] = { + {.adap_id = bus_id(30),}, {.adap_id = bus_id(31),}, + {.adap_id = bus_id(32),}, {.adap_id = bus_id(33),}, + {.adap_id = bus_id(34),}, {.adap_id = bus_id(35),}, + {.adap_id = bus_id(36),}, {.adap_id = bus_id(37),}, +}; + +static struct pca954x_platform_data mux_data_0 = { + .modes = mux_modes_0, + .num_modes = 4, +}; +static struct pca954x_platform_data mux_data_0_0 = { + .modes = mux_modes_0_0, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_1 = { + .modes = mux_modes_0_1, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_2 = { + .modes = mux_modes_0_2, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_3 = { + .modes = mux_modes_0_3, + .num_modes = 8, +}; + +static struct i2c_board_info i2c_device_info0[] __initdata = { + {"inv_psoc", 0, 0x66, 0, 0, 0},//psoc + {"inv_cpld", 0, 0x55, 0, 0, 0},//cpld + {"pca9545", 0, 0x70, &mux_data_0, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info1[] __initdata = { + {"pca9545", 0, 0x70, &mux_data_0, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info2[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_0, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info3[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_1, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info4[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_2, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info5[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_3, 0, 0}, +}; + + +static struct inv_i2c_board_info i2cdev_list[] = { + {0, ARRAY_SIZE(i2c_device_info0), i2c_device_info0 }, //smbus 0 + {1, ARRAY_SIZE(i2c_device_info1), i2c_device_info1 }, //smbus 1 or gpio11+12 + + {bus_id(2), ARRAY_SIZE(i2c_device_info2), i2c_device_info2 }, //mux 0 + {bus_id(3), ARRAY_SIZE(i2c_device_info3), i2c_device_info3 }, //mux 1 + {bus_id(4), ARRAY_SIZE(i2c_device_info4), i2c_device_info4 }, //mux 2 + {bus_id(5), ARRAY_SIZE(i2c_device_info5), i2c_device_info5 }, //mux 3 +}; + +///////////////////////////////////////////////////////////////////////////////////////// +static struct i2c_gpio_platform_data i2c_gpio_platdata0 = { + .scl_pin = 8, + .sda_pin = 9, + + .udelay = 5, //5:100kHz + .sda_is_open_drain = 0, + .scl_is_open_drain = 0, + .scl_is_output_only = 0 +}; + +static struct i2c_gpio_platform_data i2c_gpio_platdata1 = { + .scl_pin = 12, + .sda_pin = 11, + + .udelay = 5, //5:100kHz + .sda_is_open_drain = 0, + .scl_is_open_drain = 0, + .scl_is_output_only = 0 +}; + +static struct platform_device device_i2c_gpio0 = { + .name = "i2c-gpio", + .id = 0, // adapter number + .dev.platform_data = &i2c_gpio_platdata0, +}; + +static struct platform_device device_i2c_gpio1 = { + .name = "i2c-gpio", + .id = 1, // adapter number + .dev.platform_data = &i2c_gpio_platdata1, +}; + +static int __init plat_redwood_x86_init(void) +{ + struct i2c_adapter *adap = NULL; + struct i2c_client *e = NULL; + int ret = 0; + int i,j; + + printk("el6661 plat_redwood_x86_init \n"); + +#if 0 //disable for ICOS + //use i2c-gpio + //register i2c gpio + //config gpio8,9 to gpio function + outl( inl(0x500) | (1<<8 | 1<<9), 0x500); + + ret = platform_device_register(&device_i2c_gpio0); + if (ret) { + printk(KERN_ERR "i2c-gpio: device_i2c_gpio0 register fail %d\n", ret); + } + + outl( inl(0x500) | (1<<11 | 1<<12), 0x500); + ret = platform_device_register(&device_i2c_gpio1); + if (ret) { + printk(KERN_ERR "i2c-gpio: device_i2c_gpio1 register fail %d\n", ret); + } +#endif + + for(i=0; i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "inv_swps.h" + +static int port_major; +static int ioexp_total; +static int port_total; +static struct class *swp_class_p = NULL; +static struct inv_platform_s *platform_p = NULL; +static struct inv_ioexp_layout_s *ioexp_layout = NULL; +static struct inv_port_layout_s *port_layout = NULL; + +static int +__swp_match(struct device *dev, +#ifdef SWPS_KERN_VER_AF_3_10 + + const void *data){ +#else + void *data){ +#endif + + char *name = (char *)data; + if (strcmp(dev_name(dev), name) == 0) + return 1; + return 0; +} + + +struct device * +get_swpdev_by_name(char *name){ + struct device *dev = class_find_device(swp_class_p, + NULL, + name, + (const void *)__swp_match); + return dev; +} + + +static int +sscanf_2_int(const char *buf) { + + int result = -EBFONT; + char *hex_tag = "0x"; + + if (strcspn(buf, hex_tag) == 0) { + if (sscanf(buf,"%x",&result)) { + return result; + } + } else { + if (sscanf(buf,"%d",&result)) { + return result; + } + if(sscanf(buf,"-%d",&result)) { + return -result; + } + if (sscanf(buf,"%x",&result)) { + return result; + } + } + return -EBFONT; +} + + +static int +sscanf_2_binary(const char *buf) { + + int result = sscanf_2_int(buf); + + if (result < 0){ + return -EBFONT; + } + switch (result) { + case 0: + case 1: + return result; + default: + break; + } + return -EBFONT; +} + +/* ========== Show functions: For I/O Expander attribute ========== + */ +static ssize_t +_show_ioexp_binary_attr(struct transvr_obj_s *tobj_p, + int (*get_func)(struct ioexp_obj_s *ioexp_p, int voffset), + char *buf_p) { + size_t len; + struct ioexp_obj_s *ioexp_p = tobj_p->ioexp_obj_p; + + if (!ioexp_p) { + SWPS_ERR(" %s: data corruption! :%s\n", __func__, tobj_p->swp_name); + return -ENODATA; + } + mutex_lock(&ioexp_p->lock); + len = snprintf(buf_p, 8, "%d\n", get_func(ioexp_p, tobj_p->ioexp_virt_offset)); + mutex_unlock(&ioexp_p->lock); + return len; +} + + +static ssize_t +show_attr_present(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_present, + buf_p); +} + +static ssize_t +show_attr_reset(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_reset, + buf_p); +} + +static ssize_t +show_attr_lpmod(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_lpmod, + buf_p); +} + + +static ssize_t +show_attr_modsel(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_modsel, + buf_p); +} + +/* ========== Store functions: For I/O Expander (R/W) attribute ========== + */ +static ssize_t +_store_ioexp_binary_attr(struct transvr_obj_s *tobj_p, + int (*set_func)(struct ioexp_obj_s *ioexp_p, + int virt_offset, int input_val), + const char *buf_p, + size_t count) { + + int input, err; + struct ioexp_obj_s *ioexp_p = tobj_p->ioexp_obj_p; + + if (!ioexp_p) { + SWPS_ERR("%s: data corruption! :%s\n", + __func__, tobj_p->swp_name); + return -ENODATA; + } + input = sscanf_2_binary(buf_p); + if (input < 0) { + return -EBFONT; + } + mutex_lock(&ioexp_p->lock); + err = set_func(ioexp_p, tobj_p->ioexp_virt_offset, input); + mutex_unlock(&ioexp_p->lock); + if (err < 0){ + return err; + } + return count; +} + +static ssize_t +store_attr_reset(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_reset, + buf_p, + count); +} + + +static ssize_t +store_attr_lpmod(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_lpmod, + buf_p, + count); +} + + +static ssize_t +store_attr_modsel(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_modsel, + buf_p, + count); +} + +/* ========== IO Expander attribute: from expander ========== + */ +static DEVICE_ATTR(present, S_IRUGO, show_attr_present, NULL); +static DEVICE_ATTR(reset, S_IRUGO|S_IWUSR, show_attr_reset, store_attr_reset); +static DEVICE_ATTR(lpmod, S_IRUGO|S_IWUSR, show_attr_lpmod, store_attr_lpmod); +static DEVICE_ATTR(modsel, S_IRUGO|S_IWUSR, show_attr_modsel, store_attr_modsel); + +/* ========== Functions for module handling ========== + */ +static void +clean_port_obj(void){ + + dev_t dev_num; + char dev_name[32]; + struct device *device_p; + struct transvr_obj_s *transvr_obj_p; + int minor_curr, port_id; + + for (minor_curr=0; minor_curri2c_client_p); + kfree(transvr_obj_p); + } + dev_num = MKDEV(port_major, minor_curr); + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); + } + SWPS_DEBUG("%s: done.\n", __func__); +} + + +static int +get_platform_type(void){ + + char log_msg[64] = "ERROR"; + + platform_p = kzalloc(sizeof(struct inv_platform_s), GFP_KERNEL); + if (!platform_p){ + snprintf(log_msg, sizeof(log_msg), "kzalloc fail"); + goto err_get_platform_type_1; + } + platform_p->id = PLATFORM_SETTINGS; + memset(platform_p->name, 0, sizeof(platform_p->name)); + snprintf(platform_p->name, (sizeof(platform_p->name) - 1), + "%s", platform_map.name); + snprintf(log_msg, sizeof(log_msg), + "User setup platform: %d (%s)", + platform_p->id, platform_p->name); + SWPS_DEBUG("%s: %s, :%d\n", __func__, log_msg, PLATFORM_SETTINGS); + return 0; + +err_get_platform_type_1: + SWPS_ERR("%s: %s :%d\n", __func__, log_msg, PLATFORM_SETTINGS); + return -1; +} + + +static int +get_layout_info(void){ + + ioexp_layout = redwood_ioexp_layout; + port_layout = redwood_port_layout; + ioexp_total = ARRAY_SIZE(redwood_ioexp_layout); + port_total = ARRAY_SIZE(redwood_port_layout); + + SWPS_INFO("Start to initial platform: %d (%s)\n", + platform_p->id, platform_p->name); + return 0; +} + +/* ========== Functions for register something ========== + */ + +static int +register_ioexp_attr_qsfp_1(struct device *device_p){ + /* Support machine type: + * - QSFP : Magnolia, Redwood, Hudson32i + * - QSFP+ : Magnolia, Redwood, Hudson32i + * - QSFP28: Redwood + */ + char *err_attr = NULL; + + if (device_create_file(device_p, &dev_attr_present) < 0) { + err_attr = "dev_attr_present"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_reset) < 0) { + err_attr = "dev_attr_reset"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_lpmod) < 0) { + err_attr = "dev_attr_lpmod"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_modsel) < 0) { + err_attr = "dev_attr_modsel"; + goto err_ioexp_qsfp1_attr; + } + return 0; + +err_ioexp_qsfp1_attr: + SWPS_ERR("Add device attribute:%s failure! \n",err_attr); + return -1; +} + +static int +register_ioexp_attr(struct device *device_p, + struct transvr_obj_s *transvr_obj){ + + char *err_msg = "ERR"; + + switch (transvr_obj->ioexp_obj_p->ioexp_type){ + case IOEXP_TYPE_REDWOOD_P01P08: + case IOEXP_TYPE_REDWOOD_P09P16: + if (register_ioexp_attr_qsfp_1(device_p) < 0){ + err_msg = "register_ioexp_attr_qsfp_1 fail"; + goto err_reg_ioexp_attr; + } + break; + + default: + err_msg = "Unknow type"; + goto err_reg_ioexp_attr; + } + return 0; + +err_reg_ioexp_attr: + SWPS_ERR("%s: %s :%d \n", + __func__, err_msg, transvr_obj->ioexp_obj_p->ioexp_type); + return -1; +} + + +static int +register_port_device(char *dev_name, + dev_t dev_num, + struct transvr_obj_s *transvr_obj){ + + struct device *device_p = NULL; + device_p = device_create(swp_class_p, /* struct class *cls */ + NULL, /* struct device *parent */ + dev_num, /* dev_t devt */ + transvr_obj, /* void *private_data */ + dev_name); /* const char *fmt */ + if (IS_ERR(device_p)){ + goto err_regswp_create_dev; + } + if (register_ioexp_attr(device_p, transvr_obj) < 0){ + goto err_regswp_reg_attr; + } + return 0; + +err_regswp_reg_attr: + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); +err_regswp_create_dev: + SWPS_ERR("%s fail! :%s\n", __func__, dev_name); + return -1; +} + + +static int +register_swp_module(void){ + + dev_t port_devt = 0; + int dev_total = port_total + 1; /* char_dev for module control */ + + if (alloc_chrdev_region(&port_devt, 0, dev_total, SWP_CLS_NAME) < 0){ + SWPS_WARN("Allocate PORT MAJOR failure! \n"); + goto err_register_swp_module_3; + } + port_major = MAJOR(port_devt); + + /* Create class object */ + swp_class_p = class_create(THIS_MODULE, SWP_CLS_NAME); + if (IS_ERR(swp_class_p)) { + SWPS_ERR("Create class failure! \n"); + goto err_register_swp_module_3; + } + return 0; + +err_register_swp_module_3: + unregister_chrdev_region(MKDEV(port_major, 0), port_total); + return -1; +} + + +/* ========== Module initial relate ========== + */ +static int +create_ioexp_objs(void) { + + int i, run_mod; + + /* Clean IOEXP object */ + clean_ioexp_objs(); + /* Get running mode */ + run_mod = IOEXP_MODE_DIRECT; + /* Create IOEXP object */ + for(i=0; i devlen_max) { + snprintf(err_msg, sizeof(err_msg), + "SWP_DEV_PORT too long!"); + goto err_initport_create_tranobj; + } + memset(dev_name, 0, sizeof(dev_name)); + snprintf(dev_name, devlen_max, "%s%d", SWP_DEV_PORT, port_id); + /* Create transceiver object */ + ioexp_obj_p = get_ioexp_obj(ioexp_id); + if (!ioexp_obj_p){ + snprintf(err_msg, sizeof(err_msg), + "IOEXP object:%d not exist", ioexp_id); + goto err_initport_create_tranobj; + } + transvr_obj_p = create_transvr_obj(dev_name, chan_id, ioexp_obj_p, + ioexp_virt_offset, transvr_type, + chipset_type, run_mod); + if (!transvr_obj_p){ + snprintf(err_msg, sizeof(err_msg), + "Create transceiver object fail :%s", dev_name); + goto err_initport_create_tranobj; + } + /* Setup Lane_ID mapping */ + i = ARRAY_SIZE(port_layout[minor_curr].lane_id); + j = ARRAY_SIZE(transvr_obj_p->lane_id); + if (i != j) { + snprintf(err_msg, sizeof(err_msg), + "Lane_id size inconsistent %d/%d", i, j); + goto err_initport_reg_device; + } + memcpy(transvr_obj_p->lane_id, port_layout[minor_curr].lane_id, i*sizeof(int)); + /* Create and register device object */ + if (register_port_device(dev_name, MKDEV(port_major, minor_curr), transvr_obj_p) < 0){ + snprintf(err_msg, sizeof(err_msg), + "register_port_device fail"); + goto err_initport_reg_device; + } + /* Setup device_ptr of transvr_obj */ + dev_p = get_swpdev_by_name(dev_name); + if (!dev_p){ + snprintf(err_msg, sizeof(err_msg), + "get_swpdev_by_name fail"); + goto err_initport_reg_device; + } + transvr_obj_p->transvr_dev_p = dev_p; + /* Success */ + ok_count++; + } + SWPS_INFO("%s: initialed %d port-dev",__func__, ok_count); + return 0; + +err_initport_reg_device: + kfree(transvr_obj_p); +err_initport_create_tranobj: + clean_port_obj(); + SWPS_ERR("%s: %s", __func__, err_msg); + SWPS_ERR("Dump: :%d :%d :%d :%d :%d :%d\n", + port_id, chan_id, ioexp_id, ioexp_virt_offset, transvr_type, run_mod); + return -1; +} + +static int __init +swp_module_init(void){ + + if (get_platform_type() < 0){ + goto err_init_out; + } + if (get_layout_info() < 0){ + goto err_init_out; + } + if (register_swp_module() < 0){ + goto err_init_out; + } + if (create_ioexp_objs() < 0){ + goto err_init_ioexp; + } + if (create_port_objs() < 0){ + goto err_init_portobj; + } + if (init_ioexp_objs() < 0){ + goto err_init_portobj; + } + SWPS_INFO("Inventec switch-port module V.%s initial success.\n", SWP_VERSION); + return 0; + + +err_init_portobj: + clean_ioexp_objs(); +err_init_ioexp: + class_unregister(swp_class_p); + class_destroy(swp_class_p); + unregister_chrdev_region(MKDEV(port_major, 0), port_total); +err_init_out: + SWPS_ERR("Inventec switch-port module V.%s initial failure.\n", SWP_VERSION); + return -1; +} + + +static void __exit +swp_module_exit(void){ + clean_port_obj(); + clean_ioexp_objs(); + class_unregister(swp_class_p); + class_destroy(swp_class_p); + unregister_chrdev_region(MKDEV(port_major, 0), port_total); + SWPS_INFO("Remove Inventec switch-port module success.\n"); +} + + +/* Module information */ +MODULE_AUTHOR(SWP_AUTHOR); +MODULE_DESCRIPTION(SWP_DESC); +MODULE_VERSION(SWP_VERSION); +MODULE_LICENSE(SWP_LICENSE); + +module_init(swp_module_init); +module_exit(swp_module_exit); + + + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_swps.h b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_swps.h new file mode 100644 index 000000000000..b186c2202381 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/inv_swps.h @@ -0,0 +1,131 @@ +#ifndef INV_SWPS_H +#define INV_SWPS_H + +#include "transceiver.h" +#include "io_expander.h" + +/* Module settings */ +#define SWP_CLS_NAME "swps" +#define SWP_DEV_PORT "port" +#define SWP_AUTOCONFIG_ENABLE (1) + +/* Module information */ +#define SWP_AUTHOR "Neil " +#define SWP_DESC "Inventec port and transceiver driver" +#define SWP_VERSION "4.2.3" +#define SWP_LICENSE "GPL" + +/* Module status define */ +#define SWP_STATE_NORMAL (0) +#define SWP_STATE_I2C_DIE (-91) + +/* [Note]: + * Functions and mechanism for auto-detect platform type is ready, + * But HW and BIOS not ready! We need to wait them. + * So, please do not use PLATFORM_TYPE_AUTO until they are ready. + * (2016.06.13) + */ +#define PLATFORM_TYPE_REDWOOD (121) +/* Current running platfrom */ +#define PLATFORM_SETTINGS PLATFORM_TYPE_REDWOOD + +/* Define platform flag and kernel version */ +#if (PLATFORM_SETTINGS == PLATFORM_TYPE_REDWOOD) + #define SWPS_KERN_VER_BF_3_8 (1) +#endif + +struct inv_platform_s { + int id; + char name[64]; +}; + +struct inv_ioexp_layout_s { + int ioexp_id; + int ioexp_type; + struct ioexp_addr_s addr[4]; +}; + +struct inv_port_layout_s { + int port_id; + int chan_id; + int ioexp_id; + int ioexp_offset; + int transvr_type; + int chipset_type; + int lane_id[8]; +}; + +/* ========================================== + * Inventec Platform Settings + * ========================================== + */ +struct inv_platform_s platform_map = {PLATFORM_TYPE_REDWOOD, "D7032Q28B" }; + +/* ========================================== + * Redwood Layout configuration + * ========================================== + */ +struct inv_ioexp_layout_s redwood_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_REDWOOD_P01P08, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x25, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, + {1, IOEXP_TYPE_REDWOOD_P09P16, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x25, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, + {2, IOEXP_TYPE_REDWOOD_P01P08, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x24, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, + {3, IOEXP_TYPE_REDWOOD_P09P16, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x24, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, +}; + +struct inv_port_layout_s redwood_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 22, 0, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 1, 2, 3, 4} }, + { 1, 23, 0, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 5, 6, 7, 8} }, + { 2, 24, 0, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 9, 10, 11, 12} }, + { 3, 25, 0, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 13, 14, 15, 16} }, + { 4, 26, 0, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 17, 18, 19, 20} }, + { 5, 27, 0, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 21, 22, 23, 24} }, + { 6, 28, 0, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 25, 26, 27, 28} }, + { 7, 29, 0, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 29, 30, 31, 32} }, + { 8, 30, 1, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 33, 34, 35, 36} }, + { 9, 31, 1, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 37, 38, 39, 40} }, + {10, 32, 1, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 41, 42, 43, 44} }, + {11, 33, 1, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 45, 46, 47, 48} }, + {12, 34, 1, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 49, 50, 51, 52} }, + {13, 35, 1, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 53, 54, 55, 56} }, + {14, 36, 1, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 57, 58, 59, 60} }, + {15, 37, 1, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 61, 62, 63, 64} }, + {16, 6, 2, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 65, 66, 67, 68} }, + {17, 7, 2, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 69, 70, 71, 72} }, + {18, 8, 2, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 73, 74, 75, 76} }, + {19, 9, 2, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 77, 78, 79, 80} }, + {20, 10, 2, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 81, 82, 83, 84} }, + {21, 11, 2, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 85, 86, 87, 88} }, + {22, 12, 2, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 89, 90, 91, 92} }, + {23, 13, 2, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 93, 94, 95, 96} }, + {24, 14, 3, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 97, 98, 99,100} }, + {25, 15, 3, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {101,102,103,104} }, + {26, 16, 3, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {105,106,107,108} }, + {27, 17, 3, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {109,110,111,112} }, + {28, 18, 3, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {113,114,115,116} }, + {29, 19, 3, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {117,118,119,120} }, + {30, 20, 3, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {121,122,123,124} }, + {31, 21, 3, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {125,126,127,128} }, +}; + +#endif /* INV_SWPS_H */ + + + + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/io_expander.c b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/io_expander.c new file mode 100644 index 000000000000..7c9f8a66aec7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/io_expander.c @@ -0,0 +1,887 @@ +#include +#include +#include +#include "io_expander.h" + +static struct ioexp_obj_s *ioexp_head_p = NULL; +static struct ioexp_obj_s *ioexp_tail_p = NULL; + +struct ioexp_map_s ioexp_map_redwood_p01p08_p17p24 = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {2, 0, 0}, /* map_present[0] = MOD_ABS_PORT(X) */ + {2, 0, 1}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {2, 0, 2}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {2, 0, 3}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {2, 0, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {2, 0, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {2, 0, 6}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {2, 0, 7}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_reset = { {0, 0, 0}, /* map_reset[0] = QRESET_QSFP28_N_P(X) */ + {0, 0, 1}, /* map_reset[1] = QRESET_QSFP28_N_P(X+1) */ + {0, 0, 2}, /* map_reset[2] = QRESET_QSFP28_N_P(X+2) */ + {0, 0, 3}, /* map_reset[3] = QRESET_QSFP28_N_P(X+3) */ + {1, 0, 0}, /* map_reset[4] = QRESET_QSFP28_N_P(X+4) */ + {1, 0, 1}, /* map_reset[5] = QRESET_QSFP28_N_P(X+5) */ + {1, 0, 2}, /* map_reset[6] = QRESET_QSFP28_N_P(X+6) */ + {1, 0, 3}, /* map_reset[7] = QRESET_QSFP28_N_P(X+7) */ + }, + .map_lpmod = { {0, 0, 4}, /* map_lpmod[0] = LPMODE_QSFP28_P(X) */ + {0, 0, 5}, /* map_lpmod[1] = LPMODE_QSFP28_P(X+1) */ + {0, 0, 6}, /* map_lpmod[2] = LPMODE_QSFP28_P(X+2) */ + {0, 0, 7}, /* map_lpmod[3] = LPMODE_QSFP28_P(X+3) */ + {1, 0, 4}, /* map_lpmod[4] = LPMODE_QSFP28_P(X+4) */ + {1, 0, 5}, /* map_lpmod[5] = LPMODE_QSFP28_P(X+5) */ + {1, 0, 6}, /* map_lpmod[6] = LPMODE_QSFP28_P(X+6) */ + {1, 0, 7}, /* map_lpmod[7] = LPMODE_QSFP28_P(X+7) */ + }, + .map_modsel = { {0, 1, 4}, /* map_modsel[0] = MODSEL_QSFP28_N_P(X) */ + {0, 1, 5}, /* map_modsel[1] = MODSEL_QSFP28_N_P(X+1) */ + {0, 1, 6}, /* map_modsel[2] = MODSEL_QSFP28_N_P(X+2) */ + {0, 1, 7}, /* map_modsel[3] = MODSEL_QSFP28_N_P(X+3) */ + {1, 1, 4}, /* map_modsel[4] = MODSEL_QSFP28_N_P(X+4) */ + {1, 1, 5}, /* map_modsel[5] = MODSEL_QSFP28_N_P(X+5) */ + {1, 1, 6}, /* map_modsel[6] = MODSEL_QSFP28_N_P(X+6) */ + {1, 1, 7}, /* map_modsel[7] = MODSEL_QSFP28_N_P(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_redwood_p09p16_p25p32 = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {2, 1, 0}, /* map_present[0] = MOD_ABS_PORT(X) */ + {2, 1, 1}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {2, 1, 2}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {2, 1, 3}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {2, 1, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {2, 1, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {2, 1, 6}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {2, 1, 7}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_reset = { {0, 0, 0}, /* map_reset[0] = QRESET_QSFP28_N_P(X) */ + {0, 0, 1}, /* map_reset[1] = QRESET_QSFP28_N_P(X+1) */ + {0, 0, 2}, /* map_reset[2] = QRESET_QSFP28_N_P(X+2) */ + {0, 0, 3}, /* map_reset[3] = QRESET_QSFP28_N_P(X+3) */ + {1, 0, 0}, /* map_reset[4] = QRESET_QSFP28_N_P(X+4) */ + {1, 0, 1}, /* map_reset[5] = QRESET_QSFP28_N_P(X+5) */ + {1, 0, 2}, /* map_reset[6] = QRESET_QSFP28_N_P(X+6) */ + {1, 0, 3}, /* map_reset[7] = QRESET_QSFP28_N_P(X+7) */ + }, + .map_lpmod = { {0, 0, 4}, /* map_lpmod[0] = LPMODE_QSFP28_P(X) */ + {0, 0, 5}, /* map_lpmod[1] = LPMODE_QSFP28_P(X+1) */ + {0, 0, 6}, /* map_lpmod[2] = LPMODE_QSFP28_P(X+2) */ + {0, 0, 7}, /* map_lpmod[3] = LPMODE_QSFP28_P(X+3) */ + {1, 0, 4}, /* map_lpmod[4] = LPMODE_QSFP28_P(X+4) */ + {1, 0, 5}, /* map_lpmod[5] = LPMODE_QSFP28_P(X+5) */ + {1, 0, 6}, /* map_lpmod[6] = LPMODE_QSFP28_P(X+6) */ + {1, 0, 7}, /* map_lpmod[7] = LPMODE_QSFP28_P(X+7) */ + }, + .map_modsel = { {0, 1, 4}, /* map_modsel[0] = MODSEL_QSFP28_N_P(X) */ + {0, 1, 5}, /* map_modsel[1] = MODSEL_QSFP28_N_P(X+1) */ + {0, 1, 6}, /* map_modsel[2] = MODSEL_QSFP28_N_P(X+2) */ + {0, 1, 7}, /* map_modsel[3] = MODSEL_QSFP28_N_P(X+3) */ + {1, 1, 4}, /* map_modsel[4] = MODSEL_QSFP28_N_P(X+4) */ + {1, 1, 5}, /* map_modsel[5] = MODSEL_QSFP28_N_P(X+5) */ + {1, 1, 6}, /* map_modsel[6] = MODSEL_QSFP28_N_P(X+6) */ + {1, 1, 7}, /* map_modsel[7] = MODSEL_QSFP28_N_P(X+7) */ + }, +}; + +/* ========== Private functions ========== + */ +int check_channel_tier_1(void); + +struct i2c_client * +_get_i2c_client(struct ioexp_obj_s *self, + int chip_id){ + + struct ioexp_i2c_s *i2c_curr_p = self->i2c_head_p; + + if (!(i2c_curr_p)){ + SWPS_ERR("%s: i2c_curr_p is NULL\n", __func__); + return NULL; + } + while (i2c_curr_p){ + if ((i2c_curr_p->chip_id) == chip_id){ + return i2c_curr_p->i2c_client_p; + } + i2c_curr_p = i2c_curr_p->next; + } + SWPS_ERR("%s: not exist! :%d\n", __func__, chip_id); + return NULL; +} + + +static int +_common_ioexp_update_one(struct ioexp_obj_s *self, + struct ioexp_addr_s *ioexp_addr, + int chip_id, + int data_width, + int show_err, + char *caller_name) { + int buf = 0; + int err = 0; + int data_id = 0; + int r_offset = 0; + + for(data_id=0; data_idread_offset[data_id]; + buf = i2c_smbus_read_byte_data(_get_i2c_client(self, chip_id), r_offset); + /* Check error */ + if (buf < 0) { + err = 1; + if (show_err) { + SWPS_INFO("IOEXP-%d read fail! :%d \n", self->ioexp_id, buf); + SWPS_INFO("Dump: :%d :0x%02x :%d, :%s\n", + ioexp_addr->chan_id, ioexp_addr->chip_addr, + ioexp_addr->read_offset[data_id], caller_name); + } + continue; + } + /* Update IOEXP object */ + self->chip_data[chip_id].data[data_id] = (uint8_t)buf; + } + if (err) { + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + + +static int +common_ioexp_update_all(struct ioexp_obj_s *self, + int show_err, + char *caller_name){ + + int err = 0; + int chip_id = 0; + int chip_amount = self->ioexp_map_p->chip_amount; + + for (chip_id=0; chip_idioexp_map_p->map_addr[chip_id]), + chip_id, + self->ioexp_map_p->data_width, + show_err, + caller_name) < 0) { + err = 1; + } + } + if (err) { + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + +static int +_common_get_bit(struct ioexp_obj_s *self, + struct ioexp_bitmap_s *bitmap_obj_p, + char *func_mane){ + uint8_t buf; + int err_code; + + /* Get address */ + err_code = self->fsm_4_direct(self); + if (err_code < 0){ + return err_code; + } + + if (!bitmap_obj_p){ + SWPS_ERR("Layout config incorrect! :%d :%s\n", + self->ioexp_id, func_mane); + return ERR_IOEXP_BADCONF; + } + /* Get data form cache */ + buf = self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset]; + return (int)(buf >> bitmap_obj_p->bit_shift & 0x01); +} + + +static int +_common_set_bit(struct ioexp_obj_s *self, + struct ioexp_bitmap_s *bitmap_obj_p, + int input_val, + char *func_mane){ + int err_code, target_offset; + uint8_t origin_byte; + uint8_t modify_byte; + + /* Get address */ + err_code = self->fsm_4_direct(self); + if (err_code < 0){ + return err_code; + } + if (!bitmap_obj_p){ + SWPS_ERR("Layout config incorrect! :%d :%s\n", + self->ioexp_id, func_mane); + return ERR_IOEXP_BADCONF; + } + /* Prepare write date */ + origin_byte = self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset]; + switch (input_val) { + case 0: + modify_byte = origin_byte; + SWP_BIT_CLEAR(modify_byte, bitmap_obj_p->bit_shift); + break; + case 1: + modify_byte = origin_byte; + SWP_BIT_SET(modify_byte, bitmap_obj_p->bit_shift); + break; + default: + SWPS_ERR("Input value incorrect! :%d :%d :%s\n", + input_val, self->ioexp_id, func_mane); + return ERR_IOEXP_BADINPUT; + } + /* Setup i2c client */ + target_offset = self->ioexp_map_p->map_addr[bitmap_obj_p->chip_id].write_offset[bitmap_obj_p->ioexp_voffset]; + /* Write byte to chip via I2C */ + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, bitmap_obj_p->chip_id), + target_offset, + modify_byte); + /* Update or bollback object */ + if (err_code < 0){ + self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset] = origin_byte; + SWPS_ERR("I2C write fail! :%d :%d :%s :%d\n", + input_val, self->ioexp_id, func_mane, err_code); + return err_code; + } + self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset] = modify_byte; + return 0; +} + + +/* ========== Object public functions ========== + */ +int +common_get_present(struct ioexp_obj_s *self, + int virt_offset){ + + int UNPLUG = 1; + int retval = ERR_IOEXP_UNEXCPT; + + retval = _common_get_bit(self, + &(self->ioexp_map_p->map_present[virt_offset]), + "common_get_present"); + if (retval < 0) { + /* [Note] + * => Transceiver object does not need to handle IOEXP layer issues. + */ + return UNPLUG; + } + return retval; +} + + +int +common_get_reset(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_reset[virt_offset]), + "common_get_reset"); +} + + +int +common_get_lpmod(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_lpmod[virt_offset]), + "common_get_lpmod"); +} + + +int +common_get_modsel(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_modsel[virt_offset]), + "common_get_modsel"); +} + +int +common_set_reset(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_reset[virt_offset]), + input_val, + "common_set_reset"); +} + + +int +common_set_lpmod(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_lpmod[virt_offset]), + input_val, + "common_set_lpmod"); +} + + +int +common_set_modsel(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_modsel[virt_offset]), + input_val, + "common_set_modsel"); +} + +int +ioexp_get_not_support(struct ioexp_obj_s *self, + int virt_offset){ + return ERR_IOEXP_NOTSUPPORT; +} + + +int +ioexp_set_not_support(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + return ERR_IOEXP_NOTSUPPORT; +} + +/* ========== Initial functions for IO Expander ========== + */ +int +common_ioexp_init(struct ioexp_obj_s *self) { + + int chip_id, offset, err_code; + struct ioexp_addr_s *addr_p; + + if (self->mode == IOEXP_MODE_DIRECT) { ///important + goto update_common_ioexp_init; + } + /* Setup default value to each physical IO Expander */ + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + /* Get address mapping */ + addr_p = &(self->ioexp_map_p->map_addr[chip_id]); + if (!addr_p){ + SWPS_ERR("%s: IOEXP config incorrect! :%d \n", + __func__, chip_id); + return -1; + } + /* Setup default value */ + for (offset=0; offset<(self->ioexp_map_p->data_width); offset++){ + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, chip_id), + addr_p->write_offset[offset], + addr_p->data_default[offset]); + if (err_code < 0){ + SWPS_ERR("%s: set default fail! :%d \n", + __func__, err_code); + return ERR_IOEXP_UNEXCPT; + } + } + } + +update_common_ioexp_init: + /* Check and update info to object */ + err_code = self->update_all(self, 1, "common_ioexp_init"); + if (err_code < 0) { + SWPS_ERR("%s: update_all() fail! :%d \n", + __func__, err_code); + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + + +/* ========== Object functions for Final State Machine ========== + */ +int +_is_channel_ready(struct ioexp_obj_s *self){ + + int buf = 0; + int chip_id = 0; /* Use first chip which be registered */ + int data_id = 0; /* Use first byte which be registered */ + struct ioexp_addr_s *ioexp_addr = NULL; + + ioexp_addr = &(self->ioexp_map_p->map_addr[chip_id]); + if (!ioexp_addr){ + SWPS_ERR("%s: config incorrect!\n", __func__); + return ERR_IOEXP_UNEXCPT; + } + buf = i2c_smbus_read_byte_data(_get_i2c_client(self, chip_id), + ioexp_addr->read_offset[data_id]); + if (buf >= 0){ + return 1; + } + return 0; +} + +int +_ioexp_init_handler(struct ioexp_obj_s *self){ + + int return_val; + + switch (self->mode) { + case IOEXP_MODE_DIRECT: + return_val = self->init(self); + if (return_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + } else { + self->state = STATE_IOEXP_NORMAL; + } + return return_val; + default: + break; + } + SWPS_ERR("%s: exception occur :%d\n", __func__, self->mode); + return ERR_IOEXP_UNEXCPT; +} + + +int +common_ioexp_fsm_4_direct(struct ioexp_obj_s *self){ + + int result_val; + int show_err = 1; + char *func_mane = "common_ioexp_fsm_4_direct"; + + switch (self->state){ + case STATE_IOEXP_INIT: + result_val = _ioexp_init_handler(self); + /* Exception case: terminate initial procedure */ + if(result_val < 0){ + /* Initial fail */ + return result_val; + } + if(self->state == STATE_IOEXP_INIT){ + /* Keep in INIT state, and return error */ + return ERR_IOEXP_UNINIT; + } + /* Case: Initial done */ + return 0; + + case STATE_IOEXP_NORMAL: + result_val = self->update_all(self, show_err, func_mane); + if (result_val < 0){ + SWPS_INFO("%s: NORMAL -> ABNORMAL :%d\n", + __func__, result_val); + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + } + self->state = STATE_IOEXP_NORMAL; + return 0; + + case STATE_IOEXP_ABNORMAL: + result_val = self->update_all(self, show_err, func_mane); + if (result_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + } + SWPS_DEBUG("%s: ABNORMAL -> NORMAL :%d\n", + __func__, result_val); + self->state = STATE_IOEXP_NORMAL; + return 0; + + default: + break; + } + SWPS_ERR("%s: Exception occurs :%d\n", + __func__, self->state); + return ERR_IOEXP_UNEXCPT; +} + +/* ========== Functions for Factory pattern ========== + */ +static struct ioexp_map_s * +get_ioexp_map(int ioexp_type){ + switch (ioexp_type){ + case IOEXP_TYPE_REDWOOD_P01P08: + return &ioexp_map_redwood_p01p08_p17p24; + case IOEXP_TYPE_REDWOOD_P09P16: + return &ioexp_map_redwood_p09p16_p25p32; + default: + return NULL; + } +} + + +int +setup_ioexp_ssize_attr(struct ioexp_obj_s *self, + struct ioexp_map_s *ioexp_map_p, + int ioexp_id, + int ioexp_type, + int run_mode){ + switch (run_mode){ + case IOEXP_MODE_DIRECT: /* Direct access device mode */ + self->mode = run_mode; + break; + default: + SWPS_ERR("%s: non-defined run_mode:%d\n", + __func__, run_mode); + self->mode = ERR_IOEXP_UNEXCPT; + return ERR_IOEXP_UNEXCPT; + } + self->ioexp_id = ioexp_id; + self->ioexp_type = ioexp_type; + self->ioexp_map_p = ioexp_map_p; + self->state = STATE_IOEXP_INIT; + mutex_init(&self->lock); + return 0; +} + + +static int +setup_addr_mapping(struct ioexp_obj_s *self, + struct ioexp_addr_s *addr_map_p){ + if (!addr_map_p){ + SWPS_ERR("%s: map is null\n", __func__); + return -1; + } + self->ioexp_map_p->map_addr = addr_map_p; + return 0; +} + + +static int +setup_ioexp_public_cb(struct ioexp_obj_s *self, + int ioexp_type){ + switch (ioexp_type){ + case IOEXP_TYPE_REDWOOD_P01P08: + case IOEXP_TYPE_REDWOOD_P09P16: + self->get_present = common_get_present; + self->get_reset = common_get_reset; + self->get_lpmod = common_get_lpmod; + self->get_modsel = common_get_modsel; + self->set_reset = common_set_reset; + self->set_lpmod = common_set_lpmod; + self->set_modsel = common_set_modsel; + return 0; + default: + SWPS_ERR("%s: type:%d incorrect!\n", __func__, ioexp_type); + break; + } + return ERR_IOEXP_UNEXCPT; +} + + +static int +setup_ioexp_private_cb(struct ioexp_obj_s *self, + int ioexp_type){ + + switch (ioexp_type){ + case IOEXP_TYPE_REDWOOD_P01P08: + case IOEXP_TYPE_REDWOOD_P09P16: + + self->init = common_ioexp_init; + self->update_all = common_ioexp_update_all; + self->fsm_4_direct = common_ioexp_fsm_4_direct; + return 0; + + default: + SWPS_ERR("%s: type:%d incorrect!\n", __func__, ioexp_type); + break; + } + return ERR_IOEXP_UNEXCPT; +} + + +static int +setup_i2c_client_one(struct ioexp_obj_s *self, + int chip_id){ + + char *err_msg = "ERROR"; + struct i2c_adapter *adap = NULL; + struct i2c_client *client = NULL; + struct ioexp_i2c_s *i2c_obj_p = NULL; + struct ioexp_i2c_s *i2c_curr_p = NULL; + + int chan_id = self->ioexp_map_p->map_addr[chip_id].chan_id; + adap = i2c_get_adapter(chan_id); + if(!adap){ + err_msg = "Can not get adap!"; + goto err_ioexp_setup_i2c_1; + } + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client){ + err_msg = "Can not kzalloc client!"; + goto err_ioexp_setup_i2c_1; + } + i2c_obj_p = kzalloc(sizeof(*i2c_obj_p), GFP_KERNEL); + if (!i2c_obj_p){ + err_msg = "Can not kzalloc i2c_obj_p!"; + goto err_ioexp_setup_i2c_2; + } + client->adapter = adap; + client->addr = self->ioexp_map_p->map_addr[chip_id].chip_addr; + i2c_obj_p->i2c_client_p = client; + i2c_obj_p->chip_id = chip_id; + i2c_obj_p->next = NULL; + if (!self->i2c_head_p){ + self->i2c_head_p = i2c_obj_p; + } else { + i2c_curr_p = self->i2c_head_p; + while (i2c_curr_p->next){ + i2c_curr_p = i2c_curr_p->next; + } + i2c_curr_p->next = i2c_obj_p; + } + return 0; + +err_ioexp_setup_i2c_2: + kfree(client); +err_ioexp_setup_i2c_1: + SWPS_ERR("%s: %s :%d\n", __func__, err_msg, chan_id); + return -1; +} + + +static int +setup_i2c_client(struct ioexp_obj_s* self){ + + int result; + int chip_id = 0; + + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + result = setup_i2c_client_one(self, chip_id); + if (result < 0){ + SWPS_ERR("%s fail! :%d\n", __func__, chip_id); + return -1; + } + } + return 0; +} + +static int +setup_ioexp_config(struct ioexp_obj_s *self) { + + int chip_id, offset, err_code; + struct ioexp_addr_s *addr_p; + + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + addr_p = &(self->ioexp_map_p->map_addr[chip_id]); + if (!addr_p){ + SWPS_ERR("IOEXP config incorrect! :%d \n",chip_id); + return -1; + } + for (offset=0; offset<(self->ioexp_map_p->data_width); offset++){ + + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, chip_id), + addr_p->conf_offset[offset], + addr_p->conf_default[offset]); + + if (err_code < 0){ + SWPS_INFO("%s: set conf fail! :%d \n", __func__, err_code); + return -2; + } + } + } + return 0; +} + +struct ioexp_obj_s * +_create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode){ + + struct ioexp_map_s* ioexp_map_p; + struct ioexp_obj_s* result_p; + struct ioexp_i2c_s *i2c_curr_p; + struct ioexp_i2c_s *i2c_next_p; + + /* Get layout */ + ioexp_map_p = get_ioexp_map(ioexp_type); + if (!ioexp_map_p){ + SWPS_ERR("%s: Invalid ioexp_type\n", __func__); + goto err_create_ioexp_fail; + } + /* Prepare IOEXP object */ + result_p = kzalloc(sizeof(*result_p), GFP_KERNEL); + if (!result_p){ + SWPS_ERR("%s: kzalloc failure!\n", __func__); + goto err_create_ioexp_fail; + } + /* Prepare static size attributes */ + if (setup_ioexp_ssize_attr(result_p, + ioexp_map_p, + ioexp_id, + ioexp_type, + run_mode) < 0){ + goto err_create_ioexp_setup_attr_fail; + } + /* Prepare address mapping */ + if (setup_addr_mapping(result_p, addr_map_p) < 0){ + goto err_create_ioexp_setup_attr_fail; + } + if (setup_i2c_client(result_p) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + /* Prepare call back functions of object */ + if (setup_ioexp_public_cb(result_p, ioexp_type) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + if (setup_ioexp_private_cb(result_p, ioexp_type) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + return result_p; + +err_create_ioexp_setup_i2c_fail: + i2c_curr_p = result_p->i2c_head_p; + i2c_next_p = result_p->i2c_head_p; + while (i2c_curr_p){ + i2c_next_p = i2c_curr_p->next; + kfree(i2c_curr_p->i2c_client_p); + kfree(i2c_curr_p); + i2c_curr_p = i2c_next_p; + } +err_create_ioexp_setup_attr_fail: + kfree(result_p); +err_create_ioexp_fail: + SWPS_ERR("%s: fail! :%d :%d \n", + __func__, ioexp_id, ioexp_type); + return NULL; +} + + +int +create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode){ + + struct ioexp_obj_s *ioexp_p = NULL; + + ioexp_p = _create_ioexp_obj(ioexp_id, ioexp_type, + addr_map_p, run_mode); + if (!ioexp_p){ + return -1; + } + if (ioexp_head_p == NULL){ + ioexp_head_p = ioexp_p; + ioexp_tail_p = ioexp_p; + return 0; + } + ioexp_tail_p->next = ioexp_p; + ioexp_tail_p = ioexp_p; + return 0; +} + +static int +_init_ioexp_obj(struct ioexp_obj_s* self) { + + char *err_msg = "ERR"; + char *func_name = "_init_ioexp_obj"; + + /* Setup IOEXP configure byte */ + if (setup_ioexp_config(self) < 0){ + err_msg = "setup_ioexp_config fail"; + goto err_init_ioexp_obj; + } + /* Setup default data */ + if (_ioexp_init_handler(self) < 0){ + err_msg = "_ioexp_init_handler fail"; + goto err_init_ioexp_obj; + } + /* Update all */ + if (self->state == STATE_IOEXP_NORMAL){ + if (self->update_all(self, 1, func_name) < 0){ + err_msg = "update_all() fail"; + goto err_init_ioexp_obj; + } + } + return 0; + +err_init_ioexp_obj: + SWPS_DEBUG("%s: %s\n", __func__, err_msg); + return -1; +} + +int +init_ioexp_objs(void){ + /* Return value: + * 0: Success + * -1: Detect topology error + * -2: SWPS internal error + */ + + struct ioexp_obj_s *curr_p = ioexp_head_p; + + if (!curr_p) { + SWPS_ERR("%s: ioexp_head_p is NULL\n", __func__); + return -2; + } + while (curr_p) { + if (_init_ioexp_obj(curr_p) < 0) { + SWPS_DEBUG("%s: _init_ioexp_obj() fail\n", __func__); + return -1; + } + curr_p = curr_p->next; + } + SWPS_DEBUG("%s: done.\n", __func__); + return 0; +} + +void +clean_ioexp_objs(void){ + + struct ioexp_i2c_s *i2c_curr_p = NULL; + struct ioexp_i2c_s *i2c_next_p = NULL; + struct ioexp_obj_s *ioexp_next_p = NULL; + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + if (ioexp_head_p == NULL){ + ioexp_tail_p = NULL; + return; + } + while(ioexp_curr_p){ + ioexp_next_p = ioexp_curr_p->next; + i2c_curr_p = ioexp_curr_p->i2c_head_p; + while (i2c_curr_p) { + i2c_next_p = i2c_curr_p->next; + kfree(i2c_curr_p->i2c_client_p); + kfree(i2c_curr_p); + i2c_curr_p = i2c_next_p; + } + kfree(ioexp_curr_p); + ioexp_curr_p = ioexp_next_p; + } + ioexp_tail_p = NULL; + SWPS_DEBUG("%s: done.\n", __func__); +} + +struct ioexp_obj_s * +get_ioexp_obj(int ioexp_id){ + + struct ioexp_obj_s *result_p = NULL; + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + while(ioexp_curr_p){ + if (ioexp_curr_p->ioexp_id == ioexp_id){ + result_p = ioexp_curr_p; + break; + } + ioexp_curr_p = ioexp_curr_p->next; + } + return result_p; +} +int +check_channel_tier_1(void) { + + if ( (!_is_channel_ready(ioexp_head_p)) && + (!_is_channel_ready(ioexp_tail_p)) ){ + return -1; + } + return 0; +} + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/io_expander.h b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/io_expander.h new file mode 100644 index 000000000000..8c51b4f6d94f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/io_expander.h @@ -0,0 +1,136 @@ +#ifndef IO_EXPANDER_H +#define IO_EXPANDER_H + +#include + +/* IOEXP type define (QSFP series) */ +#define IOEXP_TYPE_REDWOOD_P01P08 (10202) +#define IOEXP_TYPE_REDWOOD_P09P16 (10203) + +/* IOEXP mode define */ +#define IOEXP_MODE_DIRECT (19001) + +/* IOEXP state define */ +#define STATE_IOEXP_NORMAL (0) +#define STATE_IOEXP_INIT (-1) +#define STATE_IOEXP_ABNORMAL (-2) + +/* IOEXP error code define */ +#define ERR_IOEXP_NOTSUPPORT (-100) +#define ERR_IOEXP_UNINIT (-101) +#define ERR_IOEXP_BADCONF (-102) +#define ERR_IOEXP_BADINPUT (-105) +#define ERR_IOEXP_UNEXCPT (-199) + + +#define SWPS_INFO(fmt, args...) printk( KERN_INFO "[SWPS] " fmt, ##args) +#define SWPS_WARN(fmt, args...) printk( KERN_WARNING "[SWPS] " fmt, ##args) +#define SWPS_ERR(fmt, args...) printk( KERN_ERR "[SWPS] " fmt, ##args) + +#ifdef DEBUG_SWPS +# define SWPS_DEBUG(fmt, args...) printk( KERN_DEBUG "[SWPS] " fmt, ##args) +#else +# define SWPS_DEBUG(fmt, args...) +#endif + + +struct ioexp_addr_s { + int chan_id; + int chip_addr; + int read_offset[8]; + int write_offset[8]; + int conf_offset[8]; + uint8_t data_default[8]; + uint8_t conf_default[8]; +}; + +struct ioexp_i2c_s { + int chip_id; + struct i2c_client *i2c_client_p; + struct ioexp_i2c_s *next; +}; + + +struct ioexp_bitmap_s { + int chip_id; /* IOEXP chip id */ + int ioexp_voffset; /* IOEXP virtual offset */ + int bit_shift; +}; + +struct ioexp_map_s { + int chip_amount; /* Number of chips that IOEXP object content */ + int data_width; /* Number of (Read/Write/Config) bytes */ + struct ioexp_addr_s *map_addr; /* Chip address info */ + struct ioexp_bitmap_s map_present[8]; /* IOEXP for SFP / QSFP */ + struct ioexp_bitmap_s map_reset[8]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_lpmod[8]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_modsel[8]; /* IOEXP for QSFP */ +}; + +struct ioexp_data_s { + uint8_t data[8]; +}; + +struct ioexp_obj_s { + + /* ============================ + * Object public property + * ============================ + */ + int ioexp_id; + int ioexp_type; + + /* ============================ + * Object private property + * ============================ + */ + struct ioexp_data_s chip_data[16]; /* Max: 8-ioexp in one virt-ioexp(ioexp_obj) */ + struct ioexp_map_s *ioexp_map_p; + struct ioexp_obj_s *next; + struct ioexp_i2c_s *i2c_head_p; + struct mutex lock; + int mode; + int state; + + /* =========================================== + * Object public functions + * =========================================== + */ + int (*get_present)(struct ioexp_obj_s *self, int virt_offset); + int (*get_reset)(struct ioexp_obj_s *self, int virt_offset); + int (*get_lpmod)(struct ioexp_obj_s *self, int virt_offset); + int (*get_modsel)(struct ioexp_obj_s *self, int virt_offset); + int (*set_reset)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_lpmod)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_modsel)(struct ioexp_obj_s *self, int virt_offset, int input_val); + + /* =========================================== + * Object private functions + * =========================================== + */ + int (*init)(struct ioexp_obj_s *self); + int (*update_all)(struct ioexp_obj_s *self, int show_err, char *caller_name); + int (*fsm_4_direct)(struct ioexp_obj_s* self); +}; + + +struct ioexp_obj_s* get_ioexp_obj(int ioexp_id); +int create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode); +int init_ioexp_objs(void); +void clean_ioexp_objs(void); + +int check_channel_tier_1(void); + +/* Macro for bit control */ +#define SWP_BIT_SET(byte_val,bit_shift) ((byte_val) |= (1<<(bit_shift))) +#define SWP_BIT_CLEAR(byte_val,bit_shift) ((byte_val) &= ~(1<<(bit_shift))) + + +#endif /* IO_EXPANDER_H */ + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/transceiver.c b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/transceiver.c new file mode 100644 index 000000000000..36ccc45a9216 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/transceiver.c @@ -0,0 +1,898 @@ +#include +#include +#include +#include +#include "io_expander.h" +#include "transceiver.h" + + +/* ========== Register EEPROM address mapping ========== + */ +struct eeprom_map_s eeprom_map_qsfp = { + .addr_rx_los =0x50, .page_rx_los =-1, .offset_rx_los =3, .length_rx_los =1, + .addr_tx_disable =0x50, .page_tx_disable =-1, .offset_tx_disable =86, .length_tx_disable =1, + .addr_tx_fault =0x50, .page_tx_fault =-1, .offset_tx_fault =4, .length_tx_fault =1, +}; + +struct eeprom_map_s eeprom_map_qsfp28 = { + .addr_rx_los =0x50, .page_rx_los =-1, .offset_rx_los =3, .length_rx_los =1, + .addr_tx_disable =0x50, .page_tx_disable =-1, .offset_tx_disable =86, .length_tx_disable =1, + .addr_tx_fault =0x50, .page_tx_fault =-1, .offset_tx_fault =4, .length_tx_fault =1, +}; + + +/* ========== Utility Functions ========== + */ +void +alarm_msg_2_user(struct transvr_obj_s *self, + char *emsg) { + + SWPS_ERR("%s on %s.\n", emsg, self->swp_name); +} + + +/* ========== Private functions ========== + */ +static int +_reload_transvr_obj(struct transvr_obj_s *self,int new_type); + +static int +reload_transvr_obj(struct transvr_obj_s *self,int new_type); + +static int +_transvr_init_handler(struct transvr_obj_s *self); + +static void +_transvr_clean_retry(struct transvr_obj_s *self) { + self->retry = 0; +} + + +static int +_transvr_handle_retry(struct transvr_obj_s *self, int retry) { + /* Return: 0: keep retry + * -1: stop retry + */ + if (self->retry == 0) { + self->retry = retry; + } + self->retry -= 1; + if (self->retry <= 0) { + _transvr_clean_retry(self); + return -1; + } + return 0; +} + +static int +_common_setup_page(struct transvr_obj_s *self, + int addr, + int page, + int offset, + int len, + int show_e) { + /* return: + * 0 : OK + * -1 : EEPROM settings incorrect + * -2 : I2C R/W failure + * -3 : Undefined case + */ + int retval = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + /* Check */ + if ((addr < 0) || (offset < 0) || (len < 0)) { + emsg = "EEPROM settings incorrect"; + retval = -1; + goto err_common_setup_page; + } + /* Case1: continue access */ + if ((self->i2c_client_p->addr == addr) && + (self->curr_page == page)) { + return 0; + } + self->i2c_client_p->addr = addr; + /* Case2: select lower page */ + if (page == -1) { + self->curr_page = page; + return 0; + } + /* Case3: select upper page */ + if (page >= 0) { + goto upper_common_setup_page; + } + /* Unexpected case */ + show_e = 1; + emsg = "Unexpected case"; + retval = -3; + goto err_common_setup_page; + +upper_common_setup_page: + if (i2c_smbus_write_byte_data(self->i2c_client_p, + VAL_TRANSVR_PAGE_SELECT_OFFSET, + page) < 0) { + emsg = "I2C R/W failure"; + retval = -2; + goto err_common_setup_page; + } + self->curr_page = page; + mdelay(VAL_TRANSVR_PAGE_SELECT_DELAY); + return 0; + +err_common_setup_page: + if (show_e) { + SWPS_INFO("%s: %s", __func__, emsg); + SWPS_INFO("%s: :0x%02x :%d :%d :%d\n", + __func__, addr, page, offset, len); + } + return retval; +} + +/* ========== Object functions for Final State Machine ========== + */ +int +is_plugged(struct transvr_obj_s *self){ + + int limit = 63; + int present = DEBUG_TRANSVR_INT_VAL; + char emsg[64] = DEBUG_TRANSVR_STR_VAL; + struct ioexp_obj_s *ioexp_p = self->ioexp_obj_p; + + if (!ioexp_p) { + snprintf(emsg, limit, "ioexp_p is null!"); + goto err_is_plugged_1; + } + present = ioexp_p->get_present(ioexp_p, self->ioexp_virt_offset); + switch (present){ + case 0: + return 1; + case 1: + return 0; + case ERR_IOEXP_UNINIT: + snprintf(emsg, limit, "ioexp_p not ready!"); + goto err_is_plugged_1; + default: + if (ioexp_p->state == STATE_IOEXP_INIT){ + snprintf(emsg, limit, "ioexp_p not ready!"); + goto err_is_plugged_1; + } + break; + } + SWPS_INFO("%s: Exception case! :%d :%d\n", + __func__, present, ioexp_p->state); + return 0; + +err_is_plugged_1: + SWPS_DEBUG("%s: %s\n", __func__, emsg); + return 0; +} + + +static int +detect_transvr_type(struct transvr_obj_s* self){ + + int type = TRANSVR_TYPE_ERROR; + + self->i2c_client_p->addr = VAL_TRANSVR_COMID_ARREESS; + type = i2c_smbus_read_byte_data(self->i2c_client_p, + VAL_TRANSVR_COMID_OFFSET); + + /* Case: 1. Wait transceiver I2C module. + * 2. Transceiver I2C module failure. + * Note: 1. SFF allow maximum transceiver initial time is 2 second. So, there + * are exist some case that we need to wait transceiver. + * For these case, we keeps status on "TRANSVR_TYPE_UNPLUGGED", than + * state machine will keep trace with it. + * 2. There exist some I2C failure case we need to handle. Such as user + * insert the failure transceiver, or any reason cause it abnormal. + */ + if (type < 0){ + switch (type) { + case -EIO: + SWPS_DEBUG("%s: %s smbus return:-5 (I/O error)\n", + __func__, self->swp_name); + return TRANSVR_TYPE_UNPLUGGED; + case -ENXIO: + SWPS_DEBUG("%s: %s smbus return:-6 (No such device or address)\n", + __func__, self->swp_name); + return TRANSVR_TYPE_UNPLUGGED; + default: + break; + } + SWPS_INFO("%s: %s unexpected smbus return:%d \n", + __func__, self->swp_name, type); + return TRANSVR_TYPE_ERROR; + } + /* Identify valid transceiver type */ + switch (type){ + case TRANSVR_TYPE_SFP: + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + break; + case TRANSVR_TYPE_UNKNOW_1: + case TRANSVR_TYPE_UNKNOW_2: + type = TRANSVR_TYPE_UNKNOW_2; + break; + default: + SWPS_DEBUG("%s: unknow type:0x%02x \n", __func__, type); + type = TRANSVR_TYPE_ERROR; + break; + } + return type; +} + + +static int +detect_transvr_state(struct transvr_obj_s *self, + int result[2]){ + /* [return] [result-0] [result-1] + * 0 STATE_TRANSVR_CONNECTED TRANSVR_TYPE_FAKE + * 0 STATE_TRANSVR_DISCONNECTED TRANSVR_TYPE_UNPLUGGED + * 0 STATE_TRANSVR_ISOLATED TRANSVR_TYPE_ERROR + * 0 STATE_TRANSVR_INIT / + * 0 STATE_TRANSVR_SWAPPED + * 0 STATE_TRANSVR_CONNECTED + * ERR_TRNASVR_BE_ISOLATED STATE_TRANSVR_ISOLATED TRANSVR_TYPE_ERROR + * ERR_TRANSVR_I2C_CRASH STATE_TRANSVR_UNEXCEPTED TRANSVR_TYPE_ERROR + * ERR_TRANSVR_UNEXCPT STATE_TRANSVR_UNEXCEPTED TRANSVR_TYPE_UNKNOW_1/2 + */ + result[0] = STATE_TRANSVR_UNEXCEPTED; /* For return state */ + result[1] = TRANSVR_TYPE_ERROR; /* For return type */ + + /* Case1: Fake type */ + if (self->type == TRANSVR_TYPE_FAKE){ + result[0] = STATE_TRANSVR_CONNECTED; + result[1] = TRANSVR_TYPE_FAKE; + return 0; + } + /* Case2: Transceiver unplugged */ + if (!is_plugged(self)){ + result[0] = STATE_TRANSVR_DISCONNECTED; + result[1] = TRANSVR_TYPE_UNPLUGGED; + return 0; + } + /* Case3: Transceiver be isolated */ + if (self->state == STATE_TRANSVR_ISOLATED){ + result[0] = STATE_TRANSVR_ISOLATED; + result[1] = TRANSVR_TYPE_ERROR; + return ERR_TRNASVR_BE_ISOLATED; + } + /* Case4: Transceiver plugged */ + result[1] = detect_transvr_type(self); + /* Case4.1: I2C topology crash + * Note : There are some I2C issues cause by transceiver/cables. + * We need to check topology status when user insert it. + * But in this step, we can't not ensure this is the issues + * port. So, it return the ERR_TRANSVR_I2C_CRASH, then upper + * layer will diagnostic I2C topology. + */ + if (check_channel_tier_1() < 0) { + SWPS_INFO("%s: %s detect I2C crash :%d\n", + __func__, self->swp_name, self->state); + result[0] = STATE_TRANSVR_UNEXCEPTED; + result[1] = TRANSVR_TYPE_ERROR; + return ERR_TRANSVR_I2C_CRASH; + } + /* Case4.2: System initial not ready, + * Note : Sometime i2c channel or transceiver EEPROM will delay that will + * cause system in inconsistent state between EEPROM and IOEXP. + * In this case, SWP transceiver object keep state at LINK_DOWN + * to wait system ready. + * By the way, State Machine will handle these case. + */ + if (result[1] == TRANSVR_TYPE_UNPLUGGED){ + result[0] = STATE_TRANSVR_DISCONNECTED; + return 0; + } + /* Case4.3: Error transceiver type */ + if (result[1] == TRANSVR_TYPE_ERROR){ + result[0] = STATE_TRANSVR_ISOLATED; + SWPS_INFO("%s: %s detect error type\n", __func__, self->swp_name); + alarm_msg_2_user(self, "detected transceiver/cables not meet SFF standard!"); + return ERR_TRNASVR_BE_ISOLATED; + } + /* Case3.3: Unknow transceiver type */ + if ((result[1] == TRANSVR_TYPE_UNKNOW_1) || + (result[1] == TRANSVR_TYPE_UNKNOW_2) ){ + result[0] = STATE_TRANSVR_UNEXCEPTED; + return ERR_TRANSVR_UNEXCPT; + } + /* Case3.4: During initial process */ + if (self->state == STATE_TRANSVR_INIT){ + result[0] = STATE_TRANSVR_INIT; + return 0; + } + /* Case3.5: Transceiver be swapped */ + if (self->type != result[1]){ + result[0] = STATE_TRANSVR_SWAPPED; + return 0; + } + /* Case3.6: Link up state */ + result[0] = STATE_TRANSVR_CONNECTED; + return 0; +} +int +common_fsm_4_direct_mode(struct transvr_obj_s* self, + char *caller_name){ + + int err; + int detect_result[2]; + int current_state = STATE_TRANSVR_UNEXCEPTED; + int current_type = TRANSVR_TYPE_ERROR; + + if (self->state == STATE_TRANSVR_NEW) { + if (_transvr_init_handler(self) < 0){ + return ERR_TRANSVR_INIT_FAIL; + } + } + err = detect_transvr_state(self, detect_result); + if (err < 0) { + return err; + } + /* In Direct mode, driver only detect transceiver when user call driver interface + * which on sysfs. So it only need consider the state of Transceiver. + */ + current_state = detect_result[0]; + current_type = detect_result[1]; + + switch (current_state){ + + case STATE_TRANSVR_DISCONNECTED: /* Transceiver is not plugged */ + self->state = current_state; + self->type = current_type; + return ERR_TRANSVR_UNPLUGGED; + + case STATE_TRANSVR_INIT: /* Transceiver is plugged, system not ready */ + return ERR_TRANSVR_UNINIT; + + case STATE_TRANSVR_ISOLATED: /* Transceiver is plugged, but has some issues */ + return ERR_TRNASVR_BE_ISOLATED; + + case STATE_TRANSVR_CONNECTED: /* Transceiver is plugged, system is ready */ + self->state = current_state; + self->type = current_type; + return 0; + + case STATE_TRANSVR_SWAPPED: /* Transceiver is plugged, system detect user changed */ + self->type = current_type; + if (reload_transvr_obj(self, current_type) < 0){ + self->state = STATE_TRANSVR_UNEXCEPTED; + return ERR_TRANSVR_UNEXCPT; + } + self->state = current_state; + return 0; + + case STATE_TRANSVR_UNEXCEPTED: /* Transceiver type or state is unexpected case */ + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = TRANSVR_TYPE_ERROR; + return ERR_TRANSVR_UNEXCPT; + + default: + SWPS_INFO("%s: state:%d not in define.\n", __func__, current_state); + break; + } + return ERR_TRANSVR_UNEXCPT; +} + +int +fake_fsm_4_direct_mode(struct transvr_obj_s* self, + char *caller_name){ + self->state = STATE_TRANSVR_CONNECTED; + self->type = TRANSVR_TYPE_FAKE; + return 0; +} + +/* ========== Object Initial handler ========== + */ +static int +_is_transvr_valid(struct transvr_obj_s *self, + int type, + int state) { + /* [Return] + * 0 : OK, inserted + * EVENT_TRANSVR_INIT_DOWN : OK, removed + * EVENT_TRANSVR_INIT_FAIL : Outside error, type doesn't supported + * EVENT_TRANSVR_EXCEP_INIT : Internal error, state undefined + */ + switch (type) { + case TRANSVR_TYPE_SFP: + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + case TRANSVR_TYPE_UNPLUGGED: + case TRANSVR_TYPE_FAKE: + break; + default: + SWPS_INFO("detect undefined type:0x%02x on %s\n", + type, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; + } + switch (state) { + case STATE_TRANSVR_DISCONNECTED: + return EVENT_TRANSVR_INIT_DOWN; + case STATE_TRANSVR_INIT: + case STATE_TRANSVR_CONNECTED: + case STATE_TRANSVR_SWAPPED: + break; + default: + SWPS_INFO("detect undefined state:%d on %s\n", + state, self->swp_name); + return EVENT_TRANSVR_EXCEP_INIT; + } + return 0; +} + + +static int +_is_transvr_hw_ready(struct transvr_obj_s *self, + int type){ + /* [Return] + * EVENT_TRANSVR_TASK_DONE : Ready + * EVENT_TRANSVR_TASK_WAIT : Not ready + * EVENT_TRANSVR_INIT_FAIL : Error + */ + int addr = DEBUG_TRANSVR_INT_VAL; + int page = DEBUG_TRANSVR_INT_VAL; + int offs = DEBUG_TRANSVR_INT_VAL; + int bit = DEBUG_TRANSVR_INT_VAL; + int ready = DEBUG_TRANSVR_INT_VAL; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t ab_val = DEBUG_TRANSVR_HEX_VAL; + + switch (type) { + case TRANSVR_TYPE_SFP: + addr = VAL_TRANSVR_8472_READY_ADDR; + page = VAL_TRANSVR_8472_READY_PAGE; + offs = VAL_TRANSVR_8472_READY_OFFSET; + bit = VAL_TRANSVR_8472_READY_BIT; + ready = VAL_TRANSVR_8472_READY_VALUE; + ab_val = VAL_TRANSVR_8472_READY_ABNORMAL; + break; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + addr = VAL_TRANSVR_8436_READY_ADDR; + page = VAL_TRANSVR_8436_READY_PAGE; + offs = VAL_TRANSVR_8436_READY_OFFSET; + bit = VAL_TRANSVR_8436_READY_BIT; + ready = VAL_TRANSVR_8436_READY_VALUE; + ab_val = VAL_TRANSVR_8436_READY_ABNORMAL; + break; + + case TRANSVR_TYPE_UNPLUGGED: + case TRANSVR_TYPE_FAKE: + return EVENT_TRANSVR_TASK_DONE; + + default: + emsg = "unexpected case"; + goto err_is_transvr_hw_ready; + } + /* Select target page */ + err = _common_setup_page(self, addr, page, offs, 1, 0); + if (err < 0) { + emsg = "setup page fail"; + goto err_is_transvr_hw_ready; + } + /* Check feature supported + * [Note] + * Some of transceiver/cables doesn't support "Status Indicators" + * (ex:DAC, RJ45 copper SFP ...etc). In these case, we bypass the + * step of checking Status Indicators, then state machine will take + * the following handle procedure. + */ + err = i2c_smbus_read_byte_data(self->i2c_client_p, + VAL_TRANSVR_COMID_OFFSET); + if (err < 0) { + emsg = "doesn't support Status Indicators"; + goto bypass_is_transvr_hw_ready; + } + /* Filter abnormal case */ + if (err == ab_val) { + emsg = "detect using unusual definition."; + goto bypass_is_transvr_hw_ready; + } + /* Get Status Indicators */ + err = i2c_smbus_read_byte_data(self->i2c_client_p, offs); + if (err < 0) { + emsg = "detect current value fail"; + goto err_is_transvr_hw_ready; + } + if ((err & (1<:%d\n", __func__, emsg, type); + return EVENT_TRANSVR_TASK_DONE; + +err_is_transvr_hw_ready: + SWPS_DEBUG("%s: %s :%d\n", __func__, emsg, type); + return EVENT_TRANSVR_INIT_FAIL; +} + +static int +_transvr_init_handler(struct transvr_obj_s *self){ + + int detect[2]; + int d_state = STATE_TRANSVR_UNEXCEPTED; + int d_type = TRANSVR_TYPE_ERROR; + int result = ERR_TRANSVR_UNINIT; + int retry = 6; /* (6+1) x 0.3 = 2.1s > spec:2.0s */ + int elimit = 63; + char emsg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Clean and check callback */ + self->state = STATE_TRANSVR_INIT; + if (self->init == NULL) { + snprintf(emsg, elimit, "init() is null"); + goto initer_err_case_unexcept_0; + } + /* Detect transceiver information */ + result = detect_transvr_state(self, detect); + if (result < 0) { + snprintf(emsg, elimit, "detect_transvr_state() fail"); + switch (result) { + case ERR_TRANSVR_I2C_CRASH: + goto initer_err_case_i2c_ceash; + case ERR_TRNASVR_BE_ISOLATED: + goto initer_err_case_be_isolated; + + case ERR_TRANSVR_UNEXCPT: + default: + break; + } + goto initer_err_case_retry_1; + } + d_state = detect[0]; + d_type = detect[1]; + + /* Verify transceiver type and state */ + switch (_is_transvr_valid(self, d_type, d_state)) { + case 0: + break; + case EVENT_TRANSVR_INIT_DOWN: + goto initer_ok_case_down;; + case EVENT_TRANSVR_INIT_FAIL: + snprintf(emsg, elimit, "transceiver type doesn't support"); + goto initer_err_case_alarm_to_user; + case EVENT_TRANSVR_EXCEP_INIT: + default: + goto initer_err_case_unexcept_0; + } + + /* Handle reload case */ + if (self->type != d_type){ + /* This is the protect mechanism. Normally, This case will not happen. + * When State machine detect swap event during initial, It will trigger + * reload function to ensure type correct. */ + if (_reload_transvr_obj(self, d_type) < 0){ + snprintf(emsg, elimit, "reload object fail"); + goto initer_err_case_unexcept_0; + } + } + + /* Check transceiver HW initial ready */ + switch (_is_transvr_hw_ready(self, d_type)) { + case EVENT_TRANSVR_TASK_DONE: + break; + case EVENT_TRANSVR_TASK_WAIT: + goto initer_err_case_retry_1; + case EVENT_TRANSVR_INIT_FAIL: + default: + goto initer_err_case_unexcept_0; + } + + /* Try to update all and check */ + if (self->update_all(self, 1) < 0){ + /* For some transceiver, EEPROME has lag issues during initial stage. + * In this case, we set status back to STATE_TRANSVR_NEW, than it will + * be checked in next polling cycle. */ + goto initer_err_case_retry_1; + } + + /* Execute init() call back */ + result = self->init(self); + switch (result) { + case EVENT_TRANSVR_TASK_DONE: + break; + case EVENT_TRANSVR_TASK_WAIT: + goto initer_ok_case_wait; + + default: + snprintf(emsg, elimit, "undefined init() return:%d\n", result); + goto initer_err_case_unexcept_0; + } + goto initer_ok_case_up; + + +initer_ok_case_wait: + return EVENT_TRANSVR_TASK_WAIT; + +initer_ok_case_up: + self->state = STATE_TRANSVR_CONNECTED; + self->temp = 0; + return EVENT_TRANSVR_INIT_UP; + +initer_ok_case_down: + self->temp = 0; + self->state = STATE_TRANSVR_DISCONNECTED; + return EVENT_TRANSVR_INIT_DOWN; + +initer_err_case_i2c_ceash: + SWPS_DEBUG("%s: %s :%s :I2C crash\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_UNEXCEPTED; + return EVENT_TRANSVR_I2C_CRASH; + +initer_err_case_be_isolated: + SWPS_DEBUG("%s: %s :%s :isolated\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_ISOLATED; + return EVENT_TRANSVR_EXCEP_ISOLATED; + +initer_err_case_retry_1: + SWPS_DEBUG("%s: %s :%s :retry\n", + __func__, emsg, self->swp_name); + if (_transvr_handle_retry(self, retry) == 0) { + self->state = STATE_TRANSVR_NEW; + return EVENT_TRANSVR_INIT_REINIT; + } + goto initer_err_case_alarm_to_user; + +initer_err_case_unexcept_0: + self->state = STATE_TRANSVR_UNEXCEPTED; + return EVENT_TRANSVR_INIT_FAIL; + +initer_err_case_alarm_to_user: + SWPS_DEBUG("%s: %s :%s :alarm_to_user\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_UNEXCEPTED; + alarm_msg_2_user(self, "detected transceiver/cables not meet SFF standard"); + return EVENT_TRANSVR_INIT_FAIL; +} + +static int +setup_transvr_private_cb(struct transvr_obj_s *self, + int transvr_type){ + switch (transvr_type){ + case TRANSVR_TYPE_SFP: + self->fsm_4_direct = common_fsm_4_direct_mode; + return 0; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + self->fsm_4_direct = common_fsm_4_direct_mode; + return 0; + + case TRANSVR_TYPE_QSFP_28: + self->fsm_4_direct = common_fsm_4_direct_mode; + return 0; + + case TRANSVR_TYPE_FAKE: + self->fsm_4_direct = fake_fsm_4_direct_mode; + return 0; + + default: + break; + } + SWPS_WARN("%s: Detect non-defined type:%d\n", __func__, transvr_type); + return ERR_TRANSVR_UNEXCPT; +} + + +static struct eeprom_map_s * +get_eeprom_map(int transvr_type){ + + switch (transvr_type){ + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + return &eeprom_map_qsfp; + case TRANSVR_TYPE_QSFP_28: + return &eeprom_map_qsfp28; + + default: + break; + } + SWPS_WARN("%s: Detect non-defined type:%d\n", __func__, transvr_type); + return NULL; +} + + +static int +setup_transvr_ssize_attr(char *swp_name, + struct transvr_obj_s *self, + struct eeprom_map_s *map_p, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int chan_id, + int run_mode){ + switch (run_mode){ + case TRANSVR_MODE_DIRECT: /* Direct access device mode */ + self->mode = run_mode; + break; + default: + SWPS_ERR("%s: non-defined run_mode:%d\n", + __func__, run_mode); + self->mode = DEBUG_TRANSVR_INT_VAL; + return -1; + } + self->eeprom_map_p = map_p; + self->ioexp_obj_p = ioexp_obj_p; + self->ioexp_virt_offset = ioexp_virt_offset; + self->chan_id = chan_id; + self->layout = transvr_type; + self->type = transvr_type; + self->chipset_type = chipset_type; + self->state = STATE_TRANSVR_NEW; + self->info = STATE_TRANSVR_NEW; + self->auto_tx_disable = VAL_TRANSVR_FUNCTION_DISABLE; + strncpy(self->swp_name, swp_name, 32); + mutex_init(&self->lock); + return 0; +} + + + +static int +setup_i2c_client(struct transvr_obj_s *self){ + + struct i2c_adapter *adap = NULL; + struct i2c_client *client = NULL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + adap = i2c_get_adapter(self->chan_id); + if(!adap){ + snprintf(err_msg, sizeof(err_msg), + "can not get adap:%d", self->chan_id); + goto err_setup_i2c_client; + } + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client){ + snprintf(err_msg, sizeof(err_msg), + "can not kzalloc client:%d", self->chan_id); + goto err_setup_i2c_client; + } + client->adapter = adap; + self->i2c_client_p = client; + self->i2c_client_p->addr = VAL_TRANSVR_COMID_ARREESS; + return 0; + +err_setup_i2c_client: + SWPS_ERR("%s: %s\n", __func__, err_msg); + return ERR_TRANSVR_UNEXCPT; +} + + +struct transvr_obj_s * +create_transvr_obj(char *swp_name, + int chan_id, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int run_mode){ + + struct transvr_obj_s *result_p; + struct eeprom_map_s *map_p; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Allocate transceiver object */ + map_p = get_eeprom_map(transvr_type); + if (!map_p){ + snprintf(err_msg, sizeof(err_msg), + "Invalid transvr_type:%d", transvr_type); + goto err_create_transvr_fail; + } + result_p = kzalloc(sizeof(*result_p), GFP_KERNEL); + if (!result_p){ + snprintf(err_msg, sizeof(err_msg), "kzalloc fail"); + goto err_create_transvr_fail; + } + /* Prepare static size attributes */ + if (setup_transvr_ssize_attr(swp_name, + result_p, + map_p, + ioexp_obj_p, + ioexp_virt_offset, + transvr_type, + chipset_type, + chan_id, + run_mode) < 0){ + goto err_create_transvr_sattr_fail; + } + + /* Prepare call back functions of object */ + if (setup_transvr_private_cb(result_p, transvr_type) < 0){ + goto err_create_transvr_sattr_fail; + } + /* Prepare i2c client object */ + if (setup_i2c_client(result_p) < 0){ + goto err_create_transvr_sattr_fail; + } + return result_p; +err_create_transvr_sattr_fail: + kfree(result_p); +err_create_transvr_fail: + SWPS_ERR("%s: %s :%d :%d :%d\n", + __func__, err_msg, chan_id, ioexp_virt_offset, transvr_type); + return NULL; +} + + +static int +_reload_transvr_obj(struct transvr_obj_s *self, + int new_type){ + + struct eeprom_map_s *new_map_p; + struct eeprom_map_s *old_map_p = self->eeprom_map_p; + struct i2c_client *old_i2c_p = self->i2c_client_p; + int old_type = self->type; + + /* Change state to STATE_TRANSVR_INIT */ + self->state = STATE_TRANSVR_INIT; + self->type = new_type; + /* Replace EEPROME map */ + new_map_p = get_eeprom_map(new_type); + if (!new_map_p){ + goto err_private_reload_func_1; + } + self->eeprom_map_p = new_map_p; + /* Reload i2c client */ + if (setup_i2c_client(self) < 0){ + goto err_private_reload_func_2; + } + if (setup_transvr_private_cb(self, new_type) < 0){ + goto err_private_reload_func_3; + } + kfree(old_i2c_p); + return 0; + +err_private_reload_func_3: + SWPS_INFO("%s: init() fail!\n", __func__); + kfree(old_i2c_p); + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = TRANSVR_TYPE_ERROR; + return -2; + +err_private_reload_func_2: + self->eeprom_map_p = old_map_p; + self->i2c_client_p = old_i2c_p; +err_private_reload_func_1: + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = old_type; + SWPS_INFO("%s fail! :0x%02x\n", __func__, new_type); + return -1; +} + + +static int +reload_transvr_obj(struct transvr_obj_s *self, + int new_type){ + + int result_val = ERR_TRANSVR_UNEXCPT; + + /* Reload phase */ + result_val = _reload_transvr_obj(self, new_type); + if (result_val < 0){ + SWPS_INFO("%s: reload phase fail! :%d\n", + __func__, result_val); + return EVENT_TRANSVR_RELOAD_FAIL; + } + /* Initial phase */ + result_val = _transvr_init_handler(self); + if (result_val < 0){ + SWPS_INFO("%s: initial phase fail! :%d\n", + __func__, result_val); + } + return result_val; +} + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/transceiver.h b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/transceiver.h new file mode 100644 index 000000000000..487fcdd76773 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/modules/transceiver.h @@ -0,0 +1,167 @@ +#ifndef TRANSCEIVER_H +#define TRANSCEIVER_H + +#include + +/* Transceiver type define */ +#define TRANSVR_TYPE_UNKNOW_1 (0x00) +#define TRANSVR_TYPE_UNKNOW_2 (0xff) +#define TRANSVR_TYPE_SFP (0x03) /* Define for SFP, SFP+, SFP28 */ +#define TRANSVR_TYPE_QSFP (0x0c) +#define TRANSVR_TYPE_QSFP_PLUS (0x0d) +#define TRANSVR_TYPE_QSFP_28 (0x11) +#define TRANSVR_TYPE_UNPLUGGED (0xfa) /* Define for ERROR handle */ +#define TRANSVR_TYPE_FAKE (0xfc) /* Define for ERROR handle */ +#define TRANSVR_TYPE_INCONSISTENT (0xfd) /* Define for ERROR handle */ +#define TRANSVR_TYPE_ERROR (0xfe) /* Define for ERROR handle */ + +/* Transceiver mode define */ +#define TRANSVR_MODE_DIRECT (21000) + +/* Transceiver state define + * [Note] + * 1. State is used to represent the state of "Transceiver" and "Object". + * 2. State for different target has different means. The description as following: + */ +#define STATE_TRANSVR_CONNECTED (0) /* [Transvr]:Be plugged in. [Obj]:Link up, and work normally. */ +#define STATE_TRANSVR_NEW (-100) /* [Transvr]:(Not used) [Obj]:Create */ +#define STATE_TRANSVR_INIT (-101) /* [Transvr]:Be plugged in. [Obj]:Link up, and in initial process. */ +#define STATE_TRANSVR_ISOLATED (-102) /* [Transvr]:Be plugged in. [Obj]:Isolate, and not provide service. */ +#define STATE_TRANSVR_SWAPPED (-200) /* [Transvr]:Be plugged in. [Obj]:(Not used) */ +#define STATE_TRANSVR_DISCONNECTED (-300) /* [Transvr]:Un-plugged. [Obj]:Link down, and not provide service. */ +#define STATE_TRANSVR_UNEXCEPTED (-901) /* [Transvr]:Any [Obj]:Any, and not in expect case. */ + +/* Event for task handling */ +#define EVENT_TRANSVR_TASK_WAIT (2101) +#define EVENT_TRANSVR_TASK_DONE (0) +#define EVENT_TRANSVR_TASK_FAIL (-2101) +/* Event for initial handling */ +#define EVENT_TRANSVR_INIT_UP (2201) +#define EVENT_TRANSVR_INIT_DOWN (1) +#define EVENT_TRANSVR_INIT_REINIT (-2201) +#define EVENT_TRANSVR_INIT_FAIL (-2202) +/* Event for others */ +#define EVENT_TRANSVR_RELOAD_FAIL (-2301) +#define EVENT_TRANSVR_EXCEP_INIT (-2401) +#define EVENT_TRANSVR_EXCEP_UP (-2402) +#define EVENT_TRANSVR_EXCEP_DOWN (-2403) +#define EVENT_TRANSVR_EXCEP_SWAP (-2404) +#define EVENT_TRANSVR_EXCEP_EXCEP (-2405) +#define EVENT_TRANSVR_EXCEP_ISOLATED (-2406) +#define EVENT_TRANSVR_I2C_CRASH (-2501) + +/* Transceiver error code define */ +#define ERR_TRANSVR_UNINIT (-201) +#define ERR_TRANSVR_UNPLUGGED (-202) +#define ERR_TRANSVR_ABNORMAL (-203) +#define ERR_TRANSVR_NOSTATE (-204) +#define ERR_TRANSVR_NOTSUPPORT (-205) +#define ERR_TRANSVR_BADINPUT (-206) +#define ERR_TRANSVR_UPDATE_FAIL (-207) +#define ERR_TRANSVR_RELOAD_FAIL (-208) +#define ERR_TRANSVR_INIT_FAIL (-209) +#define ERR_TRANSVR_UNDEFINED (-210) +#define ERR_TRANSVR_TASK_FAIL (-211) +#define ERR_TRANSVR_TASK_BUSY (-212) +#define ERR_TRANSVR_FUNC_DISABLE (-214) +#define ERR_TRANSVR_I2C_CRASH (-297) +#define ERR_TRNASVR_BE_ISOLATED (-298) +#define ERR_TRANSVR_UNEXCPT (-299) + +/* For debug */ +#define DEBUG_TRANSVR_INT_VAL (-99) +#define DEBUG_TRANSVR_HEX_VAL (0xfe) +#define DEBUG_TRANSVR_STR_VAL "ERROR" + +/* For system internal */ +#define VAL_TRANSVR_COMID_ARREESS (0x50) +#define VAL_TRANSVR_COMID_OFFSET (0x00) +#define VAL_TRANSVR_8472_READY_ADDR (0x51) +#define VAL_TRANSVR_8472_READY_PAGE (-1) +#define VAL_TRANSVR_8472_READY_OFFSET (110) +#define VAL_TRANSVR_8472_READY_BIT (0) +#define VAL_TRANSVR_8472_READY_VALUE (0) +#define VAL_TRANSVR_8472_READY_ABNORMAL (0xff) +#define VAL_TRANSVR_8436_READY_ADDR (0x50) +#define VAL_TRANSVR_8436_READY_PAGE (-1) +#define VAL_TRANSVR_8436_READY_OFFSET (2) +#define VAL_TRANSVR_8436_READY_BIT (0) +#define VAL_TRANSVR_8436_READY_VALUE (0) +#define VAL_TRANSVR_8436_READY_ABNORMAL (0xff) +#define VAL_TRANSVR_8436_PWD_ADDR (0x50) +#define VAL_TRANSVR_8436_PWD_PAGE (-1) +#define VAL_TRANSVR_8436_PWD_OFFSET (123) +#define VAL_TRANSVR_PAGE_FREE (-99) +#define VAL_TRANSVR_PAGE_SELECT_OFFSET (127) +#define VAL_TRANSVR_PAGE_SELECT_DELAY (5) +#define VAL_TRANSVR_TASK_RETRY_FOREVER (-999) +#define VAL_TRANSVR_FUNCTION_DISABLE (-1) +#define STR_TRANSVR_QSFP "QSFP" +#define STR_TRANSVR_QSFP_PLUS "QSFP+" +#define STR_TRANSVR_QSFP28 "QSFP28" + +/* BCM chip type define */ +#define BCM_CHIP_TYPE_TOMAHAWK (31002) /* Redwood, Cypress */ + +/* Info from transceiver EEPROM */ +struct eeprom_map_s { + int addr_rx_los; int page_rx_los; int offset_rx_los; int length_rx_los; + int addr_tx_disable; int page_tx_disable; int offset_tx_disable; int length_tx_disable; + int addr_tx_fault; int page_tx_fault; int offset_tx_fault; int length_tx_fault; +}; + +/* Class of transceiver object */ +struct transvr_obj_s { + /* ========== Object private property ========== + */ + struct device *transvr_dev_p; + struct eeprom_map_s *eeprom_map_p; + struct i2c_client *i2c_client_p; + struct ioexp_obj_s *ioexp_obj_p; + struct mutex lock; + char swp_name[32]; + int auto_tx_disable; + int chan_id; + int chipset_type; + int curr_page; + int info; + int ioexp_virt_offset; + int lane_id[8]; + int layout; + int mode; + int retry; + int state; + int temp; + int type; + + /* ========== Object private functions ========== + */ + int (*init)(struct transvr_obj_s *self); + int (*update_all)(struct transvr_obj_s *self, int show_err); + int (*fsm_4_direct)(struct transvr_obj_s* self, char *caller_name); +}; + + +/* For AVL Mapping */ +struct transvr_avl_s { + char vendor_name[32]; + char vendor_pn[32]; + int (*init)(struct transvr_obj_s *self); +}; + +struct transvr_obj_s * +create_transvr_obj(char *swp_name, + int chan_id, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int run_mode); + +void alarm_msg_2_user(struct transvr_obj_s *self, char *emsg); + +#endif /* TRANSCEIVER_H */ + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/utils/inventec_d7032_util.py b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/utils/inventec_d7032_util.py new file mode 100755 index 000000000000..f6f5e46c5536 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/utils/inventec_d7032_util.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python +# +# Copyright (C) 2017 Inventec, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Usage: %(scriptName)s [options] command object + +options: + -h | --help : this help message + -d | --debug : run with debug mode + -f | --force : ignore error during installation or clean +command: + install : install drivers and generate related sysfs nodes + clean : uninstall drivers and remove related sysfs nodes +""" + +import os +import commands +import sys, getopt +import logging +import re +import time +from collections import namedtuple + +DEBUG = False +args = [] +FORCE = 0 +i2c_prefix = '/sys/bus/i2c/devices/' + + +if DEBUG == True: + print sys.argv[0] + print 'ARGV :', sys.argv[1:] + + +def main(): + global DEBUG + global args + global FORCE + + if len(sys.argv)<2: + show_help() + + options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', + 'debug', + 'force', + ]) + if DEBUG == True: + print options + print args + print len(sys.argv) + + for opt, arg in options: + if opt in ('-h', '--help'): + show_help() + elif opt in ('-d', '--debug'): + DEBUG = True + logging.basicConfig(level=logging.INFO) + elif opt in ('-f', '--force'): + FORCE = 1 + else: + logging.info('no option') + for arg in args: + if arg == 'install': + install() + elif arg == 'clean': + uninstall() + else: + show_help() + + + return 0 + +def show_help(): + print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} + sys.exit(0) + +def show_log(txt): + if DEBUG == True: + print "[D7032]"+txt + return + +def exec_cmd(cmd, show): + logging.info('Run :'+cmd) + status, output = commands.getstatusoutput(cmd) + show_log (cmd +"with result:" + str(status)) + show_log (" output:"+output) + if status: + logging.info('Failed :'+cmd) + if show: + print('Failed :'+cmd) + return status, output + +instantiate =[ +#'echo pca9545 0x70> /sys/bus/i2c/devices/i2c-0/new_device', +#'echo pca9548 0x72> /sys/bus/i2c/devices/i2c-1/new_device', +#'echo pca9548 0x72> /sys/bus/i2c/devices/i2c-2/new_device', +#'echo pca9548 0x72> /sys/bus/i2c/devices/i2c-3/new_device', +#'echo pca9548 0x72> /sys/bus/i2c/devices/i2c-4/new_device', +#'echo inv_psoc 0x66> /sys/bus/i2c/devices/i2c-5/new_device', +#'echo inv_cpld 0x55> /sys/bus/i2c/devices/i2c-5/new_device', +'echo inv_eeprom 0x53> /sys/bus/i2c/devices/i2c-0/new_device'] + +drivers =[ +'lpc_ich', +'i2c-i801', +'i2c-mux', +'i2c-mux-pca954x', +'i2c-dev', +'inv_eeprom', +'inv_platform', +'inv_psoc', +'inv_cpld', +'swps'] + + + +def system_install(): + global FORCE + + #remove default drivers to avoid modprobe order conflicts + status, output = exec_cmd("rmmod i2c_ismt ", 1) + status, output = exec_cmd("rmmod i2c-i801 ", 1) + #install drivers + for i in range(0,len(drivers)): + status, output = exec_cmd("modprobe "+drivers[i], 1) + if status: + print output + if FORCE == 0: + return status + + #instantiate devices + for i in range(0,len(instantiate)): + time.sleep(1) + status, output = exec_cmd(instantiate[i], 1) + if status: + print output + if FORCE == 0: + return status + + for i in range(22,30): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-4/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(30,38): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-5/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(6,14): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-2/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(14,22): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-3/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + return + + +def system_ready(): + if not device_found(): + return False + return True + +def install(): + if not device_found(): + print "No device, installing...." + status = system_install() + if status: + if FORCE == 0: + return status + else: + print " D7032 devices detected...." + return + +def uninstall(): + global FORCE + #uninstall drivers + for i in range(len(drivers)-1,-1,-1): + status, output = exec_cmd("rmmod "+drivers[i], 1) + if status: + print output + if FORCE == 0: + return status + return + +def device_found(): + ret1, log = exec_cmd("ls "+i2c_prefix+"*0072", 0) + ret2, log = exec_cmd("ls "+i2c_prefix+"i2c-2", 0) + return not(ret1 or ret2) + +if __name__ == "__main__": + main() + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/utils/onie-syseeprom b/platform/broadcom/sonic-platform-modules-inventec/d7032q28b/utils/onie-syseeprom deleted file mode 100755 index b8e3ba26a5d24bc70f970c24364a61cbfa0abf10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921685 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

3ldnE1ZCNQfUc~ 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%0DnGRQI4{ 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 diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/Makefile b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/Makefile new file mode 100755 index 000000000000..aeffa4376588 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/Makefile @@ -0,0 +1,6 @@ +obj-m += inv_cpld.o inv_psoc.o +obj-m += inv_platform.o +obj-m += inv_eeprom.o +obj-m += swps.o +swps-objs := inv_swps.o io_expander.o transceiver.o + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_cpld.c b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_cpld.c new file mode 100644 index 000000000000..683ffa0ff3ce --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_cpld.c @@ -0,0 +1,415 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include "I2CHostCommunication.h" + +#define USE_SMBUS 1 + +/* definition */ +#define CPLD_INFO_OFFSET 0x00 +#define CPLD_PSU_OFFSET 0x08 +#define CPLD_LED_OFFSET 0x0E +#define CPLD_LED_STATU_OFFSET 0x0D +#define CPLD_CTL_OFFSET 0x0C + + + +/* Each client has this additional data */ +struct cpld_data { + struct device *hwmon_dev; + struct mutex update_lock; +}; + +/*-----------------------------------------------------------------------*/ + +static ssize_t cpld_i2c_read(struct i2c_client *client, u8 *buf, u8 offset, size_t count) +{ +#if USE_SMBUS + int i; + + for(i=0; iaddr; + msg[0].buf = msgbuf; + msg[0].len = 1; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = buf; + msg[1].len = count; + + status = i2c_transfer(client->adapter, msg, 2); + + if(status == 2) + status = count; + + return status; +#endif +} + +static ssize_t cpld_i2c_write(struct i2c_client *client, char *buf, unsigned offset, size_t count) +{ +#if USE_SMBUS + int i; + + for(i=0; iaddr; + msg.flags = 0; + + /* msg.buf is u8 and casts will mask the values */ + msg.buf = writebuf; + + msg.buf[i++] = offset; + memcpy(&msg.buf[i], buf, count); + msg.len = i + count; + + status = i2c_transfer(client->adapter, &msg, 1); + if (status == 1) + status = count; + + return status; +#endif +} + +/*-----------------------------------------------------------------------*/ + +/* sysfs attributes for hwmon */ + +static ssize_t show_info(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + //struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 b[4]; + + memset(b, 0, 4); + + mutex_lock(&data->update_lock); + status = cpld_i2c_read(client, b, CPLD_INFO_OFFSET, 4); + mutex_unlock(&data->update_lock); + + if(status != 4) return sprintf(buf, "read cpld info fail\n"); + + status = sprintf (buf, "The CPLD release date is %02d/%02d/%d.\n", b[2] & 0xf, (b[3] & 0x1f), 2014+(b[2] >> 4)); /* mm/dd/yyyy*/ + status = sprintf (buf, "%sThe PCB version is %X%X\n", buf, b[0]>>4, b[0]&0xf); + status = sprintf (buf, "%sThe CPLD version is %d.%d\n", buf, b[1]>>4, b[1]&0xf); + + return strlen(buf); +} + + +static ssize_t show_ctl(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + //struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 b[1]; + + mutex_lock(&data->update_lock); + + status = cpld_i2c_read(client, b, CPLD_CTL_OFFSET, 1); + + mutex_unlock(&data->update_lock); + + if(status != 1) return sprintf(buf, "read cpld ctl fail\n"); + + + status = sprintf (buf, "0x%X\n", b[0]); + + return strlen(buf); +} + +static ssize_t set_ctl(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + //struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte; + + u8 temp = simple_strtol(buf, NULL, 10); + + mutex_lock(&data->update_lock); + cpld_i2c_read(client, &byte, CPLD_CTL_OFFSET, 1); + if(temp) byte |= (1<<0); + else byte &= ~(1<<0); + cpld_i2c_write(client, &byte, CPLD_CTL_OFFSET, 1); + mutex_unlock(&data->update_lock); + + return count; +} + + +static char* led_str[] = { + "OFF", //000 + "0.5 Hz", //001 + "1 Hz", //010 + "2 Hz", //011 + "NA", //100 + "NA", //101 + "NA", //110 + "ON", //111 +}; + +static ssize_t show_led(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte; + int shift = (attr->index == 0)?3:0; + + mutex_lock(&data->update_lock); + status = cpld_i2c_read(client, &byte, CPLD_LED_OFFSET, 1); + mutex_unlock(&data->update_lock); + + if(status != 1) return sprintf(buf, "read cpld offset 0x%x\n", CPLD_LED_OFFSET); + + byte = (byte >> shift) & 0x7; + + /* + 0: off + 1: 0.5hz + 2: 1 hz + 3: 2 hz + 4~6: not define + 7: on + */ + + status = sprintf (buf, "%d: %s\n", byte, led_str[byte]); + + return strlen(buf); +} + +static ssize_t set_led(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + + u8 temp = simple_strtol(buf, NULL, 16); + u8 byte; + int shift = (attr->index == 0)?3:0; + + temp &= 0x7; + //validate temp value: 0,1,2,3,7, TBD + + mutex_lock(&data->update_lock); + cpld_i2c_read(client, &byte, CPLD_LED_OFFSET, 1); + byte &= ~(0x7<update_lock); + + return count; +} + +/* +CPLD report the PSU0 status +000 = PSU normal operation +100 = PSU fault +010 = PSU unpowered +111 = PSU not installed + +7 6 | 5 4 3 | 2 1 0 +---------------------- + | psu0 | psu1 +*/ +static char* psu_str[] = { + "normal", //000 + "NA", //001 + "unpowered", //010 + "NA", //011 + "fault", //100 + "NA", //101 + "NA", //110 + "not installed", //111 +}; + +static ssize_t show_psu(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte; + int shift = (attr->index == 1)?0:3; + + mutex_lock(&data->update_lock); + status = cpld_i2c_read(client, &byte, CPLD_PSU_OFFSET, 1); + mutex_unlock(&data->update_lock); + + byte = (byte >> shift) & 0x7; + + status = sprintf (buf, "%d : %s\n", byte, psu_str[byte]); + + return strlen(buf); +} + + +static SENSOR_DEVICE_ATTR(info, S_IRUGO, show_info, 0, 0); +static SENSOR_DEVICE_ATTR(ctl, S_IWUSR|S_IRUGO, show_ctl, set_ctl, 0); + +static SENSOR_DEVICE_ATTR(grn_led, S_IWUSR|S_IRUGO, show_led, set_led, 0); +static SENSOR_DEVICE_ATTR(red_led, S_IWUSR|S_IRUGO, show_led, set_led, 1); + +static SENSOR_DEVICE_ATTR(psu0, S_IRUGO, show_psu, 0, 0); +static SENSOR_DEVICE_ATTR(psu1, S_IRUGO, show_psu, 0, 1); + +static struct attribute *cpld_attributes[] = { + //info + &sensor_dev_attr_info.dev_attr.attr, + &sensor_dev_attr_ctl.dev_attr.attr, + + &sensor_dev_attr_grn_led.dev_attr.attr, + &sensor_dev_attr_red_led.dev_attr.attr, + + &sensor_dev_attr_psu0.dev_attr.attr, + &sensor_dev_attr_psu1.dev_attr.attr, + + NULL +}; + +static const struct attribute_group cpld_group = { + .attrs = cpld_attributes, +}; + +/*-----------------------------------------------------------------------*/ + +/* device probe and removal */ + +static int +cpld_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct cpld_data *data; + int status; + + printk("+%s\n", __func__); + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) + return -EIO; + + data = kzalloc(sizeof(struct cpld_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &cpld_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: sensor '%s'\n", + dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &cpld_group); +exit_free: + i2c_set_clientdata(client, NULL); + kfree(data); + return status; +} + +static int cpld_remove(struct i2c_client *client) +{ + struct cpld_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &cpld_group); + i2c_set_clientdata(client, NULL); + kfree(data); + return 0; +} + +static const struct i2c_device_id cpld_ids[] = { + { "inv_cpld", 0, }, + { /* LIST END */ } +}; +MODULE_DEVICE_TABLE(i2c, cpld_ids); + +static struct i2c_driver cpld_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "inv_cpld", + }, + .probe = cpld_probe, + .remove = cpld_remove, + .id_table = cpld_ids, +}; + +/*-----------------------------------------------------------------------*/ + +/* module glue */ + +static int __init inv_cpld_init(void) +{ + return i2c_add_driver(&cpld_driver); +} + +static void __exit inv_cpld_exit(void) +{ + i2c_del_driver(&cpld_driver); +} + +MODULE_AUTHOR("eddie.lan "); +MODULE_DESCRIPTION("inv cpld driver"); +MODULE_LICENSE("GPL"); + +module_init(inv_cpld_init); +module_exit(inv_cpld_exit); diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_eeprom.c b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_eeprom.c new file mode 100644 index 000000000000..3d13f3b04719 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_eeprom.c @@ -0,0 +1,181 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include + + +/* Size of EEPROM in bytes */ +#define EEPROM_SIZE 256 + +#define SLICE_BITS (6) +#define SLICE_SIZE (1 << SLICE_BITS) +#define SLICE_NUM (EEPROM_SIZE/SLICE_SIZE) + +/* Each client has this additional data */ +struct eeprom_data { + struct mutex update_lock; + u8 valid; /* bitfield, bit!=0 if slice is valid */ + unsigned long last_updated[SLICE_NUM]; /* In jiffies, 8 slices */ + u8 data[EEPROM_SIZE]; /* Register values */ +}; + + +static void inv_eeprom_update_client(struct i2c_client *client, u8 slice) +{ + struct eeprom_data *data = i2c_get_clientdata(client); + int i, j; + int ret; + int addr; + + + mutex_lock(&data->update_lock); + + if (!(data->valid & (1 << slice)) || + time_after(jiffies, data->last_updated[slice] + 300 * HZ)) { + dev_dbg(&client->dev, "Starting eeprom update, slice %u\n", slice); + + addr = slice << SLICE_BITS; + + ret = i2c_smbus_write_byte_data(client, ((u8)addr >> 8) & 0xFF, (u8)addr & 0xFF); + /* select the eeprom address */ + if (ret < 0) { + dev_err(&client->dev, "address set failed\n"); + goto exit; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE)) { + goto exit; + } + + for (i = slice << SLICE_BITS; i < (slice + 1) << SLICE_BITS; i+= SLICE_SIZE) { + for (j = i; j < (i+SLICE_SIZE); j++) { + int res; + + res = i2c_smbus_read_byte(client); + if (res < 0) { + goto exit; + } + + data->data[j] = res & 0xFF; + } + } + + data->last_updated[slice] = jiffies; + data->valid |= (1 << slice); + } + +exit: + mutex_unlock(&data->update_lock); +} + +static ssize_t inv_eeprom_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + u8 slice; + + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + /* Only refresh slices which contain requested bytes */ + for (slice = off >> SLICE_BITS; slice <= (off + count - 1) >> SLICE_BITS; slice++) { + inv_eeprom_update_client(client, slice); + } + + memcpy(buf, &data->data[off], count); + + return count; +} + +static struct bin_attribute inv_eeprom_attr = { + .attr = { + .name = "eeprom", + .mode = S_IRUGO, + }, + .size = EEPROM_SIZE, + .read = inv_eeprom_read, +}; + +static int inv_eeprom_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct eeprom_data *data; + int err; + + if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) { + err = -ENOMEM; + goto exit; + } + + memset(data->data, 0xff, EEPROM_SIZE); + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* create the sysfs eeprom file */ + err = sysfs_create_bin_file(&client->dev.kobj, &inv_eeprom_attr); + if (err) { + goto exit_kfree; + } + + return 0; + +exit_kfree: + kfree(data); +exit: + return err; +} + +static int inv_eeprom_remove(struct i2c_client *client) +{ + sysfs_remove_bin_file(&client->dev.kobj, &inv_eeprom_attr); + kfree(i2c_get_clientdata(client)); + + return 0; +} + +static const struct i2c_device_id inv_eeprom_id[] = { + { "inv_eeprom", 0 }, + { } +}; + +static struct i2c_driver inv_eeprom_driver = { + .driver = { + .name = "inv_eeprom", + }, + .probe = inv_eeprom_probe, + .remove = inv_eeprom_remove, + .id_table = inv_eeprom_id, +}; + +module_i2c_driver(inv_eeprom_driver); + +MODULE_AUTHOR("Inventec"); +MODULE_DESCRIPTION("Inventec D7054 Mother Board EEPROM driver"); +MODULE_LICENSE("GPL"); + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_platform.c b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_platform.c new file mode 100644 index 000000000000..ea26970075b0 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_platform.c @@ -0,0 +1,219 @@ +#include +//#include +#include +#include +#include +#include +#include + +#include +//#include +//#include + +//#include +//#define IO_EXPAND_BASE 64 +//#define IO_EXPAND_NGPIO 16 + +struct inv_i2c_board_info { + int ch; + int size; + struct i2c_board_info *board_info; +}; + +#define bus_id(id) (id) +static struct pca954x_platform_mode mux_modes_0[] = { + {.adap_id = bus_id(2),}, {.adap_id = bus_id(3),}, + {.adap_id = bus_id(4),}, {.adap_id = bus_id(5),}, + {.adap_id = bus_id(6),}, {.adap_id = bus_id(7),}, + {.adap_id = bus_id(8),}, {.adap_id = bus_id(9),}, +}; +static struct pca954x_platform_mode mux_modes_0_0[] = { + {.adap_id = bus_id(10),}, {.adap_id = bus_id(11),}, + {.adap_id = bus_id(12),}, {.adap_id = bus_id(13),}, + {.adap_id = bus_id(14),}, {.adap_id = bus_id(15),}, + {.adap_id = bus_id(16),}, {.adap_id = bus_id(17),}, +}; + +static struct pca954x_platform_mode mux_modes_0_1[] = { + {.adap_id = bus_id(18),}, {.adap_id = bus_id(19),}, + {.adap_id = bus_id(20),}, {.adap_id = bus_id(21),}, + {.adap_id = bus_id(22),}, {.adap_id = bus_id(23),}, + {.adap_id = bus_id(24),}, {.adap_id = bus_id(25),}, +}; + +static struct pca954x_platform_mode mux_modes_0_2[] = { + {.adap_id = bus_id(26),}, {.adap_id = bus_id(27),}, + {.adap_id = bus_id(28),}, {.adap_id = bus_id(29),}, + {.adap_id = bus_id(30),}, {.adap_id = bus_id(31),}, + {.adap_id = bus_id(32),}, {.adap_id = bus_id(33),}, +}; + +static struct pca954x_platform_mode mux_modes_0_3[] = { + {.adap_id = bus_id(34),}, {.adap_id = bus_id(35),}, + {.adap_id = bus_id(36),}, {.adap_id = bus_id(37),}, + {.adap_id = bus_id(38),}, {.adap_id = bus_id(39),}, + {.adap_id = bus_id(40),}, {.adap_id = bus_id(41),}, +}; + +static struct pca954x_platform_mode mux_modes_0_4[] = { + {.adap_id = bus_id(42),}, {.adap_id = bus_id(43),}, + {.adap_id = bus_id(44),}, {.adap_id = bus_id(45),}, + {.adap_id = bus_id(46),}, {.adap_id = bus_id(47),}, + {.adap_id = bus_id(48),}, {.adap_id = bus_id(49),}, +}; + +static struct pca954x_platform_mode mux_modes_0_5[] = { + {.adap_id = bus_id(50),}, {.adap_id = bus_id(51),}, + {.adap_id = bus_id(52),}, {.adap_id = bus_id(53),}, + {.adap_id = bus_id(54),}, {.adap_id = bus_id(55),}, + {.adap_id = bus_id(56),}, {.adap_id = bus_id(57),}, +}; + +static struct pca954x_platform_mode mux_modes_0_6[] = { + {.adap_id = bus_id(58),}, {.adap_id = bus_id(59),}, + {.adap_id = bus_id(60),}, {.adap_id = bus_id(61),}, + {.adap_id = bus_id(62),}, {.adap_id = bus_id(63),}, + {.adap_id = bus_id(64),}, {.adap_id = bus_id(65),}, +}; + +//no i2c device driver attach to mux 7 + + +static struct pca954x_platform_data mux_data_0 = { + .modes = mux_modes_0, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_0 = { + .modes = mux_modes_0_0, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_1 = { + .modes = mux_modes_0_1, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_2 = { + .modes = mux_modes_0_2, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_3 = { + .modes = mux_modes_0_3, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_4 = { + .modes = mux_modes_0_4, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_5 = { + .modes = mux_modes_0_5, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_6 = { + .modes = mux_modes_0_6, + .num_modes = 8, +}; + +static struct i2c_board_info i2c_device_info0[] __initdata = { + {"inv_psoc", 0, 0x66, 0, 0, 0},//psoc + {"inv_cpld", 0, 0x55, 0, 0, 0},//cpld + {"pca9548", 0, 0x71, &mux_data_0, 0, 0}, +}; + +static struct i2c_board_info i2c_device_info2[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_0, 0, 0}, +}; +static struct i2c_board_info i2c_device_info3[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_1, 0, 0}, +}; +static struct i2c_board_info i2c_device_info4[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_2, 0, 0}, +}; +static struct i2c_board_info i2c_device_info5[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_3, 0, 0}, +}; +static struct i2c_board_info i2c_device_info6[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_4, 0, 0}, +}; +static struct i2c_board_info i2c_device_info7[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_5, 0, 0}, +}; +static struct i2c_board_info i2c_device_info8[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_6, 0, 0}, +}; + + +static struct inv_i2c_board_info i2cdev_list[] = { + {0, ARRAY_SIZE(i2c_device_info0), i2c_device_info0 }, //smbus 0 + + {bus_id(2), ARRAY_SIZE(i2c_device_info2), i2c_device_info2 }, //mux 0 + {bus_id(3), ARRAY_SIZE(i2c_device_info3), i2c_device_info3 }, //mux 1 + {bus_id(4), ARRAY_SIZE(i2c_device_info4), i2c_device_info4 }, //mux 2 + {bus_id(5), ARRAY_SIZE(i2c_device_info5), i2c_device_info5 }, //mux 3 + {bus_id(6), ARRAY_SIZE(i2c_device_info6), i2c_device_info6 }, //mux 4 + {bus_id(7), ARRAY_SIZE(i2c_device_info7), i2c_device_info7 }, //mux 5 + {bus_id(8), ARRAY_SIZE(i2c_device_info8), i2c_device_info8 }, //mux 6 + +}; + +///////////////////////////////////////////////////////////////////////////////////////// +#if 0 +static struct i2c_gpio_platform_data i2c_gpio_platdata0 = { + .scl_pin = 58, + .sda_pin = 75, + + .udelay = 5, //5:100kHz + .sda_is_open_drain = 0, + .scl_is_open_drain = 0, + .scl_is_output_only = 0 +}; + +static struct platform_device device_i2c_gpio0 = { + .name = "i2c-gpio", + .id = 0, // adapter number + .dev.platform_data = &i2c_gpio_platdata0, +}; +#endif +static int __init inv_platform_init(void) +{ + struct i2c_adapter *adap = NULL; + struct i2c_client *e = NULL; + int ret = 0; + int i,j; + + printk("%s \n", __func__); + +#if 0 + //use i2c-gpio + //register i2c gpio + //config gpio58,75 to gpio function 58=32+3*8+2 75=32*2+8*1+3 + outl( inl(0x533) | (1<<2), 0x533); + outl( inl(0x541) | (1<<3), 0x541); + + ret = platform_device_register(&device_i2c_gpio0); + if (ret) { + printk(KERN_ERR "i2c-gpio: device_i2c_gpio0 register fail %d\n", ret); + } + #endif + for(i=0; i +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include "I2CHostCommunication.h" + +#define IMPLEMENT_IPMI_CODE 1 +int USE_IPMI=0; +//================================= +#if IMPLEMENT_IPMI_CODE +#include +#include +#include +#include + +#define IPMI_MAX_INTF (4) +#define NETFN_OEM 0x30 +#define CMD_GETDATA 0x31 +#define CMD_SETDATA 0x32 + +struct mutex ipmi_mutex; + +static void msg_handler(struct ipmi_recv_msg *msg,void* handler_data); +static ipmi_user_t ipmi_mh_user = NULL; +static struct ipmi_user_hndl ipmi_hndlrs = { .ipmi_recv_hndl = msg_handler,}; + +static atomic_t dummy_count = ATOMIC_INIT(0); +static void dummy_smi_free(struct ipmi_smi_msg *msg) +{ + atomic_dec(&dummy_count); +} +static void dummy_recv_free(struct ipmi_recv_msg *msg) +{ + atomic_dec(&dummy_count); +} +static struct ipmi_smi_msg halt_smi_msg = { + .done = dummy_smi_free +}; +static struct ipmi_recv_msg halt_recv_msg = { + .done = dummy_recv_free +}; +#endif +//================================= + +#define USE_SMBUS 1 + +#define FAN_NUM 4 +#define PSU_NUM 2 + +struct __attribute__ ((__packed__)) psoc_psu_layout { + u16 psu1_iin; + u16 psu2_iin; + u16 psu1_iout; + u16 psu2_iout; + + u16 psu1_pin; + u16 psu2_pin; + u16 psu1_pout; + u16 psu2_pout; + + u16 psu1_vin; + u16 psu2_vin; + u16 psu1_vout; + u16 psu2_vout; +}; + +struct __attribute__ ((__packed__)) psoc_layout { + u8 ctl; //offset: 0 + u16 switch_temp; //offset: 1 + u8 reserve0; //offset: 3 + + u8 fw_upgrade; //offset: 4 + + //i2c bridge + u8 i2c_st; //offset: 5 + u8 i2c_ctl; //offset: 6 + u8 i2c_addr; //offset: 7 + u8 i2c_data[0x20]; //offset: 8 + + //gpo + u8 led_ctl; //offset: 28 + + u8 gpio; //offset: 29 + + //pwm duty + u8 pwm[FAN_NUM]; //offset: 2a + u8 pwm_psu[PSU_NUM]; //offset: 2e + + //fan rpm + u16 fan[FAN_NUM*2]; //offset: 30 + + u8 reserve1[4]; //offset: 40 + + //gpi + u8 gpi_fan; //offset: 44 + + //psu state + u8 psu_state; //offset: 45 + + //temperature + u16 temp[5]; //offset: 46 + u16 temp_psu[PSU_NUM]; //offset: 50 + + //version + u8 version[2]; //offset: 54 + + u8 reserve2[4]; //offset: 56 + struct psoc_psu_layout psu_info; //offset: 5a +}; + +/* definition */ +/* definition */ +#define PSOC_OFF(m) offsetof(struct psoc_layout, m) +#define PSOC_PSU_OFF(m) offsetof(struct psoc_psu_layout, m) + +#define SWITCH_TMP_OFFSET PSOC_OFF(switch_temp) +#define PWM_OFFSET PSOC_OFF(pwm) +#define THERMAL_OFFSET PSOC_OFF(temp) +#define RPM_OFFSET PSOC_OFF(fan) +#define DIAG_FLAG_OFFSET PSOC_OFF(ctl) +#define FAN_LED_OFFSET PSOC_OFF(led_ctl) +#define FAN_GPI_OFFSET PSOC_OFF(gpi_fan) +#define PSOC_PSU_OFFSET PSOC_OFF(psu_state) +#define VERSION_OFFSET PSOC_OFF(version) +#define PSU_INFO_OFFSET PSOC_OFF(psu_info) + +/* Each client has this additional data */ +struct psoc_data { + struct device *hwmon_dev; + struct mutex update_lock; + u32 diag; +}; + +/*-----------------------------------------------------------------------*/ +#if IMPLEMENT_IPMI_CODE +static void msg_handler(struct ipmi_recv_msg *recv_msg,void* handler_data) +{ + struct completion *comp = recv_msg->user_msg_data; + if (comp) + complete(comp); + else + ipmi_free_recv_msg(recv_msg); + return; +} + +int ipmi_command(char NetFn, char cmd,char *data,int data_length, char* result, int* result_length) +{ + int rv=0,i; + struct ipmi_system_interface_addr addr; + uint8_t _data[data_length]; + struct kernel_ipmi_msg msg; + struct completion comp; + + if(!mutex_trylock(&ipmi_mutex)) return 0; + +// for (i=0,rv=1; iaddr; + msg[0].buf = msgbuf; + msg[0].len = 1; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = buf; + msg[1].len = count; + + status = i2c_transfer(client->adapter, msg, 2); + + if(status == 2) + status = count; + + return status; +#endif +} + +static ssize_t psoc_i2c_write(struct i2c_client *client, char *buf, unsigned offset, size_t count) +{ +#if USE_SMBUS +if(USE_IPMI==0) +{ + int i; + + for(i=0; iaddr; + msg.flags = 0; + + /* msg.buf is u8 and casts will mask the values */ + msg.buf = writebuf; + + msg.buf[i++] = offset; + memcpy(&msg.buf[i], buf, count); + msg.len = i + count; + + status = i2c_transfer(client->adapter, &msg, 1); + if (status == 1) + status = count; + + return status; +#endif +} + +#if 0 +static u32 psoc_read32(struct i2c_client *client, u8 offset) +{ + u32 value = 0; + u8 buf[4]; + + if( psoc_i2c_read(client, buf, offset, 4) == 4) + value = (buf[0]<<24 | buf[1]<<16 | buf[2]<<8 | buf[3]); + + return value; +} +#endif + +static u16 psoc_read16(struct i2c_client *client, u8 offset) +{ + u16 value = 0; + u8 buf[2]; + + if(psoc_i2c_read(client, buf, offset, 2) == 2) + value = (buf[0]<<8 | buf[1]<<0); + + return value; +} + +static u8 psoc_read8(struct i2c_client *client, u8 offset) +{ + u8 value = 0; + u8 buf = 0; + + if(psoc_i2c_read(client, &buf, offset, 1) == 1) + value = buf; + + return value; +} + +//PSOC i2c bridge regsters +#define PSOC_I2C_STATUS 0x05 +#define PSOC_I2C_CNTRL 0x06 +#define PSOC_I2C_ADDR 0x07 +#define PSOC_I2C_DATA 0x08 + +//status bit definition +#define PSOC_I2C_START (1 << 0) +#define PSOC_PMB_SEL (1 << 7) + +//addr bits definition +#define PSOC_I2C_READ (1 << 0) + +//PMBUS registers definition +#define PMBUS_READ_VIN (0x88) +#define PMBUS_READ_IIN (0x89) +#define PMBUS_READ_VOUT (0x8B) +#define PMBUS_READ_IOUT (0x8C) +#define PMBUS_READ_POUT (0x96) +#define PMBUS_READ_PIN (0x97) + +/* +CPLD report the PSU0 status +000 = PSU normal operation +100 = PSU fault +010 = PSU unpowered +111 = PSU not installed + +7 6 | 5 4 3 | 2 1 0 +---------------------- + | psu1 | psu0 +*/ +static char* psu_str[] = { + "normal", //000 + "NA", //001 + "unpowered", //010 + "NA", //011 + "fault", //100 + "NA", //101 + "NA", //110 + "not installed", //111 +}; + +static ssize_t show_psu_st(struct device *dev, struct device_attribute *da, + char *buf) +{ + u32 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 byte; + int shift = (attr->index == 0)?3:0; + + mutex_lock(&data->update_lock); + status = psoc_i2c_read(client, &byte, PSOC_PSU_OFFSET, 1); + mutex_unlock(&data->update_lock); + + byte = (byte >> shift) & 0x7; + + status = sprintf (buf, "%d : %s\n", byte, psu_str[byte]); + + return strlen(buf); +} + +/*-----------------------------------------------------------------------*/ + +/* sysfs attributes for hwmon */ +#define PSU1 0x5800 +#define PSU2 0x5900 +#define BMC_I2cBus 3 //BMC's I2C-1 +#define PMBus_Vender 0x99 +#define PMBus_Serial 0x9E +#define PMBus_Temp2 0x8E +#define PMBus_Version 0x9B +#define MaxLeng_Result 0x20 +#define MaxLog +static long pmbus_reg2data_linear(int data, int linear16); + + +static ssize_t show_ipmi_i2c(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + uint8_t data[4],result[MaxLeng_Result]; + int result_len; + + data[0] = BMC_I2cBus; + data[1] = (attr->index & 0xFF00 ) >>7; + data[3] = attr->index & 0xff; + if(data[3]==PMBus_Temp2) + data[2]=2; + else + data[2]=MaxLeng_Result; + + if(ipmi_command(0x06, 0x52,data,4, result, &result_len)==0) + { + if(data[3]==PMBus_Temp2) + { + return sprintf(buf, "%ld \n", pmbus_reg2data_linear(result[0] | (result[1]<<8), 0 )); + } + result[result[0]+1]='\0'; + + return sprintf(buf, "%s\n",&result[1] ); + } + else + return 0; +} + +static ssize_t show_ipmi_sollog(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + uint8_t data[5],result[256]; + int result_len; + uint32_t i; + + for(i=0;i<0xffffff;i+=255) + { + data[0] = attr->index; + data[1] = (i & 0x0000ff); + data[2] = (i & 0x00ff00)>>8; + data[3] = (i & 0xff0000)>>16; + data[4] = 0; + + result_len=0; + + if(ipmi_command(0x32, 0xFE, data, 5, result, &result_len)==0) + { + if(result_len==0) break; + result[result_len+1]='\0'; + printk("%s",result); + } + else break; + + if(result_len==0) break; + } + + return 0; +} + +static ssize_t show_thermal(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index * 2 + THERMAL_OFFSET; + + mutex_lock(&data->update_lock); + + status = psoc_read16(client, offset); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", + (s8)(status>>8) * 1000 ); +} + + + +static ssize_t show_pwm(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index + PWM_OFFSET; + + mutex_lock(&data->update_lock); + + status = psoc_read8(client, offset); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", + status); +} + +static ssize_t set_pwm(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index + PWM_OFFSET; + + u8 pwm = simple_strtol(buf, NULL, 10); + if(pwm > 255) pwm = 255; + + if(data->diag) { + mutex_lock(&data->update_lock); + psoc_i2c_write(client, &pwm, offset, 1); + mutex_unlock(&data->update_lock); + } + + return count; +} + + +static ssize_t show_rpm(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index*2 + RPM_OFFSET; + + mutex_lock(&data->update_lock); + + status = psoc_read16(client, offset); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", + status); +} + +static ssize_t show_switch_tmp(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status; + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u16 temp = 0; + + mutex_lock(&data->update_lock); + status = psoc_i2c_read(client, (u8*)&temp, SWITCH_TMP_OFFSET, 2); + mutex_unlock(&data->update_lock); + + status = sprintf (buf, "%d\n", (s8)(temp>>8) * 1000 ); + + return strlen(buf); +} + +static ssize_t set_switch_tmp(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + //struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + + long temp = simple_strtol(buf, NULL, 10); + u16 temp2 = ( (temp/1000) <<8 ) & 0xFF00 ; + + //printk("set_switch_tmp temp=%d, temp2=0x%x (%x,%x)\n", temp, temp2, ( ( (temp/1000) <<8 ) & 0xFF00 ), (( (temp%1000) / 10 ) & 0xFF)); + + mutex_lock(&data->update_lock); + psoc_i2c_write(client, (u8*)&temp2, SWITCH_TMP_OFFSET, 2); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_diag(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status; + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 diag_flag = 0; + + mutex_lock(&data->update_lock); + status = psoc_i2c_read(client, (u8*)&diag_flag, DIAG_FLAG_OFFSET, 1); + mutex_unlock(&data->update_lock); + + data->diag = (diag_flag & 0x80)?1:0; + status = sprintf (buf, "%d\n", data->diag); + + return strlen(buf); +} + +static ssize_t set_diag(struct device *dev, + struct device_attribute *devattr, + const char *buf, size_t count) +{ + //struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 value = 0; + u8 diag = simple_strtol(buf, NULL, 10); + + diag = diag?1:0; + data->diag = diag; + + mutex_lock(&data->update_lock); + psoc_i2c_read(client, (u8*)&value, DIAG_FLAG_OFFSET, 1); + if(diag) value |= (1<<7); + else value &= ~(1<<7); + psoc_i2c_write(client, (u8*)&value, DIAG_FLAG_OFFSET, 1); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_version(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status; + //struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->update_lock); + + status = psoc_read16(client, VERSION_OFFSET); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "ver: %x.%x\n", (status & 0xFF00)>>8, (status & 0xFF) ); +} + + +static ssize_t show_fan_led(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 bit = attr->index; + + mutex_lock(&data->update_lock); + + status = psoc_read8(client, FAN_LED_OFFSET); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", + (status & (1<index; + u8 led_state = 0; + + u8 v = simple_strtol(buf, NULL, 10); + + if(data->diag) { + mutex_lock(&data->update_lock); + led_state = psoc_read8(client, FAN_LED_OFFSET); + if(v) led_state |= (1<update_lock); + } + + return count; +} + +static ssize_t show_value8(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index; + + mutex_lock(&data->update_lock); + + status = psoc_read8(client, offset); + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "0x%02X\n", status ); +} + +static long pmbus_reg2data_linear(int data, int linear16) +{ + s16 exponent; + s32 mantissa; + long val; + + if (linear16) { /* LINEAR16 */ + exponent = -9; + mantissa = (u16) data; + } else { /* LINEAR11 */ + exponent = ((s16)data) >> 11; + exponent = ((s16)( data & 0xF800) ) >> 11; + mantissa = ((s32)((data & 0x7ff) << 5)) >> 5; + } + + //printk("data=%d, m=%d, e=%d\n", data, exponent, mantissa); + val = mantissa; + + /* scale result to micro-units for power sensors */ + val = val * 1000L; + + if (exponent >= 0) + val <<= exponent; + else + val >>= -exponent; + + return val; +} + +static ssize_t show_psu_psoc(struct device *dev, struct device_attribute *da, + char *buf) +{ + u16 status; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psoc_data *data = i2c_get_clientdata(client); + u8 offset = attr->index + PSU_INFO_OFFSET; + + mutex_lock(&data->update_lock); + status = psoc_read16(client, offset); + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%ld \n", pmbus_reg2data_linear(status, strstr(attr->dev_attr.attr.name, "vout")? 1:0 )); +} + + + +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_thermal, 0, 0); +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_thermal, 0, 1); +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, show_thermal, 0, 2); +static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, show_thermal, 0, 3); +static SENSOR_DEVICE_ATTR(temp5_input, S_IRUGO, show_thermal, 0, 4); +static SENSOR_DEVICE_ATTR(thermal_psu1, S_IRUGO, show_thermal, 0, 5); +static SENSOR_DEVICE_ATTR(thermal_psu2, S_IRUGO, show_thermal, 0, 6); + +static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 0); +static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 1); +static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 2); +static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 3); +static SENSOR_DEVICE_ATTR(pwm_psu1, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 4); +static SENSOR_DEVICE_ATTR(pwm_psu2, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 5); + +static SENSOR_DEVICE_ATTR(psu0, S_IRUGO, show_psu_st, 0, 0); +static SENSOR_DEVICE_ATTR(psu1, S_IRUGO, show_psu_st, 0, 1); + +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_rpm, 0, 0); +static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_rpm, 0, 1); +static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_rpm, 0, 2); +static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_rpm, 0, 3); +static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_rpm, 0, 4); +static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_rpm, 0, 5); +static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_rpm, 0, 6); +static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_rpm, 0, 7); +static SENSOR_DEVICE_ATTR(rpm_psu1, S_IRUGO, show_rpm, 0, 8); +static SENSOR_DEVICE_ATTR(rpm_psu2, S_IRUGO, show_rpm, 0, 9); + +static SENSOR_DEVICE_ATTR(switch_tmp, S_IWUSR|S_IRUGO, show_switch_tmp, set_switch_tmp, 0); + +static SENSOR_DEVICE_ATTR(diag, S_IWUSR|S_IRUGO, show_diag, set_diag, 0); +static SENSOR_DEVICE_ATTR(version, S_IRUGO, show_version, 0, 0); + +static SENSOR_DEVICE_ATTR(fan_led_grn1, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 0); +static SENSOR_DEVICE_ATTR(fan_led_grn2, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 1); +static SENSOR_DEVICE_ATTR(fan_led_grn3, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 2); +static SENSOR_DEVICE_ATTR(fan_led_grn4, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 3); +static SENSOR_DEVICE_ATTR(fan_led_red1, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 4); +static SENSOR_DEVICE_ATTR(fan_led_red2, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 5); +static SENSOR_DEVICE_ATTR(fan_led_red3, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 6); +static SENSOR_DEVICE_ATTR(fan_led_red4, S_IWUSR|S_IRUGO, show_fan_led, set_fan_led, 7); + +static SENSOR_DEVICE_ATTR(fan_gpi, S_IRUGO, show_value8, 0, FAN_GPI_OFFSET); +static SENSOR_DEVICE_ATTR(psoc_psu1_vin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_vin)); +static SENSOR_DEVICE_ATTR(psoc_psu1_vout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_vout)); +static SENSOR_DEVICE_ATTR(psoc_psu1_iin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_iin)); +static SENSOR_DEVICE_ATTR(psoc_psu1_iout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_iout)); +static SENSOR_DEVICE_ATTR(psoc_psu1_pin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_pin)); +static SENSOR_DEVICE_ATTR(psoc_psu1_pout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu1_pout)); + + +static SENSOR_DEVICE_ATTR(psoc_psu2_vin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_vin)); +static SENSOR_DEVICE_ATTR(psoc_psu2_vout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_vout)); +static SENSOR_DEVICE_ATTR(psoc_psu2_iin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_iin)); +static SENSOR_DEVICE_ATTR(psoc_psu2_iout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_iout)); +static SENSOR_DEVICE_ATTR(psoc_psu2_pin, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_pin)); +static SENSOR_DEVICE_ATTR(psoc_psu2_pout, S_IRUGO, show_psu_psoc, 0, PSOC_PSU_OFF(psu2_pout)); + +//IPMI +static SENSOR_DEVICE_ATTR(thermal2_psu1, S_IRUGO, show_ipmi_i2c, 0, PSU1 | PMBus_Temp2); +static SENSOR_DEVICE_ATTR(psoc_psu1_vender, S_IRUGO, show_ipmi_i2c, 0, PSU1 | PMBus_Vender); +static SENSOR_DEVICE_ATTR(psoc_psu1_serial, S_IRUGO, show_ipmi_i2c, 0, PSU1 | PMBus_Serial); +static SENSOR_DEVICE_ATTR(psoc_psu1_version, S_IRUGO, show_ipmi_i2c, 0, PSU1 | PMBus_Version); + +static SENSOR_DEVICE_ATTR(thermal2_psu2, S_IRUGO, show_ipmi_i2c, 0, PSU2 | PMBus_Temp2); +static SENSOR_DEVICE_ATTR(psoc_psu2_vender, S_IRUGO, show_ipmi_i2c, 0, PSU2 | PMBus_Vender); +static SENSOR_DEVICE_ATTR(psoc_psu2_serial, S_IRUGO, show_ipmi_i2c, 0, PSU2 | PMBus_Serial); +static SENSOR_DEVICE_ATTR(psoc_psu2_version, S_IRUGO, show_ipmi_i2c, 0, PSU2 | PMBus_Version); + +static SENSOR_DEVICE_ATTR(sollog1, S_IRUGO, show_ipmi_sollog, 0, 1); +static SENSOR_DEVICE_ATTR(sollog2, S_IRUGO, show_ipmi_sollog, 0, 2); + +static struct attribute *psoc_attributes[] = { + //thermal + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp2_input.dev_attr.attr, + &sensor_dev_attr_temp3_input.dev_attr.attr, + &sensor_dev_attr_temp4_input.dev_attr.attr, + &sensor_dev_attr_temp5_input.dev_attr.attr, + + &sensor_dev_attr_thermal_psu1.dev_attr.attr, + &sensor_dev_attr_thermal_psu2.dev_attr.attr, + + + //pwm + &sensor_dev_attr_pwm1.dev_attr.attr, + &sensor_dev_attr_pwm2.dev_attr.attr, + &sensor_dev_attr_pwm3.dev_attr.attr, + &sensor_dev_attr_pwm4.dev_attr.attr, + &sensor_dev_attr_pwm_psu1.dev_attr.attr, + &sensor_dev_attr_pwm_psu2.dev_attr.attr, + + //rpm + &sensor_dev_attr_fan1_input.dev_attr.attr, + &sensor_dev_attr_fan2_input.dev_attr.attr, + &sensor_dev_attr_fan3_input.dev_attr.attr, + &sensor_dev_attr_fan4_input.dev_attr.attr, + &sensor_dev_attr_fan5_input.dev_attr.attr, + &sensor_dev_attr_fan6_input.dev_attr.attr, + &sensor_dev_attr_fan7_input.dev_attr.attr, + &sensor_dev_attr_fan8_input.dev_attr.attr, + + &sensor_dev_attr_rpm_psu1.dev_attr.attr, + &sensor_dev_attr_rpm_psu2.dev_attr.attr, + + //switch temperature + &sensor_dev_attr_switch_tmp.dev_attr.attr, + + //diag flag + &sensor_dev_attr_diag.dev_attr.attr, + + //version + &sensor_dev_attr_version.dev_attr.attr, + + //fan led + &sensor_dev_attr_fan_led_grn1.dev_attr.attr, + &sensor_dev_attr_fan_led_grn2.dev_attr.attr, + &sensor_dev_attr_fan_led_grn3.dev_attr.attr, + &sensor_dev_attr_fan_led_grn4.dev_attr.attr, + &sensor_dev_attr_fan_led_red1.dev_attr.attr, + &sensor_dev_attr_fan_led_red2.dev_attr.attr, + &sensor_dev_attr_fan_led_red3.dev_attr.attr, + &sensor_dev_attr_fan_led_red4.dev_attr.attr, + + //fan GPI + &sensor_dev_attr_fan_gpi.dev_attr.attr, + &sensor_dev_attr_psu0.dev_attr.attr, + &sensor_dev_attr_psu1.dev_attr.attr, + + + //psu_psoc, new added on psoc 1.9 + &sensor_dev_attr_psoc_psu1_vin.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_vout.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_iin.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_iout.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_pin.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_pout.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_vin.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_vout.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_iin.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_iout.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_pin.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_pout.dev_attr.attr, + + //ipmi_command + &sensor_dev_attr_thermal2_psu1.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_vender.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_serial.dev_attr.attr, + &sensor_dev_attr_psoc_psu1_version.dev_attr.attr, + + &sensor_dev_attr_thermal2_psu2.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_vender.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_serial.dev_attr.attr, + &sensor_dev_attr_psoc_psu2_version.dev_attr.attr, + + &sensor_dev_attr_sollog1.dev_attr.attr, + &sensor_dev_attr_sollog2.dev_attr.attr, + + NULL +}; + +static const struct attribute_group psoc_group = { + .attrs = psoc_attributes, +}; + +/*-----------------------------------------------------------------------*/ + +/* device probe and removal */ + +static int +psoc_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct psoc_data *data; + int status,i,rv; + + printk("+%s\n", __func__); + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) + return -EIO; + + data = kzalloc(sizeof(struct psoc_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + data->diag = 0; + +#if IMPLEMENT_IPMI_CODE + for (i=0,rv=1; idev.kobj, &psoc_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: sensor '%s'\n", + dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &psoc_group); +exit_free: + i2c_set_clientdata(client, NULL); + kfree(data); + return status; +} + +static int psoc_remove(struct i2c_client *client) +{ + struct psoc_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &psoc_group); + i2c_set_clientdata(client, NULL); + kfree(data); + return 0; +} + +static const struct i2c_device_id psoc_ids[] = { + { "inv_psoc", 0, }, + { /* LIST END */ } +}; +MODULE_DEVICE_TABLE(i2c, psoc_ids); + +static struct i2c_driver psoc_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "inv_psoc", + }, + .probe = psoc_probe, + .remove = psoc_remove, + .id_table = psoc_ids, +}; + +/*-----------------------------------------------------------------------*/ + +/* module glue */ + +static int __init inv_psoc_init(void) +{ + return i2c_add_driver(&psoc_driver); +} + +static void __exit inv_psoc_exit(void) +{ + i2c_del_driver(&psoc_driver); +} + +MODULE_AUTHOR("eddie.lan "); +MODULE_DESCRIPTION("inv psoc driver"); +MODULE_LICENSE("GPL"); + +module_init(inv_psoc_init); +module_exit(inv_psoc_exit); diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_swps.c b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_swps.c new file mode 100644 index 000000000000..08bd490e63b6 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_swps.c @@ -0,0 +1,730 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "inv_swps.h" + +static int port_major; +static int ioexp_total; +static int port_total; +static struct class *swp_class_p = NULL; +static struct inv_platform_s *platform_p = NULL; +static struct inv_ioexp_layout_s *ioexp_layout = NULL; +static struct inv_port_layout_s *port_layout = NULL; + +static int +__swp_match(struct device *dev, +#ifdef SWPS_KERN_VER_AF_3_10 + + const void *data){ +#else + void *data){ +#endif + + char *name = (char *)data; + if (strcmp(dev_name(dev), name) == 0) + return 1; + return 0; +} + + +struct device * +get_swpdev_by_name(char *name){ + struct device *dev = class_find_device(swp_class_p, + NULL, + name, + (const void *)__swp_match); + return dev; +} + + +static int +sscanf_2_int(const char *buf) { + + int result = -EBFONT; + char *hex_tag = "0x"; + + if (strcspn(buf, hex_tag) == 0) { + if (sscanf(buf,"%x",&result)) { + return result; + } + } else { + if (sscanf(buf,"%d",&result)) { + return result; + } + if(sscanf(buf,"-%d",&result)) { + return -result; + } + if (sscanf(buf,"%x",&result)) { + return result; + } + } + return -EBFONT; +} + + +static int +sscanf_2_binary(const char *buf) { + + int result = sscanf_2_int(buf); + + if (result < 0){ + return -EBFONT; + } + switch (result) { + case 0: + case 1: + return result; + default: + break; + } + return -EBFONT; +} + +/* ========== Show functions: For I/O Expander attribute ========== + */ +static ssize_t +_show_ioexp_binary_attr(struct transvr_obj_s *tobj_p, + int (*get_func)(struct ioexp_obj_s *ioexp_p, int voffset), + char *buf_p) { + size_t len; + struct ioexp_obj_s *ioexp_p = tobj_p->ioexp_obj_p; + + if (!ioexp_p) { + SWPS_ERR(" %s: data corruption! :%s\n", __func__, tobj_p->swp_name); + return -ENODATA; + } + mutex_lock(&ioexp_p->lock); + len = snprintf(buf_p, 8, "%d\n", get_func(ioexp_p, tobj_p->ioexp_virt_offset)); + mutex_unlock(&ioexp_p->lock); + return len; +} + + +static ssize_t +show_attr_present(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_present, + buf_p); +} + +static ssize_t +show_attr_tx_fault(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_tx_fault, + buf_p); +} + +static ssize_t +show_attr_rxlos(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_rxlos, + buf_p); +} + +static ssize_t +show_attr_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_tx_disable, + buf_p); +} + +static ssize_t +show_attr_reset(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_reset, + buf_p); +} + +static ssize_t +show_attr_lpmod(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_lpmod, + buf_p); +} + + +static ssize_t +show_attr_modsel(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_modsel, + buf_p); +} + +/* ========== Store functions: For I/O Expander (R/W) attribute ========== + */ +static ssize_t +_store_ioexp_binary_attr(struct transvr_obj_s *tobj_p, + int (*set_func)(struct ioexp_obj_s *ioexp_p, + int virt_offset, int input_val), + const char *buf_p, + size_t count) { + + int input, err; + struct ioexp_obj_s *ioexp_p = tobj_p->ioexp_obj_p; + + if (!ioexp_p) { + SWPS_ERR("%s: data corruption! :%s\n", + __func__, tobj_p->swp_name); + return -ENODATA; + } + input = sscanf_2_binary(buf_p); + if (input < 0) { + return -EBFONT; + } + mutex_lock(&ioexp_p->lock); + err = set_func(ioexp_p, tobj_p->ioexp_virt_offset, input); + mutex_unlock(&ioexp_p->lock); + if (err < 0){ + return err; + } + return count; +} + +static ssize_t +store_attr_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_tx_disable, + buf_p, + count); +} + +static ssize_t +store_attr_reset(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_reset, + buf_p, + count); +} + + +static ssize_t +store_attr_lpmod(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_lpmod, + buf_p, + count); +} + + +static ssize_t +store_attr_modsel(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_modsel, + buf_p, + count); +} + +/* ========== IO Expander attribute: from expander ========== + */ +static DEVICE_ATTR(present, S_IRUGO, show_attr_present, NULL); +static DEVICE_ATTR(tx_fault, S_IRUGO, show_attr_tx_fault, NULL); +static DEVICE_ATTR(rxlos, S_IRUGO, show_attr_rxlos, NULL); +static DEVICE_ATTR(tx_disable, S_IRUGO|S_IWUSR, show_attr_tx_disable, store_attr_tx_disable); +static DEVICE_ATTR(reset, S_IRUGO|S_IWUSR, show_attr_reset, store_attr_reset); +static DEVICE_ATTR(lpmod, S_IRUGO|S_IWUSR, show_attr_lpmod, store_attr_lpmod); +static DEVICE_ATTR(modsel, S_IRUGO|S_IWUSR, show_attr_modsel, store_attr_modsel); + +/* ========== Functions for module handling ========== + */ +static void +clean_port_obj(void){ + + dev_t dev_num; + char dev_name[32]; + struct device *device_p; + struct transvr_obj_s *transvr_obj_p; + int minor_curr, port_id; + + for (minor_curr=0; minor_curri2c_client_p); + kfree(transvr_obj_p); + } + dev_num = MKDEV(port_major, minor_curr); + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); + } + SWPS_DEBUG("%s: done.\n", __func__); +} + + +static int +get_platform_type(void){ + + char log_msg[64] = "ERROR"; + + platform_p = kzalloc(sizeof(struct inv_platform_s), GFP_KERNEL); + if (!platform_p){ + snprintf(log_msg, sizeof(log_msg), "kzalloc fail"); + goto err_get_platform_type_1; + } + platform_p->id = PLATFORM_SETTINGS; + memset(platform_p->name, 0, sizeof(platform_p->name)); + snprintf(platform_p->name, (sizeof(platform_p->name) - 1), + "%s", platform_map.name); + snprintf(log_msg, sizeof(log_msg), + "User setup platform: %d (%s)", + platform_p->id, platform_p->name); + SWPS_DEBUG("%s: %s, :%d\n", __func__, log_msg, PLATFORM_SETTINGS); + return 0; + +err_get_platform_type_1: + SWPS_ERR("%s: %s :%d\n", __func__, log_msg, PLATFORM_SETTINGS); + return -1; +} + + +static int +get_layout_info(void){ + ioexp_layout = cypress_ga2_ioexp_layout; + port_layout = cypress_ga2_port_layout; + ioexp_total = ARRAY_SIZE(cypress_ga2_ioexp_layout); + port_total = ARRAY_SIZE(cypress_ga2_port_layout); + + SWPS_INFO("Start to initial platform: %d (%s)\n", + platform_p->id, platform_p->name); + return 0; +} + +/* ========== Functions for register something ========== + */ + +static int +register_ioexp_attr_sfp_1(struct device *device_p){ + /* Support machine type: + * - SFP : Magnolia + */ + char *err_attr = NULL; + + if (device_create_file(device_p, &dev_attr_present) < 0) { + err_attr = "dev_attr_present"; + goto err_ioexp_sfp1_attr; + } + if (device_create_file(device_p, &dev_attr_tx_fault) < 0) { + err_attr = "dev_attr_tx_fault"; + goto err_ioexp_sfp1_attr; + } + if (device_create_file(device_p, &dev_attr_rxlos) < 0) { + err_attr = "dev_attr_rxlos"; + goto err_ioexp_sfp1_attr; + } + if (device_create_file(device_p, &dev_attr_tx_disable) < 0) { + err_attr = "dev_attr_tx_disable"; + goto err_ioexp_sfp1_attr; + } + return 0; + +err_ioexp_sfp1_attr: + SWPS_ERR("Add device attribute:%s failure! \n",err_attr); + return -1; +} + +static int +register_ioexp_attr_sfp_2(struct device *device_p){ + /* Support machine type: + * - SFP28 : Cypress + */ + char *err_attr = NULL; + + if (register_ioexp_attr_sfp_1(device_p) < 0){ + goto err_ioexp_sfp2_attr; + } + return 0; + +err_ioexp_sfp2_attr: + SWPS_ERR("Add device attribute:%s failure! \n",err_attr); + return -1; +} + +static int +register_ioexp_attr_qsfp_1(struct device *device_p){ + /* Support machine type: + * - QSFP : Magnolia, Redwood, Hudson32i + * - QSFP+ : Magnolia, Redwood, Hudson32i + * - QSFP28: Redwood + */ + char *err_attr = NULL; + + if (device_create_file(device_p, &dev_attr_present) < 0) { + err_attr = "dev_attr_present"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_reset) < 0) { + err_attr = "dev_attr_reset"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_lpmod) < 0) { + err_attr = "dev_attr_lpmod"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_modsel) < 0) { + err_attr = "dev_attr_modsel"; + goto err_ioexp_qsfp1_attr; + } + return 0; + +err_ioexp_qsfp1_attr: + SWPS_ERR("Add device attribute:%s failure! \n",err_attr); + return -1; +} + +static int +register_ioexp_attr(struct device *device_p, + struct transvr_obj_s *transvr_obj){ + + char *err_msg = "ERR"; + + switch (transvr_obj->ioexp_obj_p->ioexp_type){ + case IOEXP_TYPE_CYPRESS_NABC: + if (register_ioexp_attr_sfp_2(device_p) < 0){ + err_msg = "register_ioexp_attr_sfp_2 fail"; + goto err_reg_ioexp_attr; + } + break; + case IOEXP_TYPE_CYPRESS_7ABC: + if (register_ioexp_attr_qsfp_1(device_p) < 0){ + err_msg = "register_ioexp_attr_qsfp_1 fail"; + goto err_reg_ioexp_attr; + } + break; + + default: + err_msg = "Unknow type"; + goto err_reg_ioexp_attr; + } + return 0; + +err_reg_ioexp_attr: + SWPS_ERR("%s: %s :%d \n", + __func__, err_msg, transvr_obj->ioexp_obj_p->ioexp_type); + return -1; +} + + +static int +register_port_device(char *dev_name, + dev_t dev_num, + struct transvr_obj_s *transvr_obj){ + + struct device *device_p = NULL; + device_p = device_create(swp_class_p, /* struct class *cls */ + NULL, /* struct device *parent */ + dev_num, /* dev_t devt */ + transvr_obj, /* void *private_data */ + dev_name); /* const char *fmt */ + if (IS_ERR(device_p)){ + goto err_regswp_create_dev; + } + if (register_ioexp_attr(device_p, transvr_obj) < 0){ + goto err_regswp_reg_attr; + } + return 0; + +err_regswp_reg_attr: + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); +err_regswp_create_dev: + SWPS_ERR("%s fail! :%s\n", __func__, dev_name); + return -1; +} + + +static int +register_swp_module(void){ + + dev_t port_devt = 0; + int dev_total = port_total + 1; /* char_dev for module control */ + + if (alloc_chrdev_region(&port_devt, 0, dev_total, SWP_CLS_NAME) < 0){ + SWPS_WARN("Allocate PORT MAJOR failure! \n"); + goto err_register_swp_module_3; + } + port_major = MAJOR(port_devt); + + /* Create class object */ + swp_class_p = class_create(THIS_MODULE, SWP_CLS_NAME); + if (IS_ERR(swp_class_p)) { + SWPS_ERR("Create class failure! \n"); + goto err_register_swp_module_3; + } + return 0; + +err_register_swp_module_3: + unregister_chrdev_region(MKDEV(port_major, 0), port_total); + return -1; +} + + +/* ========== Module initial relate ========== + */ +static int +create_ioexp_objs(void) { + + int i, run_mod; + + /* Clean IOEXP object */ + clean_ioexp_objs(); + /* Get running mode */ + run_mod = IOEXP_MODE_DIRECT; + /* Create IOEXP object */ + for(i=0; i devlen_max) { + snprintf(err_msg, sizeof(err_msg), + "SWP_DEV_PORT too long!"); + goto err_initport_create_tranobj; + } + memset(dev_name, 0, sizeof(dev_name)); + snprintf(dev_name, devlen_max, "%s%d", SWP_DEV_PORT, port_id); + /* Create transceiver object */ + ioexp_obj_p = get_ioexp_obj(ioexp_id); + if (!ioexp_obj_p){ + snprintf(err_msg, sizeof(err_msg), + "IOEXP object:%d not exist", ioexp_id); + goto err_initport_create_tranobj; + } + transvr_obj_p = create_transvr_obj(dev_name, chan_id, ioexp_obj_p, + ioexp_virt_offset, transvr_type, + chipset_type, run_mod); + if (!transvr_obj_p){ + snprintf(err_msg, sizeof(err_msg), + "Create transceiver object fail :%s", dev_name); + goto err_initport_create_tranobj; + } + /* Setup Lane_ID mapping */ + i = ARRAY_SIZE(port_layout[minor_curr].lane_id); + j = ARRAY_SIZE(transvr_obj_p->lane_id); + if (i != j) { + snprintf(err_msg, sizeof(err_msg), + "Lane_id size inconsistent %d/%d", i, j); + goto err_initport_reg_device; + } + memcpy(transvr_obj_p->lane_id, port_layout[minor_curr].lane_id, i*sizeof(int)); + /* Create and register device object */ + if (register_port_device(dev_name, MKDEV(port_major, minor_curr), transvr_obj_p) < 0){ + snprintf(err_msg, sizeof(err_msg), + "register_port_device fail"); + goto err_initport_reg_device; + } + /* Setup device_ptr of transvr_obj */ + dev_p = get_swpdev_by_name(dev_name); + if (!dev_p){ + snprintf(err_msg, sizeof(err_msg), + "get_swpdev_by_name fail"); + goto err_initport_reg_device; + } + transvr_obj_p->transvr_dev_p = dev_p; + /* Success */ + ok_count++; + } + SWPS_INFO("%s: initialed %d port-dev",__func__, ok_count); + return 0; + +err_initport_reg_device: + kfree(transvr_obj_p); +err_initport_create_tranobj: + clean_port_obj(); + SWPS_ERR("%s: %s", __func__, err_msg); + SWPS_ERR("Dump: :%d :%d :%d :%d :%d :%d\n", + port_id, chan_id, ioexp_id, ioexp_virt_offset, transvr_type, run_mod); + return -1; +} + +static int __init +swp_module_init(void){ + + if (get_platform_type() < 0){ + goto err_init_out; + } + if (get_layout_info() < 0){ + goto err_init_out; + } + if (register_swp_module() < 0){ + goto err_init_out; + } + if (create_ioexp_objs() < 0){ + goto err_init_ioexp; + } + if (create_port_objs() < 0){ + goto err_init_portobj; + } + if (init_ioexp_objs() < 0){ + goto err_init_portobj; + } + SWPS_INFO("Inventec switch-port module V.%s initial success.\n", SWP_VERSION); + return 0; + + +err_init_portobj: + clean_ioexp_objs(); +err_init_ioexp: + class_unregister(swp_class_p); + class_destroy(swp_class_p); + unregister_chrdev_region(MKDEV(port_major, 0), port_total); +err_init_out: + SWPS_ERR("Inventec switch-port module V.%s initial failure.\n", SWP_VERSION); + return -1; +} + + +static void __exit +swp_module_exit(void){ + clean_port_obj(); + clean_ioexp_objs(); + class_unregister(swp_class_p); + class_destroy(swp_class_p); + unregister_chrdev_region(MKDEV(port_major, 0), port_total); + SWPS_INFO("Remove Inventec switch-port module success.\n"); +} + + +/* Module information */ +MODULE_AUTHOR(SWP_AUTHOR); +MODULE_DESCRIPTION(SWP_DESC); +MODULE_VERSION(SWP_VERSION); +MODULE_LICENSE(SWP_LICENSE); + +module_init(swp_module_init); +module_exit(swp_module_exit); + + + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_swps.h b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_swps.h new file mode 100644 index 000000000000..f37fd387e4a5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/inv_swps.h @@ -0,0 +1,170 @@ +#ifndef INV_SWPS_H +#define INV_SWPS_H + +#include "transceiver.h" +#include "io_expander.h" + +/* Module settings */ +#define SWP_CLS_NAME "swps" +#define SWP_DEV_PORT "port" +#define SWP_AUTOCONFIG_ENABLE (1) + +/* Module information */ +#define SWP_AUTHOR "Neil " +#define SWP_DESC "Inventec port and transceiver driver" +#define SWP_VERSION "4.2.3" +#define SWP_LICENSE "GPL" + +/* Module status define */ +#define SWP_STATE_NORMAL (0) +#define SWP_STATE_I2C_DIE (-91) + +/* [Note]: + * Functions and mechanism for auto-detect platform type is ready, + * But HW and BIOS not ready! We need to wait them. + * So, please do not use PLATFORM_TYPE_AUTO until they are ready. + * (2016.06.13) + */ +#define PLATFORM_TYPE_CYPRESS_GA2 (152) /* Down -> Up */ +#define PLATFORM_TYPE_CYPRESS_BAI (153) /* Down -> Up */ + +/* Current running platfrom */ +#define PLATFORM_SETTINGS PLATFORM_TYPE_CYPRESS_GA2 + +/* Define platform flag and kernel version */ +#if (PLATFORM_SETTINGS == PLATFORM_TYPE_CYPRESS_GA2) + #define SWPS_KERN_VER_BF_3_8 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_CYPRESS_BAI) + #define SWPS_KERN_VER_AF_3_10 (1) +#endif + + +struct inv_platform_s { + int id; + char name[64]; +}; + +struct inv_ioexp_layout_s { + int ioexp_id; + int ioexp_type; + struct ioexp_addr_s addr[4]; +}; + +struct inv_port_layout_s { + int port_id; + int chan_id; + int ioexp_id; + int ioexp_offset; + int transvr_type; + int chipset_type; + int lane_id[8]; +}; + +/* ========================================== + * Inventec Platform Settings + * ========================================== + */ +struct inv_platform_s platform_map = {PLATFORM_TYPE_CYPRESS_GA2, "D7054Q28B" }; + +/* ========================================== + * Cypress Layout configuration (Inventec version [Down->Up]) + * ========================================== + */ +struct inv_ioexp_layout_s cypress_ga2_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_CYPRESS_NABC, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {2, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {1, IOEXP_TYPE_CYPRESS_NABC, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {3, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {2, IOEXP_TYPE_CYPRESS_NABC, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {4, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {3, IOEXP_TYPE_CYPRESS_NABC, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {5, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {4, IOEXP_TYPE_CYPRESS_NABC, { {6, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {6, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {6, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {5, IOEXP_TYPE_CYPRESS_NABC, { {7, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {7, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {7, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {6, IOEXP_TYPE_CYPRESS_7ABC, { {8, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xc0, 0xc0}, }, /* addr[0] = I/O Expander 7 A */ + {8, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xc0, 0xc0}, {0xff, 0xc0}, }, /* addr[1] = I/O Expander 7 B */ + {8, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 7 C */ + }, +}; + +struct inv_port_layout_s cypress_ga2_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 11, 0, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 2} }, + { 1, 10, 0, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 1} }, + { 2, 13, 0, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 4} }, + { 3, 12, 0, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 3} }, + { 4, 15, 0, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 6} }, + { 5, 14, 0, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 5} }, + { 6, 17, 0, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 8} }, + { 7, 16, 0, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 7} }, + { 8, 19, 1, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 10} }, + { 9, 18, 1, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 9} }, + {10, 21, 1, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 12} }, + {11, 20, 1, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 11} }, + {12, 23, 1, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 22} }, + {13, 22, 1, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 21} }, + {14, 25, 1, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 24} }, + {15, 24, 1, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 23} }, + {16, 27, 2, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 34} }, + {17, 26, 2, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 33} }, + {18, 29, 2, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 36} }, + {19, 28, 2, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 35} }, + {20, 31, 2, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 38} }, + {21, 30, 2, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 37} }, + {22, 33, 2, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 40} }, + {23, 32, 2, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 39} }, + {24, 35, 3, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 42} }, + {25, 34, 3, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 41} }, + {26, 37, 3, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 44} }, + {27, 36, 3, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 43} }, + {28, 39, 3, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 50} }, + {29, 38, 3, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 49} }, + {30, 41, 3, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 52} }, + {31, 40, 3, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 51} }, + {32, 43, 4, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 54} }, + {33, 42, 4, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 53} }, + {34, 45, 4, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 56} }, + {35, 44, 4, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 55} }, + {36, 47, 4, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 66} }, + {37, 46, 4, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 65} }, + {38, 49, 4, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 68} }, + {39, 48, 4, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 67} }, + {40, 51, 5, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 70} }, + {41, 50, 5, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 69} }, + {42, 53, 5, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 72} }, + {43, 52, 5, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 71} }, + {44, 55, 5, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 82} }, + {45, 54, 5, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 81} }, + {46, 57, 5, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 84} }, + {47, 56, 5, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 83} }, + {48, 59, 6, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 85, 86, 87, 88} }, + {49, 58, 6, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 97, 98, 99,100} }, + {50, 61, 6, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {105,106,107,108} }, + {51, 60, 6, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {101,102,103,104} }, + {52, 63, 6, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {117,118,119,120} }, + {53, 62, 6, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {109,110,111,112} }, +}; + + +#endif /* SFP_DRIVER_H */ + + + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/io_expander.c b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/io_expander.c new file mode 100644 index 000000000000..057995e4551a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/io_expander.c @@ -0,0 +1,944 @@ +#include +#include +#include "io_expander.h" + +static struct ioexp_obj_s *ioexp_head_p = NULL; +static struct ioexp_obj_s *ioexp_tail_p = NULL; + +struct ioexp_map_s ioexp_map_cypress_nabc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {0, 0, 4}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 0, 5}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 0, 6}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {0, 0, 7}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 0, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 0, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {1, 0, 6}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {1, 0, 7}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_tx_disable = { {0, 1, 0}, /* map_tx_disable[0] = TXDISABLE_SFP+_P(X) */ + {0, 1, 1}, /* map_tx_disable[1] = TXDISABLE_SFP+_P(X+1) */ + {0, 1, 2}, /* map_tx_disable[2] = TXDISABLE_SFP+_P(X+2) */ + {0, 1, 3}, /* map_tx_disable[3] = TXDISABLE_SFP+_P(X+3) */ + {1, 1, 0}, /* map_tx_disable[4] = TXDISABLE_SFP+_P(X+4) */ + {1, 1, 1}, /* map_tx_disable[5] = TXDISABLE_SFP+_P(X+5) */ + {1, 1, 2}, /* map_tx_disable[6] = TXDISABLE_SFP+_P(X+6) */ + {1, 1, 3}, /* map_tx_disable[7] = TXDISABLE_SFP+_P(X+7) */ + }, + .map_tx_fault = { {0, 0, 0}, /* map_tx_fault[0] = TXFAULT_SFP+_P(X) */ + {0, 0, 1}, /* map_tx_fault[1] = TXFAULT_SFP+_P(X+1) */ + {0, 0, 2}, /* map_tx_fault[2] = TXFAULT_SFP+_P(X+2) */ + {0, 0, 3}, /* map_tx_fault[3] = TXFAULT_SFP+_P(X+3) */ + {1, 0, 0}, /* map_tx_fault[4] = TXFAULT_SFP+_P(X+4) */ + {1, 0, 1}, /* map_tx_fault[5] = TXFAULT_SFP+_P(X+5) */ + {1, 0, 2}, /* map_tx_fault[6] = TXFAULT_SFP+_P(X+6) */ + {1, 0, 3}, /* map_tx_fault[7] = TXFAULT_SFP+_P(X+7) */ + }, + .map_rxlos = { {0, 1, 4}, /* map_rxlos[0] = OPRXLOS_PORT(X) */ + {0, 1, 5}, /* map_rxlos[1] = OPRXLOS_PORT(X+1) */ + {0, 1, 6}, /* map_rxlos[2] = OPRXLOS_PORT(X+2) */ + {0, 1, 7}, /* map_rxlos[3] = OPRXLOS_PORT(X+3) */ + {1, 1, 4}, /* map_rxlos[4] = OPRXLOS_PORT(X+4) */ + {1, 1, 5}, /* map_rxlos[5] = OPRXLOS_PORT(X+5) */ + {1, 1, 6}, /* map_rxlos[6] = OPRXLOS_PORT(X+6) */ + {1, 1, 7}, /* map_rxlos[7] = OPRXLOS_PORT(X+7) */ + }, +}; + +struct ioexp_map_s ioexp_map_cypress_7abc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {2, 0, 0}, /* map_present[0] = MOD_ABS_PORT(X) */ + {2, 0, 1}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {2, 0, 2}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {2, 0, 3}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {2, 0, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {2, 0, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + }, + .map_reset = { {0, 0, 0}, /* map_reset[0] = QRESET_QSFP_N_P(X) */ + {0, 0, 1}, /* map_reset[1] = QRESET_QSFP_N_P(X+1) */ + {0, 0, 2}, /* map_reset[2] = QRESET_QSFP_N_P(X+2) */ + {0, 0, 3}, /* map_reset[3] = QRESET_QSFP_N_P(X+3) */ + {0, 0, 4}, /* map_reset[4] = QRESET_QSFP_N_P(X+4) */ + {0, 0, 5}, /* map_reset[5] = QRESET_QSFP_N_P(X+5) */ + }, + .map_lpmod = { {0, 1, 0}, /* map_lpmod[0] = LPMODE_QSFP_P(X) */ + {0, 1, 1}, /* map_lpmod[1] = LPMODE_QSFP_P(X+1) */ + {0, 1, 2}, /* map_lpmod[2] = LPMODE_QSFP_P(X+2) */ + {0, 1, 3}, /* map_lpmod[3] = LPMODE_QSFP_P(X+3) */ + {0, 1, 4}, /* map_lpmod[4] = LPMODE_QSFP_P(X+4) */ + {0, 1, 5}, /* map_lpmod[5] = LPMODE_QSFP_P(X+5) */ + }, + .map_modsel = { {1, 1, 0}, /* map_modsel[0] = MODSEL_QSFP_N_P(X) */ + {1, 1, 1}, /* map_modsel[1] = MODSEL_QSFP_N_P(X+1) */ + {1, 1, 2}, /* map_modsel[2] = MODSEL_QSFP_N_P(X+2) */ + {1, 1, 3}, /* map_modsel[3] = MODSEL_QSFP_N_P(X+3) */ + {1, 1, 4}, /* map_modsel[4] = MODSEL_QSFP_N_P(X+4) */ + {1, 1, 5}, /* map_modsel[5] = MODSEL_QSFP_N_P(X+5) */ + }, +}; + + + +/* ========== Private functions ========== + */ +int check_channel_tier_1(void); + +struct i2c_client * +_get_i2c_client(struct ioexp_obj_s *self, + int chip_id){ + + struct ioexp_i2c_s *i2c_curr_p = self->i2c_head_p; + + if (!(i2c_curr_p)){ + SWPS_ERR("%s: i2c_curr_p is NULL\n", __func__); + return NULL; + } + while (i2c_curr_p){ + if ((i2c_curr_p->chip_id) == chip_id){ + return i2c_curr_p->i2c_client_p; + } + i2c_curr_p = i2c_curr_p->next; + } + SWPS_ERR("%s: not exist! :%d\n", __func__, chip_id); + return NULL; +} + + +static int +_common_ioexp_update_one(struct ioexp_obj_s *self, + struct ioexp_addr_s *ioexp_addr, + int chip_id, + int data_width, + int show_err, + char *caller_name) { + int buf = 0; + int err = 0; + int data_id = 0; + int r_offset = 0; + + for(data_id=0; data_idread_offset[data_id]; + buf = i2c_smbus_read_byte_data(_get_i2c_client(self, chip_id), r_offset); + /* Check error */ + if (buf < 0) { + err = 1; + if (show_err) { + SWPS_INFO("IOEXP-%d read fail! :%d \n", self->ioexp_id, buf); + SWPS_INFO("Dump: :%d :0x%02x :%d, :%s\n", + ioexp_addr->chan_id, ioexp_addr->chip_addr, + ioexp_addr->read_offset[data_id], caller_name); + } + continue; + } + /* Update IOEXP object */ + self->chip_data[chip_id].data[data_id] = (uint8_t)buf; + } + if (err) { + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + + +static int +common_ioexp_update_all(struct ioexp_obj_s *self, + int show_err, + char *caller_name){ + + int err = 0; + int chip_id = 0; + int chip_amount = self->ioexp_map_p->chip_amount; + + for (chip_id=0; chip_idioexp_map_p->map_addr[chip_id]), + chip_id, + self->ioexp_map_p->data_width, + show_err, + caller_name) < 0) { + err = 1; + } + } + if (err) { + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + +static int +_common_get_bit(struct ioexp_obj_s *self, + struct ioexp_bitmap_s *bitmap_obj_p, + char *func_mane){ + uint8_t buf; + int err_code; + + /* Get address */ + err_code = self->fsm_4_direct(self); + if (err_code < 0){ + return err_code; + } + + if (!bitmap_obj_p){ + SWPS_ERR("Layout config incorrect! :%d :%s\n", + self->ioexp_id, func_mane); + return ERR_IOEXP_BADCONF; + } + /* Get data form cache */ + buf = self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset]; + return (int)(buf >> bitmap_obj_p->bit_shift & 0x01); +} + + +static int +_common_set_bit(struct ioexp_obj_s *self, + struct ioexp_bitmap_s *bitmap_obj_p, + int input_val, + char *func_mane){ + int err_code, target_offset; + uint8_t origin_byte; + uint8_t modify_byte; + + /* Get address */ + err_code = self->fsm_4_direct(self); + if (err_code < 0){ + return err_code; + } + if (!bitmap_obj_p){ + SWPS_ERR("Layout config incorrect! :%d :%s\n", + self->ioexp_id, func_mane); + return ERR_IOEXP_BADCONF; + } + /* Prepare write date */ + origin_byte = self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset]; + switch (input_val) { + case 0: + modify_byte = origin_byte; + SWP_BIT_CLEAR(modify_byte, bitmap_obj_p->bit_shift); + break; + case 1: + modify_byte = origin_byte; + SWP_BIT_SET(modify_byte, bitmap_obj_p->bit_shift); + break; + default: + SWPS_ERR("Input value incorrect! :%d :%d :%s\n", + input_val, self->ioexp_id, func_mane); + return ERR_IOEXP_BADINPUT; + } + /* Setup i2c client */ + target_offset = self->ioexp_map_p->map_addr[bitmap_obj_p->chip_id].write_offset[bitmap_obj_p->ioexp_voffset]; + /* Write byte to chip via I2C */ + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, bitmap_obj_p->chip_id), + target_offset, + modify_byte); + /* Update or bollback object */ + if (err_code < 0){ + self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset] = origin_byte; + SWPS_ERR("I2C write fail! :%d :%d :%s :%d\n", + input_val, self->ioexp_id, func_mane, err_code); + return err_code; + } + self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset] = modify_byte; + return 0; +} + + +/* ========== Object public functions ========== + */ +int +common_get_present(struct ioexp_obj_s *self, + int virt_offset){ + + int UNPLUG = 1; + int retval = ERR_IOEXP_UNEXCPT; + + retval = _common_get_bit(self, + &(self->ioexp_map_p->map_present[virt_offset]), + "common_get_present"); + if (retval < 0) { + /* [Note] + * => Transceiver object does not need to handle IOEXP layer issues. + */ + return UNPLUG; + } + return retval; +} + +int +common_get_tx_fault(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_tx_fault[virt_offset]), + "common_get_tx_fault"); +} + +int +common_get_rxlos(struct ioexp_obj_s *self, + int virt_offset){ + /* [Receiver Loss of Signal (Rx_LOS)] + * The post-amplification IC also includes transition detection circuitry + * which monitors the ac level of incoming optical signals and provides a + * TTL/CMOS compatible status signal to the host (pin 8). An adequate optical + * input results in a low Rx_LOS output while a high Rx_LOS output indicates + * an unusable optical input. The Rx_LOS thresholds are factory set so that + * a high output indicates a definite optical fault has occurred. Rx_LOS can + * also be monitored via the two-wire serial interface + * (address A2h, byte 110, bit 1). + * + * 0: Normal + * 1: Abnormal + */ + return _common_get_bit(self, + &(self->ioexp_map_p->map_rxlos[virt_offset]), + "common_get_rxlos"); +} + + +int +common_get_tx_disable(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_tx_disable[virt_offset]), + "common_get_tx_disable"); +} + +int +common_get_reset(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_reset[virt_offset]), + "common_get_reset"); +} + + +int +common_get_lpmod(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_lpmod[virt_offset]), + "common_get_lpmod"); +} + + +int +common_get_modsel(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_modsel[virt_offset]), + "common_get_modsel"); +} + +int +common_set_tx_disable(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_tx_disable[virt_offset]), + input_val, + "common_set_tx_disable"); +} + +int +common_set_reset(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_reset[virt_offset]), + input_val, + "common_set_reset"); +} + + +int +common_set_lpmod(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_lpmod[virt_offset]), + input_val, + "common_set_lpmod"); +} + + +int +common_set_modsel(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_modsel[virt_offset]), + input_val, + "common_set_modsel"); +} + +int +ioexp_get_not_support(struct ioexp_obj_s *self, + int virt_offset){ + return ERR_IOEXP_NOTSUPPORT; +} + + +int +ioexp_set_not_support(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + return ERR_IOEXP_NOTSUPPORT; +} + +/* ========== Initial functions for IO Expander ========== + */ +int +common_ioexp_init(struct ioexp_obj_s *self) { + + int chip_id, offset, err_code; + struct ioexp_addr_s *addr_p; + + if (self->mode == IOEXP_MODE_DIRECT) { ///important + goto update_common_ioexp_init; + } + /* Setup default value to each physical IO Expander */ + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + /* Get address mapping */ + addr_p = &(self->ioexp_map_p->map_addr[chip_id]); + if (!addr_p){ + SWPS_ERR("%s: IOEXP config incorrect! :%d \n", + __func__, chip_id); + return -1; + } + /* Setup default value */ + for (offset=0; offset<(self->ioexp_map_p->data_width); offset++){ + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, chip_id), + addr_p->write_offset[offset], + addr_p->data_default[offset]); + if (err_code < 0){ + SWPS_ERR("%s: set default fail! :%d \n", + __func__, err_code); + return ERR_IOEXP_UNEXCPT; + } + } + } + +update_common_ioexp_init: + /* Check and update info to object */ + err_code = self->update_all(self, 1, "common_ioexp_init"); + if (err_code < 0) { + SWPS_ERR("%s: update_all() fail! :%d \n", + __func__, err_code); + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + + +/* ========== Object functions for Final State Machine ========== + */ +int +_is_channel_ready(struct ioexp_obj_s *self){ + + int buf = 0; + int chip_id = 0; /* Use first chip which be registered */ + int data_id = 0; /* Use first byte which be registered */ + struct ioexp_addr_s *ioexp_addr = NULL; + + ioexp_addr = &(self->ioexp_map_p->map_addr[chip_id]); + if (!ioexp_addr){ + SWPS_ERR("%s: config incorrect!\n", __func__); + return ERR_IOEXP_UNEXCPT; + } + buf = i2c_smbus_read_byte_data(_get_i2c_client(self, chip_id), + ioexp_addr->read_offset[data_id]); + if (buf >= 0){ + return 1; + } + return 0; +} + +int +_ioexp_init_handler(struct ioexp_obj_s *self){ + + int return_val; + + switch (self->mode) { + case IOEXP_MODE_DIRECT: + return_val = self->init(self); + if (return_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + } else { + self->state = STATE_IOEXP_NORMAL; + } + return return_val; + default: + break; + } + SWPS_ERR("%s: exception occur :%d\n", __func__, self->mode); + return ERR_IOEXP_UNEXCPT; +} + + +int +common_ioexp_fsm_4_direct(struct ioexp_obj_s *self){ + + int result_val; + int show_err = 1; + char *func_mane = "common_ioexp_fsm_4_direct"; + + switch (self->state){ + case STATE_IOEXP_INIT: + result_val = _ioexp_init_handler(self); + /* Exception case: terminate initial procedure */ + if(result_val < 0){ + /* Initial fail */ + return result_val; + } + if(self->state == STATE_IOEXP_INIT){ + /* Keep in INIT state, and return error */ + return ERR_IOEXP_UNINIT; + } + /* Case: Initial done */ + return 0; + + case STATE_IOEXP_NORMAL: + result_val = self->update_all(self, show_err, func_mane); + if (result_val < 0){ + SWPS_INFO("%s: NORMAL -> ABNORMAL :%d\n", + __func__, result_val); + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + } + self->state = STATE_IOEXP_NORMAL; + return 0; + + case STATE_IOEXP_ABNORMAL: + result_val = self->update_all(self, show_err, func_mane); + if (result_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + } + SWPS_DEBUG("%s: ABNORMAL -> NORMAL :%d\n", + __func__, result_val); + self->state = STATE_IOEXP_NORMAL; + return 0; + + default: + break; + } + SWPS_ERR("%s: Exception occurs :%d\n", + __func__, self->state); + return ERR_IOEXP_UNEXCPT; +} + +/* ========== Functions for Factory pattern ========== + */ +static struct ioexp_map_s * +get_ioexp_map(int ioexp_type){ + switch (ioexp_type){ + case IOEXP_TYPE_CYPRESS_NABC: + return &ioexp_map_cypress_nabc; + case IOEXP_TYPE_CYPRESS_7ABC: + return &ioexp_map_cypress_7abc; + default: + return NULL; + } +} + + +int +setup_ioexp_ssize_attr(struct ioexp_obj_s *self, + struct ioexp_map_s *ioexp_map_p, + int ioexp_id, + int ioexp_type, + int run_mode){ + switch (run_mode){ + case IOEXP_MODE_DIRECT: /* Direct access device mode */ + self->mode = run_mode; + break; + default: + SWPS_ERR("%s: non-defined run_mode:%d\n", + __func__, run_mode); + self->mode = ERR_IOEXP_UNEXCPT; + return ERR_IOEXP_UNEXCPT; + } + self->ioexp_id = ioexp_id; + self->ioexp_type = ioexp_type; + self->ioexp_map_p = ioexp_map_p; + self->state = STATE_IOEXP_INIT; + mutex_init(&self->lock); + return 0; +} + + +static int +setup_addr_mapping(struct ioexp_obj_s *self, + struct ioexp_addr_s *addr_map_p){ + if (!addr_map_p){ + SWPS_ERR("%s: map is null\n", __func__); + return -1; + } + self->ioexp_map_p->map_addr = addr_map_p; + return 0; +} + + +static int +setup_ioexp_public_cb(struct ioexp_obj_s *self, + int ioexp_type){ + switch (ioexp_type){ + case IOEXP_TYPE_CYPRESS_NABC: + self->get_present = common_get_present; + self->get_tx_fault = common_get_tx_fault; + self->get_rxlos = common_get_rxlos; + self->get_tx_disable = common_get_tx_disable; + self->get_reset = ioexp_get_not_support; + self->get_lpmod = ioexp_get_not_support; + self->get_modsel = ioexp_get_not_support; + self->set_tx_disable = common_set_tx_disable; + self->set_reset = ioexp_set_not_support; + self->set_lpmod = ioexp_set_not_support; + self->set_modsel = ioexp_set_not_support; + return 0; + case IOEXP_TYPE_CYPRESS_7ABC: + self->get_present = common_get_present; + self->get_tx_fault = ioexp_get_not_support; + self->get_rxlos = ioexp_get_not_support; + self->get_tx_disable = ioexp_get_not_support; + self->get_reset = common_get_reset; + self->get_lpmod = common_get_lpmod; + self->get_modsel = common_get_modsel; + self->set_tx_disable = ioexp_set_not_support; + self->set_reset = common_set_reset; + self->set_lpmod = common_set_lpmod; + self->set_modsel = common_set_modsel; + return 0; + + default: + SWPS_ERR("%s: type:%d incorrect!\n", __func__, ioexp_type); + break; + } + return ERR_IOEXP_UNEXCPT; +} + + +static int +setup_ioexp_private_cb(struct ioexp_obj_s *self, + int ioexp_type){ + + switch (ioexp_type){ + case IOEXP_TYPE_CYPRESS_NABC: + case IOEXP_TYPE_CYPRESS_7ABC: + self->init = common_ioexp_init; + self->update_all = common_ioexp_update_all; + self->fsm_4_direct = common_ioexp_fsm_4_direct; + return 0; + + default: + SWPS_ERR("%s: type:%d incorrect!\n", __func__, ioexp_type); + break; + } + return ERR_IOEXP_UNEXCPT; +} + + +static int +setup_i2c_client_one(struct ioexp_obj_s *self, + int chip_id){ + + char *err_msg = "ERROR"; + struct i2c_adapter *adap = NULL; + struct i2c_client *client = NULL; + struct ioexp_i2c_s *i2c_obj_p = NULL; + struct ioexp_i2c_s *i2c_curr_p = NULL; + + int chan_id = self->ioexp_map_p->map_addr[chip_id].chan_id; + adap = i2c_get_adapter(chan_id); + if(!adap){ + err_msg = "Can not get adap!"; + goto err_ioexp_setup_i2c_1; + } + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client){ + err_msg = "Can not kzalloc client!"; + goto err_ioexp_setup_i2c_1; + } + i2c_obj_p = kzalloc(sizeof(*i2c_obj_p), GFP_KERNEL); + if (!i2c_obj_p){ + err_msg = "Can not kzalloc i2c_obj_p!"; + goto err_ioexp_setup_i2c_2; + } + client->adapter = adap; + client->addr = self->ioexp_map_p->map_addr[chip_id].chip_addr; + i2c_obj_p->i2c_client_p = client; + i2c_obj_p->chip_id = chip_id; + i2c_obj_p->next = NULL; + if (!self->i2c_head_p){ + self->i2c_head_p = i2c_obj_p; + } else { + i2c_curr_p = self->i2c_head_p; + while (i2c_curr_p->next){ + i2c_curr_p = i2c_curr_p->next; + } + i2c_curr_p->next = i2c_obj_p; + } + return 0; + +err_ioexp_setup_i2c_2: + kfree(client); +err_ioexp_setup_i2c_1: + SWPS_ERR("%s: %s :%d\n", __func__, err_msg, chan_id); + return -1; +} + + +static int +setup_i2c_client(struct ioexp_obj_s* self){ + + int result; + int chip_id = 0; + + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + result = setup_i2c_client_one(self, chip_id); + if (result < 0){ + SWPS_ERR("%s fail! :%d\n", __func__, chip_id); + return -1; + } + } + return 0; +} + +static int +setup_ioexp_config(struct ioexp_obj_s *self) { + + int chip_id, offset, err_code; + struct ioexp_addr_s *addr_p; + + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + addr_p = &(self->ioexp_map_p->map_addr[chip_id]); + if (!addr_p){ + SWPS_ERR("IOEXP config incorrect! :%d \n",chip_id); + return -1; + } + for (offset=0; offset<(self->ioexp_map_p->data_width); offset++){ + + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, chip_id), + addr_p->conf_offset[offset], + addr_p->conf_default[offset]); + + if (err_code < 0){ + SWPS_INFO("%s: set conf fail! :%d \n", __func__, err_code); + return -2; + } + } + } + return 0; +} + +struct ioexp_obj_s * +_create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode){ + + struct ioexp_map_s* ioexp_map_p; + struct ioexp_obj_s* result_p; + struct ioexp_i2c_s *i2c_curr_p; + struct ioexp_i2c_s *i2c_next_p; + + /* Get layout */ + ioexp_map_p = get_ioexp_map(ioexp_type); + if (!ioexp_map_p){ + SWPS_ERR("%s: Invalid ioexp_type\n", __func__); + goto err_create_ioexp_fail; + } + /* Prepare IOEXP object */ + result_p = kzalloc(sizeof(*result_p), GFP_KERNEL); + if (!result_p){ + SWPS_ERR("%s: kzalloc failure!\n", __func__); + goto err_create_ioexp_fail; + } + /* Prepare static size attributes */ + if (setup_ioexp_ssize_attr(result_p, + ioexp_map_p, + ioexp_id, + ioexp_type, + run_mode) < 0){ + goto err_create_ioexp_setup_attr_fail; + } + /* Prepare address mapping */ + if (setup_addr_mapping(result_p, addr_map_p) < 0){ + goto err_create_ioexp_setup_attr_fail; + } + if (setup_i2c_client(result_p) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + /* Prepare call back functions of object */ + if (setup_ioexp_public_cb(result_p, ioexp_type) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + if (setup_ioexp_private_cb(result_p, ioexp_type) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + return result_p; + +err_create_ioexp_setup_i2c_fail: + i2c_curr_p = result_p->i2c_head_p; + i2c_next_p = result_p->i2c_head_p; + while (i2c_curr_p){ + i2c_next_p = i2c_curr_p->next; + kfree(i2c_curr_p->i2c_client_p); + kfree(i2c_curr_p); + i2c_curr_p = i2c_next_p; + } +err_create_ioexp_setup_attr_fail: + kfree(result_p); +err_create_ioexp_fail: + SWPS_ERR("%s: fail! :%d :%d \n", + __func__, ioexp_id, ioexp_type); + return NULL; +} + + +int +create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode){ + + struct ioexp_obj_s *ioexp_p = NULL; + + ioexp_p = _create_ioexp_obj(ioexp_id, ioexp_type, + addr_map_p, run_mode); + if (!ioexp_p){ + return -1; + } + if (ioexp_head_p == NULL){ + ioexp_head_p = ioexp_p; + ioexp_tail_p = ioexp_p; + return 0; + } + ioexp_tail_p->next = ioexp_p; + ioexp_tail_p = ioexp_p; + return 0; +} + +static int +_init_ioexp_obj(struct ioexp_obj_s* self) { + + char *err_msg = "ERR"; + char *func_name = "_init_ioexp_obj"; + + /* Setup IOEXP configure byte */ + if (setup_ioexp_config(self) < 0){ + err_msg = "setup_ioexp_config fail"; + goto err_init_ioexp_obj; + } + /* Setup default data */ + if (_ioexp_init_handler(self) < 0){ + err_msg = "_ioexp_init_handler fail"; + goto err_init_ioexp_obj; + } + /* Update all */ + if (self->state == STATE_IOEXP_NORMAL){ + if (self->update_all(self, 1, func_name) < 0){ + err_msg = "update_all() fail"; + goto err_init_ioexp_obj; + } + } + return 0; + +err_init_ioexp_obj: + SWPS_DEBUG("%s: %s\n", __func__, err_msg); + return -1; +} + +int +init_ioexp_objs(void){ + /* Return value: + * 0: Success + * -1: Detect topology error + * -2: SWPS internal error + */ + + struct ioexp_obj_s *curr_p = ioexp_head_p; + + if (!curr_p) { + SWPS_ERR("%s: ioexp_head_p is NULL\n", __func__); + return -2; + } + while (curr_p) { + if (_init_ioexp_obj(curr_p) < 0) { + SWPS_DEBUG("%s: _init_ioexp_obj() fail\n", __func__); + return -1; + } + curr_p = curr_p->next; + } + SWPS_DEBUG("%s: done.\n", __func__); + return 0; +} + +void +clean_ioexp_objs(void){ + + struct ioexp_i2c_s *i2c_curr_p = NULL; + struct ioexp_i2c_s *i2c_next_p = NULL; + struct ioexp_obj_s *ioexp_next_p = NULL; + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + if (ioexp_head_p == NULL){ + ioexp_tail_p = NULL; + return; + } + while(ioexp_curr_p){ + ioexp_next_p = ioexp_curr_p->next; + i2c_curr_p = ioexp_curr_p->i2c_head_p; + while (i2c_curr_p) { + i2c_next_p = i2c_curr_p->next; + kfree(i2c_curr_p->i2c_client_p); + kfree(i2c_curr_p); + i2c_curr_p = i2c_next_p; + } + kfree(ioexp_curr_p); + ioexp_curr_p = ioexp_next_p; + } + ioexp_tail_p = NULL; + SWPS_DEBUG("%s: done.\n", __func__); +} + +struct ioexp_obj_s * +get_ioexp_obj(int ioexp_id){ + + struct ioexp_obj_s *result_p = NULL; + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + while(ioexp_curr_p){ + if (ioexp_curr_p->ioexp_id == ioexp_id){ + result_p = ioexp_curr_p; + break; + } + ioexp_curr_p = ioexp_curr_p->next; + } + return result_p; +} +int +check_channel_tier_1(void) { + + if ( (!_is_channel_ready(ioexp_head_p)) && + (!_is_channel_ready(ioexp_tail_p)) ){ + return -1; + } + return 0; +} + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/io_expander.h b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/io_expander.h new file mode 100644 index 000000000000..a5541617dd05 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/io_expander.h @@ -0,0 +1,143 @@ +#ifndef IO_EXPANDER_H +#define IO_EXPANDER_H + +#include + +/* IOEXP type define (QSFP series) */ +#define IOEXP_TYPE_CYPRESS_NABC (10102) +#define IOEXP_TYPE_CYPRESS_7ABC (10207) + +/* IOEXP mode define */ +#define IOEXP_MODE_DIRECT (19001) + +/* IOEXP state define */ +#define STATE_IOEXP_NORMAL (0) +#define STATE_IOEXP_INIT (-1) +#define STATE_IOEXP_ABNORMAL (-2) + +/* IOEXP error code define */ +#define ERR_IOEXP_NOTSUPPORT (-100) +#define ERR_IOEXP_UNINIT (-101) +#define ERR_IOEXP_BADCONF (-102) +#define ERR_IOEXP_BADINPUT (-105) +#define ERR_IOEXP_UNEXCPT (-199) + + +#define SWPS_INFO(fmt, args...) printk( KERN_INFO "[SWPS] " fmt, ##args) +#define SWPS_WARN(fmt, args...) printk( KERN_WARNING "[SWPS] " fmt, ##args) +#define SWPS_ERR(fmt, args...) printk( KERN_ERR "[SWPS] " fmt, ##args) + +#ifdef DEBUG_SWPS +# define SWPS_DEBUG(fmt, args...) printk( KERN_DEBUG "[SWPS] " fmt, ##args) +#else +# define SWPS_DEBUG(fmt, args...) +#endif + + +struct ioexp_addr_s { + int chan_id; + int chip_addr; + int read_offset[8]; + int write_offset[8]; + int conf_offset[8]; + uint8_t data_default[8]; + uint8_t conf_default[8]; +}; + +struct ioexp_i2c_s { + int chip_id; + struct i2c_client *i2c_client_p; + struct ioexp_i2c_s *next; +}; + + +struct ioexp_bitmap_s { + int chip_id; /* IOEXP chip id */ + int ioexp_voffset; /* IOEXP virtual offset */ + int bit_shift; +}; + +struct ioexp_map_s { + int chip_amount; /* Number of chips that IOEXP object content */ + int data_width; /* Number of (Read/Write/Config) bytes */ + struct ioexp_addr_s *map_addr; /* Chip address info */ + struct ioexp_bitmap_s map_present[8]; /* IOEXP for SFP / QSFP */ + struct ioexp_bitmap_s map_tx_disable[8]; /* IOEXP for SFP */ + struct ioexp_bitmap_s map_tx_fault[8]; /* IOEXP for SFP */ + struct ioexp_bitmap_s map_rxlos[8]; /* IOEXP for SFP */ + struct ioexp_bitmap_s map_reset[8]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_lpmod[8]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_modsel[8]; /* IOEXP for QSFP */ +}; + +struct ioexp_data_s { + uint8_t data[8]; +}; + +struct ioexp_obj_s { + + /* ============================ + * Object public property + * ============================ + */ + int ioexp_id; + int ioexp_type; + + /* ============================ + * Object private property + * ============================ + */ + struct ioexp_data_s chip_data[16]; /* Max: 8-ioexp in one virt-ioexp(ioexp_obj) */ + struct ioexp_map_s *ioexp_map_p; + struct ioexp_obj_s *next; + struct ioexp_i2c_s *i2c_head_p; + struct mutex lock; + int mode; + int state; + + /* =========================================== + * Object public functions + * =========================================== + */ + int (*get_present)(struct ioexp_obj_s *self, int virt_offset); + int (*get_tx_fault)(struct ioexp_obj_s *self, int virt_offset); + int (*get_rxlos)(struct ioexp_obj_s *self, int virt_offset); + int (*get_tx_disable)(struct ioexp_obj_s *self, int virt_offset); + int (*get_reset)(struct ioexp_obj_s *self, int virt_offset); + int (*get_lpmod)(struct ioexp_obj_s *self, int virt_offset); + int (*get_modsel)(struct ioexp_obj_s *self, int virt_offset); + int (*set_tx_disable)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_reset)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_lpmod)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_modsel)(struct ioexp_obj_s *self, int virt_offset, int input_val); + + /* =========================================== + * Object private functions + * =========================================== + */ + int (*init)(struct ioexp_obj_s *self); + int (*update_all)(struct ioexp_obj_s *self, int show_err, char *caller_name); + int (*fsm_4_direct)(struct ioexp_obj_s* self); +}; + + +struct ioexp_obj_s* get_ioexp_obj(int ioexp_id); +int create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode); +int init_ioexp_objs(void); +void clean_ioexp_objs(void); + +int check_channel_tier_1(void); + +/* Macro for bit control */ +#define SWP_BIT_SET(byte_val,bit_shift) ((byte_val) |= (1<<(bit_shift))) +#define SWP_BIT_CLEAR(byte_val,bit_shift) ((byte_val) &= ~(1<<(bit_shift))) + + +#endif /* IO_EXPANDER_H */ + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/transceiver.c b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/transceiver.c new file mode 100644 index 000000000000..368e412b19e2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/transceiver.c @@ -0,0 +1,906 @@ +#include +#include +#include +#include +#include "io_expander.h" +#include "transceiver.h" + + +/* ========== Register EEPROM address mapping ========== + */ +struct eeprom_map_s eeprom_map_sfp = { + .addr_rx_los =-1, .page_rx_los =-1, .offset_rx_los =-1, .length_rx_los =-1, + .addr_tx_disable =-1, .page_tx_disable =-1, .offset_tx_disable =-1, .length_tx_disable =-1, + .addr_tx_fault =-1, .page_tx_fault =-1, .offset_tx_fault =-1, .length_tx_fault =-1, +}; + +struct eeprom_map_s eeprom_map_qsfp = { + .addr_rx_los =0x50, .page_rx_los =-1, .offset_rx_los =3, .length_rx_los =1, + .addr_tx_disable =0x50, .page_tx_disable =-1, .offset_tx_disable =86, .length_tx_disable =1, + .addr_tx_fault =0x50, .page_tx_fault =-1, .offset_tx_fault =4, .length_tx_fault =1, +}; + +struct eeprom_map_s eeprom_map_qsfp28 = { + .addr_rx_los =0x50, .page_rx_los =-1, .offset_rx_los =3, .length_rx_los =1, + .addr_tx_disable =0x50, .page_tx_disable =-1, .offset_tx_disable =86, .length_tx_disable =1, + .addr_tx_fault =0x50, .page_tx_fault =-1, .offset_tx_fault =4, .length_tx_fault =1, +}; + + +/* ========== Utility Functions ========== + */ +void +alarm_msg_2_user(struct transvr_obj_s *self, + char *emsg) { + + SWPS_ERR("%s on %s.\n", emsg, self->swp_name); +} + + +/* ========== Private functions ========== + */ +static int +_reload_transvr_obj(struct transvr_obj_s *self,int new_type); + +static int +reload_transvr_obj(struct transvr_obj_s *self,int new_type); + +static int +_transvr_init_handler(struct transvr_obj_s *self); + +static void +_transvr_clean_retry(struct transvr_obj_s *self) { + self->retry = 0; +} + + +static int +_transvr_handle_retry(struct transvr_obj_s *self, int retry) { + /* Return: 0: keep retry + * -1: stop retry + */ + if (self->retry == 0) { + self->retry = retry; + } + self->retry -= 1; + if (self->retry <= 0) { + _transvr_clean_retry(self); + return -1; + } + return 0; +} + +static int +_common_setup_page(struct transvr_obj_s *self, + int addr, + int page, + int offset, + int len, + int show_e) { + /* return: + * 0 : OK + * -1 : EEPROM settings incorrect + * -2 : I2C R/W failure + * -3 : Undefined case + */ + int retval = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + /* Check */ + if ((addr < 0) || (offset < 0) || (len < 0)) { + emsg = "EEPROM settings incorrect"; + retval = -1; + goto err_common_setup_page; + } + /* Case1: continue access */ + if ((self->i2c_client_p->addr == addr) && + (self->curr_page == page)) { + return 0; + } + self->i2c_client_p->addr = addr; + /* Case2: select lower page */ + if (page == -1) { + self->curr_page = page; + return 0; + } + /* Case3: select upper page */ + if (page >= 0) { + goto upper_common_setup_page; + } + /* Unexpected case */ + show_e = 1; + emsg = "Unexpected case"; + retval = -3; + goto err_common_setup_page; + +upper_common_setup_page: + if (i2c_smbus_write_byte_data(self->i2c_client_p, + VAL_TRANSVR_PAGE_SELECT_OFFSET, + page) < 0) { + emsg = "I2C R/W failure"; + retval = -2; + goto err_common_setup_page; + } + self->curr_page = page; + mdelay(VAL_TRANSVR_PAGE_SELECT_DELAY); + return 0; + +err_common_setup_page: + if (show_e) { + SWPS_INFO("%s: %s", __func__, emsg); + SWPS_INFO("%s: :0x%02x :%d :%d :%d\n", + __func__, addr, page, offset, len); + } + return retval; +} + +/* ========== Object functions for Final State Machine ========== + */ +int +is_plugged(struct transvr_obj_s *self){ + + int limit = 63; + int present = DEBUG_TRANSVR_INT_VAL; + char emsg[64] = DEBUG_TRANSVR_STR_VAL; + struct ioexp_obj_s *ioexp_p = self->ioexp_obj_p; + + if (!ioexp_p) { + snprintf(emsg, limit, "ioexp_p is null!"); + goto err_is_plugged_1; + } + present = ioexp_p->get_present(ioexp_p, self->ioexp_virt_offset); + switch (present){ + case 0: + return 1; + case 1: + return 0; + case ERR_IOEXP_UNINIT: + snprintf(emsg, limit, "ioexp_p not ready!"); + goto err_is_plugged_1; + default: + if (ioexp_p->state == STATE_IOEXP_INIT){ + snprintf(emsg, limit, "ioexp_p not ready!"); + goto err_is_plugged_1; + } + break; + } + SWPS_INFO("%s: Exception case! :%d :%d\n", + __func__, present, ioexp_p->state); + return 0; + +err_is_plugged_1: + SWPS_DEBUG("%s: %s\n", __func__, emsg); + return 0; +} + + +static int +detect_transvr_type(struct transvr_obj_s* self){ + + int type = TRANSVR_TYPE_ERROR; + + self->i2c_client_p->addr = VAL_TRANSVR_COMID_ARREESS; + type = i2c_smbus_read_byte_data(self->i2c_client_p, + VAL_TRANSVR_COMID_OFFSET); + + /* Case: 1. Wait transceiver I2C module. + * 2. Transceiver I2C module failure. + * Note: 1. SFF allow maximum transceiver initial time is 2 second. So, there + * are exist some case that we need to wait transceiver. + * For these case, we keeps status on "TRANSVR_TYPE_UNPLUGGED", than + * state machine will keep trace with it. + * 2. There exist some I2C failure case we need to handle. Such as user + * insert the failure transceiver, or any reason cause it abnormal. + */ + if (type < 0){ + switch (type) { + case -EIO: + SWPS_DEBUG("%s: %s smbus return:-5 (I/O error)\n", + __func__, self->swp_name); + return TRANSVR_TYPE_UNPLUGGED; + case -ENXIO: + SWPS_DEBUG("%s: %s smbus return:-6 (No such device or address)\n", + __func__, self->swp_name); + return TRANSVR_TYPE_UNPLUGGED; + default: + break; + } + SWPS_INFO("%s: %s unexpected smbus return:%d \n", + __func__, self->swp_name, type); + return TRANSVR_TYPE_ERROR; + } + /* Identify valid transceiver type */ + switch (type){ + case TRANSVR_TYPE_SFP: + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + break; + case TRANSVR_TYPE_UNKNOW_1: + case TRANSVR_TYPE_UNKNOW_2: + type = TRANSVR_TYPE_UNKNOW_2; + break; + default: + SWPS_DEBUG("%s: unknow type:0x%02x \n", __func__, type); + type = TRANSVR_TYPE_ERROR; + break; + } + return type; +} + + +static int +detect_transvr_state(struct transvr_obj_s *self, + int result[2]){ + /* [return] [result-0] [result-1] + * 0 STATE_TRANSVR_CONNECTED TRANSVR_TYPE_FAKE + * 0 STATE_TRANSVR_DISCONNECTED TRANSVR_TYPE_UNPLUGGED + * 0 STATE_TRANSVR_ISOLATED TRANSVR_TYPE_ERROR + * 0 STATE_TRANSVR_INIT / + * 0 STATE_TRANSVR_SWAPPED + * 0 STATE_TRANSVR_CONNECTED + * ERR_TRNASVR_BE_ISOLATED STATE_TRANSVR_ISOLATED TRANSVR_TYPE_ERROR + * ERR_TRANSVR_I2C_CRASH STATE_TRANSVR_UNEXCEPTED TRANSVR_TYPE_ERROR + * ERR_TRANSVR_UNEXCPT STATE_TRANSVR_UNEXCEPTED TRANSVR_TYPE_UNKNOW_1/2 + */ + result[0] = STATE_TRANSVR_UNEXCEPTED; /* For return state */ + result[1] = TRANSVR_TYPE_ERROR; /* For return type */ + + /* Case1: Fake type */ + if (self->type == TRANSVR_TYPE_FAKE){ + result[0] = STATE_TRANSVR_CONNECTED; + result[1] = TRANSVR_TYPE_FAKE; + return 0; + } + /* Case2: Transceiver unplugged */ + if (!is_plugged(self)){ + result[0] = STATE_TRANSVR_DISCONNECTED; + result[1] = TRANSVR_TYPE_UNPLUGGED; + return 0; + } + /* Case3: Transceiver be isolated */ + if (self->state == STATE_TRANSVR_ISOLATED){ + result[0] = STATE_TRANSVR_ISOLATED; + result[1] = TRANSVR_TYPE_ERROR; + return ERR_TRNASVR_BE_ISOLATED; + } + /* Case4: Transceiver plugged */ + result[1] = detect_transvr_type(self); + /* Case4.1: I2C topology crash + * Note : There are some I2C issues cause by transceiver/cables. + * We need to check topology status when user insert it. + * But in this step, we can't not ensure this is the issues + * port. So, it return the ERR_TRANSVR_I2C_CRASH, then upper + * layer will diagnostic I2C topology. + */ + if (check_channel_tier_1() < 0) { + SWPS_INFO("%s: %s detect I2C crash :%d\n", + __func__, self->swp_name, self->state); + result[0] = STATE_TRANSVR_UNEXCEPTED; + result[1] = TRANSVR_TYPE_ERROR; + return ERR_TRANSVR_I2C_CRASH; + } + /* Case4.2: System initial not ready, + * Note : Sometime i2c channel or transceiver EEPROM will delay that will + * cause system in inconsistent state between EEPROM and IOEXP. + * In this case, SWP transceiver object keep state at LINK_DOWN + * to wait system ready. + * By the way, State Machine will handle these case. + */ + if (result[1] == TRANSVR_TYPE_UNPLUGGED){ + result[0] = STATE_TRANSVR_DISCONNECTED; + return 0; + } + /* Case4.3: Error transceiver type */ + if (result[1] == TRANSVR_TYPE_ERROR){ + result[0] = STATE_TRANSVR_ISOLATED; + SWPS_INFO("%s: %s detect error type\n", __func__, self->swp_name); + alarm_msg_2_user(self, "detected transceiver/cables not meet SFF standard!"); + return ERR_TRNASVR_BE_ISOLATED; + } + /* Case3.3: Unknow transceiver type */ + if ((result[1] == TRANSVR_TYPE_UNKNOW_1) || + (result[1] == TRANSVR_TYPE_UNKNOW_2) ){ + result[0] = STATE_TRANSVR_UNEXCEPTED; + return ERR_TRANSVR_UNEXCPT; + } + /* Case3.4: During initial process */ + if (self->state == STATE_TRANSVR_INIT){ + result[0] = STATE_TRANSVR_INIT; + return 0; + } + /* Case3.5: Transceiver be swapped */ + if (self->type != result[1]){ + result[0] = STATE_TRANSVR_SWAPPED; + return 0; + } + /* Case3.6: Link up state */ + result[0] = STATE_TRANSVR_CONNECTED; + return 0; +} +int +common_fsm_4_direct_mode(struct transvr_obj_s* self, + char *caller_name){ + + int err; + int detect_result[2]; + int current_state = STATE_TRANSVR_UNEXCEPTED; + int current_type = TRANSVR_TYPE_ERROR; + + if (self->state == STATE_TRANSVR_NEW) { + if (_transvr_init_handler(self) < 0){ + return ERR_TRANSVR_INIT_FAIL; + } + } + err = detect_transvr_state(self, detect_result); + if (err < 0) { + return err; + } + /* In Direct mode, driver only detect transceiver when user call driver interface + * which on sysfs. So it only need consider the state of Transceiver. + */ + current_state = detect_result[0]; + current_type = detect_result[1]; + + switch (current_state){ + + case STATE_TRANSVR_DISCONNECTED: /* Transceiver is not plugged */ + self->state = current_state; + self->type = current_type; + return ERR_TRANSVR_UNPLUGGED; + + case STATE_TRANSVR_INIT: /* Transceiver is plugged, system not ready */ + return ERR_TRANSVR_UNINIT; + + case STATE_TRANSVR_ISOLATED: /* Transceiver is plugged, but has some issues */ + return ERR_TRNASVR_BE_ISOLATED; + + case STATE_TRANSVR_CONNECTED: /* Transceiver is plugged, system is ready */ + self->state = current_state; + self->type = current_type; + return 0; + + case STATE_TRANSVR_SWAPPED: /* Transceiver is plugged, system detect user changed */ + self->type = current_type; + if (reload_transvr_obj(self, current_type) < 0){ + self->state = STATE_TRANSVR_UNEXCEPTED; + return ERR_TRANSVR_UNEXCPT; + } + self->state = current_state; + return 0; + + case STATE_TRANSVR_UNEXCEPTED: /* Transceiver type or state is unexpected case */ + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = TRANSVR_TYPE_ERROR; + return ERR_TRANSVR_UNEXCPT; + + default: + SWPS_INFO("%s: state:%d not in define.\n", __func__, current_state); + break; + } + return ERR_TRANSVR_UNEXCPT; +} + +int +fake_fsm_4_direct_mode(struct transvr_obj_s* self, + char *caller_name){ + self->state = STATE_TRANSVR_CONNECTED; + self->type = TRANSVR_TYPE_FAKE; + return 0; +} + +/* ========== Object Initial handler ========== + */ +static int +_is_transvr_valid(struct transvr_obj_s *self, + int type, + int state) { + /* [Return] + * 0 : OK, inserted + * EVENT_TRANSVR_INIT_DOWN : OK, removed + * EVENT_TRANSVR_INIT_FAIL : Outside error, type doesn't supported + * EVENT_TRANSVR_EXCEP_INIT : Internal error, state undefined + */ + switch (type) { + case TRANSVR_TYPE_SFP: + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + case TRANSVR_TYPE_UNPLUGGED: + case TRANSVR_TYPE_FAKE: + break; + default: + SWPS_INFO("detect undefined type:0x%02x on %s\n", + type, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; + } + switch (state) { + case STATE_TRANSVR_DISCONNECTED: + return EVENT_TRANSVR_INIT_DOWN; + case STATE_TRANSVR_INIT: + case STATE_TRANSVR_CONNECTED: + case STATE_TRANSVR_SWAPPED: + break; + default: + SWPS_INFO("detect undefined state:%d on %s\n", + state, self->swp_name); + return EVENT_TRANSVR_EXCEP_INIT; + } + return 0; +} + + +static int +_is_transvr_hw_ready(struct transvr_obj_s *self, + int type){ + /* [Return] + * EVENT_TRANSVR_TASK_DONE : Ready + * EVENT_TRANSVR_TASK_WAIT : Not ready + * EVENT_TRANSVR_INIT_FAIL : Error + */ + int addr = DEBUG_TRANSVR_INT_VAL; + int page = DEBUG_TRANSVR_INT_VAL; + int offs = DEBUG_TRANSVR_INT_VAL; + int bit = DEBUG_TRANSVR_INT_VAL; + int ready = DEBUG_TRANSVR_INT_VAL; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t ab_val = DEBUG_TRANSVR_HEX_VAL; + + switch (type) { + case TRANSVR_TYPE_SFP: + addr = VAL_TRANSVR_8472_READY_ADDR; + page = VAL_TRANSVR_8472_READY_PAGE; + offs = VAL_TRANSVR_8472_READY_OFFSET; + bit = VAL_TRANSVR_8472_READY_BIT; + ready = VAL_TRANSVR_8472_READY_VALUE; + ab_val = VAL_TRANSVR_8472_READY_ABNORMAL; + break; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + addr = VAL_TRANSVR_8436_READY_ADDR; + page = VAL_TRANSVR_8436_READY_PAGE; + offs = VAL_TRANSVR_8436_READY_OFFSET; + bit = VAL_TRANSVR_8436_READY_BIT; + ready = VAL_TRANSVR_8436_READY_VALUE; + ab_val = VAL_TRANSVR_8436_READY_ABNORMAL; + break; + + case TRANSVR_TYPE_UNPLUGGED: + case TRANSVR_TYPE_FAKE: + return EVENT_TRANSVR_TASK_DONE; + + default: + emsg = "unexpected case"; + goto err_is_transvr_hw_ready; + } + /* Select target page */ + err = _common_setup_page(self, addr, page, offs, 1, 0); + if (err < 0) { + emsg = "setup page fail"; + goto err_is_transvr_hw_ready; + } + /* Check feature supported + * [Note] + * Some of transceiver/cables doesn't support "Status Indicators" + * (ex:DAC, RJ45 copper SFP ...etc). In these case, we bypass the + * step of checking Status Indicators, then state machine will take + * the following handle procedure. + */ + err = i2c_smbus_read_byte_data(self->i2c_client_p, + VAL_TRANSVR_COMID_OFFSET); + if (err < 0) { + emsg = "doesn't support Status Indicators"; + goto bypass_is_transvr_hw_ready; + } + /* Filter abnormal case */ + if (err == ab_val) { + emsg = "detect using unusual definition."; + goto bypass_is_transvr_hw_ready; + } + /* Get Status Indicators */ + err = i2c_smbus_read_byte_data(self->i2c_client_p, offs); + if (err < 0) { + emsg = "detect current value fail"; + goto err_is_transvr_hw_ready; + } + if ((err & (1<:%d\n", __func__, emsg, type); + return EVENT_TRANSVR_TASK_DONE; + +err_is_transvr_hw_ready: + SWPS_DEBUG("%s: %s :%d\n", __func__, emsg, type); + return EVENT_TRANSVR_INIT_FAIL; +} + +static int +_transvr_init_handler(struct transvr_obj_s *self){ + + int detect[2]; + int d_state = STATE_TRANSVR_UNEXCEPTED; + int d_type = TRANSVR_TYPE_ERROR; + int result = ERR_TRANSVR_UNINIT; + int retry = 6; /* (6+1) x 0.3 = 2.1s > spec:2.0s */ + int elimit = 63; + char emsg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Clean and check callback */ + self->state = STATE_TRANSVR_INIT; + if (self->init == NULL) { + snprintf(emsg, elimit, "init() is null"); + goto initer_err_case_unexcept_0; + } + /* Detect transceiver information */ + result = detect_transvr_state(self, detect); + if (result < 0) { + snprintf(emsg, elimit, "detect_transvr_state() fail"); + switch (result) { + case ERR_TRANSVR_I2C_CRASH: + goto initer_err_case_i2c_ceash; + case ERR_TRNASVR_BE_ISOLATED: + goto initer_err_case_be_isolated; + + case ERR_TRANSVR_UNEXCPT: + default: + break; + } + goto initer_err_case_retry_1; + } + d_state = detect[0]; + d_type = detect[1]; + + /* Verify transceiver type and state */ + switch (_is_transvr_valid(self, d_type, d_state)) { + case 0: + break; + case EVENT_TRANSVR_INIT_DOWN: + goto initer_ok_case_down;; + case EVENT_TRANSVR_INIT_FAIL: + snprintf(emsg, elimit, "transceiver type doesn't support"); + goto initer_err_case_alarm_to_user; + case EVENT_TRANSVR_EXCEP_INIT: + default: + goto initer_err_case_unexcept_0; + } + + /* Handle reload case */ + if (self->type != d_type){ + /* This is the protect mechanism. Normally, This case will not happen. + * When State machine detect swap event during initial, It will trigger + * reload function to ensure type correct. */ + if (_reload_transvr_obj(self, d_type) < 0){ + snprintf(emsg, elimit, "reload object fail"); + goto initer_err_case_unexcept_0; + } + } + + /* Check transceiver HW initial ready */ + switch (_is_transvr_hw_ready(self, d_type)) { + case EVENT_TRANSVR_TASK_DONE: + break; + case EVENT_TRANSVR_TASK_WAIT: + goto initer_err_case_retry_1; + case EVENT_TRANSVR_INIT_FAIL: + default: + goto initer_err_case_unexcept_0; + } + + /* Try to update all and check */ + if (self->update_all(self, 1) < 0){ + /* For some transceiver, EEPROME has lag issues during initial stage. + * In this case, we set status back to STATE_TRANSVR_NEW, than it will + * be checked in next polling cycle. */ + goto initer_err_case_retry_1; + } + + /* Execute init() call back */ + result = self->init(self); + switch (result) { + case EVENT_TRANSVR_TASK_DONE: + break; + case EVENT_TRANSVR_TASK_WAIT: + goto initer_ok_case_wait; + + default: + snprintf(emsg, elimit, "undefined init() return:%d\n", result); + goto initer_err_case_unexcept_0; + } + goto initer_ok_case_up; + + +initer_ok_case_wait: + return EVENT_TRANSVR_TASK_WAIT; + +initer_ok_case_up: + self->state = STATE_TRANSVR_CONNECTED; + self->temp = 0; + return EVENT_TRANSVR_INIT_UP; + +initer_ok_case_down: + self->temp = 0; + self->state = STATE_TRANSVR_DISCONNECTED; + return EVENT_TRANSVR_INIT_DOWN; + +initer_err_case_i2c_ceash: + SWPS_DEBUG("%s: %s :%s :I2C crash\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_UNEXCEPTED; + return EVENT_TRANSVR_I2C_CRASH; + +initer_err_case_be_isolated: + SWPS_DEBUG("%s: %s :%s :isolated\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_ISOLATED; + return EVENT_TRANSVR_EXCEP_ISOLATED; + +initer_err_case_retry_1: + SWPS_DEBUG("%s: %s :%s :retry\n", + __func__, emsg, self->swp_name); + if (_transvr_handle_retry(self, retry) == 0) { + self->state = STATE_TRANSVR_NEW; + return EVENT_TRANSVR_INIT_REINIT; + } + goto initer_err_case_alarm_to_user; + +initer_err_case_unexcept_0: + self->state = STATE_TRANSVR_UNEXCEPTED; + return EVENT_TRANSVR_INIT_FAIL; + +initer_err_case_alarm_to_user: + SWPS_DEBUG("%s: %s :%s :alarm_to_user\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_UNEXCEPTED; + alarm_msg_2_user(self, "detected transceiver/cables not meet SFF standard"); + return EVENT_TRANSVR_INIT_FAIL; +} + +static int +setup_transvr_private_cb(struct transvr_obj_s *self, + int transvr_type){ + switch (transvr_type){ + case TRANSVR_TYPE_SFP: + self->fsm_4_direct = common_fsm_4_direct_mode; + return 0; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + self->fsm_4_direct = common_fsm_4_direct_mode; + return 0; + + case TRANSVR_TYPE_QSFP_28: + self->fsm_4_direct = common_fsm_4_direct_mode; + return 0; + + case TRANSVR_TYPE_FAKE: + self->fsm_4_direct = fake_fsm_4_direct_mode; + return 0; + + default: + break; + } + SWPS_WARN("%s: Detect non-defined type:%d\n", __func__, transvr_type); + return ERR_TRANSVR_UNEXCPT; +} + + +static struct eeprom_map_s * +get_eeprom_map(int transvr_type){ + + switch (transvr_type){ + case TRANSVR_TYPE_SFP: + return &eeprom_map_sfp; + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + return &eeprom_map_qsfp; + case TRANSVR_TYPE_QSFP_28: + return &eeprom_map_qsfp28; + + default: + break; + } + SWPS_WARN("%s: Detect non-defined type:%d\n", __func__, transvr_type); + return NULL; +} + + +static int +setup_transvr_ssize_attr(char *swp_name, + struct transvr_obj_s *self, + struct eeprom_map_s *map_p, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int chan_id, + int run_mode){ + switch (run_mode){ + case TRANSVR_MODE_DIRECT: /* Direct access device mode */ + self->mode = run_mode; + break; + default: + SWPS_ERR("%s: non-defined run_mode:%d\n", + __func__, run_mode); + self->mode = DEBUG_TRANSVR_INT_VAL; + return -1; + } + self->eeprom_map_p = map_p; + self->ioexp_obj_p = ioexp_obj_p; + self->ioexp_virt_offset = ioexp_virt_offset; + self->chan_id = chan_id; + self->layout = transvr_type; + self->type = transvr_type; + self->chipset_type = chipset_type; + self->state = STATE_TRANSVR_NEW; + self->info = STATE_TRANSVR_NEW; + self->auto_tx_disable = VAL_TRANSVR_FUNCTION_DISABLE; + strncpy(self->swp_name, swp_name, 32); + mutex_init(&self->lock); + return 0; +} + + + +static int +setup_i2c_client(struct transvr_obj_s *self){ + + struct i2c_adapter *adap = NULL; + struct i2c_client *client = NULL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + adap = i2c_get_adapter(self->chan_id); + if(!adap){ + snprintf(err_msg, sizeof(err_msg), + "can not get adap:%d", self->chan_id); + goto err_setup_i2c_client; + } + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client){ + snprintf(err_msg, sizeof(err_msg), + "can not kzalloc client:%d", self->chan_id); + goto err_setup_i2c_client; + } + client->adapter = adap; + self->i2c_client_p = client; + self->i2c_client_p->addr = VAL_TRANSVR_COMID_ARREESS; + return 0; + +err_setup_i2c_client: + SWPS_ERR("%s: %s\n", __func__, err_msg); + return ERR_TRANSVR_UNEXCPT; +} + + +struct transvr_obj_s * +create_transvr_obj(char *swp_name, + int chan_id, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int run_mode){ + + struct transvr_obj_s *result_p; + struct eeprom_map_s *map_p; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Allocate transceiver object */ + map_p = get_eeprom_map(transvr_type); + if (!map_p){ + snprintf(err_msg, sizeof(err_msg), + "Invalid transvr_type:%d", transvr_type); + goto err_create_transvr_fail; + } + result_p = kzalloc(sizeof(*result_p), GFP_KERNEL); + if (!result_p){ + snprintf(err_msg, sizeof(err_msg), "kzalloc fail"); + goto err_create_transvr_fail; + } + /* Prepare static size attributes */ + if (setup_transvr_ssize_attr(swp_name, + result_p, + map_p, + ioexp_obj_p, + ioexp_virt_offset, + transvr_type, + chipset_type, + chan_id, + run_mode) < 0){ + goto err_create_transvr_sattr_fail; + } + + /* Prepare call back functions of object */ + if (setup_transvr_private_cb(result_p, transvr_type) < 0){ + goto err_create_transvr_sattr_fail; + } + /* Prepare i2c client object */ + if (setup_i2c_client(result_p) < 0){ + goto err_create_transvr_sattr_fail; + } + return result_p; +err_create_transvr_sattr_fail: + kfree(result_p); +err_create_transvr_fail: + SWPS_ERR("%s: %s :%d :%d :%d\n", + __func__, err_msg, chan_id, ioexp_virt_offset, transvr_type); + return NULL; +} + + +static int +_reload_transvr_obj(struct transvr_obj_s *self, + int new_type){ + + struct eeprom_map_s *new_map_p; + struct eeprom_map_s *old_map_p = self->eeprom_map_p; + struct i2c_client *old_i2c_p = self->i2c_client_p; + int old_type = self->type; + + /* Change state to STATE_TRANSVR_INIT */ + self->state = STATE_TRANSVR_INIT; + self->type = new_type; + /* Replace EEPROME map */ + new_map_p = get_eeprom_map(new_type); + if (!new_map_p){ + goto err_private_reload_func_1; + } + self->eeprom_map_p = new_map_p; + /* Reload i2c client */ + if (setup_i2c_client(self) < 0){ + goto err_private_reload_func_2; + } + if (setup_transvr_private_cb(self, new_type) < 0){ + goto err_private_reload_func_3; + } + kfree(old_i2c_p); + return 0; + +err_private_reload_func_3: + SWPS_INFO("%s: init() fail!\n", __func__); + kfree(old_i2c_p); + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = TRANSVR_TYPE_ERROR; + return -2; + +err_private_reload_func_2: + self->eeprom_map_p = old_map_p; + self->i2c_client_p = old_i2c_p; +err_private_reload_func_1: + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = old_type; + SWPS_INFO("%s fail! :0x%02x\n", __func__, new_type); + return -1; +} + + +static int +reload_transvr_obj(struct transvr_obj_s *self, + int new_type){ + + int result_val = ERR_TRANSVR_UNEXCPT; + + /* Reload phase */ + result_val = _reload_transvr_obj(self, new_type); + if (result_val < 0){ + SWPS_INFO("%s: reload phase fail! :%d\n", + __func__, result_val); + return EVENT_TRANSVR_RELOAD_FAIL; + } + /* Initial phase */ + result_val = _transvr_init_handler(self); + if (result_val < 0){ + SWPS_INFO("%s: initial phase fail! :%d\n", + __func__, result_val); + } + return result_val; +} + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/transceiver.h b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/transceiver.h new file mode 100644 index 000000000000..0e79f0b9027f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/modules/transceiver.h @@ -0,0 +1,168 @@ +#ifndef TRANSCEIVER_H +#define TRANSCEIVER_H + +#include + +/* Transceiver type define */ +#define TRANSVR_TYPE_UNKNOW_1 (0x00) +#define TRANSVR_TYPE_UNKNOW_2 (0xff) +#define TRANSVR_TYPE_SFP (0x03) /* Define for SFP, SFP+, SFP28 */ +#define TRANSVR_TYPE_QSFP (0x0c) +#define TRANSVR_TYPE_QSFP_PLUS (0x0d) +#define TRANSVR_TYPE_QSFP_28 (0x11) +#define TRANSVR_TYPE_UNPLUGGED (0xfa) /* Define for ERROR handle */ +#define TRANSVR_TYPE_FAKE (0xfc) /* Define for ERROR handle */ +#define TRANSVR_TYPE_INCONSISTENT (0xfd) /* Define for ERROR handle */ +#define TRANSVR_TYPE_ERROR (0xfe) /* Define for ERROR handle */ + +/* Transceiver mode define */ +#define TRANSVR_MODE_DIRECT (21000) + +/* Transceiver state define + * [Note] + * 1. State is used to represent the state of "Transceiver" and "Object". + * 2. State for different target has different means. The description as following: + */ +#define STATE_TRANSVR_CONNECTED (0) /* [Transvr]:Be plugged in. [Obj]:Link up, and work normally. */ +#define STATE_TRANSVR_NEW (-100) /* [Transvr]:(Not used) [Obj]:Create */ +#define STATE_TRANSVR_INIT (-101) /* [Transvr]:Be plugged in. [Obj]:Link up, and in initial process. */ +#define STATE_TRANSVR_ISOLATED (-102) /* [Transvr]:Be plugged in. [Obj]:Isolate, and not provide service. */ +#define STATE_TRANSVR_SWAPPED (-200) /* [Transvr]:Be plugged in. [Obj]:(Not used) */ +#define STATE_TRANSVR_DISCONNECTED (-300) /* [Transvr]:Un-plugged. [Obj]:Link down, and not provide service. */ +#define STATE_TRANSVR_UNEXCEPTED (-901) /* [Transvr]:Any [Obj]:Any, and not in expect case. */ + +/* Event for task handling */ +#define EVENT_TRANSVR_TASK_WAIT (2101) +#define EVENT_TRANSVR_TASK_DONE (0) +#define EVENT_TRANSVR_TASK_FAIL (-2101) +/* Event for initial handling */ +#define EVENT_TRANSVR_INIT_UP (2201) +#define EVENT_TRANSVR_INIT_DOWN (1) +#define EVENT_TRANSVR_INIT_REINIT (-2201) +#define EVENT_TRANSVR_INIT_FAIL (-2202) +/* Event for others */ +#define EVENT_TRANSVR_RELOAD_FAIL (-2301) +#define EVENT_TRANSVR_EXCEP_INIT (-2401) +#define EVENT_TRANSVR_EXCEP_UP (-2402) +#define EVENT_TRANSVR_EXCEP_DOWN (-2403) +#define EVENT_TRANSVR_EXCEP_SWAP (-2404) +#define EVENT_TRANSVR_EXCEP_EXCEP (-2405) +#define EVENT_TRANSVR_EXCEP_ISOLATED (-2406) +#define EVENT_TRANSVR_I2C_CRASH (-2501) + +/* Transceiver error code define */ +#define ERR_TRANSVR_UNINIT (-201) +#define ERR_TRANSVR_UNPLUGGED (-202) +#define ERR_TRANSVR_ABNORMAL (-203) +#define ERR_TRANSVR_NOSTATE (-204) +#define ERR_TRANSVR_NOTSUPPORT (-205) +#define ERR_TRANSVR_BADINPUT (-206) +#define ERR_TRANSVR_UPDATE_FAIL (-207) +#define ERR_TRANSVR_RELOAD_FAIL (-208) +#define ERR_TRANSVR_INIT_FAIL (-209) +#define ERR_TRANSVR_UNDEFINED (-210) +#define ERR_TRANSVR_TASK_FAIL (-211) +#define ERR_TRANSVR_TASK_BUSY (-212) +#define ERR_TRANSVR_FUNC_DISABLE (-214) +#define ERR_TRANSVR_I2C_CRASH (-297) +#define ERR_TRNASVR_BE_ISOLATED (-298) +#define ERR_TRANSVR_UNEXCPT (-299) + +/* For debug */ +#define DEBUG_TRANSVR_INT_VAL (-99) +#define DEBUG_TRANSVR_HEX_VAL (0xfe) +#define DEBUG_TRANSVR_STR_VAL "ERROR" + +/* For system internal */ +#define VAL_TRANSVR_COMID_ARREESS (0x50) +#define VAL_TRANSVR_COMID_OFFSET (0x00) +#define VAL_TRANSVR_8472_READY_ADDR (0x51) +#define VAL_TRANSVR_8472_READY_PAGE (-1) +#define VAL_TRANSVR_8472_READY_OFFSET (110) +#define VAL_TRANSVR_8472_READY_BIT (0) +#define VAL_TRANSVR_8472_READY_VALUE (0) +#define VAL_TRANSVR_8472_READY_ABNORMAL (0xff) +#define VAL_TRANSVR_8436_READY_ADDR (0x50) +#define VAL_TRANSVR_8436_READY_PAGE (-1) +#define VAL_TRANSVR_8436_READY_OFFSET (2) +#define VAL_TRANSVR_8436_READY_BIT (0) +#define VAL_TRANSVR_8436_READY_VALUE (0) +#define VAL_TRANSVR_8436_READY_ABNORMAL (0xff) +#define VAL_TRANSVR_8436_PWD_ADDR (0x50) +#define VAL_TRANSVR_8436_PWD_PAGE (-1) +#define VAL_TRANSVR_8436_PWD_OFFSET (123) +#define VAL_TRANSVR_PAGE_FREE (-99) +#define VAL_TRANSVR_PAGE_SELECT_OFFSET (127) +#define VAL_TRANSVR_PAGE_SELECT_DELAY (5) +#define VAL_TRANSVR_TASK_RETRY_FOREVER (-999) +#define VAL_TRANSVR_FUNCTION_DISABLE (-1) +#define STR_TRANSVR_SFP "SFP" +#define STR_TRANSVR_QSFP "QSFP" +#define STR_TRANSVR_QSFP_PLUS "QSFP+" +#define STR_TRANSVR_QSFP28 "QSFP28" + +/* BCM chip type define */ +#define BCM_CHIP_TYPE_TOMAHAWK (31002) /* Redwood, Cypress */ + +/* Info from transceiver EEPROM */ +struct eeprom_map_s { + int addr_rx_los; int page_rx_los; int offset_rx_los; int length_rx_los; + int addr_tx_disable; int page_tx_disable; int offset_tx_disable; int length_tx_disable; + int addr_tx_fault; int page_tx_fault; int offset_tx_fault; int length_tx_fault; +}; + +/* Class of transceiver object */ +struct transvr_obj_s { + /* ========== Object private property ========== + */ + struct device *transvr_dev_p; + struct eeprom_map_s *eeprom_map_p; + struct i2c_client *i2c_client_p; + struct ioexp_obj_s *ioexp_obj_p; + struct mutex lock; + char swp_name[32]; + int auto_tx_disable; + int chan_id; + int chipset_type; + int curr_page; + int info; + int ioexp_virt_offset; + int lane_id[8]; + int layout; + int mode; + int retry; + int state; + int temp; + int type; + + /* ========== Object private functions ========== + */ + int (*init)(struct transvr_obj_s *self); + int (*update_all)(struct transvr_obj_s *self, int show_err); + int (*fsm_4_direct)(struct transvr_obj_s* self, char *caller_name); +}; + + +/* For AVL Mapping */ +struct transvr_avl_s { + char vendor_name[32]; + char vendor_pn[32]; + int (*init)(struct transvr_obj_s *self); +}; + +struct transvr_obj_s * +create_transvr_obj(char *swp_name, + int chan_id, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int run_mode); + +void alarm_msg_2_user(struct transvr_obj_s *self, char *emsg); + +#endif /* TRANSCEIVER_H */ + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/utils/inventec_d7054_util.py b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/utils/inventec_d7054_util.py new file mode 100755 index 000000000000..7fbb707f4187 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d7054q28b/utils/inventec_d7054_util.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python +# +# Copyright (C) 2017 Inventec, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +""" +Usage: %(scriptName)s [options] command object + +options: + -h | --help : this help message + -d | --debug : run with debug mode + -f | --force : ignore error during installation or clean +command: + install : install drivers and generate related sysfs nodes + clean : uninstall drivers and remove related sysfs nodes +""" + +import os +import commands +import sys, getopt +import logging +import re +import time +from collections import namedtuple + +DEBUG = False +args = [] +FORCE = 0 +i2c_prefix = '/sys/bus/i2c/devices/' + + +if DEBUG == True: + print sys.argv[0] + print 'ARGV :', sys.argv[1:] + + +def main(): + global DEBUG + global args + global FORCE + + if len(sys.argv)<2: + show_help() + + options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', + 'debug', + 'force', + ]) + if DEBUG == True: + print options + print args + print len(sys.argv) + + for opt, arg in options: + if opt in ('-h', '--help'): + show_help() + elif opt in ('-d', '--debug'): + DEBUG = True + logging.basicConfig(level=logging.INFO) + elif opt in ('-f', '--force'): + FORCE = 1 + else: + logging.info('no option') + for arg in args: + if arg == 'install': + install() + elif arg == 'clean': + uninstall() + else: + show_help() + + + return 0 + +def show_help(): + print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} + sys.exit(0) + +def show_log(txt): + if DEBUG == True: + print "[D7032]"+txt + return + +def exec_cmd(cmd, show): + logging.info('Run :'+cmd) + status, output = commands.getstatusoutput(cmd) + show_log (cmd +"with result:" + str(status)) + show_log (" output:"+output) + if status: + logging.info('Failed :'+cmd) + if show: + print('Failed :'+cmd) + return status, output + +instantiate =[ +#'echo pca9548 0x71> /sys/bus/i2c/devices/i2c-0/new_device', +#'echo pca9548 0x72> /sys/bus/i2c/devices/i2c-0/i2c-2/new_device', +#'echo pca9548 0x72> /sys/bus/i2c/devices/i2c-0/i2c-3/new_device', +#'echo pca9548 0x72> /sys/bus/i2c/devices/i2c-0/i2c-4/new_device', +#'echo pca9548 0x72> /sys/bus/i2c/devices/i2c-0/i2c-5/new_device', +#'echo pca9548 0x72> /sys/bus/i2c/devices/i2c-0/i2c-6/new_device', +#'echo pca9548 0x72> /sys/bus/i2c/devices/i2c-0/i2c-7/new_device', +#'echo pca9548 0x72> /sys/bus/i2c/devices/i2c-0/i2c-8/new_device', +'echo inv_eeprom 0x53 > /sys/bus/i2c/devices/i2c-0/new_device'] +#'echo inv_psoc 0x66> /sys/bus/i2c/devices/i2c-0/new_device', +#'echo inv_cpld 0x55> /sys/bus/i2c/devices/i2c-0/new_device'] + +drivers =[ +'lpc_ich', +'i2c-i801', +'i2c-mux', +'i2c-mux-pca954x', +'i2c-dev', +'inv_eeprom', +'inv_platform', +'inv_psoc', +'inv_cpld', +'swps'] + + + +def system_install(): + global FORCE + + #install drivers + for i in range(0,len(drivers)): + status, output = exec_cmd("modprobe "+drivers[i], 1) + if status: + print output + if FORCE == 0: + return status + + #instantiate devices + for i in range(0,len(instantiate)): + #time.sleep(1) + status, output = exec_cmd(instantiate[i], 1) + if status: + print output + if FORCE == 0: + return status + + for i in range(10,18): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-2/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(18,26): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-3/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(26,34): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-4/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(34,42): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-5/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(42,50): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-6/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(50,58): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-7/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(58,64): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-8/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + return + + +def system_ready(): + if not device_found(): + return False + return True + +def install(): + if not device_found(): + print "No device, installing...." + status = system_install() + if status: + if FORCE == 0: + return status + else: + print " D7032 devices detected...." + return + +def uninstall(): + global FORCE + #uninstall drivers + for i in range(len(drivers)-1,-1,-1): + status, output = exec_cmd("rmmod "+drivers[i], 1) + if status: + print output + if FORCE == 0: + return status + return + +def device_found(): + ret1, log = exec_cmd("ls "+i2c_prefix+"*0072", 0) + ret2, log = exec_cmd("ls "+i2c_prefix+"i2c-2", 0) + return not(ret1 or ret2) + +if __name__ == "__main__": + main() + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/changelog b/platform/broadcom/sonic-platform-modules-inventec/debian/changelog index 3598fc1d40d1..9d33aa418ef5 100644 --- a/platform/broadcom/sonic-platform-modules-inventec/debian/changelog +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/changelog @@ -1,3 +1,8 @@ +sonic-inventec-platform-modules (1.1.0) unstable; urgency=low + * Add support for Inventec d7054 + + -- developer Tue, 18 Jul 2017 16:30:45 +0800 + sonic-inventec-platform-modules (1.0.0) unstable; urgency=low * Add support for Inventec d7032 diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/control b/platform/broadcom/sonic-platform-modules-inventec/debian/control index 328de48c097b..d570e777de98 100644 --- a/platform/broadcom/sonic-platform-modules-inventec/debian/control +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/control @@ -10,3 +10,8 @@ Architecture: amd64 Depends: linux-image-3.16.0-4-amd64 Description: kernel modules for platform devices such as fan, led +Package: platform-modules-d7054q28b +Architecture: amd64 +Depends: linux-image-3.16.0-4-amd64 +Description: kernel modules for platform devices such as fan, led + diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.init b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.init index 9b9683a4eb2a..5df1bb444123 100644 --- a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.init +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.init @@ -15,43 +15,14 @@ case "$1" in start) echo -n "Setting up board... " - depmod -a - modprobe inv_platform - modprobe inv_psoc - modprobe inv_cpld - - /usr/local/bin/onie-syseeprom -S /tmp/eeprom - # Attach 32 instances of EEPROM driver QSFP ports on IO module 1 - #eeprom can dump data using below command - for ((i=22;i<=29;i++)); - do - echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-4/i2c-$i/new_device - done - - for ((i=30;i<=37;i++)); - do - echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-5/i2c-$i/new_device - done - - for ((i=6;i<=13;i++)); - do - echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-2/i2c-$i/new_device - done - - for ((i=14;i<=21;i++)); - do - echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-3/i2c-$i/new_device - done - + depmod -a + /usr/local/bin/inventec_d7032_util.py -f install echo "done." ;; stop) - - rmmod inv_cpld - rmmod inv_psoc - rmmod inv_platform - + + /usr/local/bin/inventec_d7032_util.py -f clean echo "done." ;; diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.install b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.install index 996d5e36b781..0864a728ea79 100644 --- a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.install +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.install @@ -1 +1 @@ -d7032q28b/conf/d7032q28b-modules.conf etc/modules-load.d +d7032q28b/utils/inventec_d7032_util.py usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.upstart b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.upstart new file mode 100644 index 000000000000..cbb96a664f6a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7032q28b.upstart @@ -0,0 +1,5 @@ +description "SONiC platform service" + +respawn + +exec /usr/local/bin/inventec_d7032_util.py -f install diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.init b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.init new file mode 100644 index 000000000000..20341f8527e5 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.init @@ -0,0 +1,40 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: setup-board +# Required-Start: +# Required-Stop: +# Should-Start: +# Should-Stop: +# Default-Start: S +# Default-Stop: 0 6 +# Short-Description: Setup Inventec d7054q28b board. +### END INIT INFO + +case "$1" in +start) + echo -n "Setting up board... " + + depmod -a + /usr/local/bin/inventec_d7054_util.py -f install + echo "done." + ;; + +stop) + + /usr/local/bin/inventec_d7054_util.py -f clean + echo "done." + + ;; + +force-reload|restart) + echo "Not supported" + ;; + +*) + echo "Usage: /etc/init.d/platform-modules-d7054q28b.init {start|stop}" + exit 1 + ;; +esac + +exit 0 diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.install b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.install new file mode 100644 index 000000000000..42bf3f23c809 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.install @@ -0,0 +1 @@ +d7054q28b/utils/inventec_d7054_util.py usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.upstart b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.upstart new file mode 100644 index 000000000000..9f185f47b623 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d7054q28b.upstart @@ -0,0 +1,5 @@ +description "SONiC platform service" + +respawn + +exec /usr/local/bin/inventec_d7054_util.py -f install diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/rules b/platform/broadcom/sonic-platform-modules-inventec/debian/rules index 166a3426b2ba..6ead4c21de50 100755 --- a/platform/broadcom/sonic-platform-modules-inventec/debian/rules +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/rules @@ -14,7 +14,7 @@ export INSTALL_MOD_DIR:=extra KVERSION ?= $(shell uname -r) KERNEL_SRC := /lib/modules/$(KVERSION) MOD_SRC_DIR:= $(shell pwd) -MODULE_DIRS:= d7032q28b +MODULE_DIRS:= d7032q28b d7054q28b %: dh $@ @@ -31,7 +31,8 @@ override_dh_auto_install: cp $(MOD_SRC_DIR)/$${mod}/modules/*.ko \ debian/platform-modules-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ dh_installdirs -pplatform-modules-$${mod} usr/local/bin; \ - cp -r $(MOD_SRC_DIR)/$${mod}/utils/onie-syseeprom debian/platform-modules-$${mod}/usr/local/bin/; \ + cp $(MOD_SRC_DIR)/$${mod}/utils/* \ + debian/platform-modules-$${mod}/usr/local/bin; \ done) override_dh_usrlocal: From a9566bdb1e708de2a0ec249e54d05bdf42c90618 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 19 Oct 2017 16:52:33 -0700 Subject: [PATCH 0852/1011] [Broadcom]: Update Broadcom SAI package to 3.0.3.2-8 (#1057) Update Inventec config.bcm files Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index bf20f0dc706f..bee229ddbebf 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-7_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-7_amd64.deb?sv=2015-04-05&sr=b&sig=RUUm3WJuGYmtIatkKtR5iAuI%2FG2KM9hMXewAEnR2AKY%3D&se=2031-06-26T21%3A45%3A55Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-8_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-8_amd64.deb?sv=2015-04-05&sr=b&sig=PYRdEo1SB0TfoahBoxwoNMt4g1V5aQpBH5RolBGZ6Lw%3D&se=2031-06-28T20%3A29%3A10Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-7_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-8_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-7_amd64.deb?sv=2015-04-05&sr=b&sig=hTQZeaqa7oiR9YTIuUGG1DGYNg8bwlWKB2J2r46Mq%2BE%3D&se=2031-06-26T21%3A46%3A16Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-8_amd64.deb?sv=2015-04-05&sr=b&sig=HWoCzzgNscATWcW0KXjh24LdoJ0AM4sVgISgyBh60MI%3D&se=2031-06-28T20%3A28%3A29Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From 587b14a3bf4a043941e2bcbaee8eafad6aa3d2a2 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Fri, 20 Oct 2017 04:36:25 +0300 Subject: [PATCH 0853/1011] [Mellanox]: Add get_presence implementation for SFP on Mellanox platforms (#1056) Signed-off-by: Andriy Moroz --- .../x86_64-mlnx_msn2410-r0/plugins/sfputil.py | 17 ++++++++++++++++- .../x86_64-mlnx_msn2700-r0/plugins/sfputil.py | 17 ++++++++++++++++- .../x86_64-mlnx_msn2740-r0/plugins/sfputil.py | 17 ++++++++++++++++- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py index db71cb423503..0d7870b785fa 100644 --- a/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/sfputil.py @@ -46,8 +46,23 @@ def __init__(self): SfpUtilBase.__init__(self) def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False - raise NotImplementedError + try: + reg_file = open("/bsp/qsfp/qsfp%d_status" % (port_num+1)) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string with the qsfp status + if content == "good": + return True + + return False def get_low_power_mode(self, port_num): diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py index b746af219917..b768cc44022d 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/sfputil.py @@ -46,8 +46,23 @@ def __init__(self): SfpUtilBase.__init__(self) def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False - raise NotImplementedError + try: + reg_file = open("/bsp/qsfp/qsfp%d_status" % (port_num+1)) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string with the qsfp status + if content == "good": + return True + + return False def get_low_power_mode(self, port_num): diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py index b746af219917..b768cc44022d 100644 --- a/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/sfputil.py @@ -46,8 +46,23 @@ def __init__(self): SfpUtilBase.__init__(self) def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False - raise NotImplementedError + try: + reg_file = open("/bsp/qsfp/qsfp%d_status" % (port_num+1)) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string with the qsfp status + if content == "good": + return True + + return False def get_low_power_mode(self, port_num): From bdbede51e0b5557727b86f25345d067231fe2071 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Fri, 20 Oct 2017 05:09:37 -0700 Subject: [PATCH 0854/1011] [docker ptf]: Install tcpdump (#1059) * Always start with Forwarding State flag set for bgpd * Install tcpdump into ptf container --- dockers/docker-ptf/Dockerfile.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 1d1231d9418e..01312687b93c 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -40,6 +40,7 @@ RUN sed --in-place 's/httpredir.debian.org/debian-archive.trafficmanager.net/' / iputils-ping \ hping3 \ curl \ + tcpdump \ python \ python-dev \ python-scapy From 8bc6b5533186c14e69c5e785b0dbd0eb73acd395 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 20 Oct 2017 07:15:11 -0700 Subject: [PATCH 0855/1011] [bgpd.conf] Fix template issue with multiple lo addresses (#1060) --- dockers/docker-fpm-quagga/bgpd.conf.j2 | 13 ++++++++----- src/sonic-config-engine/minigraph.py | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index 3d01d9d52714..bd8de7e4ba15 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -32,16 +32,15 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp graceful-restart {% endif %} {% for (name, prefix) in LOOPBACK_INTERFACE %} -{# TODO: use v4 lo for backward compatibility, will revisit the case with multiple lo interfaces #} -{% if prefix | ipv4 %} +{% if prefix | ipv4 and name == 'Loopback0' %} bgp router-id {{ prefix | ip }} {% endif %} {% endfor %} {# advertise loopback #} {% for (name, prefix) in LOOPBACK_INTERFACE %} -{% if prefix | ipv4 %} +{% if prefix | ipv4 and name == 'Loopback0' %} network {{ prefix | ip }}/32 -{% elif prefix | ipv6 %} +{% elif prefix | ipv6 and name == 'Loopback0' %} address-family ipv6 network {{ prefix | ip }}/64 exit-address-family @@ -97,7 +96,11 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} neighbor {{ bgp_peer['name'] }} remote-as {{ deployment_id_asn_map[DEVICE_METADATA['localhost']['deployment_id']] }} neighbor {{ bgp_peer['name'] }} ebgp-multihop 255 neighbor {{ bgp_peer['name'] }} soft-reconfiguration inbound - neighbor {{ bgp_peer['name'] }} update-source Loopback0 +{% for (name, prefix) in LOOPBACK_INTERFACE %} +{% if name == 'Loopback1' %} + neighbor {{ bgp_peer['name'] }} update-source {{ prefix | ip }} +{% endif %} +{% endfor %} neighbor {{ bgp_peer['name'] }} route-map FROM_BGP_SPEAKER_V4 in neighbor {{ bgp_peer['name'] }} route-map TO_BGP_SPEAKER_V4 out {% for ip_range in bgp_peer['ip_range'] %} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 69299ce3c50a..2cb1c89981e1 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -274,7 +274,7 @@ def parse_cpg(cpg, hname): bgp_session = bgp_sessions[peer] if hostname == bgp_session['name']: bgp_session['asn'] = asn - + bgp_sessions = { key: bgp_sessions[key] for key in bgp_sessions if bgp_sessions[key].has_key('asn') and int(bgp_sessions[key]['asn']) != 0 } return bgp_sessions, myasn, bgp_peers_with_range From def0f2e4deb03f9bb14d590414047a735a9a15f1 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 20 Oct 2017 11:01:26 -0700 Subject: [PATCH 0856/1011] [sensors]: Workaround for apparent bug in lm-sensors (#1058) --- dockers/docker-platform-monitor/lm-sensors.sh | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/dockers/docker-platform-monitor/lm-sensors.sh b/dockers/docker-platform-monitor/lm-sensors.sh index 61e90c09a8e3..2f4768a8cdda 100755 --- a/dockers/docker-platform-monitor/lm-sensors.sh +++ b/dockers/docker-platform-monitor/lm-sensors.sh @@ -3,7 +3,19 @@ # Based off /etc/init.d/lm-sensors # -/usr/bin/sensors -s > /dev/null 2>&1 + +# NOTE: lm-sensors v3.3.5 appears to have a bug. If `sensors -s` is called, it +# will first load /etc/sensors.conf, then load all files in /etc/sensors.d/, +# overriding any values that may have already been specified in +# /etc/sensors.conf. However, it appears this overriding is not taking place. +# As a workaround, as long as a platform-specific sensors.conf has been copied +# to /etc/sensors.d/, we will ONLY load that file, otherwise we load the default. +if [ -e /etc/sensors.d/sensors.conf ]; then + /usr/bin/sensors -s -c /etc/sensors.d/sensors.conf > /dev/null 2>&1 +else + /usr/bin/sensors -s > /dev/null 2>&1 +fi + /usr/bin/sensors > /dev/null 2>&1 # Currently, there is no way to run sensord in the foreground, so we From 3417e78d55838e336d3fcc29e2510d1f328fcf09 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Sun, 22 Oct 2017 13:44:44 -0700 Subject: [PATCH 0857/1011] [swss-common]: Update sonic-swss-common submodule (#1064) Signed-off-by: Qi Luo --- src/sonic-swss-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index f6ff19bee131..31142b8fac17 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit f6ff19bee131048f2274a21ea1064a8493a7fd8b +Subproject commit 31142b8fac1796b7d665ed06609c9fec09c9707f From c74007bb837b2a92c8c65de67fbd714c80c91ceb Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Mon, 23 Oct 2017 11:46:26 -0700 Subject: [PATCH 0858/1011] [Arista]: Modified HWSKU to match the internally defined HWSKU string (#1062) --- .../{Arista-7060-CX32S => Arista-7060-CX-32S}/port_config.ini | 0 .../{Arista-7060-CX32S => Arista-7060-CX-32S}/sai.profile | 0 device/arista/x86_64-arista_7060_cx32s/minigraph.xml | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename device/arista/x86_64-arista_7060_cx32s/{Arista-7060-CX32S => Arista-7060-CX-32S}/port_config.ini (100%) rename device/arista/x86_64-arista_7060_cx32s/{Arista-7060-CX32S => Arista-7060-CX-32S}/sai.profile (100%) diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX-32S/port_config.ini similarity index 100% rename from device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/port_config.ini rename to device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX-32S/port_config.ini diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/sai.profile b/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX-32S/sai.profile similarity index 100% rename from device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX32S/sai.profile rename to device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX-32S/sai.profile diff --git a/device/arista/x86_64-arista_7060_cx32s/minigraph.xml b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml index 513a60254818..7c9f66ab69da 100644 --- a/device/arista/x86_64-arista_7060_cx32s/minigraph.xml +++ b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml @@ -1040,7 +1040,7 @@ switch1 - Arista-7060-CX32S + Arista-7060-CX-32S @@ -1075,5 +1075,5 @@ switch1 - Arista-7060-CX32S + Arista-7060-CX-32S From b6cc73a0ad7c2a44712722899955886354d6554f Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 23 Oct 2017 13:20:37 -0700 Subject: [PATCH 0859/1011] [dockers]: Remove deprecated docker-lldp and docker-snmp (#1068) Signed-off-by: Shu0T1an ChenG --- dockers/docker-lldp/Dockerfile | 25 --------------- dockers/docker-lldp/supervisord.conf | 19 ----------- dockers/docker-snmp/Dockerfile | 48 ---------------------------- dockers/docker-snmp/supervisord.conf | 14 -------- 4 files changed, 106 deletions(-) delete mode 100644 dockers/docker-lldp/Dockerfile delete mode 100644 dockers/docker-lldp/supervisord.conf delete mode 100644 dockers/docker-snmp/Dockerfile delete mode 100644 dockers/docker-snmp/supervisord.conf diff --git a/dockers/docker-lldp/Dockerfile b/dockers/docker-lldp/Dockerfile deleted file mode 100644 index 595c41bcd85e..000000000000 --- a/dockers/docker-lldp/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM docker-base - -COPY deps/swsssdk*.whl deps/lldpsyncd_*.deb deps/lldpd_*.deb /deps/ - -# Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -# Pre-install the fundamental packages -# Install Python SwSS SDK (lldpsyncd dependency) -# Install LLDP Sync Daemon -# Note: dpkg_apt function has the benefit to detect missing .deb file -# Clean up -RUN apt-get update && \ - dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ - dpkg_apt /deps/lldpd_*.deb && \ - dpkg_apt /deps/lldpsyncd_*.deb && \ - apt-get install -y python-pip supervisor && \ - pip install /deps/swsssdk*.whl && \ - apt-get remove -y python-pip && \ - apt-get purge -y && apt-get autoclean -y && apt-get autoremove -y && \ - rm -rf /deps ~/.cache - -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf - -ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-lldp/supervisord.conf b/dockers/docker-lldp/supervisord.conf deleted file mode 100644 index faff70ed06fa..000000000000 --- a/dockers/docker-lldp/supervisord.conf +++ /dev/null @@ -1,19 +0,0 @@ -[supervisord] -nodaemon=true - -[program:lldpd] -# https://github.com/vincentbernat/lldpd/commit/9856f2792c301116cc4a3fcfba91b9672ee5db1f -# - `-d` means to stay in foreground, log to syslog -# - `-dd` means to stay in foreground, log warnings to console -# - `-ddd` means to stay in foreground, log warnings and info to console -# - `-dddd` means to stay in foreground, log all to console -command=/usr/sbin/lldpd -d -I Ethernet*,eth* -priority=100 - -[program:lldpsyncd] -command=/usr/sbin/lldpsyncd -priority=200 - -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n -priority=1 diff --git a/dockers/docker-snmp/Dockerfile b/dockers/docker-snmp/Dockerfile deleted file mode 100644 index 6a79db976adc..000000000000 --- a/dockers/docker-snmp/Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -FROM docker-base - -COPY deps/snmp_*.deb deps/snmpd_*.deb deps/libsnmp-base_*.deb deps/libsnmp30_*.deb /deps/ -COPY deps/python3/*.whl /python3/ - -# enable -O for all Python calls -ENV PYTHONOPTIMIZE 1 - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -## Pre-install the fundamental packages -## Install SNMP subagent -## Note: dpkg_apt function has the benefit to detect missing .deb file -## Clean up -RUN apt-get update && \ - dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } && \ - dpkg_apt /deps/libsnmp-base_*.deb && \ - dpkg_apt /deps/libsnmp30_*.deb && \ - dpkg_apt /deps/snmp_*.deb && \ - dpkg_apt /deps/snmpd_*.deb && \ - rm -rf /deps - -# install subagent -RUN apt-get -y install build-essential wget libssl-dev openssl supervisor && \ - rm -rf /var/lib/apt/lists/* && \ - wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz && \ - tar xvf Python-3.5.2.tgz && cd Python-3.5.2 && \ - ./configure --without-doc-strings --prefix=/usr --without-pymalloc --enable-shared && \ - make && make install && \ - ldconfig && \ - cd .. && rm -rf Python-3.5.2 && rm Python-3.5.2.tgz && \ - pip3 install --no-cache-dir /python3/*py3*.whl hiredis && \ - rm -rf /python3 && \ - python3 -m acs_ax_impl install && \ - python3 -m pip uninstall -y pip setuptools && \ - /bin/bash -c "rm -rf /usr/lib/python3.5/{unittest,lib2to3,tkinter,idlelib,email,test}" && \ - apt-get -y purge build-essential wget libssl-dev openssl && \ - apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y && \ - find / | grep -E "__pycache__" | xargs rm -rf && \ - rm -rf ~/.cache - -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf - -## Although exposing ports is not need for host net mode, keep it for possible bridge mode -EXPOSE 161/udp 162/udp - -ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-snmp/supervisord.conf b/dockers/docker-snmp/supervisord.conf deleted file mode 100644 index c954add628d0..000000000000 --- a/dockers/docker-snmp/supervisord.conf +++ /dev/null @@ -1,14 +0,0 @@ -[supervisord] -nodaemon=true - -[program:snmpd] -command=/usr/sbin/snmpd -f -LS4d -u Debian-snmp -g Debian-snmp -I -smux,mteTrigger,mteTriggerConf,ifTable,ifXTable -p /run/snmpd.pid -priority=100 - -[program:acs-snmp-subagent] -command=/usr/bin/env python3 -m acs_ax_impl -priority=200 - -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n -priority=1 From a4ecade8f6eba814e947204f36927d2a6561d31c Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 23 Oct 2017 15:46:07 -0700 Subject: [PATCH 0860/1011] [Broadcom]: Update Broadcom SAI package to 3.0.3.2-8 (#1070) Update Arista config.bcm files Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index bee229ddbebf..93cf129e0cbb 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-8_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-8_amd64.deb?sv=2015-04-05&sr=b&sig=PYRdEo1SB0TfoahBoxwoNMt4g1V5aQpBH5RolBGZ6Lw%3D&se=2031-06-28T20%3A29%3A10Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-9_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-9_amd64.deb?sv=2015-04-05&sr=b&sig=w4MY%2FMlnCe59xwMXRxODyLkaEDLEljeBlT3bPUnedoU%3D&se=2031-07-02T20%3A17%3A33Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-8_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-9_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-8_amd64.deb?sv=2015-04-05&sr=b&sig=HWoCzzgNscATWcW0KXjh24LdoJ0AM4sVgISgyBh60MI%3D&se=2031-06-28T20%3A28%3A29Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-9_amd64.deb?sv=2015-04-05&sr=b&sig=zfBAMJKd0LUesg88UjDdUor%2Bc4j8omvw08MKymQQFnE%3D&se=2031-07-02T20%3A17%3A10Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From fd34d907ffb2318d79ab60ba73af3d063b13fd92 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 23 Oct 2017 19:53:10 -0700 Subject: [PATCH 0861/1011] [lldp]: Get all interfaces from the database (#1069) The previous implementation only supports EthernetX while X varies from 0 - 124. Remove such hard coded logics and use the information from the database instead. Signed-off-by: Shu0T1an ChenG --- dockers/docker-lldp-sv2/Dockerfile.j2 | 2 +- dockers/docker-lldp-sv2/reconfigure.sh | 17 ++++++++--------- dockers/docker-lldp-sv2/supervisord.conf | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/dockers/docker-lldp-sv2/Dockerfile.j2 b/dockers/docker-lldp-sv2/Dockerfile.j2 index 158d5b52ffe7..bfb1f9ca678a 100644 --- a/dockers/docker-lldp-sv2/Dockerfile.j2 +++ b/dockers/docker-lldp-sv2/Dockerfile.j2 @@ -30,7 +30,7 @@ RUN pip install /python-wheels/swsssdk-2.0.1-py2-none-any.whl && \ COPY ["start.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] -COPY ["reconfigure.sh", "/opt/"] +COPY ["reconfigure.sh", "/usr/bin/"] COPY ["lldpd.conf.j2", "/usr/share/sonic/templates/"] COPY ["lldpd", "/etc/default/"] diff --git a/dockers/docker-lldp-sv2/reconfigure.sh b/dockers/docker-lldp-sv2/reconfigure.sh index 9f42a33a24b4..515e771aa6f2 100755 --- a/dockers/docker-lldp-sv2/reconfigure.sh +++ b/dockers/docker-lldp-sv2/reconfigure.sh @@ -2,9 +2,8 @@ set -e -num_of_interfaces=32 -if_step=4 -last_if_idx=$((num_of_interfaces*if_step - if_step)) +# TODO: Listen to state database when it is ready +interfaces=$(sonic-cfggen -d -v "PORT.keys() | join(' ')") function wait_until_if_exists { @@ -31,23 +30,23 @@ function wait_until_if_not_exists while /bin/true ; do # wait until all interfaces are created - echo Wait until all ifaces are created - for i in $(seq 0 $if_step $last_if_idx) + echo Wait until all interfaces are created + for i in $interfaces do - wait_until_if_exists "Ethernet$i" + wait_until_if_exists $i done echo Wait 10 seconds while lldpd finds new interfaces sleep 10 # apply lldpd configuration - echo apply lldpd configuration + echo Apply lldpd configuration lldpcli -c /etc/lldpd.conf # wait until all interfaces are destroyed echo Wait until all ifaces are destroyed - for i in $(seq 0 $if_step $last_if_idx) + for i in $interfaces do - wait_until_if_not_exists "Ethernet$i" + wait_until_if_not_exists $i done done diff --git a/dockers/docker-lldp-sv2/supervisord.conf b/dockers/docker-lldp-sv2/supervisord.conf index 505b72d18227..ab62d9ed2e87 100644 --- a/dockers/docker-lldp-sv2/supervisord.conf +++ b/dockers/docker-lldp-sv2/supervisord.conf @@ -33,7 +33,7 @@ stdout_logfile=syslog stderr_logfile=syslog [program:lldpd-conf-reload] -command=/opt/reconfigure.sh +command=/usr/bin/reconfigure.sh priority=150 autostart=false autorestart=false From a49ac2d211178552a3262479fc4666d7967ce227 Mon Sep 17 00:00:00 2001 From: zhenggen-xu Date: Mon, 23 Oct 2017 21:17:58 -0700 Subject: [PATCH 0862/1011] [FRR]: Change the FRR as a submodule (#1071) Signed-off-by: zxu@linkedin.com --- .gitmodules | 3 +++ src/sonic-frr/Makefile | 5 ----- src/sonic-frr/frr | 1 + 3 files changed, 4 insertions(+), 5 deletions(-) create mode 160000 src/sonic-frr/frr diff --git a/.gitmodules b/.gitmodules index 4bddfb4a60da..c837451c9480 100644 --- a/.gitmodules +++ b/.gitmodules @@ -66,3 +66,6 @@ [submodule "platform/broadcom/sonic-platform-modules-cel"] path = platform/broadcom/sonic-platform-modules-cel url = https://github.com/celestica-Inc/sonic-platform-modules-cel.git +[submodule "src/sonic-frr/frr"] + path = src/sonic-frr/frr + url = https://github.com/FRRouting/frr.git diff --git a/src/sonic-frr/Makefile b/src/sonic-frr/Makefile index 80d5a9ad0900..b044781a60f2 100644 --- a/src/sonic-frr/Makefile +++ b/src/sonic-frr/Makefile @@ -5,11 +5,6 @@ SHELL = /bin/bash MAIN_TARGET = frr_$(FRR_VERSION)_amd64.deb $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : - # Cloning FRR repo if not already done - if [ ! -d "frr" ]; then \ - git clone -b stable/$(FRR_VERSION) https://github.com/FRRouting/frr.git; \ - fi - # Replacing frr's rules/install files with SONiC's own versions to activate # specific knobs and adjust install process to address SONiC's needs. cp sonic_frr.rules frr/debian/rules diff --git a/src/sonic-frr/frr b/src/sonic-frr/frr new file mode 160000 index 000000000000..5424c62d6e9d --- /dev/null +++ b/src/sonic-frr/frr @@ -0,0 +1 @@ +Subproject commit 5424c62d6e9d574a00529edfc0a0b3bb3beb8811 From f073d8c6548de8d47ba42ab540a8adb72e84e0e9 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 23 Oct 2017 22:01:42 -0700 Subject: [PATCH 0863/1011] [virtualswitch]: build docker-sonic-vs docker based on SAI virtual switch (#1065) --- platform/vs/README.md | 17 +++++ platform/vs/create_vnet.sh | 38 +++++++++++ platform/vs/docker-sonic-vs.mk | 16 +++++ platform/vs/docker-sonic-vs/50-default.conf | 68 ++++++++++++++++++++ platform/vs/docker-sonic-vs/Dockerfile | 51 +++++++++++++++ platform/vs/docker-sonic-vs/Dockerfile.j2 | 56 ++++++++++++++++ platform/vs/docker-sonic-vs/brcm.profile.ini | 4 ++ platform/vs/docker-sonic-vs/orchagent.sh | 15 +++++ platform/vs/docker-sonic-vs/start.sh | 33 ++++++++++ platform/vs/docker-sonic-vs/supervisord.conf | 68 ++++++++++++++++++++ platform/vs/rules.mk | 4 ++ platform/vs/syncd-vs.mk | 13 ++++ rules/sairedis.mk | 15 +++++ slave.mk | 5 +- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- 16 files changed, 404 insertions(+), 3 deletions(-) create mode 100644 platform/vs/README.md create mode 100755 platform/vs/create_vnet.sh create mode 100644 platform/vs/docker-sonic-vs.mk create mode 100644 platform/vs/docker-sonic-vs/50-default.conf create mode 100644 platform/vs/docker-sonic-vs/Dockerfile create mode 100644 platform/vs/docker-sonic-vs/Dockerfile.j2 create mode 100644 platform/vs/docker-sonic-vs/brcm.profile.ini create mode 100755 platform/vs/docker-sonic-vs/orchagent.sh create mode 100755 platform/vs/docker-sonic-vs/start.sh create mode 100644 platform/vs/docker-sonic-vs/supervisord.conf create mode 100644 platform/vs/rules.mk create mode 100644 platform/vs/syncd-vs.mk diff --git a/platform/vs/README.md b/platform/vs/README.md new file mode 100644 index 000000000000..a7ec58856124 --- /dev/null +++ b/platform/vs/README.md @@ -0,0 +1,17 @@ +HOWTO Use Virtual Switch + + +1. Create a docker with 32 front panel port + +``` +docker run -id --name sw debian bash +sudo ./create_vnet.sh sw +``` + +2. Create sonic virtual switch docker + +``` +docker run --privileged --network container:sw -d docker-sonic-vs +``` + +3. Run test in virtual switch docker (TBD) diff --git a/platform/vs/create_vnet.sh b/platform/vs/create_vnet.sh new file mode 100755 index 000000000000..857a61b52cc5 --- /dev/null +++ b/platform/vs/create_vnet.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +SWNAME=$1 + +pid=$(docker inspect --format '{{.State.Pid}}' $SWNAME) + +echo Seting up servers + +SERVERS=31 + +for srv in `seq 0 $SERVERS`; do + + SRV="$SWNAME-srv$srv" + + NSS="ip netns exec $SRV" + + ip netns add $SRV + + $NSS ip addr add 127.0.0.1/8 dev lo + $NSS ip addr add ::1/128 dev lo + $NSS ip link set dev lo up + + # add virtual link between neighbor and the virtual switch docker + + IF="vEthernet$((srv*4))" + + ip link add ${SRV}eth0 type veth peer name $IF + ip link set ${SRV}eth0 netns $SRV + ip link set $IF netns ${pid} + + echo "Bring ${SRV}eth0 up" + $NSS ip link set dev ${SRV}eth0 name eth0 + $NSS ip link set dev eth0 up + + echo "Bring $IF up in the virtual switch docker" + nsenter -t $pid -n ip link set dev $IF up + +done diff --git a/platform/vs/docker-sonic-vs.mk b/platform/vs/docker-sonic-vs.mk new file mode 100644 index 000000000000..b52965787149 --- /dev/null +++ b/platform/vs/docker-sonic-vs.mk @@ -0,0 +1,16 @@ +# docker image for virtual switch based sonic docker image + +DOCKER_SONIC_VS = docker-sonic-vs.gz +$(DOCKER_SONIC_VS)_PATH = $(PLATFORM_PATH)/docker-sonic-vs +$(DOCKER_SONIC_VS)_DEPENDS += $(SWSS) $(SYNCD_VS) $(REDIS_SERVER) $(REDIS_TOOLS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(SONIC_DEVICE_DATA) + +ifeq ($(SONIC_ROUTING_STACK), quagga) +$(DOCKER_SONIC_VS)_DEPENDS += $(QUAGGA) +else ifeq ($(SONIC_ROUTING_STACK), frr) +$(DOCKER_SONIC_VS)_DEPENDS += $(FRR) +else +$(DOCKER_SONIC_VS)_DEPENDS += $(GOBGP) +endif + +$(DOCKER_SONIC_VS)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) +SONIC_DOCKER_IMAGES += $(DOCKER_SONIC_VS) diff --git a/platform/vs/docker-sonic-vs/50-default.conf b/platform/vs/docker-sonic-vs/50-default.conf new file mode 100644 index 000000000000..d672d83af789 --- /dev/null +++ b/platform/vs/docker-sonic-vs/50-default.conf @@ -0,0 +1,68 @@ +# Default rules for rsyslog. +# +# For more information see rsyslog.conf(5) and /etc/rsyslog.conf + +# +# First some standard log files. Log by facility. +# +auth,authpriv.* /var/log/auth.log +*.*;auth,authpriv.none -/var/log/syslog +#cron.* /var/log/cron.log +#daemon.* -/var/log/daemon.log +kern.* -/var/log/kern.log +#lpr.* -/var/log/lpr.log +mail.* -/var/log/mail.log +#user.* -/var/log/user.log + +# +# Logging for the mail system. Split it up so that +# it is easy to write scripts to parse these files. +# +#mail.info -/var/log/mail.info +#mail.warn -/var/log/mail.warn +mail.err /var/log/mail.err + +# +# Logging for INN news system. +# +news.crit /var/log/news/news.crit +news.err /var/log/news/news.err +news.notice -/var/log/news/news.notice + +# +# Some "catch-all" log files. +# +#*.=debug;\ +# auth,authpriv.none;\ +# news.none;mail.none -/var/log/debug +#*.=info;*.=notice;*.=warn;\ +# auth,authpriv.none;\ +# cron,daemon.none;\ +# mail,news.none -/var/log/messages + +# +# Emergencies are sent to everybody logged in. +# +*.emerg :omusrmsg:* + +# +# I like to have messages displayed on the console, but only on a virtual +# console I usually leave idle. +# +#daemon,mail.*;\ +# news.=crit;news.=err;news.=notice;\ +# *.=debug;*.=info;\ +# *.=notice;*.=warn /dev/tty8 + +# The named pipe /dev/xconsole is for the `xconsole' utility. To use it, +# you must invoke `xconsole' with the `-file' option: +# +# $ xconsole -file /dev/xconsole [...] +# +# NOTE: adjust the list below, or you'll go crazy if you have a reasonably +# busy site.. +# +daemon.*;mail.*;\ + news.err;\ + *.=debug;*.=info;\ + *.=notice;*.=warn |/dev/xconsole diff --git a/platform/vs/docker-sonic-vs/Dockerfile b/platform/vs/docker-sonic-vs/Dockerfile new file mode 100644 index 000000000000..2a75868cd99d --- /dev/null +++ b/platform/vs/docker-sonic-vs/Dockerfile @@ -0,0 +1,51 @@ +FROM docker-config-engine + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update + +RUN apt-get install -y net-tools \ + ethtool \ + tcpdump \ + ifupdown \ + bridge-utils \ + python-ply \ + libqt5core5a \ + libqt5network5 \ + libboost-program-options1.55.0 \ + libboost-system1.55.0 \ + libboost-thread1.55.0 \ + libgmp10 \ + libjudydebian1 \ + libnanomsg0 \ + libdaemon0 \ + libjansson4 \ + libjemalloc1 \ + openssh-client \ + openssh-server \ + libc-ares2 \ + iproute + +COPY \ +debs/libnl-route-3-200_3.2.27-1_amd64.deb debs/libnl-genl-3-200_3.2.27-1_amd64.deb debs/libnl-nf-3-200_3.2.27-1_amd64.deb debs/libhiredis0.13_0.13.3-2_amd64.deb debs/libnl-3-200_3.2.27-1_amd64.deb debs/libnl-cli-3-200_3.2.27-1_amd64.deb debs/libswsscommon_1.0.0_amd64.deb debs/libsairedis_1.0.0_amd64.deb debs/libsaimetadata_1.0.0_amd64.deb debs/libteam5_1.26-1_amd64.deb debs/libsaivs_1.0.0_amd64.deb debs/swss_1.0.0_amd64.deb debs/syncd-vs_1.0.0_amd64.deb debs/redis-server_3.2.4-1~bpo8+1_amd64.deb debs/redis-tools_3.2.4-1~bpo8+1_amd64.deb debs/libteamdctl0_1.26-1_amd64.deb debs/libteam-utils_1.26-1_amd64.deb debs/sonic-device-data_1.0-1_all.deb debs/quagga_0.99.24.1-2.1_amd64.deb debs/ + +RUN dpkg -i \ +debs/libnl-route-3-200_3.2.27-1_amd64.deb debs/libnl-genl-3-200_3.2.27-1_amd64.deb debs/libnl-nf-3-200_3.2.27-1_amd64.deb debs/libhiredis0.13_0.13.3-2_amd64.deb debs/libnl-3-200_3.2.27-1_amd64.deb debs/libnl-cli-3-200_3.2.27-1_amd64.deb debs/libswsscommon_1.0.0_amd64.deb debs/libsairedis_1.0.0_amd64.deb debs/libsaimetadata_1.0.0_amd64.deb debs/libteam5_1.26-1_amd64.deb debs/libsaivs_1.0.0_amd64.deb debs/swss_1.0.0_amd64.deb debs/syncd-vs_1.0.0_amd64.deb debs/redis-server_3.2.4-1~bpo8+1_amd64.deb debs/redis-tools_3.2.4-1~bpo8+1_amd64.deb debs/libteamdctl0_1.26-1_amd64.deb debs/libteam-utils_1.26-1_amd64.deb debs/sonic-device-data_1.0-1_all.deb debs/quagga_0.99.24.1-2.1_amd64.deb + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +RUN sed -ri 's/^daemonize yes$/daemonize no/; \ + s/^logfile .*$/logfile ""/; \ + s/^# syslog-enabled no$/syslog-enabled no/; \ + s/^# unixsocket/unixsocket/ \ + ' /etc/redis/redis.conf + +COPY ["50-default.conf", "/etc/rsyslog.d/"] +COPY ["start.sh", "orchagent.sh", "/usr/bin/"] +COPY ["brcm.profile.ini", "/usr/share/sonic/device/vswitch/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + +ENTRYPOINT ["/usr/bin/supervisord"] \ No newline at end of file diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2 new file mode 100644 index 000000000000..f6e784017f78 --- /dev/null +++ b/platform/vs/docker-sonic-vs/Dockerfile.j2 @@ -0,0 +1,56 @@ +FROM docker-config-engine + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update + +RUN apt-get install -y net-tools \ + ethtool \ + tcpdump \ + ifupdown \ + bridge-utils \ + python-ply \ + libqt5core5a \ + libqt5network5 \ + libboost-program-options1.55.0 \ + libboost-system1.55.0 \ + libboost-thread1.55.0 \ + libgmp10 \ + libjudydebian1 \ + libnanomsg0 \ + libdaemon0 \ + libjansson4 \ + libjemalloc1 \ + openssh-client \ + openssh-server \ + libc-ares2 \ + iproute + +COPY \ +{% for deb in docker_sonic_vs_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -i \ +{% for deb in docker_sonic_vs_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +RUN sed -ri 's/^daemonize yes$/daemonize no/; \ + s/^logfile .*$/logfile ""/; \ + s/^# syslog-enabled no$/syslog-enabled no/; \ + s/^# unixsocket/unixsocket/ \ + ' /etc/redis/redis.conf + +COPY ["50-default.conf", "/etc/rsyslog.d/"] +COPY ["start.sh", "orchagent.sh", "/usr/bin/"] +COPY ["brcm.profile.ini", "/usr/share/sonic/device/vswitch/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/vs/docker-sonic-vs/brcm.profile.ini b/platform/vs/docker-sonic-vs/brcm.profile.ini new file mode 100644 index 000000000000..23cd24c73a35 --- /dev/null +++ b/platform/vs/docker-sonic-vs/brcm.profile.ini @@ -0,0 +1,4 @@ +SAI_WARM_BOOT_READ_FILE=/var/cache/sai_warmboot.bin +SAI_WARM_BOOT_WRITE_FILE=/var/cache/sai_warmboot.bin +SAI_VS_SWITCH_TYPE=SAI_VS_SWITCH_TYPE_BCM56850 +SAI_VS_HOSTIF_USE_TAP_DEVICE=true diff --git a/platform/vs/docker-sonic-vs/orchagent.sh b/platform/vs/docker-sonic-vs/orchagent.sh new file mode 100755 index 000000000000..7e250dfa20e9 --- /dev/null +++ b/platform/vs/docker-sonic-vs/orchagent.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` + +# Create a folder for SsWW record files +mkdir -p /var/log/swss +ORCHAGENT_ARGS="-d /var/log/swss " + +# Set orchagent pop batch size to 8192 +ORCHAGENT_ARGS+="-b 8192 " + +# Set mac address +ORCHAGENT_ARGS+="-m $MAC_ADDRESS" + +exec /usr/bin/orchagent ${ORCHAGENT_ARGS} diff --git a/platform/vs/docker-sonic-vs/start.sh b/platform/vs/docker-sonic-vs/start.sh new file mode 100755 index 000000000000..26633c24a70b --- /dev/null +++ b/platform/vs/docker-sonic-vs/start.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +mkdir -p /etc/swss/config.d/ + +# sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json +# sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/mirror.json.j2 > /etc/swss/config.d/mirror.json +# sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ports.json.j2 > /etc/swss/config.d/ports.json + +# export platform=`sonic-cfggen -v platform` + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd + +mkdir -p /var/run/redis + +supervisorctl start redis-server + +supervisorctl start syncd + +supervisorctl start orchagent + +supervisorctl start portsyncd + +supervisorctl start intfsyncd + +supervisorctl start neighsyncd + +# Start arp_update when VLAN exists +# VLAN=`sonic-cfggen -d -v 'VLAN.keys() | join(" ") if VLAN'` +# if [ "$VLAN" != "" ]; then +# supervisorctl start arp_update +# fi diff --git a/platform/vs/docker-sonic-vs/supervisord.conf b/platform/vs/docker-sonic-vs/supervisord.conf new file mode 100644 index 000000000000..35c56420b463 --- /dev/null +++ b/platform/vs/docker-sonic-vs/supervisord.conf @@ -0,0 +1,68 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:redis-server] +command=/usr/bin/redis-server /etc/redis/redis.conf +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:syncd] +command=/usr/bin/syncd -uN -p /usr/share/sonic/device/vswitch/brcm.profile.ini +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:orchagent] +command=/usr/bin/orchagent.sh +priority=5 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:portsyncd] +command=/usr/bin/portsyncd -p /usr/share/sonic/device/x86_64-dell_s6000_s1220-r0/Force10-S6000/port_config.ini +priority=6 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:intfsyncd] +command=/usr/bin/intfsyncd +priority=7 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:neighsyncd] +command=/usr/bin/neighsyncd +priority=8 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog diff --git a/platform/vs/rules.mk b/platform/vs/rules.mk new file mode 100644 index 000000000000..28dba54a5a4e --- /dev/null +++ b/platform/vs/rules.mk @@ -0,0 +1,4 @@ +include $(PLATFORM_PATH)/syncd-vs.mk +include $(PLATFORM_PATH)/docker-sonic-vs.mk + +SONIC_ALL += $(DOCKER_SONIC_VS) diff --git a/platform/vs/syncd-vs.mk b/platform/vs/syncd-vs.mk new file mode 100644 index 000000000000..49035aaf958b --- /dev/null +++ b/platform/vs/syncd-vs.mk @@ -0,0 +1,13 @@ +$(LIBSAIREDIS)_DPKG_TARGET = binary-syncd-vs + +# inject libsaivs and libsaivs_dev to swss build dependency +$(SWSS)_DEPENDS += $(LIBSAIVS) $(LIBSAIVS_DEV) + +SYNCD_VS = syncd-vs_1.0.0_amd64.deb +$(SYNCD_VS)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(LIBSAIVS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS))) + +SYNCD_VS_DBG = syncd-vs-dbg_1.0.0_amd64.deb +$(SYNCD_VS_DBG)_DEPENDS += $(SYNCD_VS) +$(SYNCD_VS_DBG)_RDEPENDS += $(SYNCD_VS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_VS_DBG))) diff --git a/rules/sairedis.mk b/rules/sairedis.mk index 4a62954f4d1c..760d75c5a611 100644 --- a/rules/sairedis.mk +++ b/rules/sairedis.mk @@ -9,6 +9,13 @@ SONIC_DPKG_DEBS += $(LIBSAIREDIS) LIBSAIREDIS_DEV = libsairedis-dev_1.0.0_amd64.deb $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DEV))) +LIBSAIVS = libsaivs_1.0.0_amd64.deb +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS))) + +LIBSAIVS_DEV = libsaivs-dev_1.0.0_amd64.deb +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS_DEV))) + +ifneq ($(CONFIGURED_PLATFORM),vs) SYNCD = syncd_1.0.0_amd64.deb $(SYNCD)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD))) @@ -16,6 +23,7 @@ $(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD))) SYNCD_RPC = syncd-rpc_1.0.0_amd64.deb $(SYNCD_RPC)_RDEPENDS += $(LIBSAIREDIS) $(LIBSAIMETADATA) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_RPC))) +endif LIBSAIMETADATA = libsaimetadata_1.0.0_amd64.deb $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIMETADATA))) @@ -29,6 +37,12 @@ $(LIBSAIREDIS_DBG)_DEPENDS += $(LIBSAIREDIS) $(LIBSAIREDIS_DBG)_RDEPENDS += $(LIBSAIREDIS) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIREDIS_DBG))) +LIBSAIVS_DBG = libsaivs-dbg_1.0.0_amd64.deb +$(LIBSAIVS_DBG)_DEPENDS += $(LIBSAIVS) +$(LIBSAIVS_DBG)_RDEPENDS += $(LIBSAIVS) +$(eval $(call add_derived_package,$(LIBSAIREDIS),$(LIBSAIVS_DBG))) + +ifneq ($(CONFIGURED_PLATFORM),vs) SYNCD_DBG = syncd-dbg_1.0.0_amd64.deb $(SYNCD_DBG)_DEPENDS += $(SYNCD) $(SYNCD_DBG)_RDEPENDS += $(SYNCD) @@ -38,6 +52,7 @@ SYNCD_RPC_DBG = syncd-rpc-dbg_1.0.0_amd64.deb $(SYNCD_RPC_DBG)_DEPENDS += $(SYNCD_RPC) $(SYNCD_RPC_DBG)_RDEPENDS += $(SYNCD_RPC) $(eval $(call add_derived_package,$(LIBSAIREDIS),$(SYNCD_RPC_DBG))) +endif LIBSAIMETADATA_DBG = libsaimetadata-dbg_1.0.0_amd64.deb $(LIBSAIMETADATA_DBG)_DEPENDS += $(LIBSAIMETADATA) diff --git a/slave.mk b/slave.mk index bbcdf4bc3599..114491b2f6b8 100644 --- a/slave.mk +++ b/slave.mk @@ -203,7 +203,10 @@ $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) : $(DEBS_PATH)/% : .platform $$(a # Build project pushd $($*_SRC_PATH) $(LOG) [ ! -f ./autogen.sh ] || ./autogen.sh $(LOG) - dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) $(LOG) + $(if $($*_DPKG_TARGET), + dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --as-root -T$($*_DPKG_TARGET) $(LOG), + dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) $(LOG) + ) popd $(LOG) # Clean up if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && quilt pop -a -f; popd; fi diff --git a/src/sonic-sairedis b/src/sonic-sairedis index e4d24276cb6f..f5d9c8364f5f 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit e4d24276cb6fc7122f756c637f30ddea27487c70 +Subproject commit f5d9c8364f5fbcc487a5f1a3e3e6203ab2293a83 diff --git a/src/sonic-swss b/src/sonic-swss index bcdea1323e70..e07d86b100cc 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit bcdea1323e70c73fa0a85c6df55eaed886bded81 +Subproject commit e07d86b100ccefe8b51e2c41b543cc93f33a0f13 From 8b8b8a130f4018069314b39f37c89301543f2c5f Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 24 Oct 2017 10:56:09 -0700 Subject: [PATCH 0864/1011] [cfg engine] Separate portconfig.py as individual module for port_config.ini parsing (#1072) Move port_config.ini related parsing code out of minigraph.py and create an independent portconfig.py. Add support to multiple optional fields according to Porting Guide --- src/sonic-config-engine/minigraph.py | 62 +++---------------- src/sonic-config-engine/portconfig.py | 54 ++++++++++++++++ src/sonic-config-engine/setup.py | 2 +- .../tests/sample_output/table_everflow.json | 2 +- src/sonic-config-engine/tests/test_cfggen.py | 2 +- 5 files changed, 64 insertions(+), 58 deletions(-) create mode 100644 src/sonic-config-engine/portconfig.py diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 2cb1c89981e1..3e1e603e6412 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -12,27 +12,13 @@ from lxml import etree as ET from lxml.etree import QName -DOCUMENTATION = ''' ---- -module: minigraph_facts +from portconfig import get_port_config + +"""minigraph.py version_added: "1.9" author: Guohan Lu (gulv@microsoft.com) -short_description: Retrive minigraph facts for a device. -description: - - Retrieve minigraph facts for a device, the facts will be - inserted to the ansible_facts key. -options: - host: - description: - - Set to target snmp server (normally {{inventory_hostname}}) - required: true -''' - -EXAMPLES = ''' -# Gather minigraph facts -- name: Gathering minigraph facts about the device - minigraph_facts: host={{ hostname }} -''' +short_description: Parse minigraph xml file and device description xml file +""" ns = "Microsoft.Search.Autopilot.Evolution" ns1 = "http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution" @@ -319,40 +305,6 @@ def parse_deviceinfo(meta, hwsku): ethernet_interfaces[port_alias_map.get(alias, alias)] = speed return ethernet_interfaces -def parse_port_config(hwsku, platform=None, port_config_file=None): - port_config_candidates = [] - if port_config_file != None: - port_config_candidates.append(port_config_file) - port_config_candidates.append('/usr/share/sonic/hwsku/port_config.ini') - if platform != None: - port_config_candidates.append(os.path.join('/usr/share/sonic/device', platform, hwsku, 'port_config.ini')) - port_config_candidates.append(os.path.join('/usr/share/sonic/platform', hwsku, 'port_config.ini')) - port_config_candidates.append(os.path.join('/usr/share/sonic', hwsku, 'port_config.ini')) - port_config = None - for candidate in port_config_candidates: - if os.path.isfile(candidate): - port_config = candidate - break - if port_config == None: - return None - - ports = {} - with open(port_config) as data: - for line in data: - if line.startswith('#'): - continue - tokens = line.split() - if len(tokens) < 2: - continue - name = tokens[0].strip() - if len(tokens) == 2: - alias = name - else: - alias = tokens[2].strip() - ports[name] = {'alias': alias} - port_alias_map[alias] = name - return ports - def parse_xml(filename, platform=None, port_config_file=None): root = ET.parse(filename).getroot() mini_graph_path = filename @@ -389,8 +341,8 @@ def parse_xml(filename, platform=None, port_config_file=None): if child.tag == str(hostname_qn): hostname = child.text - ports = parse_port_config(hwsku, platform, port_config_file) - + (ports, alias_map) = get_port_config(hwsku, platform, port_config_file) + port_alias_map.update(alias_map) for child in root: if child.tag == str(QName(ns, "DpgDec")): (intfs, lo_intfs, mgmt_intf, vlans, pcs, acls) = parse_dpg(child, hostname) diff --git a/src/sonic-config-engine/portconfig.py b/src/sonic-config-engine/portconfig.py new file mode 100644 index 000000000000..db2baa308174 --- /dev/null +++ b/src/sonic-config-engine/portconfig.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +import os +import sys + + +def get_port_config_file_name(hwsku=None, platform=None): + port_config_candidates = [] + port_config_candidates.append('/usr/share/sonic/hwsku/port_config.ini') + if hwsku: + if platform: + port_config_candidates.append(os.path.join('/usr/share/sonic/device', platform, hwsku, 'port_config.ini')) + port_config_candidates.append(os.path.join('/usr/share/sonic/platform', hwsku, 'port_config.ini')) + port_config_candidates.append(os.path.join('/usr/share/sonic', hwsku, 'port_config.ini')) + for candidate in port_config_candidates: + if os.path.isfile(candidate): + return candidate + return None + + +def get_port_config(hwsku=None, platform=None, port_config_file=None): + if not port_config_file: + port_config_file = get_port_config_file_name(hwsku, platform) + if not port_config_file: + return ({}, {}) + return parse_port_config_file(port_config_file) + + +def parse_port_config_file(port_config_file): + ports = {} + port_alias_map = {} + # Default column definition + titles = ['name', 'lanes', 'alias', 'index'] + with open(port_config_file) as data: + for line in data: + if line.startswith('#'): + if "name" in line: + titles = line.strip('#').split() + continue; + tokens = line.split() + if len(tokens) < 2: + continue + name_index = titles.index('name') + name = tokens[name_index] + data = {} + for i, item in enumerate(tokens): + if i == name_index: + continue + data[titles[i]] = item + data.setdefault('alias', name) + ports[name] = data + port_alias_map[data['alias']] = name + return (ports, port_alias_map) + + diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py index ac4eb16b30e1..1bb597f395f6 100755 --- a/src/sonic-config-engine/setup.py +++ b/src/sonic-config-engine/setup.py @@ -15,7 +15,7 @@ def get_test_suite(): author='Taoyu Li', author_email='taoyl@microsoft.com', url='https://github.com/Azure/sonic-buildimage', - py_modules=['minigraph', 'openconfig_acl', 'sonic_platform'], + py_modules=['portconfig', 'minigraph', 'openconfig_acl', 'sonic_platform'], scripts=['sonic-cfggen', 'translate_acl'], install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'pyyaml', 'pyangbind'], test_suite='setup.get_test_suite', diff --git a/src/sonic-config-engine/tests/sample_output/table_everflow.json b/src/sonic-config-engine/tests/sample_output/table_everflow.json index 9686f8e3890d..a4ad52bfe553 100644 --- a/src/sonic-config-engine/tests/sample_output/table_everflow.json +++ b/src/sonic-config-engine/tests/sample_output/table_everflow.json @@ -2,7 +2,7 @@ { "ACL_TABLE:EVERFLOW":{ "policy_desc":"everflow", - "ports":"Ethernet24,Ethernet40,Ethernet20,Ethernet44,Ethernet48,Ethernet28,Ethernet96,Ethernet92,Ethernet76,Ethernet116,Ethernet72,Ethernet112,Ethernet52,Ethernet108,Ethernet56,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet120,Ethernet8,Ethernet4,Ethernet0,Ethernet124,Ethernet68,Ethernet84,Ethernet100,Ethernet80,Ethernet60,Ethernet104,Ethernet64,Ethernet88", + "ports":"Ethernet24,Ethernet40,Ethernet20,Ethernet44,Ethernet48,Ethernet28,Ethernet96,Ethernet92,Ethernet76,Ethernet116,Ethernet72,Ethernet112,Ethernet52,Ethernet80,Ethernet56,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet60,Ethernet8,Ethernet4,Ethernet0,Ethernet64,Ethernet68,Ethernet84,Ethernet88,Ethernet108,Ethernet120,Ethernet104,Ethernet124,Ethernet100", "type":"mirror" }, "OP":"SET" diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 91d14a043042..57172af97c39 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -128,4 +128,4 @@ def test_minigraph_deployment_id(self): def test_minigraph_ethernet_interfaces(self): argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v "PORT[\'Ethernet8\']"' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'alias': 'fortyGigE0/8', 'speed': '40000'}") + self.assertEqual(output.strip(), "{'alias': 'fortyGigE0/8', 'lanes': '37,38,39,40', 'speed': '40000'}") From 1b20ea1680e7f781467e2c825f5420899ba7ef38 Mon Sep 17 00:00:00 2001 From: paavaanan Date: Wed, 25 Oct 2017 01:27:20 +0530 Subject: [PATCH 0865/1011] [Dell]: Added support for S6100 sfputil.py (#1073) Check SFP Presence, toggling lpmode, reset, and print eeprom details --- .../plugins/sfputil.py | 442 +++++++++++++++++- 1 file changed, 424 insertions(+), 18 deletions(-) diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py index 534e587ae722..d6fbcbcf6944 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/sfputil.py @@ -1,27 +1,433 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# +# +-i2c----+--------+ +# | 6 | 7 | +# | +-------------+ | +# | |IOM1 | IOM3 | | +# | |IOM2 | IOM4 | | +# | +-------------+ | +# | 8 | 9 | +# +--------+--------+ + try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import time + import os + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 63 + PORTS_IN_BLOCK = 64 + + _port_to_eeprom_mapping = {} + _port_to_i2c_mapping = { + 0: [6, 18, 34, 50, 66], + 1: [6, 19, 35, 51, 67], + 2: [6, 20, 36, 52, 68], + 3: [6, 21, 37, 53, 69], + 4: [6, 22, 38, 54, 70], + 5: [6, 23, 39, 55, 71], + 6: [6, 24, 40, 56, 72], + 7: [6, 25, 41, 57, 73], + 8: [6, 26, 42, 58, 74], + 9: [6, 27, 43, 59, 75], + 10: [6, 28, 44, 60, 76], + 11: [6, 29, 45, 61, 77], + 12: [6, 30, 46, 62, 78], + 13: [6, 31, 47, 63, 79], + 14: [6, 32, 48, 64, 80], + 15: [6, 33, 49, 65, 81], + 16: [8, 18, 34, 50, 66], + 17: [8, 19, 35, 51, 67], + 18: [8, 20, 36, 52, 68], + 19: [8, 21, 37, 53, 69], + 20: [8, 22, 38, 54, 70], + 21: [8, 23, 39, 55, 71], + 22: [8, 24, 40, 56, 72], + 23: [8, 25, 41, 57, 73], + 24: [8, 26, 42, 58, 74], + 25: [8, 27, 43, 59, 75], + 26: [8, 28, 44, 60, 76], + 27: [8, 29, 45, 61, 77], + 28: [8, 30, 46, 62, 78], + 29: [8, 31, 47, 63, 79], + 30: [8, 32, 48, 64, 80], + 31: [8, 33, 49, 65, 81], + 32: [7, 18, 34, 50, 66], + 33: [7, 19, 35, 51, 67], + 34: [7, 20, 36, 52, 68], + 35: [7, 21, 37, 53, 69], + 36: [7, 22, 38, 54, 70], + 37: [7, 23, 39, 55, 71], + 38: [7, 24, 40, 56, 72], + 39: [7, 25, 41, 57, 73], + 40: [7, 26, 42, 58, 74], + 41: [7, 27, 43, 59, 75], + 42: [7, 28, 44, 60, 76], + 43: [7, 29, 45, 61, 77], + 44: [7, 30, 46, 62, 78], + 45: [7, 31, 47, 63, 79], + 46: [7, 32, 48, 64, 80], + 47: [7, 33, 49, 65, 81], + 48: [9, 18, 34, 50, 66], + 49: [9, 19, 35, 51, 67], + 50: [9, 20, 36, 52, 68], + 51: [9, 21, 37, 53, 69], + 52: [9, 22, 38, 54, 70], + 53: [9, 23, 39, 55, 71], + 54: [9, 24, 40, 56, 72], + 55: [9, 25, 41, 57, 73], + 56: [9, 26, 42, 58, 74], + 57: [9, 27, 43, 59, 75], + 58: [9, 28, 44, 60, 76], + 59: [9, 29, 45, 61, 77], + 60: [9, 30, 46, 62, 78], + 61: [9, 31, 47, 63, 79], + 62: [9, 32, 48, 64, 80], + 63: [9, 33, 49, 65, 81] +} + + IOM_1_PORT_START = 0 + IOM_1_PORT_END = 15 + + IOM_2_PORT_START = 16 + IOM_2_PORT_END = 31 + + IOM_3_PORT_START = 32 + IOM_3_PORT_END = 47 + + IOM_4_PORT_START = 48 + IOM_4_PORT_END = 63 + + BASE_VAL_PATH="/sys/class/i2c-adapter/i2c-{0}/{0}-003e/" + + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def iom1_port_start(self): + return self.IOM_1_PORT_START + + @property + def iom1_port_end(self): + return self.IOM_1_PORT_END + + @property + def iom2_port_start(self): + return self.IOM_2_PORT_START + + @property + def iom2_port_end(self): + return self.IOM_2_PORT_END + + @property + def iom3_port_start(self): + return self.IOM_3_PORT_START + + @property + def iom3_port_end(self): + return self.IOM_3_PORT_END + + @property + def iom4_port_start(self): + return self.IOM_4_PORT_START + + @property + def iom4_port_end(self): + return self.IOM_4_PORT_END + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + @property + def port_to_i2c_mapping(self): + return self._port_to_i2c_mapping + + + def __init__(self): + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/i2c-{1}/{1}-0050/eeprom" + global port_to_eeprom_path + + for port_num in range(0, self.port_end + 1): + if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: + assigned=0 + #i2c-6 + for x in range(1,5): + port_to_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[port_num][0], self.port_to_i2c_mapping[port_num][x]) + if ( os.path.isfile(port_to_eeprom_path) ): + self.port_to_eeprom_mapping[port_num]=port_to_eeprom_path + assigned=1 + elif (not assigned): + self.port_to_eeprom_mapping[port_num]="No IOM" + + elif port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: + assigned=0 + #i2c-8 + for x in range(1,5): + port_to_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[port_num][0], self.port_to_i2c_mapping[port_num][x]) + if ( os.path.isfile(port_to_eeprom_path) ): + self.port_to_eeprom_mapping[port_num]=port_to_eeprom_path + assigned=1 + elif (not assigned): + self.port_to_eeprom_mapping[port_num]="No IOM" + + elif port_num >= self.iom3_port_start and port_num <= self.iom3_port_end: + assigned=0 + #i2c-7 + for x in range(1,5): + port_to_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[port_num][0], self.port_to_i2c_mapping[port_num][x]) + if ( os.path.isfile(port_to_eeprom_path) ): + self.port_to_eeprom_mapping[port_num]=port_to_eeprom_path + assigned=1 + elif (not assigned): + self.port_to_eeprom_mapping[port_num]="No IOM" + + + elif port_num >= self.iom4_port_start and port_num <= self.iom4_port_end: + assigned=0 + #i2c-9 + for x in range(1,5): + port_to_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[port_num][0], self.port_to_i2c_mapping[port_num][x]) + if ( os.path.isfile(port_to_eeprom_path) ): + self.port_to_eeprom_mapping[port_num]=port_to_eeprom_path + assigned=1 + elif (not assigned): + self.port_to_eeprom_mapping[port_num]="No IOM" + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + + global i2c_line + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + #port_num and i2c match + if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: + i2c_line=14 + elif port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: + i2c_line=16 + elif port_num >= self.iom3_port_start and port_num <= self.iom3_port_end: + i2c_line=15 + elif port_num >= self.iom4_port_start and port_num <= self.iom4_port_end: + i2c_line=17 + + try: + qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_modprs" + reg_file = open(qsfp_path, "r") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + #Absence of IOM throws read error + if (content == 'read error'): + return False + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + #Rationalize port settings + if port_num > 15: + port_num=port_num%16 + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ModPrsL is active low + if reg_value & mask == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + #port_num and i2c match + if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: + i2c_line=14 + elif port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: + i2c_line=16 + elif port_num >= self.iom3_port_start and port_num <= self.iom3_port_end: + i2c_line=15 + elif port_num >= self.iom4_port_start and port_num <= self.iom4_port_end: + i2c_line=17 + + try: + qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_lpmode" + reg_file = open(qsfp_path, "r") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + #Absence of IOM throws read error + if (content == 'read error'): + return False + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + #Rationalize port settings + if port_num > 15: + port_num=port_num%16 + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # LPMode is active high + if reg_value & mask == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + #port_num and i2c match + if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: + i2c_line=14 + elif port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: + i2c_line=16 + elif port_num >= self.iom3_port_start and port_num <= self.iom3_port_end: + i2c_line=15 + elif port_num >= self.iom4_port_start and port_num <= self.iom4_port_end: + i2c_line=17 + + try: + qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_lpmode" + reg_file = open(qsfp_path, "r+") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + #Absence of IOM throws read error + if (content == 'read error'): + return False + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + #Rationalize port settings + if port_num > 15: + port_num=port_num%16 + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = hex(reg_value) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + + global i2c_line + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + #port_num and i2c match + if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: + i2c_line=14 + elif port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: + i2c_line=16 + elif port_num >= self.iom3_port_start and port_num <= self.iom3_port_end: + i2c_line=15 + elif port_num >= self.iom4_port_start and port_num <= self.iom4_port_end: + i2c_line=17 + + try: + qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_lpmode" + reg_file = open(qsfp_path, "r+") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + #Absence of IOM throws read error + if (content == 'read error'): + print("it's empty"); + return False + + # File content is a string containing the hex representation of the register + reg_value = int(content, 16) + + #Rationalize port settings + if port_num > 15: + port_num=port_num%16 + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + # ResetL is active low + reg_value = reg_value & ~mask -class sfputil(sfputilbase): - """Platform specific sfputil class""" + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() - port_start = 0 - port_end = 63 - ports_in_block = 64 + # Sleep 1 second to allow it to settle + time.sleep(1) - eeprom_offset = 18 + # Flip the bit back high and write back to the register to take port out of reset + try: + qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_lpmode" + reg_file = open(qsfp_path, "w") - port_to_eeprom_mapping = {} + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False - _qsfp_ports = range(0, ports_in_block + 1) + reg_value = reg_value | mask + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' - for x in range(0, self.port_end + 1): - self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) - sfputilbase.__init__(self, port_num) + return True From d7d6f3044fd06222c7d5ad6f6a00fd749fe87559 Mon Sep 17 00:00:00 2001 From: Shu0T1an ChenG Date: Tue, 24 Oct 2017 13:01:33 -0700 Subject: [PATCH 0866/1011] [Dell]: Update sonic-platform-modules-dell submodule Add eeprom driver for only valid devices Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sonic-platform-modules-dell | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-dell b/platform/broadcom/sonic-platform-modules-dell index 8c330a508f78..f0e808fe518f 160000 --- a/platform/broadcom/sonic-platform-modules-dell +++ b/platform/broadcom/sonic-platform-modules-dell @@ -1 +1 @@ -Subproject commit 8c330a508f7860082ed4f6259fe8df4c5b4c9c92 +Subproject commit f0e808fe518f336e4cb97fdaf25e35a752c24d89 From 41f226f0dc9e73e2bbb3060661aeb7322fb0f43b Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Tue, 24 Oct 2017 19:49:37 -0700 Subject: [PATCH 0867/1011] [build] capture 2 initialization git commands in 'make init' target (#1074) --- Makefile | 6 +++++- README.md | 13 +++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index b5bd895b37ad..bf9e0da0c76a 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,7 @@ SONIC_BUILD_INSTRUCTION := make \ PASSWORD=$(PASSWORD) \ USERNAME=$(USERNAME) -.PHONY: sonic-slave-build sonic-slave-bash +.PHONY: sonic-slave-build sonic-slave-bash init .DEFAULT_GOAL := all @@ -89,3 +89,7 @@ sonic-slave-bash : { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ $(DOCKER_BUILD) ; } @$(DOCKER_RUN) -t $(SLAVE_IMAGE):$(SLAVE_TAG) bash + +init : + git submodule update --init --recursive + git submodule foreach --recursive '[ -f .git ] && echo "gitdir: $$(realpath --relative-to=. $$(cut -d" " -f2 .git))" > .git' diff --git a/README.md b/README.md index 5edaf3ae7f89..53e8b8ff221a 100644 --- a/README.md +++ b/README.md @@ -25,19 +25,16 @@ To clone the code repository recursively, assuming git version 1.9 or newer: git clone --recursive https://github.com/Azure/sonic-buildimage.git -NOTE: If the repo has already been cloned, however there are no files under the submodule directories (e.g., src/lldpd, src/ptf, src/sonic-linux-kernel, etc.), you can manually fetch all the git submodules as follows: - - git submodule update --init --recursive - -You also need to change all git paths to relative path as we build all submodules inside the docker: - - git submodule foreach --recursive '[ -f .git ] && echo "gitdir: $(realpath --relative-to=. $(cut -d" " -f2 .git))" > .git' - ## Usage To build SONiC installer image and docker images, run the following commands: + # Execute make init once after cloning the repo, or fetched remote repo with submodule updates + make init + + # Execute make configure once to configure ASIC make configure PLATFORM=[ASIC_VENDOR] + make **NOTE**: We recommend reserving 50G free space to build one platform. From a31c08047bbdb6cb5526f82ec37230275d27a4da Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 25 Oct 2017 05:06:30 -0700 Subject: [PATCH 0868/1011] [build]: add sonic-config-engine to sonic-utilitie build dependency (#1075) --- rules/sonic-utilities.mk | 1 + slave.mk | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/rules/sonic-utilities.mk b/rules/sonic-utilities.mk index 9349813f5c4e..7a935ba70ede 100644 --- a/rules/sonic-utilities.mk +++ b/rules/sonic-utilities.mk @@ -2,4 +2,5 @@ SONIC_UTILS = python-sonic-utilities_1.1-1_all.deb $(SONIC_UTILS)_SRC_PATH = $(SRC_PATH)/sonic-utilities +$(SONIC_UTILS)_WHEEL_DEPENDS = $(SONIC_CONFIG_ENGINE) SONIC_PYTHON_STDEB_DEBS += $(SONIC_UTILS) diff --git a/slave.mk b/slave.mk index 114491b2f6b8..6f823cf98340 100644 --- a/slave.mk +++ b/slave.mk @@ -222,7 +222,8 @@ SONIC_TARGET_LIST += $(addprefix $(DEBS_PATH)/, $(SONIC_DPKG_DEBS)) # $(SOME_NEW_DEB)_SRC_PATH = $(SRC_PATH)/project_name # $(SOME_NEW_DEB)_DEPENDS = $(SOME_OTHER_DEB1) $(SOME_OTHER_DEB2) ... # SONIC_PYTHON_STDEB_DEBS += $(SOME_NEW_DEB) -$(addprefix $(DEBS_PATH)/, $(SONIC_PYTHON_STDEB_DEBS)) : $(DEBS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) +$(addprefix $(DEBS_PATH)/, $(SONIC_PYTHON_STDEB_DEBS)) : $(DEBS_PATH)/% : .platform $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) \ + $$(addsuffix -install,$$(addprefix $(PYTHON_WHEELS_PATH)/,$$($$*_WHEEL_DEPENDS))) $(HEADER) # Apply series of patches if exist if [ -f $($*_SRC_PATH).patch/series ]; then pushd $($*_SRC_PATH) && QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; popd; fi From 2ae29caa035d7e8841fe9539b6b3b293351a0e53 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Wed, 25 Oct 2017 19:09:30 +0300 Subject: [PATCH 0869/1011] Update QoS config name for Mellanox platform (#1077) Signed-off-by: Andriy Moroz --- dockers/docker-orchagent/swssconfig.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index 55a22c5353c8..f780ae8afb20 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -49,7 +49,7 @@ elif [ "$HWSKU" == "Arista-7050-QX32" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [[ "$HWSKU" == "ACS-MSN27"* ]]; then sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/msn27xx.32ports.buffers.json.j2 > /etc/swss/config.d/msn27xx.32ports.buffers.json - SWSSCONFIG_ARGS+="msn27xx.32ports.buffers.json msn2700.32ports.qos.json " + SWSSCONFIG_ARGS+="msn27xx.32ports.buffers.json msn27xx.32ports.qos.json " fi for file in $SWSSCONFIG_ARGS; do From 47c8567d93ccebda00959acfa4246cc42c58e2c2 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 25 Oct 2017 16:43:43 -0700 Subject: [PATCH 0870/1011] [snmp]: Update sonic-snmpagent submodule (#1078) --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index d9d85a1383d7..5e00a50cf397 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit d9d85a1383d752220054a714487899c06b697863 +Subproject commit 5e00a50cf397693808e1ccc7371a043d8d53cdab From 7f7ddc80a33851f4ea2e9aec942a4172fc9ab4e6 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 25 Oct 2017 17:57:28 -0700 Subject: [PATCH 0871/1011] [swss]: Change the env name from ASIC to platform (#1033) --- dockers/docker-orchagent/orchagent.sh | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index 57f28e4e78dc..f92dfe5fd543 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -2,9 +2,7 @@ # Export platform information. Required to be able to write # vendor specific code. -export platform=`sonic-cfggen -v onie_switch_asic` - -export ASIC=`sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type` +export platform=`sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type` MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` @@ -16,9 +14,9 @@ ORCHAGENT_ARGS="-d /var/log/swss " ORCHAGENT_ARGS+="-b 8192 " # Add platform specific arguments if necessary -if [ "$ASIC" == "broadcom" ]; then +if [ "$platform" == "broadcom" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" -elif [ "$ASIC" == "cavium" ]; then +elif [ "$platform" == "cavium" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" fi From 11e17e763fc8af85809dd77578800f91d031a685 Mon Sep 17 00:00:00 2001 From: Balaselvi Date: Wed, 25 Oct 2017 21:36:31 -0700 Subject: [PATCH 0872/1011] [Inventec]: Bug fix for sfputil in D7054 (#1080) --- device/inventec/x86_64-inventec_d7054q28b-r0/plugins/sfputil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/inventec/x86_64-inventec_d7054q28b-r0/plugins/sfputil.py b/device/inventec/x86_64-inventec_d7054q28b-r0/plugins/sfputil.py index d236146e495e..c2edefd2eb70 100755 --- a/device/inventec/x86_64-inventec_d7054q28b-r0/plugins/sfputil.py +++ b/device/inventec/x86_64-inventec_d7054q28b-r0/plugins/sfputil.py @@ -95,7 +95,7 @@ def qsfp_port_end(self): @property def qsfp_ports(self): - return range(0, self.PORTS_IN_BLOCK + 1) + return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) @property def port_to_eeprom_mapping(self): From 623e7fe93981d11619fbc175bee61c187b38345c Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 25 Oct 2017 21:37:09 -0700 Subject: [PATCH 0873/1011] [utilities]: update sonic-utilities submodule (#1076) --- .gitmodules | 1 - src/sonic-utilities | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index c837451c9480..cc2b5b416028 100644 --- a/.gitmodules +++ b/.gitmodules @@ -44,7 +44,6 @@ [submodule "src/sonic-utilities"] path = src/sonic-utilities url = https://github.com/Azure/sonic-utilities - branch = v1.0.3 [submodule "platform/broadcom/sonic-platform-modules-s6000"] path = platform/broadcom/sonic-platform-modules-s6000 url = https://github.com/Azure/sonic-platform-modules-s6000 diff --git a/src/sonic-utilities b/src/sonic-utilities index 8e20a3dc90fd..4804711c600b 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 8e20a3dc90fdfe86d3a74675c24de91b97e9d3c7 +Subproject commit 4804711c600b97c6bc5f24877b808721f91d1f84 From 3d290b96d99a504a36dae779d16823e9d52acf8b Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Thu, 26 Oct 2017 14:03:46 -0700 Subject: [PATCH 0874/1011] Submodule updated for py-swsssdk and utilities (#1083) --- src/sonic-py-swsssdk | 2 +- src/sonic-utilities | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index a21b7a929ab6..3b074795c907 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit a21b7a929ab63f027e4a0d2f919145d8054b8011 +Subproject commit 3b074795c907a7d0afea6d337010393fe9a1509d diff --git a/src/sonic-utilities b/src/sonic-utilities index 4804711c600b..67f9f96b9a08 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 4804711c600b97c6bc5f24877b808721f91d1f84 +Subproject commit 67f9f96b9a0817aeeee8efca6e74d1729fd8d5be From d1156ca3b2b78d0803562faf5062df93c0a4fe72 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 26 Oct 2017 14:20:44 -0700 Subject: [PATCH 0875/1011] [teamd]: Bring down all member interfaces before starting teamd (#1081) teamd requires all members to be set down before adding as a team port Signed-off-by: Shu0T1an ChenG --- dockers/docker-teamd/start.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dockers/docker-teamd/start.sh b/dockers/docker-teamd/start.sh index 6b0a3d785894..6e80f6eb9a83 100755 --- a/dockers/docker-teamd/start.sh +++ b/dockers/docker-teamd/start.sh @@ -17,6 +17,12 @@ fi for pc in `sonic-cfggen -d -v "PORTCHANNEL.keys() | join(' ') if PORTCHANNEL"`; do sonic-cfggen -d -a '{"pc":"'$pc'","hwaddr":"'$MAC_ADDRESS'"}' -t /usr/share/sonic/templates/teamd.j2 > $TEAMD_CONF_PATH/$pc.conf + # bring down all member ports before starting teamd + for member in $(sonic-cfggen -d -v "PORTCHANNEL['$pc']['members'] | join(' ')" ); do + if [ -L /sys/class/net/$member ]; then + ip link set $member down + fi + done done mkdir -p /var/sonic From 437419c79eae23e671d4648a24aa2c45941fd9ed Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 26 Oct 2017 16:49:25 -0700 Subject: [PATCH 0876/1011] Update submodule pointer and sonic-slave for test dependency (#1084) --- sonic-slave/Dockerfile | 3 +++ src/sonic-utilities | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index f194bf604caa..b66c917384af 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -223,6 +223,9 @@ RUN pip install j2cli # For sonic config engine testing RUN pip install pyangbind==0.5.10 +# For sonic utilities testing +RUN pip install click-default-group click natsort tabulate + # For supervisor build RUN pip install meld3 mock diff --git a/src/sonic-utilities b/src/sonic-utilities index 67f9f96b9a08..67f8806ce42f 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 67f9f96b9a0817aeeee8efca6e74d1729fd8d5be +Subproject commit 67f8806ce42f2511f170117d70ecfd0e8d205eb5 From 961a6669f7c896d0521b0a9bfc796330f12608fe Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 27 Oct 2017 13:59:51 -0700 Subject: [PATCH 0877/1011] [Broadcom]: Update Broadcom OpenNSL/SAI packages (#1090) Update OpenNSL to 3.2.3.3-2 Update SAI to 3.0.3.2-10 This commit fixes S6100 CPU high usage issue Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 93cf129e0cbb..5b66026f297f 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-9_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-9_amd64.deb?sv=2015-04-05&sr=b&sig=w4MY%2FMlnCe59xwMXRxODyLkaEDLEljeBlT3bPUnedoU%3D&se=2031-07-02T20%3A17%3A33Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-10_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-10_amd64.deb?sv=2015-04-05&sr=b&sig=tByZ7QDBsYlJ4UHbapnzqHYrbA8rD92%2FQXEpupITTmM%3D&se=2031-07-06T19%3A19%3A32Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-9_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-10_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-9_amd64.deb?sv=2015-04-05&sr=b&sig=zfBAMJKd0LUesg88UjDdUor%2Bc4j8omvw08MKymQQFnE%3D&se=2031-07-02T20%3A17%3A10Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-10_amd64.deb?sv=2015-04-05&sr=b&sig=T6U8sF%2BW8B%2FffBzPoUJ9peLcg2O9MunHBBKSu7SZOKo%3D&se=2031-07-06T19%3A19%3A52Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index 04d540c64582..aff0cf07fe5c 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,4 +1,4 @@ -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.3.3-1_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.3-1_amd64.deb?sv=2015-04-05&sr=b&sig=Uepf4z2wOadX%2F6OR%2BCoQzjv2tkwEZ2AspBiuo5sb25s%3D&se=2031-05-30T19%3A37%3A19Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.3.3-2_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.3-2_amd64.deb?sv=2015-04-05&sr=b&sig=RADtBDA9oZmwHnTzBY76ewajyJ8Af%2BchVCzNbe%2BPsbc%3D&se=2031-07-06T19%3A18%3A56Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL_KERNEL) From c92b95383a661f96267dba785bdb62c0392e3735 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 27 Oct 2017 17:59:03 -0700 Subject: [PATCH 0878/1011] [build]: Add swig3.0 for building python-based swsscommon library (#1088) --- sonic-slave/Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index b66c917384af..603c3b6cb357 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -200,7 +200,9 @@ RUN apt-get update && apt-get install -y \ procmail \ # For gtest libgtest-dev \ - cmake + cmake \ +# For python-based swsscommon + swig3.0 # For linux build RUN apt-get -y build-dep linux From a7ea0556c87b29e0fca4c440a1d8a59e1a8bc915 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 27 Oct 2017 18:01:02 -0700 Subject: [PATCH 0879/1011] [updategraph]: Support a special value to use empty configuration (#1086) When updategraph service is enabled, a special value 'default' from DHCP response will now initialize the system with an empty configuration instead of existing minigraph. A DHCP response without option 224 will remain the current behavior of skipping graph update and use existing default minigraph. --- files/dhcp/graphserviceurl | 2 +- files/image_config/updategraph/updategraph | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/files/dhcp/graphserviceurl b/files/dhcp/graphserviceurl index f255cdff9877..5c5d801cbc8c 100644 --- a/files/dhcp/graphserviceurl +++ b/files/dhcp/graphserviceurl @@ -3,7 +3,7 @@ case $reason in if [ -n "$new_minigraph_url" ]; then echo $new_minigraph_url > /tmp/dhcp_graph_url else - echo "N/A" > /tmp/dhcp_graph_url + echo "default" > /tmp/dhcp_graph_url fi if [ -n "$new_acl_url" ]; then echo $new_acl_url > /tmp/dhcp_acl_url diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph index 4e9846fba024..b72bc6e2c1c8 100755 --- a/files/image_config/updategraph/updategraph +++ b/files/image_config/updategraph/updategraph @@ -20,8 +20,25 @@ if [ "$src" = "dhcp" ]; then sleep 1 done + if [ "`cat /tmp/dhcp_graph_url`" = "default" ]; then + echo "No graph_url option in DHCP response. Skipping graph update and using existing minigraph." + if [ "$dhcp_as_static" = "true" ]; then + sed -i "/enabled=/d" /etc/sonic/updategraph.conf + echo "enabled=false" >> /etc/sonic/updategraph.conf + fi + exit 0 + fi if [ "`cat /tmp/dhcp_graph_url`" = "N/A" ]; then - echo "No graph_url option in DHCP response. Skipping graph update." + echo "'N/A' found in DHCP response. Skipping graph update and generating an empty configuration." + echo '{"DEVICE_METADATA":' > /tmp/device_meta.json + sonic-cfggen -m /etc/sonic/minigraph.xml --var-json DEVICE_METADATA >> /tmp/device_meta.json + echo '}' >> /tmp/device_meta.json + if [ -f /etc/sonic/init_cfg.json ]; then + sonic-cfggen -j /tmp/device_meta.json -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json + else + cp -f /tmp/device_meta.json /etc/sonic/config_db.json + fi + if [ "$dhcp_as_static" = "true" ]; then sed -i "/enabled=/d" /etc/sonic/updategraph.conf echo "enabled=false" >> /etc/sonic/updategraph.conf @@ -29,6 +46,7 @@ if [ "$src" = "dhcp" ]; then exit 0 fi + HOSTNAME=`hostname -s` GRAPH_URL=`sonic-cfggen -t /tmp/dhcp_graph_url -a "{\"hostname\": \"$HOSTNAME\"}"` URL_REGEX='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]$' From 2ba281829c966222680f1d049a54181d1b11cef4 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Sun, 29 Oct 2017 11:50:49 -0700 Subject: [PATCH 0880/1011] [swss]: Update sonic-swss submodule (#1091) Including: - [swss] a couple non-functional code cleanup changes - [bufferorch] move buffer pool definitions together - [orchagent] optimize the code structure - [orchagent]: Fix hang problem caused by erase operation on empty map - [orchagent]: Support port/LAG in multiple VLANs Signed-off-by: Shu0T1an ChenG --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index e07d86b100cc..3b7c3e334877 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit e07d86b100ccefe8b51e2c41b543cc93f33a0f13 +Subproject commit 3b7c3e3348779e1fc7b147a299d22942a34f5cb9 From 1a81715275dfd5e22225670462886d5bdde59ad6 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Sun, 29 Oct 2017 11:50:57 -0700 Subject: [PATCH 0881/1011] [swss]: Add switch.json.j2 to set the hash seed according to the switch type (#1089) Set the ECMP/LAG hash seed to 10 when the switch is a ToR, 20 when the switch is a Leaf, 0 otherwise. Signed-off-by: Shu0T1an ChenG --- dockers/docker-orchagent/Dockerfile.j2 | 7 +++---- dockers/docker-orchagent/start.sh | 1 + dockers/docker-orchagent/switch.json.j2 | 18 ++++++++++++++++++ dockers/docker-orchagent/swssconfig.sh | 2 +- 4 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 dockers/docker-orchagent/switch.json.j2 diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index b2d20383e38e..9fba8d17b9d6 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -28,9 +28,8 @@ RUN rm -rf /debs COPY ["arp_update", "start.sh", "orchagent.sh", "swssconfig.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] -COPY ["ipinip.json.j2", "/usr/share/sonic/templates/"] -COPY ["mirror.json.j2", "/usr/share/sonic/templates/"] -COPY ["ports.json.j2", "/usr/share/sonic/templates/"] -COPY ["msn27xx.32ports.buffers.json.j2", "/usr/share/sonic/templates/"] + +## Copy all Jinja2 template files into the templates folder +COPY ["*.j2", "/usr/share/sonic/templates/"] ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 0931321a9436..bad88111c9a1 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -2,6 +2,7 @@ mkdir -p /etc/swss/config.d/ +sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/switch.json.j2 > /etc/swss/config.d/switch.json sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/mirror.json.j2 > /etc/swss/config.d/mirror.json sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ports.json.j2 > /etc/swss/config.d/ports.json diff --git a/dockers/docker-orchagent/switch.json.j2 b/dockers/docker-orchagent/switch.json.j2 new file mode 100644 index 000000000000..7a8c3522ecee --- /dev/null +++ b/dockers/docker-orchagent/switch.json.j2 @@ -0,0 +1,18 @@ +{# set default hash seed to 0 #} +{% set hash_seed = 0 %} +{% if DEVICE_METADATA.localhost.type %} +{% if DEVICE_METADATA.localhost.type == "ToRRouter" %} +{% set hash_seed = 10 %} +{% elif DEVICE_METADATA.localhost.type == "LeafRouter" %} +{% set hash_seed = 20 %} +{% endif %} +{% endif %} +[ + { + "SWITCH_TABLE:switch": { + "ecmp_hash_seed": "{{ hash_seed }}", + "lag_hash_seed": "{{ hash_seed }}" + }, + "OP": "SET" + } +] diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index f780ae8afb20..c00d203a71ab 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -39,7 +39,7 @@ fast_reboot HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -d -v "DEVICE_METADATA['localhost']['hwsku']"` -SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json ports.json " +SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json ports.json switch.json " if [ "$HWSKU" == "Force10-S6000" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " From b0c13ea928028da6378bc92ba650927a63345bb1 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 30 Oct 2017 14:47:07 -0700 Subject: [PATCH 0882/1011] [snmpagent]: Update sonic-snmpagent submodule (#1094) Include the fix: [mibs]: Add oid:0x prefix to the SAI ID in counter table (#48) Signed-off-by: Shu0T1an ChenG --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 5e00a50cf397..39f1e23cb834 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 5e00a50cf397693808e1ccc7371a043d8d53cdab +Subproject commit 39f1e23cb834255955f5270234c8a72b14c11d6f From 4f59b2e4c7936d34a46888fac9dde5354f80b613 Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Mon, 30 Oct 2017 18:02:44 -0700 Subject: [PATCH 0883/1011] Modified HWSKU to match internally defined SKU string (#1095) --- .../port_config.ini | 0 .../{Arista-7060-CX-32S => Arista-7060CX-32S-C32}/sai.profile | 0 device/arista/x86_64-arista_7060_cx32s/minigraph.xml | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename device/arista/x86_64-arista_7060_cx32s/{Arista-7060-CX-32S => Arista-7060CX-32S-C32}/port_config.ini (100%) rename device/arista/x86_64-arista_7060_cx32s/{Arista-7060-CX-32S => Arista-7060CX-32S-C32}/sai.profile (100%) diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX-32S/port_config.ini b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/port_config.ini similarity index 100% rename from device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX-32S/port_config.ini rename to device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/port_config.ini diff --git a/device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX-32S/sai.profile b/device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/sai.profile similarity index 100% rename from device/arista/x86_64-arista_7060_cx32s/Arista-7060-CX-32S/sai.profile rename to device/arista/x86_64-arista_7060_cx32s/Arista-7060CX-32S-C32/sai.profile diff --git a/device/arista/x86_64-arista_7060_cx32s/minigraph.xml b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml index 7c9f66ab69da..23282de17af1 100644 --- a/device/arista/x86_64-arista_7060_cx32s/minigraph.xml +++ b/device/arista/x86_64-arista_7060_cx32s/minigraph.xml @@ -1040,7 +1040,7 @@ switch1 - Arista-7060-CX-32S + Arista-7060CX-32S-C32 @@ -1075,5 +1075,5 @@ switch1 - Arista-7060-CX-32S + Arista-7060CX-32S-C32 From d7d6c411845d1eca3235510d67e50c9a4fbea060 Mon Sep 17 00:00:00 2001 From: byu343 Date: Mon, 30 Oct 2017 18:04:40 -0700 Subject: [PATCH 0884/1011] [Arista]: Fix the udev waiting in networking start (#1093) * [Arista]: Fix the udev waiting in networking start This change is to fix the issue in https://github.com/aristanetworks/sonic/issues/16 For the checking condition used, it is only applied to Arista switches Signed-off-by: Boyang Yu * [Arista]: Correct for PR comments Signed-off-by: Boyang Yu --- files/build_templates/sonic_debian_extension.j2 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 8270af923078..37fcfbc56fcb 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -188,6 +188,11 @@ 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 +if [ "$image_type" = "aboot" ]; then + sudo sed -i 's/udevadm settle/udevadm settle -E \/sys\/class\/net\/eth0/' $FILESYSTEM_ROOT/etc/init.d/networking +fi + ## copy platform rc.local sudo cp $IMAGE_CONFIGS/platform/rc.local $FILESYSTEM_ROOT/etc/ From bfa034604045c8918ec5f3181fe2b3b9de1c12f3 Mon Sep 17 00:00:00 2001 From: paavaanan Date: Tue, 31 Oct 2017 23:11:29 +0530 Subject: [PATCH 0885/1011] =?UTF-8?q?Added=20support=20for=20Z9100=20to=20?= =?UTF-8?q?check=20SFP=20Presence,=20toggling=20lpmode,=20reset=E2=80=A6?= =?UTF-8?q?=20(#1087)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added support for Z9100 to check SFP Presence, toggling lpmode, reset, and eeprom details --- .../plugins/sfputil.py | 395 +++++++++++++++--- 1 file changed, 337 insertions(+), 58 deletions(-) diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py index 07e094db7bb8..5609abe9b49a 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py @@ -1,60 +1,339 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: - from sonic_sfp.sfputilbase import sfputilbase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") - - -class sfputil(sfputilbase): - """Platform specific sfputil class""" - - port_start = 0 - port_end = 31 - ports_in_block = 32 - - port_to_eeprom_mapping = {} - port_to_i2c_mapping = { - 0: 18, - 1: 19, - 2: 20, - 3: 21, - 4: 22, - 5: 23, - 6: 24, - 7: 25, - 8: 26, - 9: 27, - 10: 28, - 11: 29, - 12: 31, - 13: 30, - 14: 33, - 15: 32, - 16: 34, - 17: 35, - 18: 36, - 19: 37, - 20: 38, - 21: 39, - 22: 40, - 23: 41, - 24: 42, - 25: 43, - 26: 44, - 27: 45, - 28: 46, - 29: 47, - 30: 48, - 31: 49 - } - - _qsfp_ports = range(0, ports_in_block + 1) - - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization - eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' - for x in range(0, self.port_end + 1): - port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) - self.port_to_eeprom_mapping[x] = port_eeprom_path - sfputilbase.__init__(self, port_num) + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 + IOM_1_PORT_START = 0 + IOM_1_PORT_END = 11 + IOM_2_PORT_START = 12 + IOM_2_PORT_END = 21 + IOM_3_PORT_START = 22 + IOM_3_PORT_END = 31 + + BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{0}-003e/" + + _port_to_eeprom_mapping = {} + _port_to_i2c_mapping = { + 0: [9, 18], + 1: [9, 19], + 2: [9, 20], + 3: [9, 21], + 4: [9, 22], + 5: [9, 23], + 6: [9, 24], + 7: [9, 25], + 8: [8, 26], + 9: [8, 27], + 10: [8, 28], + 11: [8, 29], + 12: [8, 31], # reordered + 13: [8, 30], + 14: [8, 33], # reordered + 15: [8, 32], + 16: [7, 34], + 17: [7, 35], + 18: [7, 36], + 19: [7, 37], + 20: [7, 38], + 21: [7, 39], + 22: [7, 40], + 23: [7, 41], + 24: [6, 42], + 25: [6, 43], + 26: [6, 44], + 27: [6, 45], + 28: [6, 46], + 29: [6, 47], + 30: [6, 48], + 31: [6, 49] + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def iom1_port_start(self): + return self.IOM_1_PORT_START + + @property + def iom1_port_end(self): + return self.IOM_1_PORT_END + + @property + def iom2_port_start(self): + return self.IOM_2_PORT_START + + @property + def iom2_port_end(self): + return self.IOM_2_PORT_END + + @property + def iom3_port_start(self): + return self.IOM_3_PORT_START + + @property + def iom3_port_end(self): + return self.IOM_3_PORT_END + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + @property + def port_to_i2c_mapping(self): + return self._port_to_i2c_mapping + + def __init__(self): + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/i2c-{1}/{1}-0050/eeprom" + + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = eeprom_path.format( + self.port_to_i2c_mapping[x][0], + self.port_to_i2c_mapping[x][1]) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + + global i2c_line + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + # port_num and i2c match + if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: + i2c_line = 14 + elif (port_num >= self.iom2_port_start and + port_num <= self.iom2_port_end): + i2c_line = 15 + elif (port_num >= self.iom3_port_start and + port_num <= self.iom3_port_end): + i2c_line = 16 + + try: + qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_modprs" + reg_file = open(qsfp_path, "r") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # Absence of IOM throws read error + if (content == 'read error'): + return False + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Rationalize port settings + if port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: + port_num = port_num % 12 + elif (port_num >= self.iom3_port_start and + port_num <= self.iom3_port_end): + port_num = port_num % 22 + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ModPrsL is active low + if reg_value & mask == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # port_num and i2c match + if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: + i2c_line = 14 + elif (port_num >= self.iom2_port_start and + port_num <= self.iom2_port_end): + i2c_line = 15 + elif (port_num >= self.iom3_port_start and + port_num <= self.iom3_port_end): + i2c_line = 16 + + try: + qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_lpmode" + reg_file = open(qsfp_path, "r") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # Absence of IOM throws read error + if (content == 'read error'): + return False + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Rationalize port settings + if port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: + port_num = port_num % 12 + elif (port_num >= self.iom3_port_start and + port_num <= self.iom3_port_end): + port_num = port_num % 22 + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # LPMode is active high + if reg_value & mask == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # port_num and i2c match + if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: + i2c_line = 14 + elif (port_num >= self.iom2_port_start and + port_num <= self.iom2_port_end): + i2c_line = 15 + elif (port_num >= self.iom3_port_start and + port_num <= self.iom3_port_end): + i2c_line = 16 + + try: + qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_lpmode" + reg_file = open(qsfp_path, "r+") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # Absence of IOM throws read error + if (content == 'read error'): + return False + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Rationalize port settings + if port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: + port_num = port_num % 12 + elif (port_num >= self.iom3_port_start and + port_num <= self.iom3_port_end): + port_num = port_num % 22 + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = hex(reg_value) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # port_num and i2c match + if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: + i2c_line = 14 + elif (port_num >= self.iom2_port_start and + port_num <= self.iom2_port_end): + i2c_line = 15 + elif (port_num >= self.iom3_port_start and + port_num <= self.iom3_port_end): + i2c_line = 16 + + try: + qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_lpmode" + reg_file = open(qsfp_path, "r+") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # File content is a string containing the hex representation of th + reg_value = int(content, 16) + + # Rationalize port settings + if port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: + port_num = port_num % 12 + elif (port_num >= self.iom3_port_start and + port_num <= self.iom3_port_end): + port_num = port_num % 22 + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take + # port out of reset + try: + qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_lpmode" + reg_file = open(qsfp_path, "w+") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_value | mask + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + return True From c832f2af62c44aef7d6f39ca71174db0d87cc81e Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 31 Oct 2017 22:20:18 -0700 Subject: [PATCH 0886/1011] [ntp]: Restart ntp after ntp-config (#1098) --- files/image_config/ntp/ntp-config.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/files/image_config/ntp/ntp-config.sh b/files/image_config/ntp/ntp-config.sh index 7c79a16c0ef3..601b7bd421f0 100755 --- a/files/image_config/ntp/ntp-config.sh +++ b/files/image_config/ntp/ntp-config.sh @@ -1,3 +1,5 @@ #!/bin/bash sonic-cfggen -d -t /usr/share/sonic/templates/ntp.conf.j2 >/etc/ntp.conf + +systemctl restart ntp From 06c0f7d2e84a8d63a2b26b0cb7b37dfcdf737390 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Wed, 1 Nov 2017 18:40:33 -0700 Subject: [PATCH 0887/1011] Revert "[ntp]: Restart ntp after ntp-config (#1098)" (#1102) This reverts commit c832f2af62c44aef7d6f39ca71174db0d87cc81e. --- files/image_config/ntp/ntp-config.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/files/image_config/ntp/ntp-config.sh b/files/image_config/ntp/ntp-config.sh index 601b7bd421f0..7c79a16c0ef3 100755 --- a/files/image_config/ntp/ntp-config.sh +++ b/files/image_config/ntp/ntp-config.sh @@ -1,5 +1,3 @@ #!/bin/bash sonic-cfggen -d -t /usr/share/sonic/templates/ntp.conf.j2 >/etc/ntp.conf - -systemctl restart ntp From 967030f24d2c75a77a86e3ea92c2d815ce065e5e Mon Sep 17 00:00:00 2001 From: Bairen Yi Date: Fri, 3 Nov 2017 02:19:05 +0800 Subject: [PATCH 0888/1011] Change third party repos from git:// to https:// for better compatibility (#1104) * Change git:// to https:// for better security and compatibility --- src/isc-dhcp/Makefile | 2 +- src/supervisor/Makefile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/isc-dhcp/Makefile b/src/isc-dhcp/Makefile index 9cacd6cfe5e7..d2304876d1cf 100644 --- a/src/isc-dhcp/Makefile +++ b/src/isc-dhcp/Makefile @@ -10,7 +10,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : rm -rf ./isc-dhcp # Clone isc-dhcp repo - git clone git://anonscm.debian.org/pkg-dhcp/isc-dhcp.git + git clone https://anonscm.debian.org/cgit/pkg-dhcp/isc-dhcp.git pushd ./isc-dhcp git checkout -f debian/4.3.1-6 popd diff --git a/src/supervisor/Makefile b/src/supervisor/Makefile index 5f06325960b1..778903194ffa 100644 --- a/src/supervisor/Makefile +++ b/src/supervisor/Makefile @@ -8,8 +8,8 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Remove any stale files rm -rf ./supervisor - # Clone isc-dhcp repo - git clone git://github.com/Supervisor/supervisor.git + # Clone supervisor repo + git clone https://github.com/Supervisor/supervisor.git pushd ./supervisor git checkout -f 3.3.2 From 29f67ebe5807dc37b9cf1f0c2e4695699e7f0dba Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Fri, 3 Nov 2017 00:09:27 +0200 Subject: [PATCH 0889/1011] [acl-loader]: acl-loader integration. (#1000) * [acl-loader]: acl-loader integration. acl-loader was inplemented based on translate_acl source code. acl-loader can't be tested with unittest. Same testcases will be covered with testbed tests. - Remove translate_acl utility and tests. - Remove mirror template. - Do not run ACL rules and mirror configuration generators. - Adopt minigraph parser to work with acl-loader. * Update sonic-swss-common and sonic-swss submodules. Enable ACL dynamic config feature. * Update sonic-utilities submodule. Include fix for acl-loader incremental update command. * [sonic-cfggen]: Add test for everflow cfggen configuration. --- dockers/docker-orchagent/mirror.json.j2 | 24 --- dockers/docker-orchagent/start.sh | 1 - dockers/docker-orchagent/swssconfig.sh | 16 +- src/sonic-config-engine/minigraph.py | 14 +- src/sonic-config-engine/setup.py | 2 +- .../tests/sample_output/mirror.json | 14 -- .../sample_output/rules_for_dataacl.json | 46 ----- .../sample_output/rules_for_everflow.json | 14 -- .../tests/sample_output/table_dataacl.json | 10 - .../tests/sample_output/table_everflow.json | 10 - src/sonic-config-engine/tests/test_acl.py | 58 ------ src/sonic-config-engine/tests/test_cfggen.py | 21 ++- src/sonic-config-engine/tests/test_j2files.py | 13 +- src/sonic-config-engine/translate_acl | 174 ------------------ src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- src/sonic-utilities | 2 +- 17 files changed, 27 insertions(+), 396 deletions(-) delete mode 100644 dockers/docker-orchagent/mirror.json.j2 delete mode 100644 src/sonic-config-engine/tests/sample_output/mirror.json delete mode 100644 src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json delete mode 100644 src/sonic-config-engine/tests/sample_output/rules_for_everflow.json delete mode 100644 src/sonic-config-engine/tests/sample_output/table_dataacl.json delete mode 100644 src/sonic-config-engine/tests/sample_output/table_everflow.json delete mode 100644 src/sonic-config-engine/tests/test_acl.py delete mode 100755 src/sonic-config-engine/translate_acl diff --git a/dockers/docker-orchagent/mirror.json.j2 b/dockers/docker-orchagent/mirror.json.j2 deleted file mode 100644 index 3a3fc6eed079..000000000000 --- a/dockers/docker-orchagent/mirror.json.j2 +++ /dev/null @@ -1,24 +0,0 @@ -[ -{% if MIRROR_SESSION %} -{% for session in MIRROR_SESSION %} - { - "MIRROR_SESSION_TABLE:{{session}}": { - "src_ip": "{{ MIRROR_SESSION[session]['src_ip'] }}", - "dst_ip": "{{ MIRROR_SESSION[session]['dst_ip'] }}", -{% if onie_switch_asic == "mlnx" %} - "gre_type": "0x6558", - "queue": "1", -{% else %} - "gre_type": "0x88be", - "queue": "0", -{% endif %} - "dscp": "8", - "ttl": "255" - }, - "OP": "SET" - }{% if not loop.last %},{% endif %} - -{% endfor %} -{% endif %} -] - diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index bad88111c9a1..aa4e5b7dae1d 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -4,7 +4,6 @@ mkdir -p /etc/swss/config.d/ sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/switch.json.j2 > /etc/swss/config.d/switch.json sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json -sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/mirror.json.j2 > /etc/swss/config.d/mirror.json sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ports.json.j2 > /etc/swss/config.d/ports.json export platform=`sonic-cfggen -v platform` diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index c00d203a71ab..3458ddae61e6 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -2,18 +2,6 @@ set -e -function config_acl { - if [ -f "/etc/sonic/acl.json" ]; then - mkdir -p /etc/swss/config.d/acl - rm -rf /etc/swss/config.d/acl/* - translate_acl -m /etc/sonic/minigraph.xml -o /etc/swss/config.d/acl /etc/sonic/acl.json - for filename in /etc/swss/config.d/acl/*.json; do - [ -e "$filename" ] || break - swssconfig $filename - done - fi -} - function fast_reboot { case "$(cat /proc/cmdline)" in *fast-reboot*) @@ -39,7 +27,7 @@ fast_reboot HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -d -v "DEVICE_METADATA['localhost']['hwsku']"` -SWSSCONFIG_ARGS="00-copp.config.json ipinip.json mirror.json ports.json switch.json " +SWSSCONFIG_ARGS="00-copp.config.json ipinip.json ports.json switch.json " if [ "$HWSKU" == "Force10-S6000" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " @@ -56,5 +44,3 @@ for file in $SWSSCONFIG_ARGS; do swssconfig /etc/swss/config.d/$file sleep 1 done - -config_acl diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 3e1e603e6412..c51b24afed08 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -29,7 +29,7 @@ class minigraph_encoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, ( - ipaddress.IPv4Network, ipaddress.IPv6Network, + ipaddress.IPv4Network, ipaddress.IPv6Network, ipaddress.IPv4Address, ipaddress.IPv6Address )): return str(obj) @@ -129,7 +129,7 @@ def parse_dpg(dpg, hname): intfname = lointf.find(str(QName(ns, "AttachTo"))).text ipprefix = lointf.find(str(QName(ns1, "PrefixStr"))).text lo_intfs[(intfname, ipprefix)] = {} - + mgmtintfs = child.find(str(QName(ns, "ManagementIPInterfaces"))) mgmt_intf = {} for mgmtintf in mgmtintfs.findall(str(QName(ns1, "ManagementIPInterface"))): @@ -175,7 +175,7 @@ def parse_dpg(dpg, hname): aclintfs = child.find(str(QName(ns, "AclInterfaces"))) acls = {} for aclintf in aclintfs.findall(str(QName(ns, "AclInterface"))): - aclname = aclintf.find(str(QName(ns, "InAcl"))).text.lower().replace(" ", "_").replace("-", "_") + aclname = aclintf.find(str(QName(ns, "InAcl"))).text.upper().replace(" ", "_").replace("-", "_") aclattach = aclintf.find(str(QName(ns, "AttachTo"))).text.split(';') acl_intfs = [] is_mirror = False @@ -193,7 +193,7 @@ def parse_dpg(dpg, hname): acl_intfs = port_alias_map.values() break; if acl_intfs: - acls[aclname] = { 'policy_desc': aclname, 'ports': acl_intfs, 'type': 'mirror' if is_mirror else 'L3'} + acls[aclname] = { 'policy_desc': aclname, 'ports': acl_intfs, 'type': 'MIRROR' if is_mirror else 'L3'} return intfs, lo_intfs, mgmt_intf, vlans, pcs, acls return None, None, None, None, None, None @@ -358,7 +358,7 @@ def parse_xml(filename, platform=None, port_config_file=None): port_speeds = parse_deviceinfo(child, hwsku) results = {} - results['DEVICE_METADATA'] = {'localhost': { + results['DEVICE_METADATA'] = {'localhost': { 'bgp_asn': bgp_asn, 'deployment_id': deployment_id, 'hostname': hostname, @@ -423,13 +423,13 @@ def parse_device_desc_xml(filename): (lo_prefix, mgmt_prefix, hostname, hwsku, d_type) = parse_device(root) results = {} - results['DEVICE_METADATA'] = {'localhost': { + results['DEVICE_METADATA'] = {'localhost': { 'hostname': hostname, 'hwsku': hwsku, }} results['LOOPBACK_INTERFACE'] = {('lo', lo_prefix): {}} - + mgmt_intf = {} mgmtipn = ipaddress.IPNetwork(mgmt_prefix) gwaddr = ipaddress.IPAddress(int(mgmtipn.network) + 1) diff --git a/src/sonic-config-engine/setup.py b/src/sonic-config-engine/setup.py index 1bb597f395f6..296b7a03a6b9 100755 --- a/src/sonic-config-engine/setup.py +++ b/src/sonic-config-engine/setup.py @@ -16,7 +16,7 @@ def get_test_suite(): author_email='taoyl@microsoft.com', url='https://github.com/Azure/sonic-buildimage', py_modules=['portconfig', 'minigraph', 'openconfig_acl', 'sonic_platform'], - scripts=['sonic-cfggen', 'translate_acl'], + scripts=['sonic-cfggen'], install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'pyyaml', 'pyangbind'], test_suite='setup.get_test_suite', ) diff --git a/src/sonic-config-engine/tests/sample_output/mirror.json b/src/sonic-config-engine/tests/sample_output/mirror.json deleted file mode 100644 index 225235067e23..000000000000 --- a/src/sonic-config-engine/tests/sample_output/mirror.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "MIRROR_SESSION_TABLE:everflow0": { - "src_ip": "10.1.0.32", - "dst_ip": "2.2.2.2", - "gre_type": "0x88be", - "queue": "0", - "dscp": "8", - "ttl": "255" - }, - "OP": "SET" - } -] - diff --git a/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json b/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json deleted file mode 100644 index 709468f9d945..000000000000 --- a/src/sonic-config-engine/tests/sample_output/rules_for_dataacl.json +++ /dev/null @@ -1,46 +0,0 @@ -[ - { - "ACL_RULE_TABLE:DATAACL:RULE_1":{ - "IP_PROTOCOL":17, - "PACKET_ACTION":"FORWARD", - "SRC_IP":"10.0.0.0/8", - "priority":9999 - }, - "OP":"SET" - }, - { - "ACL_RULE_TABLE:DATAACL:RULE_3":{ - "IP_PROTOCOL":17, - "PACKET_ACTION":"FORWARD", - "SRC_IP":"25.0.0.0/8", - "priority":9997 - }, - "OP":"SET" - }, - { - "ACL_RULE_TABLE:DATAACL:RULE_2":{ - "IP_PROTOCOL":17, - "PACKET_ACTION":"FORWARD", - "SRC_IP":"100.64.0.0/10", - "priority":9998 - }, - "OP":"SET" - }, - { - "ACL_RULE_TABLE:DATAACL:RULE_4":{ - "IP_PROTOCOL":6, - "PACKET_ACTION":"FORWARD", - "TCP_FLAGS":"0x10/0x10", - "priority":9996 - }, - "OP":"SET" - }, - { - "ACL_RULE_TABLE:DATAACL:DEFAULT_RULE":{ - "ETHER_TYPE":"0x0800", - "PACKET_ACTION":"DROP", - "priority":1 - }, - "OP":"SET" - } -] \ No newline at end of file diff --git a/src/sonic-config-engine/tests/sample_output/rules_for_everflow.json b/src/sonic-config-engine/tests/sample_output/rules_for_everflow.json deleted file mode 100644 index 2f39a0dcc4a3..000000000000 --- a/src/sonic-config-engine/tests/sample_output/rules_for_everflow.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "ACL_RULE_TABLE:EVERFLOW:RULE_1":{ - "DST_IP":"127.0.0.1/32", - "IP_PROTOCOL":6, - "L4_DST_PORT":0, - "L4_SRC_PORT":0, - "MIRROR_ACTION":"everflow", - "SRC_IP":"127.0.0.1/32", - "priority":9999 - }, - "OP":"SET" - } -] \ No newline at end of file diff --git a/src/sonic-config-engine/tests/sample_output/table_dataacl.json b/src/sonic-config-engine/tests/sample_output/table_dataacl.json deleted file mode 100644 index a099680821d4..000000000000 --- a/src/sonic-config-engine/tests/sample_output/table_dataacl.json +++ /dev/null @@ -1,10 +0,0 @@ -[ - { - "ACL_TABLE:DATAACL":{ - "policy_desc":"dataacl", - "ports":"Ethernet112,Ethernet116,Ethernet120,Ethernet124", - "type":"L3" - }, - "OP":"SET" - } -] \ No newline at end of file diff --git a/src/sonic-config-engine/tests/sample_output/table_everflow.json b/src/sonic-config-engine/tests/sample_output/table_everflow.json deleted file mode 100644 index a4ad52bfe553..000000000000 --- a/src/sonic-config-engine/tests/sample_output/table_everflow.json +++ /dev/null @@ -1,10 +0,0 @@ -[ - { - "ACL_TABLE:EVERFLOW":{ - "policy_desc":"everflow", - "ports":"Ethernet24,Ethernet40,Ethernet20,Ethernet44,Ethernet48,Ethernet28,Ethernet96,Ethernet92,Ethernet76,Ethernet116,Ethernet72,Ethernet112,Ethernet52,Ethernet80,Ethernet56,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet60,Ethernet8,Ethernet4,Ethernet0,Ethernet64,Ethernet68,Ethernet84,Ethernet88,Ethernet108,Ethernet120,Ethernet104,Ethernet124,Ethernet100", - "type":"mirror" - }, - "OP":"SET" - } -] \ No newline at end of file diff --git a/src/sonic-config-engine/tests/test_acl.py b/src/sonic-config-engine/tests/test_acl.py deleted file mode 100644 index 319b2c1f73a7..000000000000 --- a/src/sonic-config-engine/tests/test_acl.py +++ /dev/null @@ -1,58 +0,0 @@ -import filecmp -import os -import subprocess - -from unittest import TestCase - -class TestAcl(TestCase): - def setUp(self): - self.test_dir = os.path.dirname(os.path.realpath(__file__)) - self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfggen') - self.acl_script_file = os.path.join(self.test_dir, '..', 'translate_acl') - self.t0_minigraph = os.path.join(self.test_dir, 't0-sample-graph.xml') - self.t0_minigraph_everflow = os.path.join(self.test_dir, 't0-sample-graph-everflow.xml') - self.t0_acl = os.path.join(self.test_dir, 't0-sample-acl.json') - self.t0_port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') - - def run_script(self, argument): - print 'CMD: sonic-cfggen ' + argument - output = '' - try: - output = subprocess.check_output(self.script_file + ' ' + argument, shell=True, stderr=subprocess.STDOUT) - except subprocess.CalledProcessError, (p): - print 'CalledProcessError: CMD:%s returncode:%s' % (p.cmd, p.returncode) - print p.output - return output - - def run_acl_script(self, argument): - print 'CMD: translate_acl ' + argument - output = '' - try: - output = subprocess.check_output(self.acl_script_file + ' ' + argument, shell=True, stderr=subprocess.STDOUT) - except subprocess.CalledProcessError, (p): - print 'CalledProcessError: CMD:%s returncode:%s' % (p.cmd, p.returncode) - print p.output - return output - - def test_translate_acl(self): - argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -o ' + self.test_dir + ' ' + self.t0_acl - self.run_acl_script(argument) - for filename in ['rules_for_dataacl.json','table_dataacl.json']: - sample_output_file = os.path.join(self.test_dir, 'sample_output', filename) - output_file = os.path.join(self.test_dir, filename) - assert filecmp.cmp(sample_output_file, output_file) - - def test_translate_everflow(self): - argument = '-m ' + self.t0_minigraph_everflow + ' -p ' + self.t0_port_config + ' -o ' + self.test_dir + ' ' + self.t0_acl - self.run_acl_script(argument) - for filename in ['rules_for_everflow.json','table_everflow.json']: - sample_output_file = os.path.join(self.test_dir, 'sample_output', filename) - output_file = os.path.join(self.test_dir, filename) - assert filecmp.cmp(sample_output_file, output_file) - - def tearDown(self): - for filename in ['rules_for_dataacl.json','table_dataacl.json','rules_for_everflow.json','table_everflow.json']: - try: - os.remove(os.path.join(self.test_dir, filename)) - except OSError: - pass diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 57172af97c39..31663077c434 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -3,7 +3,7 @@ import os class TestCfgGen(TestCase): - + def setUp(self): self.test_dir = os.path.dirname(os.path.realpath(__file__)) self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfggen') @@ -29,7 +29,7 @@ def test_dummy_run(self): argument = '' output = self.run_script(argument) self.assertEqual(output, '') - + def test_device_desc(self): argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -M "' + self.sample_device_desc + '"' output = self.run_script(argument) @@ -44,17 +44,17 @@ def test_minigraph_sku(self): argument = '-v "DEVICE_METADATA[\'localhost\'][\'hwsku\']" -m "' + self.sample_graph + '"' output = self.run_script(argument) self.assertEqual(output.strip(), 'Force10-Z9100') - + def test_print_data(self): argument = '-m "' + self.sample_graph + '" --print-data' output = self.run_script(argument) self.assertTrue(len(output.strip()) > 0) - + def test_jinja_expression(self): argument = '-m "' + self.sample_graph + '" -v "DEVICE_METADATA[\'localhost\'][\'type\']"' output = self.run_script(argument) self.assertEqual(output.strip(), 'LeafRouter') - + def test_additional_json_data(self): argument = '-a \'{"key1":"value1"}\' -v key1' output = self.run_script(argument) @@ -64,7 +64,7 @@ def test_read_yaml(self): argument = '-v yml_item -y ' + os.path.join(self.test_dir, 'test.yml') output = self.run_script(argument) self.assertEqual(output.strip(), '[\'value1\', \'value2\']') - + def test_render_template(self): argument = '-y ' + os.path.join(self.test_dir, 'test.yml') + ' -t ' + os.path.join(self.test_dir, 'test.j2') output = self.run_script(argument) @@ -73,13 +73,18 @@ def test_render_template(self): def test_minigraph_acl(self): argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v ACL_TABLE' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'dataacl': {'type': 'L3', 'policy_desc': 'dataacl', 'ports': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}}") + self.assertEqual(output.strip(), "{'DATAACL': {'type': 'L3', 'policy_desc': 'DATAACL', 'ports': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124']}}") + + def test_minigraph_everflow(self): + argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v MIRROR_SESSION' + output = self.run_script(argument) + self.assertEqual(output.strip(), "{'everflow0': {'src_ip': '10.1.0.32', 'dst_ip': '2.2.2.2'}}") def test_minigraph_interfaces(self): argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v \'INTERFACE.keys()\'' output = self.run_script(argument) self.assertEqual(output.strip(), "[('Ethernet0', '10.0.0.58/31'), ('Ethernet0', 'FC00::75/126')]") - + def test_minigraph_vlans(self): argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v VLAN' output = self.run_script(argument) diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 3d4139d0eb20..d1cc0d2a3296 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -31,14 +31,14 @@ def test_alias_map(self): argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + alias_map_template output = self.run_script(argument) data = json.loads(output) - self.assertEqual(data["Ethernet4"], "fortyGigE0/4") + self.assertEqual(data["Ethernet4"], "fortyGigE0/4") def test_lldp(self): lldpd_conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-lldp-sv2', 'lldpd.conf.j2') argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + lldpd_conf_template + ' > ' + self.output_file self.run_script(argument) self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'lldpd.conf'), self.output_file)) - + def test_teamd(self): def test_render_teamd(self, pc, minigraph, sample_output): @@ -77,15 +77,6 @@ def test_ipinip(self): assert filecmp.cmp(sample_output_file, self.output_file) - def test_everflow(self): - everflow_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'mirror.json.j2') - argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + everflow_file + ' > ' + self.output_file - self.run_script(argument) - - sample_output_file = os.path.join(self.test_dir, 'sample_output', 'mirror.json') - - assert filecmp.cmp(sample_output_file, self.output_file) - def test_msn27xx_32ports_buffers(self): buffer_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'msn27xx.32ports.buffers.json.j2') argument = '-m ' + self.t1_mlnx_minigraph + ' -p ' + self.mlnx_port_config + ' -t ' + buffer_file + ' > ' + self.output_file diff --git a/src/sonic-config-engine/translate_acl b/src/sonic-config-engine/translate_acl deleted file mode 100755 index b8138cf36b18..000000000000 --- a/src/sonic-config-engine/translate_acl +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/env python - -import sys -import os.path -import json -import argparse - -import openconfig_acl -import pyangbind.lib.pybindJSON as pybindJSON -from minigraph import parse_xml - -def dump_json(filename, data): - with open(filename, 'w') as outfile: - json.dump(data, outfile, indent=4, sort_keys=True, separators=(',', ':')) - -def default_deny_rule(table_name): - rule_props = {} - rule_data = {} - rule_data["ACL_RULE_TABLE:"+table_name.upper()+":DEFAULT_RULE"] = rule_props - rule_data["OP"] = "SET" - rule_props["priority"] = 1 - rule_props["ETHER_TYPE"] = "0x0800" - rule_props["PACKET_ACTION"] = "DROP" - return rule_data - -def generate_rule_json(table_name, rule, max_priority, mirror): - rule_idx = rule.config.sequence_id - rule_props = {} - rule_data = {} - rule_data["ACL_RULE_TABLE:"+table_name.upper()+":RULE_"+str(rule_idx)] = rule_props - rule_data["OP"] = "SET" - - rule_props["priority"] = max_priority - rule_idx - if rule.actions.config.forwarding_action == "ACCEPT": - if mirror: - rule_props["MIRROR_ACTION"] = "everflow" - else: - rule_props["PACKET_ACTION"] = "FORWARD" - elif rule.actions.config.forwarding_action == "DROP": - rule_props["PACKET_ACTION"] = "DROP" - elif rule.actions.config.forwarding_action == "REJECT": - rule_props["PACKET_ACTION"] = "DROP" - else: - print "Unknown rule action %s in table %s, rule %d!" % (rule.actions.config.forwarding_action, table_name, rule_idx) - return {} - - ip_protocol_map = { - "IP_TCP" : 6, - "IP_ICMP" : 1, - "IP_UDP" : 17, - "IP_IGMP" : 2, - "IP_PIM" : 103, - "IP_RSVP" : 46, - "IP_GRE" : 47, - "IP_AUTH" : 51, - "IP_L2TP" : 115 - } - - if not rule.ip.config.protocol: - pass - elif ip_protocol_map.has_key(rule.ip.config.protocol): - rule_props["IP_PROTOCOL"] = ip_protocol_map[rule.ip.config.protocol] - else: - try: - int(rule.ip.config.protocol) - except: - print "Unknown rule protocol %s in table %s, rule %d!" % (rule.ip.config.protocol, table_name, rule_idx) - return {} - else: - rule_props["IP_PROTOCOL"] = rule.ip.config.protocol - - if rule.ip.config.source_ip_address != "": - rule_props["SRC_IP"] = rule.ip.config.source_ip_address - if rule.ip.config.destination_ip_address != "": - rule_props["DST_IP"] = rule.ip.config.destination_ip_address - - if rule.transport.config.source_port == "": - pass - elif str(rule.transport.config.source_port).find("..") < 0: - rule_props["L4_SRC_PORT"] = rule.transport.config.source_port - else: - rule_props["L4_SRC_PORT_RANGE"] = str(rule.transport.config.source_port).replace("..", "-") - - if rule.transport.config.destination_port == "": - pass - elif str(rule.transport.config.destination_port).find("..") < 0: - rule_props["L4_DST_PORT"] = rule.transport.config.destination_port - else: - rule_props["L4_DST_PORT_RANGE"] = str(rule.transport.config.destination_port).replace("..", "-") - - tcp_flags = 0x00; - for flag in rule.transport.config.tcp_flags: - if flag == "TCP_FIN": - tcp_flags = tcp_flags | 0x01 - if flag == "TCP_SYN": - tcp_flags = tcp_flags | 0x02 - if flag == "TCP_RST": - tcp_flags = tcp_flags | 0x04 - if flag == "TCP_PSH": - tcp_flags = tcp_flags | 0x08 - if flag == "TCP_ACK": - tcp_flags = tcp_flags | 0x10 - if flag == "TCP_URG": - tcp_flags = tcp_flags | 0x20 - if flag == "TCP_ECE": - tcp_flags = tcp_flags | 0x40 - if flag == "TCP_CWR": - tcp_flags = tcp_flags | 0x80 - if tcp_flags != 0x00: - rule_props["TCP_FLAGS"] = '0x{:02x}/0x{:02x}'.format(tcp_flags, tcp_flags) - return rule_data - -def generate_table_json(aclset, aclname, ports, t_type, max_priority, output_path='.'): - table_name = aclname.replace(" ", "_").replace("-", "_") - #table_name = generate_random_table_name() - mirror = (t_type == 'mirror') - - table_props = {} - table_props["policy_desc"] = table_name - table_props["type"] = t_type - table_props["ports"] = ports - - table_data = [{}] - table_data[0]["ACL_TABLE:"+table_name.upper()] = table_props - table_data[0]["OP"] = "SET" - dump_json(os.path.join(output_path, "table_"+table_name+".json"), table_data) - - rule_data = [] - for aclentryname in aclset.acl_entries.acl_entry: - aclentry = aclset.acl_entries.acl_entry[aclentryname] - rule_props = generate_rule_json(table_name, aclentry, max_priority, mirror) - if rule_props: - rule_data.append(rule_props) - if not mirror: - rule_data.append(default_deny_rule(table_name)) - dump_json(os.path.join(output_path, "rules_for_"+table_name+".json"), rule_data) - -def translate_acl_fixed_port(filename, output_path, port, max_priority): - yang_acl = pybindJSON.load(filename, openconfig_acl, "openconfig_acl") - for aclsetname in yang_acl.acl.acl_sets.acl_set: - aclset = yang_acl.acl.acl_sets.acl_set[aclsetname] - generate_table_json(aclset, aclsetname, port, 'l3', max_priority, output_path) - return - -def translate_acl(filename, output_path, mini_acl, max_priority): - yang_acl = pybindJSON.load(filename, openconfig_acl, "openconfig_acl") - for aclsetname in yang_acl.acl.acl_sets.acl_set: - tablename = aclsetname.replace(" ", "_").replace("-", "_") - if mini_acl.has_key(tablename): - t_type = mini_acl[tablename]['type'] - ports = ','.join(mini_acl[tablename]['ports']) - aclset = yang_acl.acl.acl_sets.acl_set[aclsetname] - generate_table_json(aclset, aclsetname, ports, t_type, max_priority, output_path) - return - -def main(): - parser = argparse.ArgumentParser(description="Translate openconfig ACL json into SONiC ACL jsons") - parser.add_argument('input', metavar='INPUT', help='input json file in openconfig format') - group = parser.add_mutually_exclusive_group(required=True) - group.add_argument('-a', '--attach-to', help='the port(s) that this ACL is attached to') - group.add_argument('-m', '--minigraph', help='read ACL attaching information from minigraph') - parser.add_argument("-p", "--port-config", help="port config file, used with -m") - parser.add_argument('-n', '--max-priority', type=int, default=10000, help='the priority number of the first rule in ACL entries') - parser.add_argument('-o', '--output-path', default='.', help='output directory where SONiC ACL jsons will be generated') - args = parser.parse_args() - if args.attach_to: - translate_acl_fixed_port(args.input, args.output_path, args.port, args.max_priority) - elif args.minigraph: - mini_data = parse_xml(args.minigraph, port_config_file=args.port_config) - if mini_data['ACL_TABLE']: - translate_acl(args.input, args.output_path, mini_data['ACL_TABLE'], args.max_priority) - -if __name__ == "__main__": - main() diff --git a/src/sonic-swss b/src/sonic-swss index 3b7c3e334877..f90a4e1ef369 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 3b7c3e3348779e1fc7b147a299d22942a34f5cb9 +Subproject commit f90a4e1ef369491b84a048cbf234f4cd3442d552 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 31142b8fac17..2e94b54e3626 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 31142b8fac1796b7d665ed06609c9fec09c9707f +Subproject commit 2e94b54e3626a4acd73bb3edb2f94d61793ee0e4 diff --git a/src/sonic-utilities b/src/sonic-utilities index 67f8806ce42f..1d37c9c199b7 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 67f8806ce42f2511f170117d70ecfd0e8d205eb5 +Subproject commit 1d37c9c199b7934653f907095bf11e685889df23 From ef438002b871ee7175ad22632148c195e139761b Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 3 Nov 2017 09:33:23 -0700 Subject: [PATCH 0890/1011] [swsssdk] Update swsssdk pointer (#1107) --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 3b074795c907..294f5406e971 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 3b074795c907a7d0afea6d337010393fe9a1509d +Subproject commit 294f5406e971396352b06c3b4954a2f80dd8ba34 From a7e602501ce790651d7412de53b04db4f6b57a56 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 3 Nov 2017 14:36:26 -0700 Subject: [PATCH 0891/1011] Use sha1sum instead of shasum for portability (#1113) sha1sum is a better option to use since it is part of the coreutil package. shasum is owned by perl which might not always exist on the host system. --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index bf9e0da0c76a..800cd32093e3 100644 --- a/Makefile +++ b/Makefile @@ -25,8 +25,8 @@ $(shell rm -f .screen) MAKEFLAGS += -B -SLAVE_BASE_TAG = $(shell shasum sonic-slave/Dockerfile | awk '{print substr($$1,0,11);}') -SLAVE_TAG = $(shell cat sonic-slave/Dockerfile.user sonic-slave/Dockerfile | shasum | awk '{print substr($$1,0,11);}') +SLAVE_BASE_TAG = $(shell sha1sum sonic-slave/Dockerfile | awk '{print substr($$1,0,11);}') +SLAVE_TAG = $(shell cat sonic-slave/Dockerfile.user sonic-slave/Dockerfile | sha1sum | awk '{print substr($$1,0,11);}') SLAVE_BASE_IMAGE = sonic-slave-base SLAVE_IMAGE = sonic-slave-$(USER) From ca214b947c4eb11df9faf3c4ac2e9fc6b2c9c1e4 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 3 Nov 2017 15:22:05 -0700 Subject: [PATCH 0892/1011] [arista]: Bump sonic-platform-modules-arista submodule (#1111) * Bump sonic-platform-modules-arista Improves i2c performance for xcvrs Fix the led_plugin by ignoring unknown ports Miscellaneous improvements * Fix index column for Arista-7260CX3-D108C8 * Fix flash permissions for Arista platforms The ext4 flash uses acl to properly handle permissions in EOS. Aboot isn't built with this support and therefore can't be used to set the flash permissions. It has to be deferred in sonic initrd. --- .../Arista-7260CX3-D108C8/port_config.ini | 238 +++++++++--------- files/Aboot/boot0.j2 | 3 - files/initramfs-tools/arista-convertfs.j2 | 18 +- .../broadcom/sonic-platform-modules-arista | 2 +- 4 files changed, 137 insertions(+), 124 deletions(-) diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini index 35a2175cf21d..352926377a5c 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini @@ -1,121 +1,121 @@ # name lanes alias index Ethernet0 77,78 Ethernet1/1 1 -Ethernet2 79,80 Ethernet1/3 2 -Ethernet4 65,66 Ethernet2/1 3 -Ethernet6 67,68 Ethernet2/3 4 -Ethernet8 85,86 Ethernet3/1 5 -Ethernet10 87,88 Ethernet3/3 6 -Ethernet12 89,90 Ethernet4/1 7 -Ethernet14 91,92 Ethernet4/3 8 -Ethernet16 109,110 Ethernet5/1 9 -Ethernet18 111,112 Ethernet5/3 10 -Ethernet20 97,98 Ethernet6/1 11 -Ethernet22 99,100 Ethernet6/3 12 -Ethernet24 5,6 Ethernet7/1 13 -Ethernet26 7,8 Ethernet7/3 14 -Ethernet28 13,14 Ethernet8/1 15 -Ethernet30 15,16 Ethernet8/3 16 -Ethernet32 25,26 Ethernet9/1 17 -Ethernet34 27,28 Ethernet9/3 18 -Ethernet36 21,22 Ethernet10/1 19 -Ethernet38 23,24 Ethernet10/3 20 -Ethernet40 37,38 Ethernet11/1 21 -Ethernet42 39,40 Ethernet11/3 22 -Ethernet44 45,46 Ethernet12/1 23 -Ethernet46 47,48 Ethernet12/3 24 -Ethernet48 57,58 Ethernet13/1 25 -Ethernet50 59,60 Ethernet13/3 26 -Ethernet52 53,54 Ethernet14/1 27 -Ethernet54 55,56 Ethernet14/3 28 -Ethernet56 117,118 Ethernet15/1 29 -Ethernet58 119,120 Ethernet15/3 30 -Ethernet60 121,122 Ethernet16/1 31 -Ethernet62 123,124 Ethernet16/3 32 -Ethernet64 141,142 Ethernet17/1 33 -Ethernet66 143,144 Ethernet17/3 34 -Ethernet68 133,134,135,136 Ethernet18/1 35 -Ethernet72 197,198 Ethernet19/1 36 -Ethernet74 199,200 Ethernet19/3 37 -Ethernet76 205,206,207,208 Ethernet20/1 38 -Ethernet80 217,218 Ethernet21/1 39 -Ethernet82 219,220 Ethernet21/3 40 -Ethernet84 213,214 Ethernet22/1 41 -Ethernet86 215,216 Ethernet22/3 42 -Ethernet88 229,230 Ethernet23/1 43 -Ethernet90 231,232 Ethernet23/3 44 -Ethernet92 237,238 Ethernet24/1 45 -Ethernet94 239,240 Ethernet24/3 46 -Ethernet96 249,250 Ethernet25/1 47 -Ethernet98 251,252 Ethernet25/3 48 -Ethernet100 245,246 Ethernet26/1 49 -Ethernet102 247,248 Ethernet26/3 50 -Ethernet104 149,150 Ethernet27/1 51 -Ethernet106 151,152 Ethernet27/3 52 -Ethernet108 153,154 Ethernet28/1 53 -Ethernet110 155,156 Ethernet28/3 54 -Ethernet112 173,174 Ethernet29/1 55 -Ethernet114 175,176 Ethernet29/3 56 -Ethernet116 161,162 Ethernet30/1 57 -Ethernet118 163,164 Ethernet30/3 58 -Ethernet120 181,182 Ethernet31/1 59 -Ethernet122 183,184 Ethernet31/3 60 -Ethernet124 185,186 Ethernet32/1 61 -Ethernet126 187,188 Ethernet32/3 62 -Ethernet128 69,70 Ethernet33/1 63 -Ethernet130 71,72 Ethernet33/3 64 -Ethernet132 73,74 Ethernet34/1 65 -Ethernet134 75,76 Ethernet34/3 66 -Ethernet136 93,94 Ethernet35/1 67 -Ethernet138 95,96 Ethernet35/3 68 -Ethernet140 81,82 Ethernet36/1 69 -Ethernet142 83,84 Ethernet36/3 70 -Ethernet144 101,102 Ethernet37/1 71 -Ethernet146 103,104 Ethernet37/3 72 -Ethernet148 105,106 Ethernet38/1 73 -Ethernet150 107,108 Ethernet38/3 74 -Ethernet152 9,10 Ethernet39/1 75 -Ethernet154 11,12 Ethernet39/3 76 -Ethernet156 1,2 Ethernet40/1 77 -Ethernet158 3,4 Ethernet40/3 78 -Ethernet160 17,18 Ethernet41/1 79 -Ethernet162 19,20 Ethernet41/3 80 -Ethernet164 29,30 Ethernet42/1 81 -Ethernet166 31,32 Ethernet42/1 82 -Ethernet168 41,42 Ethernet43/1 83 -Ethernet170 43,44 Ethernet43/3 84 -Ethernet172 33,34 Ethernet44/1 85 -Ethernet174 35,36 Ethernet44/3 86 -Ethernet176 49,50,51,52 Ethernet45/1 87 -Ethernet180 61,62,63,64 Ethernet46/1 88 -Ethernet184 125,126,127,128 Ethernet47/1 89 -Ethernet188 113,114,115,116 Ethernet48/1 90 -Ethernet192 129,130,131,132 Ethernet49/1 91 -Ethernet196 137,138,139,140 Ethernet50/1 92 -Ethernet200 201,202,203,204 Ethernet51/1 93 -Ethernet204 193,194,195,196 Ethernet52/1 94 -Ethernet208 209,210 Ethernet53/1 95 -Ethernet210 211,212 Ethernet53/3 96 -Ethernet212 221,222 Ethernet54/1 97 -Ethernet214 223,224 Ethernet54/3 98 -Ethernet216 233,234 Ethernet55/1 99 -Ethernet218 235,236 Ethernet55/3 100 -Ethernet220 225,226 Ethernet56/1 101 -Ethernet222 227,228 Ethernet56/3 102 -Ethernet224 241,242 Ethernet57/1 103 -Ethernet226 243,244 Ethernet57/3 104 -Ethernet228 253,254 Ethernet58/1 105 -Ethernet230 255,256 Ethernet58/3 106 -Ethernet232 157,158 Ethernet59/1 107 -Ethernet234 159,160 Ethernet59/3 108 -Ethernet236 145,146 Ethernet60/1 109 -Ethernet238 147,148 Ethernet60/3 110 -Ethernet240 165,166 Ethernet61/1 111 -Ethernet242 167,168 Ethernet61/3 112 -Ethernet244 169,170 Ethernet62/1 113 -Ethernet246 171,172 Ethernet62/3 114 -Ethernet248 189,190 Ethernet63/1 115 -Ethernet250 191,192 Ethernet63/3 116 -Ethernet252 177,178 Ethernet64/1 117 -Ethernet254 179,180 Ethernet64/3 118 -Ethernet256 257 Ethernet257 119 -Ethernet260 259 Ethernet259 120 +Ethernet2 79,80 Ethernet1/3 1 +Ethernet4 65,66 Ethernet2/1 2 +Ethernet6 67,68 Ethernet2/3 2 +Ethernet8 85,86 Ethernet3/1 3 +Ethernet10 87,88 Ethernet3/3 3 +Ethernet12 89,90 Ethernet4/1 4 +Ethernet14 91,92 Ethernet4/3 4 +Ethernet16 109,110 Ethernet5/1 5 +Ethernet18 111,112 Ethernet5/3 5 +Ethernet20 97,98 Ethernet6/1 6 +Ethernet22 99,100 Ethernet6/3 6 +Ethernet24 5,6 Ethernet7/1 7 +Ethernet26 7,8 Ethernet7/3 7 +Ethernet28 13,14 Ethernet8/1 8 +Ethernet30 15,16 Ethernet8/3 8 +Ethernet32 25,26 Ethernet9/1 9 +Ethernet34 27,28 Ethernet9/3 9 +Ethernet36 21,22 Ethernet10/1 10 +Ethernet38 23,24 Ethernet10/3 10 +Ethernet40 37,38 Ethernet11/1 11 +Ethernet42 39,40 Ethernet11/3 11 +Ethernet44 45,46 Ethernet12/1 12 +Ethernet46 47,48 Ethernet12/3 12 +Ethernet48 57,58 Ethernet13/1 13 +Ethernet50 59,60 Ethernet13/3 13 +Ethernet52 53,54 Ethernet14/1 14 +Ethernet54 55,56 Ethernet14/3 14 +Ethernet56 117,118 Ethernet15/1 15 +Ethernet58 119,120 Ethernet15/3 15 +Ethernet60 121,122 Ethernet16/1 16 +Ethernet62 123,124 Ethernet16/3 16 +Ethernet64 141,142 Ethernet17/1 17 +Ethernet66 143,144 Ethernet17/3 17 +Ethernet68 133,134,135,136 Ethernet18/1 18 +Ethernet72 197,198 Ethernet19/1 19 +Ethernet74 199,200 Ethernet19/3 19 +Ethernet76 205,206,207,208 Ethernet20/1 20 +Ethernet80 217,218 Ethernet21/1 21 +Ethernet82 219,220 Ethernet21/3 21 +Ethernet84 213,214 Ethernet22/1 22 +Ethernet86 215,216 Ethernet22/3 22 +Ethernet88 229,230 Ethernet23/1 23 +Ethernet90 231,232 Ethernet23/3 23 +Ethernet92 237,238 Ethernet24/1 24 +Ethernet94 239,240 Ethernet24/3 24 +Ethernet96 249,250 Ethernet25/1 25 +Ethernet98 251,252 Ethernet25/3 25 +Ethernet100 245,246 Ethernet26/1 26 +Ethernet102 247,248 Ethernet26/3 26 +Ethernet104 149,150 Ethernet27/1 27 +Ethernet106 151,152 Ethernet27/3 27 +Ethernet108 153,154 Ethernet28/1 28 +Ethernet110 155,156 Ethernet28/3 28 +Ethernet112 173,174 Ethernet29/1 29 +Ethernet114 175,176 Ethernet29/3 29 +Ethernet116 161,162 Ethernet30/1 30 +Ethernet118 163,164 Ethernet30/3 30 +Ethernet120 181,182 Ethernet31/1 31 +Ethernet122 183,184 Ethernet31/3 31 +Ethernet124 185,186 Ethernet32/1 32 +Ethernet126 187,188 Ethernet32/3 32 +Ethernet128 69,70 Ethernet33/1 33 +Ethernet130 71,72 Ethernet33/3 33 +Ethernet132 73,74 Ethernet34/1 34 +Ethernet134 75,76 Ethernet34/3 34 +Ethernet136 93,94 Ethernet35/1 35 +Ethernet138 95,96 Ethernet35/3 35 +Ethernet140 81,82 Ethernet36/1 36 +Ethernet142 83,84 Ethernet36/3 36 +Ethernet144 101,102 Ethernet37/1 37 +Ethernet146 103,104 Ethernet37/3 37 +Ethernet148 105,106 Ethernet38/1 38 +Ethernet150 107,108 Ethernet38/3 38 +Ethernet152 9,10 Ethernet39/1 39 +Ethernet154 11,12 Ethernet39/3 39 +Ethernet156 1,2 Ethernet40/1 40 +Ethernet158 3,4 Ethernet40/3 40 +Ethernet160 17,18 Ethernet41/1 41 +Ethernet162 19,20 Ethernet41/3 41 +Ethernet164 29,30 Ethernet42/1 42 +Ethernet166 31,32 Ethernet42/1 42 +Ethernet168 41,42 Ethernet43/1 43 +Ethernet170 43,44 Ethernet43/3 43 +Ethernet172 33,34 Ethernet44/1 44 +Ethernet174 35,36 Ethernet44/3 44 +Ethernet176 49,50,51,52 Ethernet45/1 45 +Ethernet180 61,62,63,64 Ethernet46/1 46 +Ethernet184 125,126,127,128 Ethernet47/1 47 +Ethernet188 113,114,115,116 Ethernet48/1 48 +Ethernet192 129,130,131,132 Ethernet49/1 49 +Ethernet196 137,138,139,140 Ethernet50/1 50 +Ethernet200 201,202,203,204 Ethernet51/1 51 +Ethernet204 193,194,195,196 Ethernet52/1 52 +Ethernet208 209,210 Ethernet53/1 53 +Ethernet210 211,212 Ethernet53/3 53 +Ethernet212 221,222 Ethernet54/1 54 +Ethernet214 223,224 Ethernet54/3 54 +Ethernet216 233,234 Ethernet55/1 55 +Ethernet218 235,236 Ethernet55/3 55 +Ethernet220 225,226 Ethernet56/1 56 +Ethernet222 227,228 Ethernet56/3 56 +Ethernet224 241,242 Ethernet57/1 57 +Ethernet226 243,244 Ethernet57/3 57 +Ethernet228 253,254 Ethernet58/1 58 +Ethernet230 255,256 Ethernet58/3 58 +Ethernet232 157,158 Ethernet59/1 59 +Ethernet234 159,160 Ethernet59/3 59 +Ethernet236 145,146 Ethernet60/1 60 +Ethernet238 147,148 Ethernet60/3 60 +Ethernet240 165,166 Ethernet61/1 61 +Ethernet242 167,168 Ethernet61/3 61 +Ethernet244 169,170 Ethernet62/1 62 +Ethernet246 171,172 Ethernet62/3 62 +Ethernet248 189,190 Ethernet63/1 63 +Ethernet250 191,192 Ethernet63/3 63 +Ethernet252 177,178 Ethernet64/1 64 +Ethernet254 179,180 Ethernet64/3 64 +Ethernet256 257 Ethernet65 65 +Ethernet260 259 Ethernet66 66 diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index b88c0ec35b39..8ea085bf5e8d 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -65,9 +65,6 @@ extract_image() { ## vfat does not support symbol link if [ -n "$sonic_upgrade" ] || [ "$rootfs_type" != "vfat" ]; then - ## on ext4, other doesn't have access to the flash by default - chmod o+rx "$target_path" - mkdir -p "$image_path/{{ DOCKERFS_DIR }}" if [ -n "$sonic_upgrade" ]; then diff --git a/files/initramfs-tools/arista-convertfs.j2 b/files/initramfs-tools/arista-convertfs.j2 index 75ce011e839a..cea25bd39837 100644 --- a/files/initramfs-tools/arista-convertfs.j2 +++ b/files/initramfs-tools/arista-convertfs.j2 @@ -82,6 +82,13 @@ run_cmd() { fi } +fixup_flash_permissions() { + # properly set flash permissions for others + # this allows the sonic admin user to have read access on the flash + local flash_mnt="$1" + chmod o+rx "$flash_mnt" +} + # Extract kernel parameters set -- $(cat /proc/cmdline) for x in "$@"; do @@ -111,7 +118,14 @@ if ! wait_for_root_dev; then fi # exit when the root is ext4 -blkid | grep "$root_dev.*vfat" -q || exit 0 +if ! blkid | grep "$root_dev.*vfat" -q; then + mkdir -p "$root_mnt" + mount -t ext4 "$root_dev" "$root_mnt" + fixup_flash_permissions "$root_mnt" + umount "$root_mnt" + rmdir "$root_mnt" + exit 0 +fi # Get flash dev name if [ -z "$block_flash" ]; then @@ -176,3 +190,5 @@ run_cmd "$cmd" "$err_msg" err_msg="Error: copying files form $tmp_mnt to $root_mnt failed" cmd="cp -a $tmp_mnt/. $root_mnt/" run_cmd "$cmd" "$err_msg" + +fixup_flash_permissions "$root_mnt" diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index d1417bff1778..f985b188326e 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit d1417bff17780255d4cc371b315f620087673eb8 +Subproject commit f985b188326e480124ec49541b4fecc51a213889 From 4e1fb6850fe0c3b4670d1068c16073e69822dcf0 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Sat, 4 Nov 2017 01:31:02 +0200 Subject: [PATCH 0893/1011] Update Mellanox buffers profile to use single pool for lossless (#1101) Signed-off-by: Andriy Moroz --- .../msn27xx.32ports.buffers.json.j2 | 17 +++++------------ .../tests/sample_output/msn27.32ports.json | 14 +++----------- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 b/dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 index 075385079a0d..ce1ddedbba37 100644 --- a/dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 +++ b/dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 @@ -4,14 +4,6 @@ {%- if port_names_list.append(port) %}{% endif %} {% endfor %} {% set port_names = port_names_list | join(',') %} - { - "BUFFER_POOL_TABLE:ingress_lossless_pool": { - "size": "3024486", - "type": "ingress", - "mode": "dynamic" - }, - "OP": "SET" - }, { "BUFFER_POOL_TABLE:ingress_lossy_pool": { "size": "6422528", @@ -106,6 +98,7 @@ }, {# The following template part is for variable PG profile configuration #} +{% set non_pg_lossless_pool_size = 866726 %} {% set pg_range = '3-4' %} {# Lists of supported speed and cable length #} {% set supported_speed = [10000, 25000, 40000, 50000, 100000] %} @@ -239,7 +232,7 @@ {%- set profile_config = pg_profiles[profile_name] %} { "BUFFER_PROFILE_TABLE:{{ profile_name }}": { - "pool":"[BUFFER_POOL_TABLE:ingress_lossless_pg_pool]", + "pool":"[BUFFER_POOL_TABLE:ingress_lossless_pool]", "xon":"{{ profile_config['xon'] }}", "xoff":"{{ profile_config['xoff'] }}", "size":"{{ profile_config['size'] }}", @@ -249,10 +242,10 @@ }, {% endfor -%} - {# Pool declaration #} + {# Lossless pool declaration #} { - "BUFFER_POOL_TABLE:ingress_lossless_pg_pool": { - "size": "{{ ingress_lossless_pg_pool_size | sum }}", + "BUFFER_POOL_TABLE:ingress_lossless_pool": { + "size": "{{ ingress_lossless_pg_pool_size | sum + non_pg_lossless_pool_size }}", "type": "ingress", "mode": "dynamic" }, diff --git a/src/sonic-config-engine/tests/sample_output/msn27.32ports.json b/src/sonic-config-engine/tests/sample_output/msn27.32ports.json index 876706b5de13..c65ebb847d7b 100644 --- a/src/sonic-config-engine/tests/sample_output/msn27.32ports.json +++ b/src/sonic-config-engine/tests/sample_output/msn27.32ports.json @@ -1,12 +1,4 @@ [ - { - "BUFFER_POOL_TABLE:ingress_lossless_pool": { - "size": "3024486", - "type": "ingress", - "mode": "dynamic" - }, - "OP": "SET" - }, { "BUFFER_POOL_TABLE:ingress_lossy_pool": { "size": "6422528", @@ -297,7 +289,7 @@ { "BUFFER_PROFILE_TABLE:pg_lossless_40G_300m_profile": { - "pool":"[BUFFER_POOL_TABLE:ingress_lossless_pg_pool]", + "pool":"[BUFFER_POOL_TABLE:ingress_lossless_pool]", "xon":"18432", "xoff":"75776", "size":"94208", @@ -306,8 +298,8 @@ "OP": "SET" }, { - "BUFFER_POOL_TABLE:ingress_lossless_pg_pool": { - "size": "3014656", + "BUFFER_POOL_TABLE:ingress_lossless_pool": { + "size": "3881382", "type": "ingress", "mode": "dynamic" }, From 875bdf6be94f9652fd98623bab15df6e343175f0 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 3 Nov 2017 17:13:39 -0700 Subject: [PATCH 0894/1011] [vs] add teamsyncd into vs docker (#1112) * [vs] add teamsyncd into vs docker * add build badge for virtual switch --- .gitignore | 1 + README.md | 7 +- platform/vs/README.md | 68 ++++++++++++++++++-- platform/vs/docker-sonic-vs.mk | 2 +- platform/vs/docker-sonic-vs/Dockerfile | 51 --------------- platform/vs/docker-sonic-vs/Dockerfile.j2 | 3 +- platform/vs/docker-sonic-vs/start.sh | 2 + platform/vs/docker-sonic-vs/supervisord.conf | 8 +++ rules/swss-common.mk | 3 + src/sonic-swss-common | 2 +- 10 files changed, 86 insertions(+), 61 deletions(-) delete mode 100644 platform/vs/docker-sonic-vs/Dockerfile diff --git a/.gitignore b/.gitignore index 9ca9d2ff1a98..c5ed255e62a9 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ dockers/docker-teamd/Dockerfile dockers/docker-sonic-mgmt/Dockerfile platform/*/docker-syncd-*/Dockerfile platform/*/docker-syncd-*-rpc/Dockerfile +platform/vs/docker-sonic-vs/Dockerfile # Installer-related files and directories installer/x86_64/platforms/ diff --git a/README.md b/README.md index 53e8b8ff221a..b494f56bc0ae 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ Broadcom: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/broad Cavium: [![Cavium](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) Centec: [![Centec](https://sonic-jenkins.westus.cloudapp.azure.com/job/centec/job/buildimage-centec-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/centec/job/buildimage-centec-all/) Mellanox: [![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) -P4: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all) +P4: [![P4](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all) +VS: [![VS](https://sonic-jenkins.westus.cloudapp.azure.com/job/vs/job/buildimage-vs-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/vs/job/buildimage-vs-all) # sonic-buildimage @@ -10,7 +11,7 @@ P4: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buil # Description -Following is the instruction on how to build an [(ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also how to build docker images running inside the NOS. Note that SONiC image are build per ASIC platform. Switches using the same ASIC platform share a common image. For a list of supported switches and ASIC, please refer to this [document](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all). +Following is the instruction on how to build an [(ONIE)](https://github.com/opencomputeproject/onie) compatiable network operating system (NOS) installer image for network switches, and also how to build docker images running inside the NOS. Note that SONiC image are build per ASIC platform. Switches using the same ASIC platform share a common image. For a list of supported switches and ASIC, please refer to this [list](https://github.com/Azure/SONiC/wiki/Supported-Devices-and-Platforms) # Hardware Any server can be a build image server. We are using a server with 1T hard disk. The OS is Ubuntu 16.04. @@ -47,6 +48,7 @@ The SONiC installer contains all docker images needed. SONiC uses one image for - PLATFORM=cavium - PLATFORM=centec - PLATFORM=p4 +- PLATFORM=vs For Broadcom ASIC, we build ONIE and EOS image. EOS image is used for Arista devices, ONIE image is used for all other Broadcom ASIC based devices. @@ -92,6 +94,7 @@ This may take a while, but it is a one-time action, so please be patient. - docker-syncd-cavm.gz: docker image for the daemon to sync database and Cavium switch ASIC (gzip tar archive) - docker-syncd-mlnx.gz: docker image for the daemon to sync database and Mellanox switch ASIC (gzip tar archive) - docker-sonic-p4.gz: docker image for all-in-one for p4 software switch (gzip tar archive) + - docker-sonic-vs.gz: docker image for all-in-one for software virtual switch (gzip tar archive) ## Contribution Guide diff --git a/platform/vs/README.md b/platform/vs/README.md index a7ec58856124..52f3f30eac6d 100644 --- a/platform/vs/README.md +++ b/platform/vs/README.md @@ -4,14 +4,72 @@ HOWTO Use Virtual Switch 1. Create a docker with 32 front panel port ``` -docker run -id --name sw debian bash -sudo ./create_vnet.sh sw +$ docker run -id --name sw debian bash +$ sudo ./create_vnet.sh sw +$ ip netns list +sw-srv31 (id: 37) +sw-srv30 (id: 35) +sw-srv29 (id: 34) +sw-srv28 (id: 33) +sw-srv27 (id: 32) +sw-srv26 (id: 31) +sw-srv25 (id: 30) +sw-srv24 (id: 29) +sw-srv23 (id: 28) +sw-srv22 (id: 27) +sw-srv21 (id: 26) +sw-srv20 (id: 25) +sw-srv19 (id: 24) +sw-srv18 (id: 23) +sw-srv17 (id: 22) +sw-srv16 (id: 21) +sw-srv15 (id: 20) +sw-srv14 (id: 19) +sw-srv13 (id: 18) +sw-srv12 (id: 17) +sw-srv11 (id: 16) +sw-srv10 (id: 15) +sw-srv9 (id: 14) +sw-srv8 (id: 13) +sw-srv7 (id: 12) +sw-srv6 (id: 11) +sw-srv5 (id: 10) +sw-srv4 (id: 9) +sw-srv3 (id: 8) +sw-srv2 (id: 7) +sw-srv1 (id: 6) +sw-srv0 (id: 5) ``` -2. Create sonic virtual switch docker +2. Start sonic virtual switch docker ``` -docker run --privileged --network container:sw -d docker-sonic-vs +$ docker run --privileged --network container:sw -d docker-sonic-vs ``` -3. Run test in virtual switch docker (TBD) +3. Setup IP in the virtual switch docker + +``` +$ docker exec -it vs bash +root@2e9b5c2dc2a2:/# ifconfig Ethernet0 10.0.0.0/31 up +root@2e9b5c2dc2a2:/# ifconfig Ethernet4 10.0.0.2/31 up +``` + +4. Setup IP in the server network namespace + +``` +$ sudo ip netns exec sw-srv0 ifconfig eth0 10.0.0.1/31 +$ sudo ip netns exec sw-srv0 ip route add default via 10.0.0.0 +$ sudo ip netns exec sw-srv1 ifconfig eth0 10.0.0.3/31 +$ sudo ip netns exec sw-srv1 ip route add default via 10.0.0.2 +``` + +5. Ping from sw-srv0 to sw-srv1 + +``` +$ sudo ip netns exec sw-srv0 ping 10.0.0.3 +PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data. +64 bytes from 10.0.0.3: icmp_seq=1 ttl=63 time=0.137 ms +64 bytes from 10.0.0.3: icmp_seq=2 ttl=63 time=0.148 ms +64 bytes from 10.0.0.3: icmp_seq=3 ttl=63 time=0.149 ms +``` diff --git a/platform/vs/docker-sonic-vs.mk b/platform/vs/docker-sonic-vs.mk index b52965787149..e9d23db493db 100644 --- a/platform/vs/docker-sonic-vs.mk +++ b/platform/vs/docker-sonic-vs.mk @@ -2,7 +2,7 @@ DOCKER_SONIC_VS = docker-sonic-vs.gz $(DOCKER_SONIC_VS)_PATH = $(PLATFORM_PATH)/docker-sonic-vs -$(DOCKER_SONIC_VS)_DEPENDS += $(SWSS) $(SYNCD_VS) $(REDIS_SERVER) $(REDIS_TOOLS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(SONIC_DEVICE_DATA) +$(DOCKER_SONIC_VS)_DEPENDS += $(SWSS) $(SYNCD_VS) $(REDIS_SERVER) $(REDIS_TOOLS) $(PYTHON_SWSSCOMMON) $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(SONIC_DEVICE_DATA) ifeq ($(SONIC_ROUTING_STACK), quagga) $(DOCKER_SONIC_VS)_DEPENDS += $(QUAGGA) diff --git a/platform/vs/docker-sonic-vs/Dockerfile b/platform/vs/docker-sonic-vs/Dockerfile deleted file mode 100644 index 2a75868cd99d..000000000000 --- a/platform/vs/docker-sonic-vs/Dockerfile +++ /dev/null @@ -1,51 +0,0 @@ -FROM docker-config-engine - -## Make apt-get non-interactive -ENV DEBIAN_FRONTEND=noninteractive - -RUN apt-get update - -RUN apt-get install -y net-tools \ - ethtool \ - tcpdump \ - ifupdown \ - bridge-utils \ - python-ply \ - libqt5core5a \ - libqt5network5 \ - libboost-program-options1.55.0 \ - libboost-system1.55.0 \ - libboost-thread1.55.0 \ - libgmp10 \ - libjudydebian1 \ - libnanomsg0 \ - libdaemon0 \ - libjansson4 \ - libjemalloc1 \ - openssh-client \ - openssh-server \ - libc-ares2 \ - iproute - -COPY \ -debs/libnl-route-3-200_3.2.27-1_amd64.deb debs/libnl-genl-3-200_3.2.27-1_amd64.deb debs/libnl-nf-3-200_3.2.27-1_amd64.deb debs/libhiredis0.13_0.13.3-2_amd64.deb debs/libnl-3-200_3.2.27-1_amd64.deb debs/libnl-cli-3-200_3.2.27-1_amd64.deb debs/libswsscommon_1.0.0_amd64.deb debs/libsairedis_1.0.0_amd64.deb debs/libsaimetadata_1.0.0_amd64.deb debs/libteam5_1.26-1_amd64.deb debs/libsaivs_1.0.0_amd64.deb debs/swss_1.0.0_amd64.deb debs/syncd-vs_1.0.0_amd64.deb debs/redis-server_3.2.4-1~bpo8+1_amd64.deb debs/redis-tools_3.2.4-1~bpo8+1_amd64.deb debs/libteamdctl0_1.26-1_amd64.deb debs/libteam-utils_1.26-1_amd64.deb debs/sonic-device-data_1.0-1_all.deb debs/quagga_0.99.24.1-2.1_amd64.deb debs/ - -RUN dpkg -i \ -debs/libnl-route-3-200_3.2.27-1_amd64.deb debs/libnl-genl-3-200_3.2.27-1_amd64.deb debs/libnl-nf-3-200_3.2.27-1_amd64.deb debs/libhiredis0.13_0.13.3-2_amd64.deb debs/libnl-3-200_3.2.27-1_amd64.deb debs/libnl-cli-3-200_3.2.27-1_amd64.deb debs/libswsscommon_1.0.0_amd64.deb debs/libsairedis_1.0.0_amd64.deb debs/libsaimetadata_1.0.0_amd64.deb debs/libteam5_1.26-1_amd64.deb debs/libsaivs_1.0.0_amd64.deb debs/swss_1.0.0_amd64.deb debs/syncd-vs_1.0.0_amd64.deb debs/redis-server_3.2.4-1~bpo8+1_amd64.deb debs/redis-tools_3.2.4-1~bpo8+1_amd64.deb debs/libteamdctl0_1.26-1_amd64.deb debs/libteam-utils_1.26-1_amd64.deb debs/sonic-device-data_1.0-1_all.deb debs/quagga_0.99.24.1-2.1_amd64.deb - -## Clean up -RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y -RUN rm -rf /debs - -RUN sed -ri 's/^daemonize yes$/daemonize no/; \ - s/^logfile .*$/logfile ""/; \ - s/^# syslog-enabled no$/syslog-enabled no/; \ - s/^# unixsocket/unixsocket/ \ - ' /etc/redis/redis.conf - -COPY ["50-default.conf", "/etc/rsyslog.d/"] -COPY ["start.sh", "orchagent.sh", "/usr/bin/"] -COPY ["brcm.profile.ini", "/usr/share/sonic/device/vswitch/"] -COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] - -ENTRYPOINT ["/usr/bin/supervisord"] \ No newline at end of file diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2 index f6e784017f78..32b91e8cf44a 100644 --- a/platform/vs/docker-sonic-vs/Dockerfile.j2 +++ b/platform/vs/docker-sonic-vs/Dockerfile.j2 @@ -25,7 +25,8 @@ RUN apt-get install -y net-tools \ openssh-client \ openssh-server \ libc-ares2 \ - iproute + iproute \ + libpython2.7 COPY \ {% for deb in docker_sonic_vs_debs.split(' ') -%} diff --git a/platform/vs/docker-sonic-vs/start.sh b/platform/vs/docker-sonic-vs/start.sh index 26633c24a70b..07d0fb7a0426 100755 --- a/platform/vs/docker-sonic-vs/start.sh +++ b/platform/vs/docker-sonic-vs/start.sh @@ -26,6 +26,8 @@ supervisorctl start intfsyncd supervisorctl start neighsyncd +supervisorctl start teamsyncd + # Start arp_update when VLAN exists # VLAN=`sonic-cfggen -d -v 'VLAN.keys() | join(" ") if VLAN'` # if [ "$VLAN" != "" ]; then diff --git a/platform/vs/docker-sonic-vs/supervisord.conf b/platform/vs/docker-sonic-vs/supervisord.conf index 35c56420b463..c6fefef1415a 100644 --- a/platform/vs/docker-sonic-vs/supervisord.conf +++ b/platform/vs/docker-sonic-vs/supervisord.conf @@ -66,3 +66,11 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog + +[program:teamsyncd] +command=/usr/bin/teamsyncd +priority=9 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog diff --git a/rules/swss-common.mk b/rules/swss-common.mk index a4ccdafc2376..623410d4cdab 100644 --- a/rules/swss-common.mk +++ b/rules/swss-common.mk @@ -12,6 +12,9 @@ SONIC_DPKG_DEBS += $(LIBSWSSCOMMON) LIBSWSSCOMMON_DEV = libswsscommon-dev_1.0.0_amd64.deb $(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(LIBSWSSCOMMON_DEV))) +PYTHON_SWSSCOMMON = python-swsscommon_1.0.0_amd64.deb +$(eval $(call add_derived_package,$(LIBSWSSCOMMON),$(PYTHON_SWSSCOMMON))) + LIBSWSSCOMMON_DBG = libswsscommon-dbg_1.0.0_amd64.deb $(LIBSWSSCOMMON_DBG)_DEPENDS += $(LIBSWSSCOMMON) $(LIBSWSSCOMMON_DBG)_RDEPENDS += $(LIBSWSSCOMMON) diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 2e94b54e3626..a6f74b67a580 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 2e94b54e3626a4acd73bb3edb2f94d61793ee0e4 +Subproject commit a6f74b67a58074439d8f3dbf84fa8ecc0a2e06a6 From ce6cbbbb99ed7c418f0c1d1de113fb8f25c7cb12 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 3 Nov 2017 17:58:34 -0700 Subject: [PATCH 0895/1011] [Arista7260CX3] Fix a typo in port_ini.cfg (#1114) --- .../Arista-7260CX3-D108C8/port_config.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini index 352926377a5c..541b197f6bb8 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini @@ -80,7 +80,7 @@ Ethernet158 3,4 Ethernet40/3 40 Ethernet160 17,18 Ethernet41/1 41 Ethernet162 19,20 Ethernet41/3 41 Ethernet164 29,30 Ethernet42/1 42 -Ethernet166 31,32 Ethernet42/1 42 +Ethernet166 31,32 Ethernet42/3 42 Ethernet168 41,42 Ethernet43/1 43 Ethernet170 43,44 Ethernet43/3 43 Ethernet172 33,34 Ethernet44/1 44 From c17d6a79f58ecbb2718cf812cd5a2fde04ce0d27 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 4 Nov 2017 18:31:07 -0700 Subject: [PATCH 0896/1011] [doc]: add badge for marvell and nephos build (#1116) --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b494f56bc0ae..bbae2e150b8e 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,13 @@ -Broadcom: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) -Cavium: [![Cavium](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) -Centec: [![Centec](https://sonic-jenkins.westus.cloudapp.azure.com/job/centec/job/buildimage-centec-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/centec/job/buildimage-centec-all/) +*master*: Broadcom: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) Mellanox: [![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) P4: [![P4](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all) VS: [![VS](https://sonic-jenkins.westus.cloudapp.azure.com/job/vs/job/buildimage-vs-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/vs/job/buildimage-vs-all) +*201709*: Cavium: [![Cavium](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) +Centec: [![Centec](https://sonic-jenkins.westus.cloudapp.azure.com/job/centec/job/buildimage-centec-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/centec/job/buildimage-centec-all/) +Nephos: [![Nephos](https://sonic-jenkins.westus.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all/) +Marvell: [![Marvell](https://sonic-jenkins.westus.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-all/) + # sonic-buildimage ## Build SONiC Switch Images From 84cbfd5bbc6168e8a3d46b5819911a42b1559407 Mon Sep 17 00:00:00 2001 From: JipanYanga Date: Sun, 5 Nov 2017 01:31:29 -0600 Subject: [PATCH 0897/1011] [configdb]: Store switch mac to configDB switch table (#1108) Signed-off-by: Jipan Yang --- files/image_config/interfaces/interfaces-config.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index bd5111a01f73..28396774bfa1 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -12,6 +12,9 @@ fi sonic-cfggen -d -a '{"hwaddr":"'$SYSTEM_MAC_ADDRESS'"}' -t /usr/share/sonic/templates/interfaces.j2 > /etc/network/interfaces +# Also store the system mac to configDB switch table. User configured switch_mac is not supported for now. +/usr/bin/docker exec database redis-cli -n 4 hset SWITCH\|SWITCH_ATTR switch_mac $SYSTEM_MAC_ADDRESS + [ -f /var/run/dhclient.eth0.pid ] && kill `cat /var/run/dhclient.eth0.pid` && rm -f /var/run/dhclient.eth0.pid systemctl restart networking From 7406d3709bbd8da3f5749151519dfc6a7ce4564c Mon Sep 17 00:00:00 2001 From: JipanYanga Date: Mon, 6 Nov 2017 00:37:16 -0600 Subject: [PATCH 0898/1011] [configdb]: Add support for vlanconfd and intfconfd (#1063) * Add support for vlanconfd and intfconfd Signed-off-by: Jipan Yang * Change name to vlanmgrd and intfmgrd Signed-off-by: Jipan Yang * Add missing vlan_members for parse_dpg result Signed-off-by: Jipan Yang * Remove cfgmgr debug CLI from image Signed-off-by: Jipan Yang * Update swss and swss-common submodules for VLAN trunk support Signed-off-by: Jipan Yang --- dockers/docker-orchagent/start.sh | 4 + dockers/docker-orchagent/supervisord.conf | 16 ++ files/image_config/interfaces/interfaces.j2 | 27 ---- src/sonic-config-engine/minigraph.py | 18 ++- .../tests/sample_output/interfaces | 153 ------------------ src/sonic-config-engine/tests/test_cfggen.py | 7 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 8 files changed, 40 insertions(+), 189 deletions(-) diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index aa4e5b7dae1d..9f3ba3cb078d 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -22,6 +22,10 @@ supervisorctl start neighsyncd supervisorctl start swssconfig +supervisorctl start vlanmgrd + +supervisorctl start intfmgrd + # Start arp_update when VLAN exists VLAN=`sonic-cfggen -d -v 'VLAN.keys() | join(" ") if VLAN'` if [ "$VLAN" != "" ]; then diff --git a/dockers/docker-orchagent/supervisord.conf b/dockers/docker-orchagent/supervisord.conf index 09850b13d4a1..95e92be622bb 100644 --- a/dockers/docker-orchagent/supervisord.conf +++ b/dockers/docker-orchagent/supervisord.conf @@ -67,3 +67,19 @@ autostart=false autorestart=true stdout_logfile=syslog stderr_logfile=syslog + +[program:vlanmgrd] +command=/usr/bin/vlanmgrd +priority=9 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:intfmgrd] +command=/usr/bin/intfmgrd +priority=10 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 2fdd04804ca4..a06ff91518a7 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -55,19 +55,6 @@ iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} # {% endfor %} -{% if VLAN %} -# "|| true" is added to suppress the error when interface is already a member of VLAN -{% for vlan in VLAN.keys()|sort %} -{% for member in VLAN[vlan]['members'] %} -allow-hotplug {{ member }} -iface {{ member }} inet manual - pre-up ifconfig {{ member }} up mtu 9100 - post-up brctl addif {{ vlan }} {{ member }} || true - post-down ifconfig {{ member }} down -# -{% endfor %} -{% endfor %} -{% endif %} {% if PORTCHANNEL %} # "|| true" is added to suppress the error when interface is already a member of LAG # "ip link show | grep -q master" is added to ensure interface is enslaved @@ -83,20 +70,6 @@ iface {{ member }} inet manual {% endfor %} {% endif %} {% endblock front_panel_interfaces %} -{% block vlan_interfaces %} -{% if VLAN_INTERFACE %} -# Vlan interfaces -{% for (name, prefix) in VLAN_INTERFACE.keys() | sort %} -auto {{ name }} -iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static - bridge_ports none - hwaddress ether {{ hwaddr }} - address {{ prefix | ip }} - netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} -{% endfor %} -# -{% endif %} -{% endblock vlan_interfaces %} {% block pc_interfaces %} {% if PORTCHANNEL_INTERFACE %} # Portchannel interfaces diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index c51b24afed08..826997063349 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -24,7 +24,7 @@ ns1 = "http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution" ns2 = "Microsoft.Search.Autopilot.NetMux" ns3 = "http://www.w3.org/2001/XMLSchema-instance" - +KEY_SEPARATOR = '|' class minigraph_encoder(json.JSONEncoder): def default(self, obj): @@ -86,7 +86,7 @@ def parse_png(png, hname): if child.tag == str(QName(ns, "Devices")): for device in child.findall(str(QName(ns, "Device"))): (lo_prefix, mgmt_prefix, name, hwsku, d_type) = parse_device(device) - device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku } + device_data = {'lo_addr': lo_prefix, 'type': d_type, 'mgmt_addr': mgmt_prefix, 'hwsku': hwsku } devices[name] = device_data if child.tag == str(QName(ns, "DeviceInterfaceLinks")): @@ -153,6 +153,7 @@ def parse_dpg(dpg, hname): vlanintfs = child.find(str(QName(ns, "VlanInterfaces"))) vlan_intfs = [] vlans = {} + vlan_members = {} for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))): vintfname = vintf.find(str(QName(ns, "Name"))).text vlanid = vintf.find(str(QName(ns, "VlanID"))).text @@ -160,7 +161,10 @@ def parse_dpg(dpg, hname): vmbr_list = vintfmbr.split(';') for i, member in enumerate(vmbr_list): vmbr_list[i] = port_alias_map.get(member, member) - vlan_attributes = {'members': vmbr_list, 'vlanid': vlanid} + sonic_vlan_member_name = "Vlan%s%s%s" % (vlanid, KEY_SEPARATOR, vmbr_list[i]) + vlan_members[sonic_vlan_member_name] = {'tagging_mode': 'untagged'} + + vlan_attributes = {'vlanid': vlanid} # If this VLAN requires a DHCP relay agent, it will contain a element # containing a list of DHCP server IPs @@ -194,8 +198,8 @@ def parse_dpg(dpg, hname): break; if acl_intfs: acls[aclname] = { 'policy_desc': aclname, 'ports': acl_intfs, 'type': 'MIRROR' if is_mirror else 'L3'} - return intfs, lo_intfs, mgmt_intf, vlans, pcs, acls - return None, None, None, None, None, None + return intfs, lo_intfs, mgmt_intf, vlans, vlan_members, pcs, acls + return None, None, None, None, None, None, None def parse_cpg(cpg, hname): @@ -318,6 +322,7 @@ def parse_xml(filename, platform=None, port_config_file=None): vlan_intfs = None pc_intfs = None vlans = None + vlan_members = None pcs = None mgmt_intf = None lo_intf = None @@ -345,7 +350,7 @@ def parse_xml(filename, platform=None, port_config_file=None): port_alias_map.update(alias_map) for child in root: if child.tag == str(QName(ns, "DpgDec")): - (intfs, lo_intfs, mgmt_intf, vlans, pcs, acls) = parse_dpg(child, hostname) + (intfs, lo_intfs, mgmt_intf, vlans, vlan_members, pcs, acls) = parse_dpg(child, hostname) elif child.tag == str(QName(ns, "CpgDec")): (bgp_sessions, bgp_asn, bgp_peers_with_range) = parse_cpg(child, hostname) elif child.tag == str(QName(ns, "PngDec")): @@ -393,6 +398,7 @@ def parse_xml(filename, platform=None, port_config_file=None): results['PORT'] = ports results['PORTCHANNEL'] = pcs results['VLAN'] = vlans + results['VLAN_MEMBER'] = vlan_members results['DEVICE_NEIGHBOR'] = neighbors results['DEVICE_NEIGHBOR_METADATA'] = { key:devices[key] for key in devices if key != hostname } diff --git a/src/sonic-config-engine/tests/sample_output/interfaces b/src/sonic-config-engine/tests/sample_output/interfaces index 89a23471a7ee..2d54e6dabb3d 100644 --- a/src/sonic-config-engine/tests/sample_output/interfaces +++ b/src/sonic-config-engine/tests/sample_output/interfaces @@ -39,151 +39,6 @@ iface eth0 inet6 static down ip -6 rule delete from 2603:10e2:0:2902::8/128 table default # # The switch front panel interfaces -# "|| true" is added to suppress the error when interface is already a member of VLAN -allow-hotplug fortyGigE0/4 -iface fortyGigE0/4 inet manual - pre-up ifconfig fortyGigE0/4 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/4 || true - post-down ifconfig fortyGigE0/4 down -# -allow-hotplug fortyGigE0/8 -iface fortyGigE0/8 inet manual - pre-up ifconfig fortyGigE0/8 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/8 || true - post-down ifconfig fortyGigE0/8 down -# -allow-hotplug fortyGigE0/12 -iface fortyGigE0/12 inet manual - pre-up ifconfig fortyGigE0/12 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/12 || true - post-down ifconfig fortyGigE0/12 down -# -allow-hotplug fortyGigE0/16 -iface fortyGigE0/16 inet manual - pre-up ifconfig fortyGigE0/16 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/16 || true - post-down ifconfig fortyGigE0/16 down -# -allow-hotplug fortyGigE0/20 -iface fortyGigE0/20 inet manual - pre-up ifconfig fortyGigE0/20 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/20 || true - post-down ifconfig fortyGigE0/20 down -# -allow-hotplug fortyGigE0/24 -iface fortyGigE0/24 inet manual - pre-up ifconfig fortyGigE0/24 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/24 || true - post-down ifconfig fortyGigE0/24 down -# -allow-hotplug fortyGigE0/28 -iface fortyGigE0/28 inet manual - pre-up ifconfig fortyGigE0/28 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/28 || true - post-down ifconfig fortyGigE0/28 down -# -allow-hotplug fortyGigE0/32 -iface fortyGigE0/32 inet manual - pre-up ifconfig fortyGigE0/32 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/32 || true - post-down ifconfig fortyGigE0/32 down -# -allow-hotplug fortyGigE0/36 -iface fortyGigE0/36 inet manual - pre-up ifconfig fortyGigE0/36 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/36 || true - post-down ifconfig fortyGigE0/36 down -# -allow-hotplug fortyGigE0/40 -iface fortyGigE0/40 inet manual - pre-up ifconfig fortyGigE0/40 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/40 || true - post-down ifconfig fortyGigE0/40 down -# -allow-hotplug fortyGigE0/44 -iface fortyGigE0/44 inet manual - pre-up ifconfig fortyGigE0/44 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/44 || true - post-down ifconfig fortyGigE0/44 down -# -allow-hotplug fortyGigE0/48 -iface fortyGigE0/48 inet manual - pre-up ifconfig fortyGigE0/48 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/48 || true - post-down ifconfig fortyGigE0/48 down -# -allow-hotplug fortyGigE0/52 -iface fortyGigE0/52 inet manual - pre-up ifconfig fortyGigE0/52 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/52 || true - post-down ifconfig fortyGigE0/52 down -# -allow-hotplug fortyGigE0/56 -iface fortyGigE0/56 inet manual - pre-up ifconfig fortyGigE0/56 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/56 || true - post-down ifconfig fortyGigE0/56 down -# -allow-hotplug fortyGigE0/60 -iface fortyGigE0/60 inet manual - pre-up ifconfig fortyGigE0/60 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/60 || true - post-down ifconfig fortyGigE0/60 down -# -allow-hotplug fortyGigE0/64 -iface fortyGigE0/64 inet manual - pre-up ifconfig fortyGigE0/64 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/64 || true - post-down ifconfig fortyGigE0/64 down -# -allow-hotplug fortyGigE0/68 -iface fortyGigE0/68 inet manual - pre-up ifconfig fortyGigE0/68 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/68 || true - post-down ifconfig fortyGigE0/68 down -# -allow-hotplug fortyGigE0/72 -iface fortyGigE0/72 inet manual - pre-up ifconfig fortyGigE0/72 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/72 || true - post-down ifconfig fortyGigE0/72 down -# -allow-hotplug fortyGigE0/76 -iface fortyGigE0/76 inet manual - pre-up ifconfig fortyGigE0/76 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/76 || true - post-down ifconfig fortyGigE0/76 down -# -allow-hotplug fortyGigE0/80 -iface fortyGigE0/80 inet manual - pre-up ifconfig fortyGigE0/80 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/80 || true - post-down ifconfig fortyGigE0/80 down -# -allow-hotplug fortyGigE0/84 -iface fortyGigE0/84 inet manual - pre-up ifconfig fortyGigE0/84 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/84 || true - post-down ifconfig fortyGigE0/84 down -# -allow-hotplug fortyGigE0/88 -iface fortyGigE0/88 inet manual - pre-up ifconfig fortyGigE0/88 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/88 || true - post-down ifconfig fortyGigE0/88 down -# -allow-hotplug fortyGigE0/92 -iface fortyGigE0/92 inet manual - pre-up ifconfig fortyGigE0/92 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/92 || true - post-down ifconfig fortyGigE0/92 down -# -allow-hotplug fortyGigE0/96 -iface fortyGigE0/96 inet manual - pre-up ifconfig fortyGigE0/96 up mtu 9100 - post-up brctl addif Vlan1000 fortyGigE0/96 || true - post-down ifconfig fortyGigE0/96 down -# # "|| true" is added to suppress the error when interface is already a member of LAG # "ip link show | grep -q master" is added to ensure interface is enslaved allow-hotplug fortyGigE0/112 @@ -210,14 +65,6 @@ iface fortyGigE0/124 inet manual post-up ip link show fortyGigE0/124 | grep -q master && ifconfig fortyGigE0/124 up post-down ifconfig fortyGigE0/124 down # -# Vlan interfaces -auto Vlan1000 -iface Vlan1000 inet static - bridge_ports none - hwaddress ether e4:1d:2d:a5:f3:ad - address 192.168.0.1 - netmask 255.255.255.224 -# # Portchannel interfaces allow-hotplug PortChannel01 iface PortChannel01 inet static diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 31663077c434..47cc006f4662 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -88,7 +88,12 @@ def test_minigraph_interfaces(self): def test_minigraph_vlans(self): argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v VLAN' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'Vlan1000': {'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'members': ['Ethernet8'], 'vlanid': '1000'}}") + self.assertEqual(output.strip(), "{'Vlan1000': {'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'vlanid': '1000'}}") + + def test_minigraph_vlan_members(self): + argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v VLAN_MEMBER' + output = self.run_script(argument) + self.assertEqual(output.strip(), "{'Vlan1000|Ethernet8': {'tagging_mode': 'untagged'}}") def test_minigraph_vlan_interfaces(self): argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v "VLAN_INTERFACE.keys()"' diff --git a/src/sonic-swss b/src/sonic-swss index f90a4e1ef369..6e845042c1d9 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit f90a4e1ef369491b84a048cbf234f4cd3442d552 +Subproject commit 6e845042c1d9097bfe713a32dab7b414527962bf diff --git a/src/sonic-swss-common b/src/sonic-swss-common index a6f74b67a580..adf7d4cb3c22 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit a6f74b67a58074439d8f3dbf84fa8ecc0a2e06a6 +Subproject commit adf7d4cb3c22061bf781ef6ce7b79964ce505730 From 0e618033019ef6e956c9e980375c9a9dee55015e Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 6 Nov 2017 07:39:25 -0800 Subject: [PATCH 0899/1011] [swss]: update swss submodule (#1119) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 6e845042c1d9..8fc09d04a145 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 6e845042c1d9097bfe713a32dab7b414527962bf +Subproject commit 8fc09d04a14529dc83cca454536b9c6a2a1bdf38 From 8d3691e811d820fcc3a98eda7850a44fa412c743 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 6 Nov 2017 12:19:42 -0800 Subject: [PATCH 0900/1011] [sonic-platform-daemons]: Update submodule (#1120) --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index d68c286ba7c9..d1df4717627a 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit d68c286ba7c984c98ebfafc2bb5fe24905659e5f +Subproject commit d1df4717627acf9421861545b71e411acf3c5f32 From 7540893471095a07f6656411139687835c8f7726 Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Mon, 6 Nov 2017 16:44:02 -0800 Subject: [PATCH 0901/1011] Submodule update for sonic-swss (#1123) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 8fc09d04a145..b641aeeac349 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 8fc09d04a14529dc83cca454536b9c6a2a1bdf38 +Subproject commit b641aeeac349462dd3e3e370bfc55f16602c937f From 28eb62fcff1a5147012bd4eb5af69df931290380 Mon Sep 17 00:00:00 2001 From: YonatanPitz Date: Tue, 7 Nov 2017 08:45:50 +0200 Subject: [PATCH 0902/1011] [saip4]: New p4 platform based on SAI behavioral model software switch (#1117) * merged new p4 platform from 1.0.3 * reverted SAI-P4-BM to SAI1.0 * changed port_config.ini from alias to name. changed tenjin makefile to https * updated SAI-P4-BM commit --- .gitmodules | 12 +++---- platform/p4/SAI-P4-BM | 1 + platform/p4/docker-sonic-p4.mk | 12 +++---- platform/p4/docker-sonic-p4/Dockerfile.j2 | 1 + platform/p4/docker-sonic-p4/port_config.ini | 38 ++++++++++++++++++--- platform/p4/docker-sonic-p4/rsyslog.conf | 2 ++ platform/p4/docker-sonic-p4/run_bm.sh | 23 +++++++++++++ platform/p4/docker-sonic-p4/startup.sh | 12 +++---- platform/p4/p4-bmv.mk | 6 ++-- platform/p4/p4-bmv/behavioral-model | 1 - platform/p4/p4-hlir.mk | 4 +++ platform/p4/p4-hlir/p4-hlir-v1.1 | 1 + platform/p4/p4-switch.mk | 12 +++---- platform/p4/p4-switch/Makefile | 17 --------- platform/p4/p4-switch/switch | 1 - platform/p4/p4c-bm.mk | 4 +-- platform/p4/rules.mk | 8 +++-- platform/p4/tenjin/Makefile | 2 +- 18 files changed, 100 insertions(+), 57 deletions(-) create mode 160000 platform/p4/SAI-P4-BM create mode 100755 platform/p4/docker-sonic-p4/run_bm.sh delete mode 160000 platform/p4/p4-bmv/behavioral-model create mode 160000 platform/p4/p4-hlir/p4-hlir-v1.1 delete mode 100644 platform/p4/p4-switch/Makefile delete mode 160000 platform/p4/p4-switch/switch diff --git a/.gitmodules b/.gitmodules index cc2b5b416028..26763fb16012 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,12 +10,6 @@ [submodule "sonic-swss"] path = src/sonic-swss url = https://github.com/Azure/sonic-swss -[submodule "src/p4-switch/switch"] - path = platform/p4/p4-switch/switch - url = https://github.com/krambn/switch -[submodule "src/p4-bmv2/behavioral-model"] - path = platform/p4/p4-bmv/behavioral-model - url = https://github.com/krambn/behavioral-model [submodule "src/p4c-bm/p4c-bm"] path = platform/p4/p4c-bm/p4c-bm url = https://github.com/krambn/p4c-bm @@ -68,3 +62,9 @@ [submodule "src/sonic-frr/frr"] path = src/sonic-frr/frr url = https://github.com/FRRouting/frr.git +[submodule "platform/p4/p4-hlir/p4-hlir-v1.1"] + path = platform/p4/p4-hlir/p4-hlir-v1.1 + url = https://github.com/p4lang/p4-hlir.git +[submodule "platform/p4/SAI-P4-BM"] + path = platform/p4/SAI-P4-BM + url = https://github.com/Mellanox/SAI-P4-BM.git diff --git a/platform/p4/SAI-P4-BM b/platform/p4/SAI-P4-BM new file mode 160000 index 000000000000..c25b5aecabbb --- /dev/null +++ b/platform/p4/SAI-P4-BM @@ -0,0 +1 @@ +Subproject commit c25b5aecabbb09270dc805459434ee396792ccb3 diff --git a/platform/p4/docker-sonic-p4.mk b/platform/p4/docker-sonic-p4.mk index a23284e50374..b5a63773fbbe 100644 --- a/platform/p4/docker-sonic-p4.mk +++ b/platform/p4/docker-sonic-p4.mk @@ -4,13 +4,13 @@ DOCKER_SONIC_P4 = docker-sonic-p4.gz $(DOCKER_SONIC_P4)_PATH = $(PLATFORM_PATH)/docker-sonic-p4 $(DOCKER_SONIC_P4)_DEPENDS += $(SWSS) $(SYNCD) $(P4_SWITCH) $(REDIS_SERVER) $(REDIS_TOOLS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) -ifeq ($(ROUTING_STACK), quagga) +# ifeq ($(ROUTING_STACK), quagga) $(DOCKER_SONIC_P4)_DEPENDS += $(QUAGGA) -else ifeq ($(ROUTING_STACK), frr) -$(DOCKER_SONIC_P4)_DEPENDS += $(FRR) -else -$(DOCKER_SONIC_P4)_DEPENDS += $(GOBGP) -endif +# else ifeq ($(ROUTING_STACK), frr) +# $(DOCKER_SONIC_P4)_DEPENDS += $(FRR) +# else +# $(DOCKER_SONIC_P4)_DEPENDS += $(GOBGP) +# endif $(DOCKER_SONIC_P4)_LOAD_DOCKERS += $(DOCKER_BASE) SONIC_DOCKER_IMAGES += $(DOCKER_SONIC_P4) diff --git a/platform/p4/docker-sonic-p4/Dockerfile.j2 b/platform/p4/docker-sonic-p4/Dockerfile.j2 index 1b8d1746b2bb..debb89de9c14 100644 --- a/platform/p4/docker-sonic-p4/Dockerfile.j2 +++ b/platform/p4/docker-sonic-p4/Dockerfile.j2 @@ -20,6 +20,7 @@ debs/{{ deb }}{{' '}} ADD port_config.ini /port_config.ini ADD startup.sh /scripts/startup.sh +ADD run_bm.sh /scripts/run_bm.sh ADD rsyslog.conf /etc/rsyslog.conf diff --git a/platform/p4/docker-sonic-p4/port_config.ini b/platform/p4/docker-sonic-p4/port_config.ini index 574f8f976ef9..2a88c4a7235b 100644 --- a/platform/p4/docker-sonic-p4/port_config.ini +++ b/platform/p4/docker-sonic-p4/port_config.ini @@ -1,5 +1,33 @@ -# alias lanes -Ethernet0 1 -Ethernet1 2 -Ethernet2 3 -Ethernet3 4 +# name lanes +Ethernet0 0 +Ethernet1 1 +Ethernet2 2 +Ethernet3 3 +Ethernet4 4 +Ethernet5 5 +Ethernet6 6 +Ethernet7 7 +Ethernet8 8 +Ethernet9 9 +Ethernet10 10 +Ethernet11 11 +Ethernet12 12 +Ethernet13 13 +Ethernet14 14 +Ethernet15 15 +Ethernet16 16 +Ethernet17 17 +Ethernet18 18 +Ethernet19 19 +Ethernet20 20 +Ethernet21 21 +Ethernet22 22 +Ethernet23 23 +Ethernet24 24 +Ethernet25 25 +Ethernet26 26 +Ethernet27 27 +Ethernet28 28 +Ethernet29 29 +Ethernet30 30 +Ethernet31 31 \ No newline at end of file diff --git a/platform/p4/docker-sonic-p4/rsyslog.conf b/platform/p4/docker-sonic-p4/rsyslog.conf index 3480e18f9998..9afd889f500b 100644 --- a/platform/p4/docker-sonic-p4/rsyslog.conf +++ b/platform/p4/docker-sonic-p4/rsyslog.conf @@ -31,6 +31,8 @@ $ModLoad imuxsock # provides support for local system logging ########################### #Set remote syslog server *.* @172.17.0.1:514 +#Set local syslog +#*.* /var/log/messages # # Use traditional timestamp format. diff --git a/platform/p4/docker-sonic-p4/run_bm.sh b/platform/p4/docker-sonic-p4/run_bm.sh new file mode 100755 index 000000000000..66cea4f5d5cf --- /dev/null +++ b/platform/p4/docker-sonic-p4/run_bm.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# handler() +# { + # kill -s INT $ROUTER_PID + # kill -s INT $BRIDGE_PID +# } + +set -m +ip netns exec sw_net simple_switch -i 0@router_port1 -i 250@router_cpu_port --thrift-port 9091 --log-file /tmp/router_log --log-flush --notifications-addr ipc:///tmp/bmv2-router-notifications.ipc /usr/share/p4-sai-bm/sai_router.json & +export ROUTER_PID=$! +ip netns exec sw_net simple_switch -i 0@sw_port0 -i 1@sw_port1 -i 2@sw_port2 -i 3@sw_port3 -i 4@sw_port4 -i 5@sw_port5 -i 6@sw_port6 -i 7@sw_port7 -i 7@sw_port7 -i 8@sw_port8 -i 9@sw_port9 -i 10@sw_port10 -i 11@sw_port11 -i 12@sw_port12 -i 13@sw_port13 -i 14@sw_port14 -i 15@sw_port15 -i 16@sw_port16 -i 17@sw_port17 -i 18@sw_port18 -i 19@sw_port19 -i 20@sw_port20 -i 21@sw_port21 -i 22@sw_port22 -i 23@sw_port23 -i 24@sw_port24 -i 25@sw_port25 -i 26@sw_port26 -i 27@sw_port27 -i 28@sw_port28 -i 29@sw_port29 -i 30@sw_port30 -i 31@sw_port31 -i 250@cpu_port -i 251@router_port0 --log-file /tmp/bridge_log --log-flush /usr/share/p4-sai-bm/sai_bridge.json & +export BRIDGE_PID=$! +sleep 10 +simple_switch_CLI --pre SimplePreLAG < /usr/share/p4-sai-bm/bridge_default_config.txt +simple_switch_CLI < /usr/share/p4-sai-bm/bridge_default_config_mirror.txt +simple_switch_CLI --pre SimplePreLAG --thrift-port 9091 < /usr/share/p4-sai-bm/router_default_config.txt +simple_switch_CLI --thrift-port 9091 < /usr/share/p4-sai-bm/router_default_config_mirror.txt + +# echo "router and bridge are running send SIGINT to close" + +# trap handler INT +# sleep inf +# sudo kill -s SIGINT 3319 diff --git a/platform/p4/docker-sonic-p4/startup.sh b/platform/p4/docker-sonic-p4/startup.sh index 18cd4716580b..5880d431674c 100755 --- a/platform/p4/docker-sonic-p4/startup.sh +++ b/platform/p4/docker-sonic-p4/startup.sh @@ -8,16 +8,16 @@ rm -f /var/run/rsyslogd.pid service rsyslog start echo "Start redis server" -service redis-server start +service redis-server start & +sleep 3 -echo "Veth setup" -/usr/share/bmpd/tools/veth_setup.sh > /tmp/veth_setup.log 2>&1 +redis-cli flushall -echo "Disable IPv6" -/usr/share/bmpd/tools/veth_disable_ipv6.sh > /tmp/veth_disable.log 2>&1 +echo "Veth setup" +veth_setup.sh > /tmp/veth_setup.log 2>&1 echo "Start BMV2" -/run_bm.sh > /tmp/run_bm.log 2>&1 & +/scripts/run_bm.sh > /tmp/run_bm.log 2>&1 & sleep 15 redis-cli -n 1 set LOGLEVEL DEBUG diff --git a/platform/p4/p4-bmv.mk b/platform/p4/p4-bmv.mk index 6fe00d189eb7..affb0d5ac824 100644 --- a/platform/p4/p4-bmv.mk +++ b/platform/p4/p4-bmv.mk @@ -1,7 +1,7 @@ # p4 bmv package -P4_BMV = p4-bmv2_1.0.0_amd64.deb -$(P4_BMV)_DEPENDS += $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) +P4_BMV = sai-p4-bm_1.0.0_amd64.deb +$(P4_BMV)_DEPENDS += $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) $(P4C_BM) $(P4_BMV)_RDEPENDS += $(LIBTHRIFT) $(PYTHON_THRIFT) $(THRIFT_COMPILER) -$(P4_BMV)_SRC_PATH = $(PLATFORM_PATH)/p4-bmv/behavioral-model +$(P4_BMV)_SRC_PATH = $(PLATFORM_PATH)/SAI-P4-BM/p4-switch SONIC_DPKG_DEBS += $(P4_BMV) diff --git a/platform/p4/p4-bmv/behavioral-model b/platform/p4/p4-bmv/behavioral-model deleted file mode 160000 index a6ccf267bc9c..000000000000 --- a/platform/p4/p4-bmv/behavioral-model +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a6ccf267bc9c5c31fd40fe5841893e38e03abeb4 diff --git a/platform/p4/p4-hlir.mk b/platform/p4/p4-hlir.mk index 2873275983a9..61307c7ff79a 100644 --- a/platform/p4/p4-hlir.mk +++ b/platform/p4/p4-hlir.mk @@ -1,5 +1,9 @@ # p4 bmv package +P4_HLIR_V1_1 = python-p4-hlir-v1-1_1.1.7-1_all.deb +$(P4_HLIR_V1_1)_SRC_PATH = $(PLATFORM_PATH)/p4-hlir/p4-hlir-v1.1 +SONIC_PYTHON_STDEB_DEBS += $(P4_HLIR_V1_1) + P4_HLIR = python-p4-hlir_0.9.36-1_all.deb $(P4_HLIR)_SRC_PATH = $(PLATFORM_PATH)/p4-hlir/p4-hlir SONIC_PYTHON_STDEB_DEBS += $(P4_HLIR) diff --git a/platform/p4/p4-hlir/p4-hlir-v1.1 b/platform/p4/p4-hlir/p4-hlir-v1.1 new file mode 160000 index 000000000000..fdee55e2567f --- /dev/null +++ b/platform/p4/p4-hlir/p4-hlir-v1.1 @@ -0,0 +1 @@ +Subproject commit fdee55e2567fe65463f328d70558b5079894b420 diff --git a/platform/p4/p4-switch.mk b/platform/p4/p4-switch.mk index 6fc07f908779..fb092fa2c5f3 100644 --- a/platform/p4/p4-switch.mk +++ b/platform/p4/p4-switch.mk @@ -1,7 +1,7 @@ -# p4 switch package +# p4 sai adapter package -P4_SWITCH = p4-switch_1.0.0_amd64.deb -$(P4_SWITCH)_DEPENDS += $(P4C_BM) $(P4_BMV) -$(P4_SWITCH)_RDEPENDS += $(P4C_BM) $(P4_BMV) -$(P4_SWITCH)_SRC_PATH = $(PLATFORM_PATH)/p4-switch -SONIC_MAKE_DEBS += $(P4_SWITCH) +P4_SWITCH = p4-sai-adapter_0.1-0_amd64.deb +$(P4_SWITCH)_DEPENDS += $(LIBTHRIFT_DEV) $(PYTHON_THRIFT) $(THRIFT_COMPILER) $(P4_BMV) +$(P4_SWITCH)_RDEPENDS += $(LIBTHRIFT) $(PYTHON_THRIFT) $(THRIFT_COMPILER) $(P4_BMV) +$(P4_SWITCH)_SRC_PATH = $(PLATFORM_PATH)/SAI-P4-BM/sai_adapter +SONIC_DPKG_DEBS += $(P4_SWITCH) diff --git a/platform/p4/p4-switch/Makefile b/platform/p4/p4-switch/Makefile deleted file mode 100644 index 57f6a05999a1..000000000000 --- a/platform/p4/p4-switch/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -SHELL = /bin/bash -.ONESHELL: - -MAIN_TARGET = p4-switch_1.0.0_amd64.deb - -$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : - pushd switch - - mkdir -p p4-build/bmv2/switch - mkdir -p p4-build/bmv2/pd_thrift_gen - - ./autogen.sh - dpkg-buildpackage -us -uc -b -j4 - - popd - - mv $* $(DEST)/ diff --git a/platform/p4/p4-switch/switch b/platform/p4/p4-switch/switch deleted file mode 160000 index e934752f356d..000000000000 --- a/platform/p4/p4-switch/switch +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e934752f356d3ad48cbec99067f47c83795ddcec diff --git a/platform/p4/p4c-bm.mk b/platform/p4/p4c-bm.mk index f51595772c3a..1982ee359212 100644 --- a/platform/p4/p4c-bm.mk +++ b/platform/p4/p4c-bm.mk @@ -2,6 +2,6 @@ P4C_BM = python-p4c-bm_1.0.0-5415c416-1_all.deb $(P4C_BM)_SRC_PATH = $(PLATFORM_PATH)/p4c-bm/p4c-bm -$(P4C_BM)_DEPENDS += $(TENJIN) $(P4_HLIR) -$(P4C_BM)_RDEPENDS += $(TENJIN) $(P4_HLIR) +$(P4C_BM)_DEPENDS += $(TENJIN) $(P4_HLIR) $(P4_HLIR_V1_1) +$(P4C_BM)_RDEPENDS += $(TENJIN) $(P4_HLIR) $(P4_HLIR_V1_1) SONIC_PYTHON_STDEB_DEBS += $(P4C_BM) diff --git a/platform/p4/rules.mk b/platform/p4/rules.mk index 408a58041f56..20def91333c6 100644 --- a/platform/p4/rules.mk +++ b/platform/p4/rules.mk @@ -1,8 +1,10 @@ -include $(PLATFORM_PATH)/p4-switch.mk -include $(PLATFORM_PATH)/p4-bmv.mk +# include $(PLATFORM_PATH)/p4-softswitch.mk +include $(PLATFORM_PATH)/tenjin.mk include $(PLATFORM_PATH)/p4-hlir.mk include $(PLATFORM_PATH)/p4c-bm.mk -include $(PLATFORM_PATH)/tenjin.mk +# include $(PLATFORM_PATH)/p4-sai-bm.mk +include $(PLATFORM_PATH)/p4-bmv.mk +include $(PLATFORM_PATH)/p4-switch.mk include $(PLATFORM_PATH)/docker-sonic-p4.mk SONIC_ALL += $(DOCKER_SONIC_P4) diff --git a/platform/p4/tenjin/Makefile b/platform/p4/tenjin/Makefile index 3f36866fe0de..83b27d390abc 100644 --- a/platform/p4/tenjin/Makefile +++ b/platform/p4/tenjin/Makefile @@ -9,7 +9,7 @@ MAIN_TARGET = python-tenjin_$(TENJIN_VERSION_FULL)_all.deb $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : rm -rf Tenjin-$(TENJIN_VERSION) - wget -nc http://pypi.python.org/packages/source/T/Tenjin/Tenjin-$(TENJIN_VERSION).tar.gz + wget -nc https://pypi.python.org/packages/source/T/Tenjin/Tenjin-$(TENJIN_VERSION).tar.gz tar xzf Tenjin-$(TENJIN_VERSION).tar.gz pushd Tenjin-$(TENJIN_VERSION) From 1ce9b85e3cc02b2461778a66fc7d83bed13510be Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 6 Nov 2017 23:40:27 -0800 Subject: [PATCH 0903/1011] [init]: save the initial switch mac to config db (#1125) * [init]: save the initial switch mac to config db Save the initial switch mac to config db DEVICE_METADATA|localhost entry. * update sonic-swss submodule --- files/build_templates/swss.service.j2 | 1 + .../interfaces/interfaces-config.sh | 15 +------ files/image_config/platform/rc.local | 44 ++++++++++++++----- src/sonic-swss | 2 +- src/sonic-utilities | 2 +- 5 files changed, 37 insertions(+), 27 deletions(-) diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index 74fafb003767..ad52f395d0cf 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -18,6 +18,7 @@ ExecStartPre=/usr/bin/docker exec database redis-cli -n 0 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 1 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 2 FLUSHDB ExecStartPre=/usr/bin/docker exec database redis-cli -n 5 FLUSHDB +ExecStartPre=/usr/bin/docker exec database redis-cli -n 6 FLUSHDB {% if sonic_asic_platform == 'mellanox' %} TimeoutStartSec=3min diff --git a/files/image_config/interfaces/interfaces-config.sh b/files/image_config/interfaces/interfaces-config.sh index 28396774bfa1..06174790f04a 100755 --- a/files/image_config/interfaces/interfaces-config.sh +++ b/files/image_config/interfaces/interfaces-config.sh @@ -1,19 +1,6 @@ #!/bin/bash -SONIC_ASIC_TYPE=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type) -SYSTEM_MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') - -# Align last byte of MAC if necessary -if [ "$SONIC_ASIC_TYPE" == "mellanox" -o "$SONIC_ASIC_TYPE" == "centec" ]; then - last_byte=$(python -c "print '$SYSTEM_MAC_ADDRESS'[-2:]") - aligned_last_byte=$(python -c "print format(int(int('$last_byte', 16) & 0b11000000), '02x')") # put mask and take away the 0x prefix - SYSTEM_MAC_ADDRESS=$(python -c "print '$SYSTEM_MAC_ADDRESS'[:-2] + '$aligned_last_byte'") # put aligned byte into the end of MAC -fi - -sonic-cfggen -d -a '{"hwaddr":"'$SYSTEM_MAC_ADDRESS'"}' -t /usr/share/sonic/templates/interfaces.j2 > /etc/network/interfaces - -# Also store the system mac to configDB switch table. User configured switch_mac is not supported for now. -/usr/bin/docker exec database redis-cli -n 4 hset SWITCH\|SWITCH_ATTR switch_mac $SYSTEM_MAC_ADDRESS +sonic-cfggen -d -t /usr/share/sonic/templates/interfaces.j2 > /etc/network/interfaces [ -f /var/run/dhclient.eth0.pid ] && kill `cat /var/run/dhclient.eth0.pid` && rm -f /var/run/dhclient.eth0.pid diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index d3ecba7d8518..daeccfd5240d 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -43,6 +43,15 @@ firsttime_exit() exit 0 } +test_config() +{ + if [ -d /host/old_config ] && ( [ -f /host/old_config/minigraph.xml ] || [ -f /host/old_config/config_db.json ] ); then + return 0 + fi + + return 1 +} + # Given a string of tuples of the form field=value, extract the value for a field # In : $string, $field # Out: $value @@ -70,26 +79,39 @@ if [ -f /host/image-$sonic_version/platform/firsttime ]; then firsttime_exit fi + # setup initial switch mac + SONIC_ASIC_TYPE=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type) + SYSTEM_MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') + + # Align last byte of MAC if necessary + if [ "$SONIC_ASIC_TYPE" == "mellanox" -o "$SONIC_ASIC_TYPE" == "centec" ]; then + last_byte=$(python -c "print '$SYSTEM_MAC_ADDRESS'[-2:]") + aligned_last_byte=$(python -c "print format(int(int('$last_byte', 16) & 0b11000000), '02x')") # put mask and take away the 0x prefix + SYSTEM_MAC_ADDRESS=$(python -c "print '$SYSTEM_MAC_ADDRESS'[:-2] + '$aligned_last_byte'") # put aligned byte into the end of MAC + fi + + if [ -f /etc/sonic/init_cfg.json ]; then + sonic-cfggen -j /etc/sonic/init_cfg.json -a '{"DEVICE_METADATA":{"localhost": {"mac": "'$SYSTEM_MAC_ADDRESS'"}}}' --print-data > /etc/sonic/init_cfg.json + else + sonic-cfggen -a '{"DEVICE_METADATA":{"localhost": {"mac": "'$SYSTEM_MAC_ADDRESS'"}}}' --print-data > /etc/sonic/init_cfg.json + fi + # Try to take old configuration saved during installation - if [ -d /host/old_config ]; then + if test_config; then rm -f /host/old_config/sonic_version.yml mv -f /host/old_config/* /etc/sonic/ + if [ ! -f /etc/sonic/config_db.json ]; then + sonic-cfggen -m -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json + fi elif [ -f /host/minigraph.xml ]; then mv /host/minigraph.xml /etc/sonic/ # Combine information in minigraph and init_cfg.json to form initiate config DB dump file. # TODO: After moving all information from minigraph to DB, sample config DB dump should be provide - if [ -f /etc/sonic/init_cfg.json ]; then - sonic-cfggen -m -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json - else - sonic-cfggen -m --print-data > /etc/sonic/config_db.json - fi + sonic-cfggen -m -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json else + # Use default minigraph.xml cp /usr/share/sonic/device/$platform/minigraph.xml /etc/sonic/ - if [ -f /etc/sonic/init_cfg.json ]; then - sonic-cfggen -m -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json - else - sonic-cfggen -m --print-data > /etc/sonic/config_db.json - fi + sonic-cfggen -m -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json fi if [ -d /host/image-$sonic_version/platform/$platform ]; then diff --git a/src/sonic-swss b/src/sonic-swss index b641aeeac349..5da255c78cb5 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit b641aeeac349462dd3e3e370bfc55f16602c937f +Subproject commit 5da255c78cb5d02a49b0a5299764c325ed0bdc32 diff --git a/src/sonic-utilities b/src/sonic-utilities index 1d37c9c199b7..0a720caa0101 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 1d37c9c199b7934653f907095bf11e685889df23 +Subproject commit 0a720caa0101ebbd38309c97d4069e2545bc3259 From f7c39720f73b2eb2df290843cfecf3be911cb7ba Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Tue, 7 Nov 2017 14:51:07 -0800 Subject: [PATCH 0904/1011] Restart ntp after ntp-config (#1106) * Restart ntp after ntp-config * Remove ntp dependency to ntp-config --- files/image_config/ntp/ntp-config.service | 1 - files/image_config/ntp/ntp-config.sh | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/files/image_config/ntp/ntp-config.service b/files/image_config/ntp/ntp-config.service index 05e6211b9782..d41f1ba2ddca 100644 --- a/files/image_config/ntp/ntp-config.service +++ b/files/image_config/ntp/ntp-config.service @@ -1,6 +1,5 @@ [Unit] Description=Update NTP configuration -Before=ntp.service Requires=database.service After=database.service diff --git a/files/image_config/ntp/ntp-config.sh b/files/image_config/ntp/ntp-config.sh index 7c79a16c0ef3..601b7bd421f0 100755 --- a/files/image_config/ntp/ntp-config.sh +++ b/files/image_config/ntp/ntp-config.sh @@ -1,3 +1,5 @@ #!/bin/bash sonic-cfggen -d -t /usr/share/sonic/templates/ntp.conf.j2 >/etc/ntp.conf + +systemctl restart ntp From a9a37aab2378a311f2a22746546c7d118e25c93f Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 7 Nov 2017 14:52:20 -0800 Subject: [PATCH 0905/1011] [py-swsssdk]: Update sonic-py-swsssdk submodule (#1126) Include: [interface]: Extend the max data wait time to 60s Signed-off-by: Shu0T1an ChenG --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 294f5406e971..674fb107dfb8 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 294f5406e971396352b06c3b4954a2f80dd8ba34 +Subproject commit 674fb107dfb8e45b23a55e3e7be34e39d5630942 From cb009ba80710e8c475f3e4b5ecd7e9c01729e080 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 7 Nov 2017 15:19:47 -0800 Subject: [PATCH 0906/1011] [Broadcom]: Update Broadcom SAI package to 3.0.3.2-11 (#1127) Fix memory leak in multipath routing Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 5b66026f297f..015d85b24a5d 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-10_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-10_amd64.deb?sv=2015-04-05&sr=b&sig=tByZ7QDBsYlJ4UHbapnzqHYrbA8rD92%2FQXEpupITTmM%3D&se=2031-07-06T19%3A19%3A32Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-11_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-11_amd64.deb?sv=2015-04-05&sr=b&sig=sXvf3ejJ8npF9iPfkTIYUneN4N8wvHKo2V6A8YoTbhk%3D&se=2031-07-17T23%3A08%3A43Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-10_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-11_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-10_amd64.deb?sv=2015-04-05&sr=b&sig=T6U8sF%2BW8B%2FffBzPoUJ9peLcg2O9MunHBBKSu7SZOKo%3D&se=2031-07-06T19%3A19%3A52Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-11_amd64.deb?sv=2015-04-05&sr=b&sig=Q%2FSC7B0xDuhvHGL7GERoOw483nv6hkAQrDUaabS9JOs%3D&se=2031-07-17T23%3A09%3A08Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From c64d423fec2ab1e0aedd07591e9b4d0473ec3147 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 8 Nov 2017 18:50:22 +0200 Subject: [PATCH 0907/1011] [rc.local]: Fix init_cfg.json (#1129) If device MAC is added to init_cfg.json, it has to be done using intermediate file. We cannot redirect to same file while trying to read from it because it will be truncated first. Signed-off-by: marian-pritsak --- files/image_config/platform/rc.local | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index daeccfd5240d..f4dd9cb3ad78 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -91,7 +91,8 @@ if [ -f /host/image-$sonic_version/platform/firsttime ]; then fi if [ -f /etc/sonic/init_cfg.json ]; then - sonic-cfggen -j /etc/sonic/init_cfg.json -a '{"DEVICE_METADATA":{"localhost": {"mac": "'$SYSTEM_MAC_ADDRESS'"}}}' --print-data > /etc/sonic/init_cfg.json + sonic-cfggen -j /etc/sonic/init_cfg.json -a '{"DEVICE_METADATA":{"localhost": {"mac": "'$SYSTEM_MAC_ADDRESS'"}}}' --print-data > /tmp/init_cfg.json + mv /tmp/init_cfg.json /etc/sonic/init_cfg.json else sonic-cfggen -a '{"DEVICE_METADATA":{"localhost": {"mac": "'$SYSTEM_MAC_ADDRESS'"}}}' --print-data > /etc/sonic/init_cfg.json fi From 4e367c69849397fd4e6a36fa0be2e9b5ed565843 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 8 Nov 2017 15:09:19 -0800 Subject: [PATCH 0908/1011] [Arista7260cx3] update port_config.ini for Arista-7260CX3-D108C8 (#1130) - Port 18 and 20 are now in 50G breakout mode. --- .../Arista-7260CX3-D108C8/port_config.ini | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini index 541b197f6bb8..d67a4f1bc016 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-D108C8/port_config.ini @@ -33,10 +33,12 @@ Ethernet60 121,122 Ethernet16/1 16 Ethernet62 123,124 Ethernet16/3 16 Ethernet64 141,142 Ethernet17/1 17 Ethernet66 143,144 Ethernet17/3 17 -Ethernet68 133,134,135,136 Ethernet18/1 18 +Ethernet68 133,134 Ethernet18/1 18 +Ethernet70 135,136 Ethernet18/3 18 Ethernet72 197,198 Ethernet19/1 19 Ethernet74 199,200 Ethernet19/3 19 -Ethernet76 205,206,207,208 Ethernet20/1 20 +Ethernet76 205,206 Ethernet20/1 20 +Ethernet78 207,208 Ethernet20/3 20 Ethernet80 217,218 Ethernet21/1 21 Ethernet82 219,220 Ethernet21/3 21 Ethernet84 213,214 Ethernet22/1 22 From 8990dc73df7f1255bfa5113847d08720c1ab108e Mon Sep 17 00:00:00 2001 From: lguohan Date: Wed, 8 Nov 2017 21:57:47 -0800 Subject: [PATCH 0909/1011] [doc]: change build badge url to new build server (#1134) --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index bbae2e150b8e..dc0e34a61476 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -*master*: Broadcom: [![Broadcom](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) -Mellanox: [![Mellanox](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) -P4: [![P4](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/p4/job/buildimage-p4-all) -VS: [![VS](https://sonic-jenkins.westus.cloudapp.azure.com/job/vs/job/buildimage-vs-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/vs/job/buildimage-vs-all) - -*201709*: Cavium: [![Cavium](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) -Centec: [![Centec](https://sonic-jenkins.westus.cloudapp.azure.com/job/centec/job/buildimage-centec-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/centec/job/buildimage-centec-all/) -Nephos: [![Nephos](https://sonic-jenkins.westus.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all/) -Marvell: [![Marvell](https://sonic-jenkins.westus.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-all/badge/icon)](https://sonic-jenkins.westus.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-all/) +*master*: Broadcom: [![Broadcom](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) +Mellanox: [![Mellanox](https://sonic-jenkins.westus2.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) +P4: [![P4](https://sonic-jenkins.westus2.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/p4/job/buildimage-p4-all) +VS: [![VS](https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-all) + +*201709*: Cavium: [![Cavium](https://sonic-jenkins.westus2.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) +Centec: [![Centec](https://sonic-jenkins.westus2.cloudapp.azure.com/job/centec/job/buildimage-centec-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/centec/job/buildimage-centec-all/) +Nephos: [![Nephos](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all/) +Marvell: [![Marvell](https://sonic-jenkins.westus2.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-all/) # sonic-buildimage From 69b8d28e0929cb1f506135bdef4d18c8618ecfa6 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 9 Nov 2017 23:17:06 +0200 Subject: [PATCH 0910/1011] [mellanox]: Update SAI revision (#1135) Includes fixes for SAI 1.0.2 version Update SX-SDK to 4.2.6011 Update FW to 13.1530.0152 Signed-off-by: marian-pritsak --- platform/mellanox/fw.mk | 2 +- platform/mellanox/mlnx-sai.mk | 4 ++-- platform/mellanox/sdk.mk | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index 8c40d46d9182..201e5205daf7 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -1,6 +1,6 @@ # mellanox firmware -MLNX_FW_VERSION = 13.1400.0126 +MLNX_FW_VERSION = 13.1530.0152 MLNX_FW_FILE = fw-SPC-rel-$(subst .,_,$(MLNX_FW_VERSION))-EVB.mfa $(MLNX_FW_FILE)_URL = $(MLNX_SDK_BASE_URL)/$(MLNX_FW_FILE) SONIC_ONLINE_FILES += $(MLNX_FW_FILE) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index bba10132160d..80b6d893da38 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI -MLNX_SAI_VERSION = sonic1.9.1fixes-master -MLNX_SAI_REVISION = dc0e84b3762f847369524a917e271ceb2878b4d3 +MLNX_SAI_VERSION = SAIRel1.9.2-master +MLNX_SAI_REVISION = 16900748ee3c97bc5836ab3684ee05b8db6ec31b export MLNX_SAI_VERSION MLNX_SAI_REVISION diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index 7c517627c23d..ad34ba84e277 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,5 +1,5 @@ -MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/4ebc01e95b754c56da7f8b5fb45b82fbe661d05a/sdk -MLNX_SDK_VERSION = 4.2.5010 +MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/16900748ee3c97bc5836ab3684ee05b8db6ec31b/sdk +MLNX_SDK_VERSION = 4.2.6011 MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2) $(SX_ACL_RM) $(SX_COMPLIB) \ $(SX_EXAMPLES) $(SX_GEN_UTILS) $(SX_SCEW) $(SX_SDN_HAL) \ $(SXD_LIBS) $(TESTX) From a69b353630154935c02db0d287e1a760b2698167 Mon Sep 17 00:00:00 2001 From: Haiyang Zheng Date: Sat, 11 Nov 2017 05:54:31 +0800 Subject: [PATCH 0911/1011] [interfaces.j2] Get mtu value from config DB if provided (#1128) Signed-off-by: Haiyang Zheng --- files/image_config/interfaces/interfaces.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index a06ff91518a7..9298348d3fb8 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -50,7 +50,7 @@ iface eth0 inet dhcp {% for (name, prefix) in INTERFACE %} allow-hotplug {{ name }} iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static - mtu 9100 + mtu {{ PORT[name]['mtu'] if PORT[name]['mtu'] else 9100 }} address {{ prefix | ip }} netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} # @@ -76,7 +76,7 @@ iface {{ member }} inet manual {% for (name, prefix) in PORTCHANNEL_INTERFACE.keys() | sort %} allow-hotplug {{ name }} iface {{ name }} {{ 'inet' if prefix | ipv4 else 'inet6' }} static - mtu 9100 + mtu {{ PORTCHANNEL[name]['mtu'] if PORTCHANNEL[name]['mtu'] else 9100 }} address {{ prefix | ip }} netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }} # From 764cb913f1fd34cc1d837fb1852d3401b3f46f07 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 10 Nov 2017 15:47:38 -0800 Subject: [PATCH 0912/1011] [Arista7260cx3] Increase /var/log partition size to 4G (#1140) --- files/Aboot/boot0.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 8ea085bf5e8d..18d1ee126c00 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -130,7 +130,7 @@ platform_specific() { aboot_machine=arista_7260cx3_64 fi if [ "$platform" = "rook" ]; then - varlog_size=200 + varlog_size=4096 readprefdl -f /tmp/.system-prefdl -d > /mnt/flash/.system-prefdl fi From d7969dd4be42fbe71d91c43e516e48dc25ad773d Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 10 Nov 2017 16:51:47 -0800 Subject: [PATCH 0913/1011] [swss] update swss submodule head (#1141) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 5da255c78cb5..092f3a06e290 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 5da255c78cb5d02a49b0a5299764c325ed0bdc32 +Subproject commit 092f3a06e2900fb4cc0364648f6ea840de937b57 From 757ba00b5817ec84baa91cd36dcf096bcb961b50 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Sun, 12 Nov 2017 15:29:32 -0800 Subject: [PATCH 0914/1011] [utilities]: update sonic-utilities submodule (#1143) Signed-off-by: Qi Luo --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 0a720caa0101..e87bb97760a4 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 0a720caa0101ebbd38309c97d4069e2545bc3259 +Subproject commit e87bb97760a4cf069da51b2a0da732f7a40f3215 From f18ed0d35cc3042f438eff76cba7f45ea0b6d176 Mon Sep 17 00:00:00 2001 From: nikos-li <31227248+nikos-li@users.noreply.github.com> Date: Mon, 13 Nov 2017 09:39:10 -0800 Subject: [PATCH 0915/1011] [bgp]: Auto-completion, help (?), cmd navigation (up arrow) not working in vtysh on host system. (#1124) --- dockers/docker-fpm-frr/base_image_files/vtysh | 2 +- dockers/docker-fpm-quagga/base_image_files/vtysh | 2 +- src/sonic-quagga | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dockers/docker-fpm-frr/base_image_files/vtysh b/dockers/docker-fpm-frr/base_image_files/vtysh index 359101c06c61..18529b7522c7 100755 --- a/dockers/docker-fpm-frr/base_image_files/vtysh +++ b/dockers/docker-fpm-frr/base_image_files/vtysh @@ -1,2 +1,2 @@ #!/bin/bash -docker exec -i bgp vtysh "$@" +docker exec -it bgp vtysh "$@" diff --git a/dockers/docker-fpm-quagga/base_image_files/vtysh b/dockers/docker-fpm-quagga/base_image_files/vtysh index 359101c06c61..18529b7522c7 100755 --- a/dockers/docker-fpm-quagga/base_image_files/vtysh +++ b/dockers/docker-fpm-quagga/base_image_files/vtysh @@ -1,2 +1,2 @@ #!/bin/bash -docker exec -i bgp vtysh "$@" +docker exec -it bgp vtysh "$@" diff --git a/src/sonic-quagga b/src/sonic-quagga index b066bef0e8dc..59f7c8ed56fa 160000 --- a/src/sonic-quagga +++ b/src/sonic-quagga @@ -1 +1 @@ -Subproject commit b066bef0e8dcf23b8e1751652397c09e61ee4bdd +Subproject commit 59f7c8ed56fa1c9df2070596b25f5f019bdba8ca From cd4b11c8112a3761936b63db9be8b99b01685bd9 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 13 Nov 2017 10:07:09 -0800 Subject: [PATCH 0916/1011] [build]: add build badge for broadcom and mellanox on 201709 release (#1147) --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dc0e34a61476..5ba616c027e0 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,13 @@ Mellanox: [![Mellanox](https://sonic-jenkins.westus2.cloudapp.azure.com/job/mell P4: [![P4](https://sonic-jenkins.westus2.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/p4/job/buildimage-p4-all) VS: [![VS](https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-all) -*201709*: Cavium: [![Cavium](https://sonic-jenkins.westus2.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) +*201709*: +Broadcom: [![Broadcom](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-201709/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-201709/) +Cavium: [![Cavium](https://sonic-jenkins.westus2.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) Centec: [![Centec](https://sonic-jenkins.westus2.cloudapp.azure.com/job/centec/job/buildimage-centec-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/centec/job/buildimage-centec-all/) Nephos: [![Nephos](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all/) Marvell: [![Marvell](https://sonic-jenkins.westus2.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-all/) +Mellanox: [![Mellanox](https://sonic-jenkins.westus2.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-201709/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-201709/) # sonic-buildimage From bf1bb06e2ecfd46c280a7cc15ddfdf73cd3cc79a Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 13 Nov 2017 10:49:29 -0800 Subject: [PATCH 0917/1011] [swss]: update sonic-swss submodule (#1146) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 092f3a06e290..0be8b8b757e4 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 092f3a06e2900fb4cc0364648f6ea840de937b57 +Subproject commit 0be8b8b757e40ac9f66e8175a2f978a8cba312ac From aa09bdc2c264860ffd2a1cc13a9d0124b3f0fba4 Mon Sep 17 00:00:00 2001 From: Harish Venkatraman Date: Mon, 13 Nov 2017 11:30:16 -0800 Subject: [PATCH 0918/1011] [docker-orchagent]: ADD PFC Broadcom recommended MMU Settings (#1136) This commit adds new code to support PFC and broadcom recommended MMU setting for PFC feature. Verified by running checking the hardware setting after the switch was booted. Signed-off-by: Harish Venkatraman --- dockers/docker-orchagent/swssconfig.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index 3458ddae61e6..aee3ffaaa8cb 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -33,6 +33,8 @@ if [ "$HWSKU" == "Force10-S6000" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [ "$HWSKU" == "Force10-S6000-Q32" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " +elif [ "$HWSKU" == "Force10-S6100" ]; then + SWSSCONFIG_ARGS+="th.64ports.buffers.json th.64ports.qos.json " elif [ "$HWSKU" == "Arista-7050-QX32" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [[ "$HWSKU" == "ACS-MSN27"* ]]; then From 3e03df7a5e2cef4cbdf4d0b60d66737e02fbd331 Mon Sep 17 00:00:00 2001 From: wadelnn Date: Tue, 14 Nov 2017 04:33:59 +0800 Subject: [PATCH 0919/1011] Fixed sfputil show eeprom information is empty on SFP ports. (#1145) Signed-off-by: Wade He --- .../ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py | 2 +- .../ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py index 0bb52e88616a..076ecff4d42d 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/plugins/sfputil.py @@ -168,7 +168,7 @@ def port_end(self): @property def qsfp_ports(self): - return range(0, self.PORTS_IN_BLOCK + 1) + return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) @property def port_to_eeprom_mapping(self): diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py index 0b1ae8d3bc8e..78793beec69d 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/plugins/sfputil.py @@ -102,7 +102,7 @@ def port_end(self): @property def qsfp_ports(self): - return range(0, self.PORTS_IN_BLOCK + 1) + return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) @property def port_to_eeprom_mapping(self): From a6edef2fa52f5b7771cc5751cde1a190d96ffa50 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 13 Nov 2017 14:16:19 -0800 Subject: [PATCH 0920/1011] [docker-teamd]: Manage teamd and teamsyncd processes with supervisor (#1137) --- dockers/docker-teamd/Dockerfile.j2 | 7 +- dockers/docker-teamd/docker-teamd-init.sh | 43 +++++++++++++ dockers/docker-teamd/docker-teamd-start.sh | 9 +++ .../docker-teamd.supervisord.conf.j2 | 52 +++++++++++++++ dockers/docker-teamd/start.sh | 35 ---------- dockers/docker-teamd/teamd.sh | 27 ++------ .../docker-dhcp-relay.supervisord.conf | 9 ++- .../docker-teamd.supervisord.conf | 64 +++++++++++++++++++ .../tests/sample_output/wait_for_intf.sh | 28 ++++++++ src/sonic-config-engine/tests/test_j2files.py | 30 ++++++++- 10 files changed, 240 insertions(+), 64 deletions(-) create mode 100755 dockers/docker-teamd/docker-teamd-init.sh create mode 100755 dockers/docker-teamd/docker-teamd-start.sh create mode 100644 dockers/docker-teamd/docker-teamd.supervisord.conf.j2 delete mode 100755 dockers/docker-teamd/start.sh rename dockers/docker-teamd/supervisord.conf => src/sonic-config-engine/tests/sample_output/docker-dhcp-relay.supervisord.conf (58%) create mode 100644 src/sonic-config-engine/tests/sample_output/docker-teamd.supervisord.conf create mode 100644 src/sonic-config-engine/tests/sample_output/wait_for_intf.sh diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index f604433a6c3f..9fded5183c3c 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -22,11 +22,10 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} -COPY ["start.sh", "teamd.sh", "/usr/bin/"] -COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] -COPY ["teamd.j2", "/usr/share/sonic/templates/"] +COPY ["docker-teamd-init.sh", "docker-teamd-start.sh", "teamd.sh", "/usr/bin/"] +COPY ["docker-teamd.supervisord.conf.j2", "teamd.j2", "/usr/share/sonic/templates/"] RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -ENTRYPOINT ["/usr/bin/supervisord"] +ENTRYPOINT ["/usr/bin/docker-teamd-init.sh"] diff --git a/dockers/docker-teamd/docker-teamd-init.sh b/dockers/docker-teamd/docker-teamd-init.sh new file mode 100755 index 000000000000..a06ca4e8f890 --- /dev/null +++ b/dockers/docker-teamd/docker-teamd-init.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +TEAMD_CONF_PATH="/etc/teamd" + +rm -rf $TEAMD_CONF_PATH +mkdir -p $TEAMD_CONF_PATH + +SONIC_ASIC_TYPE=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type) +MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') + +# Align last byte +if [ "$SONIC_ASIC_TYPE" == "mellanox" -o "$SONIC_ASIC_TYPE" == "centec" ]; then + last_byte=$(python -c "print '$MAC_ADDRESS'[-2:]") + aligned_last_byte=$(python -c "print format(int(int('$last_byte', 16) & 0b11000000), '02x')") # put mask and take away the 0x prefix + MAC_ADDRESS=$(python -c "print '$MAC_ADDRESS'[:-2] + '$aligned_last_byte'") # put aligned byte into the end of MAC +fi + +for pc in `sonic-cfggen -d -v "PORTCHANNEL.keys() | join(' ') if PORTCHANNEL"`; do + sonic-cfggen -d -a '{"pc":"'$pc'","hwaddr":"'$MAC_ADDRESS'"}' -t /usr/share/sonic/templates/teamd.j2 > $TEAMD_CONF_PATH/$pc.conf + # bring down all member ports before starting teamd + for member in $(sonic-cfggen -d -v "PORTCHANNEL['$pc']['members'] | join(' ')" ); do + if [ -L /sys/class/net/$member ]; then + ip link set $member down + fi + done +done + +# Create a Python dictionary where the key is the Jinja2 variable name +# "lags" and the value is a list of dctionaries containing the name of +# the LAG and the path of the LAG config file. Then output this in +# JSON format, as we will pass it to sonic-cfggen as additional data +# below for generating the supervisord config file. +# Example output: {"lags": [{"name": "PortChannel1", "file": "/etc/teamd/PortChannel1.conf"}, {"name": "PortChannel2", "file": "/etc/teamd/PortChannel2.conf"}]} +LAG_INFO_DICT=$(python -c "import json,os,sys; lags_dict = {}; lags_dict['lags'] = [{'name': os.path.basename(file).split('.')[0], 'file': os.path.join('${TEAMD_CONF_PATH}', file)} for file in sorted(os.listdir('${TEAMD_CONF_PATH}'))]; sys.stdout.write(json.dumps(lags_dict))") + +# Generate supervisord config file +mkdir -p /etc/supervisor/conf.d/ +sonic-cfggen -d -a "${LAG_INFO_DICT}" -t /usr/share/sonic/templates/docker-teamd.supervisord.conf.j2 > /etc/supervisor/conf.d/docker-teamd.supervisord.conf + +# The Docker container should start this script as PID 1, so now that we +# have generated the proper supervisord configuration, we exec supervisord +# so that it runs as PID 1 for the duration of the container's lifetime +exec /usr/bin/supervisord diff --git a/dockers/docker-teamd/docker-teamd-start.sh b/dockers/docker-teamd/docker-teamd-start.sh new file mode 100755 index 000000000000..95b167d22b40 --- /dev/null +++ b/dockers/docker-teamd/docker-teamd-start.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd + +supervisorctl start teamd:* + +supervisorctl start teamsyncd diff --git a/dockers/docker-teamd/docker-teamd.supervisord.conf.j2 b/dockers/docker-teamd/docker-teamd.supervisord.conf.j2 new file mode 100644 index 000000000000..abd3203b3477 --- /dev/null +++ b/dockers/docker-teamd/docker-teamd.supervisord.conf.j2 @@ -0,0 +1,52 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:docker-teamd-start.sh] +command=/usr/bin/docker-teamd-start.sh +priority=1 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +{# If there are LAGs... #} +{% if lags -%} +[group:teamd] +programs= +{%- set add_preceding_comma = { 'flag': False } -%} +{%- for lag in lags -%} +{%- if add_preceding_comma.flag %},{% endif -%} +{%- set _dummy = add_preceding_comma.update({'flag': True}) -%} +teamd-{{ lag['name'] }} +{%- endfor %} + +{# Create a program entry for each teamd instance #} +{% for lag in lags %} + +[program:teamd-{{ lag['name'] }}] +command=/usr/bin/teamd.sh {{ lag['file'] }} +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +{% endfor %} + +[program:teamsyncd] +command=/usr/bin/teamsyncd +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +{% endif %} diff --git a/dockers/docker-teamd/start.sh b/dockers/docker-teamd/start.sh deleted file mode 100755 index 6e80f6eb9a83..000000000000 --- a/dockers/docker-teamd/start.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env bash - -TEAMD_CONF_PATH=/etc/teamd - -rm -rf $TEAMD_CONF_PATH -mkdir -p $TEAMD_CONF_PATH - -SONIC_ASIC_TYPE=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type) -MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') - -# Align last byte -if [ "$SONIC_ASIC_TYPE" == "mellanox" -o "$SONIC_ASIC_TYPE" == "centec" ]; then - last_byte=$(python -c "print '$MAC_ADDRESS'[-2:]") - aligned_last_byte=$(python -c "print format(int(int('$last_byte', 16) & 0b11000000), '02x')") # put mask and take away the 0x prefix - MAC_ADDRESS=$(python -c "print '$MAC_ADDRESS'[:-2] + '$aligned_last_byte'") # put aligned byte into the end of MAC -fi - -for pc in `sonic-cfggen -d -v "PORTCHANNEL.keys() | join(' ') if PORTCHANNEL"`; do - sonic-cfggen -d -a '{"pc":"'$pc'","hwaddr":"'$MAC_ADDRESS'"}' -t /usr/share/sonic/templates/teamd.j2 > $TEAMD_CONF_PATH/$pc.conf - # bring down all member ports before starting teamd - for member in $(sonic-cfggen -d -v "PORTCHANNEL['$pc']['members'] | join(' ')" ); do - if [ -L /sys/class/net/$member ]; then - ip link set $member down - fi - done -done - -mkdir -p /var/sonic -echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status - -rm -f /var/run/rsyslogd.pid - -supervisorctl start rsyslogd - -supervisorctl start teamd diff --git a/dockers/docker-teamd/teamd.sh b/dockers/docker-teamd/teamd.sh index 2b6d9fb53970..7192a2bdeca2 100755 --- a/dockers/docker-teamd/teamd.sh +++ b/dockers/docker-teamd/teamd.sh @@ -1,28 +1,15 @@ #!/usr/bin/env bash -TEAMD_CONF_PATH=/etc/teamd - -function start_app { - rm -f /var/run/teamd/* - if [ "$(ls -A $TEAMD_CONF_PATH)" ]; then - for f in $TEAMD_CONF_PATH/*; do - teamd -f $f -d - done - fi - teamsyncd & -} +TEAMD_CONF_FILE=$1 function clean_up { - if [ "$(ls -A $TEAMD_CONF_PATH)" ]; then - for f in $TEAMD_CONF_PATH/*; do - teamd -f $f -k - done - fi - pkill -9 teamsyncd - exit + teamd -f $TEAMD_CONF_FILE -k + exit $? } trap clean_up SIGTERM SIGKILL -start_app -read +teamd -f $TEAMD_CONF_FILE & +TEAMD_PID=$! +wait $TEAMD_PID +exit $? diff --git a/dockers/docker-teamd/supervisord.conf b/src/sonic-config-engine/tests/sample_output/docker-dhcp-relay.supervisord.conf similarity index 58% rename from dockers/docker-teamd/supervisord.conf rename to src/sonic-config-engine/tests/sample_output/docker-dhcp-relay.supervisord.conf index 48ef0ca9f29e..f955546cdc09 100644 --- a/dockers/docker-teamd/supervisord.conf +++ b/src/sonic-config-engine/tests/sample_output/docker-dhcp-relay.supervisord.conf @@ -19,10 +19,15 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog -[program:teamd] -command=/usr/bin/teamd.sh +[group:isc-dhcp-relay] +programs=isc-dhcp-relay-Vlan1000 + +[program:isc-dhcp-relay-Vlan1000] +command=/usr/sbin/dhcrelay -d -m discard -a %%h:%%p %%P --name-alias-map-file /tmp/port-name-alias-map.txt -i Vlan1000 -i PortChannel02 -i PortChannel03 -i PortChannel04 -i PortChannel01 192.0.0.1 192.0.0.2 priority=3 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog + + diff --git a/src/sonic-config-engine/tests/sample_output/docker-teamd.supervisord.conf b/src/sonic-config-engine/tests/sample_output/docker-teamd.supervisord.conf new file mode 100644 index 000000000000..83feaf05b8c8 --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/docker-teamd.supervisord.conf @@ -0,0 +1,64 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:docker-teamd-start.sh] +command=/usr/bin/docker-teamd-start.sh +priority=1 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[group:teamd] +programs=teamd-PortChannel01,teamd-PortChannel02,teamd-PortChannel03,teamd-PortChannel04 + +[program:teamd-PortChannel01] +command=/usr/bin/teamd.sh /sonic/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel01.conf +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:teamd-PortChannel02] +command=/usr/bin/teamd.sh /sonic/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel02.conf +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:teamd-PortChannel03] +command=/usr/bin/teamd.sh /sonic/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel03.conf +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:teamd-PortChannel04] +command=/usr/bin/teamd.sh /sonic/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel04.conf +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:teamsyncd] +command=/usr/bin/teamsyncd +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + diff --git a/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh b/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh new file mode 100644 index 000000000000..26c453d487af --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +function wait_until_iface_exists +{ + IFACE=$1 + + echo "Waiting for interface ${IFACE}..." + + # Wait for the interface to come up (i.e., 'ip link show' returns 0) + until ip link show $IFACE > /dev/null 2>&1; do + sleep 1 + done + + echo "Interface ${IFACE} is created" +} + + +# Wait for all interfaces to come up before starting the DHCP relay +wait_until_iface_exists Vlan1000 +wait_until_iface_exists PortChannel04 +wait_until_iface_exists PortChannel02 +wait_until_iface_exists PortChannel03 +wait_until_iface_exists PortChannel03 +wait_until_iface_exists PortChannel01 +wait_until_iface_exists PortChannel02 +wait_until_iface_exists PortChannel04 +wait_until_iface_exists PortChannel01 + diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index d1cc0d2a3296..fb450ba77ae2 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -33,6 +33,19 @@ def test_alias_map(self): data = json.loads(output) self.assertEqual(data["Ethernet4"], "fortyGigE0/4") + def test_dhcp_relay(self): + # Test generation of wait_for_intf.sh + template_path = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-dhcp-relay', 'wait_for_intf.sh.j2') + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + template_path + ' > ' + self.output_file + self.run_script(argument) + self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'wait_for_intf.sh'), self.output_file)) + + # Test generation of docker-dhcp-relay.supervisord.conf + template_path = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-dhcp-relay', 'docker-dhcp-relay.supervisord.conf.j2') + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + template_path + ' > ' + self.output_file + self.run_script(argument) + self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'docker-dhcp-relay.supervisord.conf'), self.output_file)) + def test_lldp(self): lldpd_conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-lldp-sv2', 'lldpd.conf.j2') argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + lldpd_conf_template + ' > ' + self.output_file @@ -49,7 +62,7 @@ def test_render_teamd(self, pc, minigraph, sample_output): # Test T0 minigraph argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -v "PORTCHANNEL.keys() | join(\' \') if PORTCHANNEL"' - output = self.run_script(argument) # Mock the output via config.sh in docker-teamd + output = self.run_script(argument) # Mock the output via docker-teamd-init.sh in docker-teamd pc_list = output.split() for i in range(1, 5): @@ -58,9 +71,9 @@ def test_render_teamd(self, pc, minigraph, sample_output): sample_output = os.path.join(self.test_dir, 'sample_output', 't0_sample_output', pc_name + '.conf') test_render_teamd(self, pc_name, self.t0_minigraph, sample_output) - # Test port channel test minigraph + # Test port channel test minigraph (for testing proper 'min_ports' attribute generation) argument = '-m ' + self.pc_minigraph + ' -p ' + self.t0_port_config + ' -v "PORTCHANNEL.keys() | join(\' \') if PORTCHANNEL"' - output = self.run_script(argument) # Mock the output via config.sh in docker-teamd + output = self.run_script(argument) # Mock the output via docker-teamd-init.sh in docker-teamd pc_list = output.split() pc_name = 'PortChannel01' @@ -68,6 +81,17 @@ def test_render_teamd(self, pc, minigraph, sample_output): sample_output = os.path.join(self.test_dir, 'sample_output', 'pc_sample_output', pc_name + '.conf') test_render_teamd(self, pc_name, self.pc_minigraph, sample_output) + # Test generation of docker-teamd.supervisord.conf + template_path = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-teamd', 'docker-teamd.supervisord.conf.j2') + teamd_conf_dir = os.path.join(self.test_dir, 'sample_output', 't0_sample_output') + + lags_dict = {} + lags_dict['lags'] = [{'name': os.path.basename(file).split('.')[0], 'file': os.path.join(teamd_conf_dir, file)} for file in sorted(os.listdir(teamd_conf_dir))] + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -a \'' + json.dumps(lags_dict) + '\' -t ' + template_path + ' > ' + self.output_file + + self.run_script(argument) + self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'docker-teamd.supervisord.conf'), self.output_file)) + def test_ipinip(self): ipinip_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ipinip.json.j2') argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + ipinip_file + ' > ' + self.output_file From 50b4868a991b40b4ea5421776daa1a3ee8e4a95e Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 13 Nov 2017 14:38:07 -0800 Subject: [PATCH 0921/1011] [vs]: update virtual switch (#1148) * [vs]: add zebra/quagga/fpmsyncd in supervisord.conf * setup the hostname for vs docker * do not save to the disk for redis db * install ipaddress module in vs docker * update sonic-sairedis submodule --- platform/vs/docker-sonic-vs/Dockerfile.j2 | 11 +++++++-- platform/vs/docker-sonic-vs/start.sh | 2 ++ platform/vs/docker-sonic-vs/supervisord.conf | 24 ++++++++++++++++++++ src/sonic-sairedis | 2 +- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2 index 32b91e8cf44a..fe6ca837a11b 100644 --- a/platform/vs/docker-sonic-vs/Dockerfile.j2 +++ b/platform/vs/docker-sonic-vs/Dockerfile.j2 @@ -28,6 +28,9 @@ RUN apt-get install -y net-tools \ iproute \ libpython2.7 +RUN pip install setuptools \ + py2_ipaddress + COPY \ {% for deb in docker_sonic_vs_debs.split(' ') -%} debs/{{ deb }}{{' '}} @@ -43,10 +46,12 @@ debs/{{ deb }}{{' '}} RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -RUN sed -ri 's/^daemonize yes$/daemonize no/; \ +RUN sed -ri 's/^(save .*$)/# \1/g; \ + s/^daemonize yes$/daemonize no/; \ s/^logfile .*$/logfile ""/; \ s/^# syslog-enabled no$/syslog-enabled no/; \ - s/^# unixsocket/unixsocket/ \ + s/^# unixsocket/unixsocket/; \ + s/^client-output-buffer-limit pubsub [0-9]+mb [0-9]+mb [0-9]+/client-output-buffer-limit pubsub 0 0 0/ \ ' /etc/redis/redis.conf COPY ["50-default.conf", "/etc/rsyslog.d/"] @@ -54,4 +59,6 @@ COPY ["start.sh", "orchagent.sh", "/usr/bin/"] COPY ["brcm.profile.ini", "/usr/share/sonic/device/vswitch/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +RUN echo "docker-sonic-vs" > /etc/hostname + ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/vs/docker-sonic-vs/start.sh b/platform/vs/docker-sonic-vs/start.sh index 07d0fb7a0426..0782705bc912 100755 --- a/platform/vs/docker-sonic-vs/start.sh +++ b/platform/vs/docker-sonic-vs/start.sh @@ -28,6 +28,8 @@ supervisorctl start neighsyncd supervisorctl start teamsyncd +supervisorctl start fpmsyncd + # Start arp_update when VLAN exists # VLAN=`sonic-cfggen -d -v 'VLAN.keys() | join(" ") if VLAN'` # if [ "$VLAN" != "" ]; then diff --git a/platform/vs/docker-sonic-vs/supervisord.conf b/platform/vs/docker-sonic-vs/supervisord.conf index c6fefef1415a..c91d808b9856 100644 --- a/platform/vs/docker-sonic-vs/supervisord.conf +++ b/platform/vs/docker-sonic-vs/supervisord.conf @@ -74,3 +74,27 @@ autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog + +[program:zebra] +command=/usr/lib/quagga/zebra -A 127.0.0.1 +priority=10 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:bgpd] +command=/usr/lib/quagga/bgpd -A 127.0.0.1 -F +priority=11 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:fpmsyncd] +command=/usr/bin/fpmsyncd +priority=12 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog diff --git a/src/sonic-sairedis b/src/sonic-sairedis index f5d9c8364f5f..d11f5501ff15 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit f5d9c8364f5fbcc487a5f1a3e3e6203ab2293a83 +Subproject commit d11f5501ff15cff7361c397ec937327ce343c94b From f48ba0e87296daf104b2ae21093c33a6d4c94b22 Mon Sep 17 00:00:00 2001 From: lguohan Date: Tue, 14 Nov 2017 03:23:39 -0800 Subject: [PATCH 0922/1011] [vs]: install py2_ipaddress correctly (#1151) --- platform/vs/docker-sonic-vs/Dockerfile.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2 index fe6ca837a11b..43f7f678e71e 100644 --- a/platform/vs/docker-sonic-vs/Dockerfile.j2 +++ b/platform/vs/docker-sonic-vs/Dockerfile.j2 @@ -28,8 +28,8 @@ RUN apt-get install -y net-tools \ iproute \ libpython2.7 -RUN pip install setuptools \ - py2_ipaddress +RUN pip install setuptools +RUN pip install py2_ipaddress COPY \ {% for deb in docker_sonic_vs_debs.split(' ') -%} From 6284452535440a9b1c4daea74fa311ae86c266fa Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 14 Nov 2017 03:23:55 -0800 Subject: [PATCH 0923/1011] [Broadcom]: Update Broadcom SAI package to 3.0.3.2-12 (#1150) Fix memory leak in multipath routing (part II) Update th-s6100-64x40G.config.bcm Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 015d85b24a5d..5fbfc47e980d 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-11_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-11_amd64.deb?sv=2015-04-05&sr=b&sig=sXvf3ejJ8npF9iPfkTIYUneN4N8wvHKo2V6A8YoTbhk%3D&se=2031-07-17T23%3A08%3A43Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-12_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-12_amd64.deb?sv=2015-04-05&sr=b&sig=iIHm3VuMr%2BcvLP4Mcq0I90JUmxuw35%2FbktTwt13%2FqbE%3D&se=2031-07-23T23%3A48%3A11Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-11_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-12_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-11_amd64.deb?sv=2015-04-05&sr=b&sig=Q%2FSC7B0xDuhvHGL7GERoOw483nv6hkAQrDUaabS9JOs%3D&se=2031-07-17T23%3A09%3A08Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-12_amd64.deb?sv=2015-04-05&sr=b&sig=Guh0wkJFpWssS10eiwxeuzAOQEsAtbdfVzpRS%2F9uC6k%3D&se=2031-07-23T23%3A48%3A26Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From 803c263331e610c38600c95af2925713ce395656 Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Tue, 14 Nov 2017 08:19:24 -0800 Subject: [PATCH 0924/1011] [baseimage]: Subnet route added for management interface (eth0) - "fixes #1023" (#1142) * Added management subnet route to route table-default in kernel. * Added sample output to interface file --- files/image_config/interfaces/interfaces.j2 | 2 ++ src/sonic-config-engine/tests/sample_output/interfaces | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2 index 9298348d3fb8..71e2d2514fa2 100644 --- a/files/image_config/interfaces/interfaces.j2 +++ b/files/image_config/interfaces/interfaces.j2 @@ -28,12 +28,14 @@ iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static ########## management network policy routing rules # management port up rules up ip {{ '-4' if prefix | ipv4 else '-6' }} route add default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table default + up ip {{ '-4' if prefix | ipv4 else '-6' }} route add {{ prefix | network }}/{{ prefix | prefixlen }} dev eth0 table default up ip {{ '-4' if prefix | ipv4 else '-6' }} rule add from {{ prefix | ip }}/{{ '32' if prefix | ipv4 else '128' }} table default {% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} up ip rule add to {{ route }} table default {% endfor %} # management port down rules down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete default via {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} dev eth0 table default + down ip {{ '-4' if prefix | ipv4 else '-6' }} route delete {{ prefix | network }}/{{ prefix | prefixlen }} dev eth0 table default down ip {{ '-4' if prefix | ipv4 else '-6' }} rule delete from {{ prefix | ip }}/{{ '32' if prefix | ipv4 else '128' }} table default {% for route in MGMT_INTERFACE[(name, prefix)]['forced_mgmt_routes'] %} down ip rule delete to {{ route }} table default diff --git a/src/sonic-config-engine/tests/sample_output/interfaces b/src/sonic-config-engine/tests/sample_output/interfaces index 2d54e6dabb3d..c8da2fee8f76 100644 --- a/src/sonic-config-engine/tests/sample_output/interfaces +++ b/src/sonic-config-engine/tests/sample_output/interfaces @@ -23,9 +23,11 @@ iface eth0 inet static ########## management network policy routing rules # management port up rules up ip -4 route add default via 10.0.0.1 dev eth0 table default + up ip -4 route add 10.0.0.0/24 dev eth0 table default up ip -4 rule add from 10.0.0.100/32 table default # management port down rules down ip -4 route delete default via 10.0.0.1 dev eth0 table default + down ip -4 route delete 10.0.0.0/24 dev eth0 table default down ip -4 rule delete from 10.0.0.100/32 table default iface eth0 inet6 static address 2603:10e2:0:2902::8 @@ -33,9 +35,11 @@ iface eth0 inet6 static ########## management network policy routing rules # management port up rules up ip -6 route add default via 2603:10e2:0:2902::1 dev eth0 table default + up ip -6 route add 2603:10e2:0:2902::/64 dev eth0 table default up ip -6 rule add from 2603:10e2:0:2902::8/128 table default # management port down rules down ip -6 route delete default via 2603:10e2:0:2902::1 dev eth0 table default + down ip -6 route delete 2603:10e2:0:2902::/64 dev eth0 table default down ip -6 rule delete from 2603:10e2:0:2902::8/128 table default # # The switch front panel interfaces From cea87e985c9cb72f9aa71ec3a521052d90a42abc Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 14 Nov 2017 14:40:15 -0800 Subject: [PATCH 0925/1011] Add docker-router-advertiser to support IPv6 router advertisements (#1103) --- .gitignore | 1 + .../docker-router-advertiser/Dockerfile.j2 | 32 ++++++++++++++++ .../docker-router-advertiser.supervisord.conf | 28 ++++++++++++++ .../docker-router-advertiser/radvd.conf.j2 | 37 +++++++++++++++++++ dockers/docker-router-advertiser/start.sh | 11 ++++++ .../router_advertiser.service.j2 | 13 +++++++ rules/docker-router-advertiser.mk | 12 ++++++ 7 files changed, 134 insertions(+) create mode 100644 dockers/docker-router-advertiser/Dockerfile.j2 create mode 100644 dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf create mode 100644 dockers/docker-router-advertiser/radvd.conf.j2 create mode 100755 dockers/docker-router-advertiser/start.sh create mode 100644 files/build_templates/router_advertiser.service.j2 create mode 100644 rules/docker-router-advertiser.mk diff --git a/.gitignore b/.gitignore index c5ed255e62a9..463994a75e8e 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,7 @@ dockers/docker-fpm-quagga/Dockerfile dockers/docker-lldp-sv2/Dockerfile dockers/docker-orchagent/Dockerfile dockers/docker-platform-monitor/Dockerfile +dockers/docker-router-advertiser/Dockerfile dockers/docker-snmp-sv2/Dockerfile dockers/docker-teamd/Dockerfile dockers/docker-sonic-mgmt/Dockerfile diff --git a/dockers/docker-router-advertiser/Dockerfile.j2 b/dockers/docker-router-advertiser/Dockerfile.j2 new file mode 100644 index 000000000000..5007daf122cf --- /dev/null +++ b/dockers/docker-router-advertiser/Dockerfile.j2 @@ -0,0 +1,32 @@ +FROM docker-config-engine + +# Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +# Update apt's cache of available packages +RUN apt-get update + +# Install radvd Debian package +RUN apt-get -y install radvd + +{% if docker_router_advertiser_debs.strip() -%} +# Copy built Debian packages +{%- for deb in docker_router_advertiser_debs.split(' ') %} +COPY debs/{{ deb }} debs/ +{%- endfor %} + +# Install built Debian packages and implicitly install their dependencies +{%- for deb in docker_router_advertiser_debs.split(' ') %} +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt debs/{{ deb }} +{%- endfor %} +{%- endif %} + +# Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +COPY ["start.sh", "/usr/bin/"] +COPY ["docker-router-advertiser.supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["radvd.conf.j2", "/usr/share/sonic/templates/"] + +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf b/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf new file mode 100644 index 000000000000..08a3e0a94872 --- /dev/null +++ b/dockers/docker-router-advertiser/docker-router-advertiser.supervisord.conf @@ -0,0 +1,28 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:radvd] +command=/usr/sbin/radvd -n +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog diff --git a/dockers/docker-router-advertiser/radvd.conf.j2 b/dockers/docker-router-advertiser/radvd.conf.j2 new file mode 100644 index 000000000000..940c26fd6588 --- /dev/null +++ b/dockers/docker-router-advertiser/radvd.conf.j2 @@ -0,0 +1,37 @@ +{% block banner %} +# =========== Managed by sonic-cfggen -- DO NOT edit manually! ==================== +# Generated by /usr/share/sonic/templates/radvd.conf.j2 using config DB data +# File: /etc/radvd.conf +# +{% endblock banner %} +# Config file for radvd, the router advertisement daemon +# See man page for radvd.conf for descriptions of all available options +# + +{# If our configuration has VLAN interfaces... #} +{% if VLAN_INTERFACE %} +{% for (name, prefix) in VLAN_INTERFACE %} +{# If this VLAN has an IPv6 address... #} +{% if prefix | ipv6 %} +interface {{ name }} +{ + IgnoreIfMissing on; + AdvSendAdvert on; + MinRtrAdvInterval 200; + MaxRtrAdvInterval 600; + AdvManagedFlag on; + AdvOtherConfigFlag off; + AdvLinkMTU 9100; + AdvHomeAgentFlag off; + prefix {{ prefix | network }}/{{ prefix | prefixlen }} { + AdvOnLink on; + AdvAutonomous off; + AdvRouterAddr off; + AdvValidLifetime infinity; + AdvPreferredLifetime infinity; + }; +}; + +{% endif %} +{% endfor %} +{% endif %} diff --git a/dockers/docker-router-advertiser/start.sh b/dockers/docker-router-advertiser/start.sh new file mode 100755 index 000000000000..cbd5ec383bd6 --- /dev/null +++ b/dockers/docker-router-advertiser/start.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +# Generate /etc/radvd.conf config file +sonic-cfggen -d -t /usr/share/sonic/templates/radvd.conf.j2 > /etc/radvd.conf + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd + +# Start the router advertiser +supervisorctl start radvd diff --git a/files/build_templates/router_advertiser.service.j2 b/files/build_templates/router_advertiser.service.j2 new file mode 100644 index 000000000000..12bdb371369d --- /dev/null +++ b/files/build_templates/router_advertiser.service.j2 @@ -0,0 +1,13 @@ +[Unit] +Description=Router advertiser container +Requires=docker.service +After=swss.service + +[Service] +User={{ sonicadmin_user }} +ExecStartPre=/usr/bin/{{ docker_container_name }}.sh start +ExecStart=/usr/bin/{{ docker_container_name }}.sh attach +ExecStop=/usr/bin/{{ docker_container_name }}.sh stop + +[Install] +WantedBy=multi-user.target diff --git a/rules/docker-router-advertiser.mk b/rules/docker-router-advertiser.mk new file mode 100644 index 000000000000..129246d8fa2d --- /dev/null +++ b/rules/docker-router-advertiser.mk @@ -0,0 +1,12 @@ +# Docker image for router advertiser + +DOCKER_ROUTER_ADVERTISER = docker-router-advertiser.gz +$(DOCKER_ROUTER_ADVERTISER)_PATH = $(DOCKERS_PATH)/docker-router-advertiser +$(DOCKER_ROUTER_ADVERTISER)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE) +SONIC_DOCKER_IMAGES += $(DOCKER_ROUTER_ADVERTISER) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ROUTER_ADVERTISER) + + +$(DOCKER_ROUTER_ADVERTISER)_CONTAINER_NAME = radv +$(DOCKER_ROUTER_ADVERTISER)_RUN_OPT += --net=host --privileged -t +$(DOCKER_ROUTER_ADVERTISER)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro From a99b5e9e2930261cd296eeb841c0d5bcba4236e8 Mon Sep 17 00:00:00 2001 From: Polly Hsu Date: Thu, 16 Nov 2017 07:41:15 +0800 Subject: [PATCH 0926/1011] [installer] FIX. ONIE installer error issue: (#1152) * [installer] FIX. ONIE installer error issue: mv: can't rename '//tmp/onie-support.tar.bz2': No such file or directory --- installer/x86_64/install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/installer/x86_64/install.sh b/installer/x86_64/install.sh index 358da41071b5..2a62132be054 100755 --- a/installer/x86_64/install.sh +++ b/installer/x86_64/install.sh @@ -455,9 +455,9 @@ if [ "$install_env" = "onie" ]; then cp /etc/machine.conf $demo_mnt # Store installation log in target file system - rm -f $onie_initrd_tmp/tmp/onie-support.tar.bz2 + rm -f $onie_initrd_tmp/tmp/onie-support*.tar.bz2 ${onie_bin} onie-support /tmp - mv $onie_initrd_tmp/tmp/onie-support.tar.bz2 $demo_mnt/$image_dir/ + mv $onie_initrd_tmp/tmp/onie-support*.tar.bz2 $demo_mnt/$image_dir/ if [ "$firmware" = "uefi" ] ; then demo_install_uefi_grub "$demo_mnt" "$blk_dev" From d3765066fee07a07cea2accae431c864909fefd7 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 16 Nov 2017 08:15:14 -0800 Subject: [PATCH 0927/1011] [make] Introducing build option SOURCE_FOLDER (#1155) When KEEP_SLAVE_ON=yes and SOURCE_FOLDER is defined, the path pointed by SOURCE_FOLDER will be mounted in the build slave docker at /var/src. This option allows user to mount an extra path into the build slave when the slave is left running. Usually when user need to build extra stuff in SOURCE_FOLDER. --- Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 800cd32093e3..d1a28f031748 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ # * USERNAME: Desired username -- default at rules/config # * PASSWORD: Desired password -- default at rules/config # * KEEP_SLAVE_ON: Keeps slave container up after building-process concludes. +# * SOURCE_FOLDER: host path to be mount as /var/src, only effective when KEEP_SLAVE_ON=yes # ############################################################################### @@ -72,7 +73,11 @@ SONIC_BUILD_INSTRUCTION := make \ { echo Image $(SLAVE_IMAGE):$(SLAVE_TAG) not found. Building... ; \ $(DOCKER_BUILD) ; } ifeq "$(KEEP_SLAVE_ON)" "yes" - @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; /bin/bash" + ifdef SOURCE_FOLDER + @$(DOCKER_RUN) -v $(SOURCE_FOLDER):/var/src $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; /bin/bash" + else + @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; /bin/bash" + endif else @$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) $(SONIC_BUILD_INSTRUCTION) $@ endif From c93c008bae115da65e981f09f0baac4e52a92635 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 16 Nov 2017 10:30:41 -0800 Subject: [PATCH 0928/1011] Revert "[docker-teamd]: Manage teamd and teamsyncd processes with supervisor (#1137)" (#1156) This reverts commit a6edef2fa52f5b7771cc5751cde1a190d96ffa50. The reason to revert this commit is that it breaks the current nightly test as no port channel interfaces are get created after boot. teamd failed to start and complained about 'Cannot allocate memory' possibly due to nlmsg_alloc function failure. Will revert this commit to investigate it further before moving to supervisor. Signed-off-by: Shu0T1an ChenG --- dockers/docker-teamd/Dockerfile.j2 | 7 +- dockers/docker-teamd/docker-teamd-init.sh | 43 ------------- dockers/docker-teamd/docker-teamd-start.sh | 9 --- .../docker-teamd.supervisord.conf.j2 | 52 --------------- dockers/docker-teamd/start.sh | 35 ++++++++++ .../docker-teamd/supervisord.conf | 9 +-- dockers/docker-teamd/teamd.sh | 27 ++++++-- .../docker-teamd.supervisord.conf | 64 ------------------- .../tests/sample_output/wait_for_intf.sh | 28 -------- src/sonic-config-engine/tests/test_j2files.py | 30 +-------- 10 files changed, 64 insertions(+), 240 deletions(-) delete mode 100755 dockers/docker-teamd/docker-teamd-init.sh delete mode 100755 dockers/docker-teamd/docker-teamd-start.sh delete mode 100644 dockers/docker-teamd/docker-teamd.supervisord.conf.j2 create mode 100755 dockers/docker-teamd/start.sh rename src/sonic-config-engine/tests/sample_output/docker-dhcp-relay.supervisord.conf => dockers/docker-teamd/supervisord.conf (58%) delete mode 100644 src/sonic-config-engine/tests/sample_output/docker-teamd.supervisord.conf delete mode 100644 src/sonic-config-engine/tests/sample_output/wait_for_intf.sh diff --git a/dockers/docker-teamd/Dockerfile.j2 b/dockers/docker-teamd/Dockerfile.j2 index 9fded5183c3c..f604433a6c3f 100644 --- a/dockers/docker-teamd/Dockerfile.j2 +++ b/dockers/docker-teamd/Dockerfile.j2 @@ -22,10 +22,11 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} -COPY ["docker-teamd-init.sh", "docker-teamd-start.sh", "teamd.sh", "/usr/bin/"] -COPY ["docker-teamd.supervisord.conf.j2", "teamd.j2", "/usr/share/sonic/templates/"] +COPY ["start.sh", "teamd.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["teamd.j2", "/usr/share/sonic/templates/"] RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -ENTRYPOINT ["/usr/bin/docker-teamd-init.sh"] +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-teamd/docker-teamd-init.sh b/dockers/docker-teamd/docker-teamd-init.sh deleted file mode 100755 index a06ca4e8f890..000000000000 --- a/dockers/docker-teamd/docker-teamd-init.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env bash - -TEAMD_CONF_PATH="/etc/teamd" - -rm -rf $TEAMD_CONF_PATH -mkdir -p $TEAMD_CONF_PATH - -SONIC_ASIC_TYPE=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type) -MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') - -# Align last byte -if [ "$SONIC_ASIC_TYPE" == "mellanox" -o "$SONIC_ASIC_TYPE" == "centec" ]; then - last_byte=$(python -c "print '$MAC_ADDRESS'[-2:]") - aligned_last_byte=$(python -c "print format(int(int('$last_byte', 16) & 0b11000000), '02x')") # put mask and take away the 0x prefix - MAC_ADDRESS=$(python -c "print '$MAC_ADDRESS'[:-2] + '$aligned_last_byte'") # put aligned byte into the end of MAC -fi - -for pc in `sonic-cfggen -d -v "PORTCHANNEL.keys() | join(' ') if PORTCHANNEL"`; do - sonic-cfggen -d -a '{"pc":"'$pc'","hwaddr":"'$MAC_ADDRESS'"}' -t /usr/share/sonic/templates/teamd.j2 > $TEAMD_CONF_PATH/$pc.conf - # bring down all member ports before starting teamd - for member in $(sonic-cfggen -d -v "PORTCHANNEL['$pc']['members'] | join(' ')" ); do - if [ -L /sys/class/net/$member ]; then - ip link set $member down - fi - done -done - -# Create a Python dictionary where the key is the Jinja2 variable name -# "lags" and the value is a list of dctionaries containing the name of -# the LAG and the path of the LAG config file. Then output this in -# JSON format, as we will pass it to sonic-cfggen as additional data -# below for generating the supervisord config file. -# Example output: {"lags": [{"name": "PortChannel1", "file": "/etc/teamd/PortChannel1.conf"}, {"name": "PortChannel2", "file": "/etc/teamd/PortChannel2.conf"}]} -LAG_INFO_DICT=$(python -c "import json,os,sys; lags_dict = {}; lags_dict['lags'] = [{'name': os.path.basename(file).split('.')[0], 'file': os.path.join('${TEAMD_CONF_PATH}', file)} for file in sorted(os.listdir('${TEAMD_CONF_PATH}'))]; sys.stdout.write(json.dumps(lags_dict))") - -# Generate supervisord config file -mkdir -p /etc/supervisor/conf.d/ -sonic-cfggen -d -a "${LAG_INFO_DICT}" -t /usr/share/sonic/templates/docker-teamd.supervisord.conf.j2 > /etc/supervisor/conf.d/docker-teamd.supervisord.conf - -# The Docker container should start this script as PID 1, so now that we -# have generated the proper supervisord configuration, we exec supervisord -# so that it runs as PID 1 for the duration of the container's lifetime -exec /usr/bin/supervisord diff --git a/dockers/docker-teamd/docker-teamd-start.sh b/dockers/docker-teamd/docker-teamd-start.sh deleted file mode 100755 index 95b167d22b40..000000000000 --- a/dockers/docker-teamd/docker-teamd-start.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -rm -f /var/run/rsyslogd.pid - -supervisorctl start rsyslogd - -supervisorctl start teamd:* - -supervisorctl start teamsyncd diff --git a/dockers/docker-teamd/docker-teamd.supervisord.conf.j2 b/dockers/docker-teamd/docker-teamd.supervisord.conf.j2 deleted file mode 100644 index abd3203b3477..000000000000 --- a/dockers/docker-teamd/docker-teamd.supervisord.conf.j2 +++ /dev/null @@ -1,52 +0,0 @@ -[supervisord] -logfile_maxbytes=1MB -logfile_backups=2 -nodaemon=true - -[program:docker-teamd-start.sh] -command=/usr/bin/docker-teamd-start.sh -priority=1 -autostart=true -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n -priority=2 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -{# If there are LAGs... #} -{% if lags -%} -[group:teamd] -programs= -{%- set add_preceding_comma = { 'flag': False } -%} -{%- for lag in lags -%} -{%- if add_preceding_comma.flag %},{% endif -%} -{%- set _dummy = add_preceding_comma.update({'flag': True}) -%} -teamd-{{ lag['name'] }} -{%- endfor %} - -{# Create a program entry for each teamd instance #} -{% for lag in lags %} - -[program:teamd-{{ lag['name'] }}] -command=/usr/bin/teamd.sh {{ lag['file'] }} -priority=3 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog -{% endfor %} - -[program:teamsyncd] -command=/usr/bin/teamsyncd -priority=4 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog -{% endif %} diff --git a/dockers/docker-teamd/start.sh b/dockers/docker-teamd/start.sh new file mode 100755 index 000000000000..6e80f6eb9a83 --- /dev/null +++ b/dockers/docker-teamd/start.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +TEAMD_CONF_PATH=/etc/teamd + +rm -rf $TEAMD_CONF_PATH +mkdir -p $TEAMD_CONF_PATH + +SONIC_ASIC_TYPE=$(sonic-cfggen -y /etc/sonic/sonic_version.yml -v asic_type) +MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') + +# Align last byte +if [ "$SONIC_ASIC_TYPE" == "mellanox" -o "$SONIC_ASIC_TYPE" == "centec" ]; then + last_byte=$(python -c "print '$MAC_ADDRESS'[-2:]") + aligned_last_byte=$(python -c "print format(int(int('$last_byte', 16) & 0b11000000), '02x')") # put mask and take away the 0x prefix + MAC_ADDRESS=$(python -c "print '$MAC_ADDRESS'[:-2] + '$aligned_last_byte'") # put aligned byte into the end of MAC +fi + +for pc in `sonic-cfggen -d -v "PORTCHANNEL.keys() | join(' ') if PORTCHANNEL"`; do + sonic-cfggen -d -a '{"pc":"'$pc'","hwaddr":"'$MAC_ADDRESS'"}' -t /usr/share/sonic/templates/teamd.j2 > $TEAMD_CONF_PATH/$pc.conf + # bring down all member ports before starting teamd + for member in $(sonic-cfggen -d -v "PORTCHANNEL['$pc']['members'] | join(' ')" ); do + if [ -L /sys/class/net/$member ]; then + ip link set $member down + fi + done +done + +mkdir -p /var/sonic +echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd + +supervisorctl start teamd diff --git a/src/sonic-config-engine/tests/sample_output/docker-dhcp-relay.supervisord.conf b/dockers/docker-teamd/supervisord.conf similarity index 58% rename from src/sonic-config-engine/tests/sample_output/docker-dhcp-relay.supervisord.conf rename to dockers/docker-teamd/supervisord.conf index f955546cdc09..48ef0ca9f29e 100644 --- a/src/sonic-config-engine/tests/sample_output/docker-dhcp-relay.supervisord.conf +++ b/dockers/docker-teamd/supervisord.conf @@ -19,15 +19,10 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog -[group:isc-dhcp-relay] -programs=isc-dhcp-relay-Vlan1000 - -[program:isc-dhcp-relay-Vlan1000] -command=/usr/sbin/dhcrelay -d -m discard -a %%h:%%p %%P --name-alias-map-file /tmp/port-name-alias-map.txt -i Vlan1000 -i PortChannel02 -i PortChannel03 -i PortChannel04 -i PortChannel01 192.0.0.1 192.0.0.2 +[program:teamd] +command=/usr/bin/teamd.sh priority=3 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog - - diff --git a/dockers/docker-teamd/teamd.sh b/dockers/docker-teamd/teamd.sh index 7192a2bdeca2..2b6d9fb53970 100755 --- a/dockers/docker-teamd/teamd.sh +++ b/dockers/docker-teamd/teamd.sh @@ -1,15 +1,28 @@ #!/usr/bin/env bash -TEAMD_CONF_FILE=$1 +TEAMD_CONF_PATH=/etc/teamd + +function start_app { + rm -f /var/run/teamd/* + if [ "$(ls -A $TEAMD_CONF_PATH)" ]; then + for f in $TEAMD_CONF_PATH/*; do + teamd -f $f -d + done + fi + teamsyncd & +} function clean_up { - teamd -f $TEAMD_CONF_FILE -k - exit $? + if [ "$(ls -A $TEAMD_CONF_PATH)" ]; then + for f in $TEAMD_CONF_PATH/*; do + teamd -f $f -k + done + fi + pkill -9 teamsyncd + exit } trap clean_up SIGTERM SIGKILL -teamd -f $TEAMD_CONF_FILE & -TEAMD_PID=$! -wait $TEAMD_PID -exit $? +start_app +read diff --git a/src/sonic-config-engine/tests/sample_output/docker-teamd.supervisord.conf b/src/sonic-config-engine/tests/sample_output/docker-teamd.supervisord.conf deleted file mode 100644 index 83feaf05b8c8..000000000000 --- a/src/sonic-config-engine/tests/sample_output/docker-teamd.supervisord.conf +++ /dev/null @@ -1,64 +0,0 @@ -[supervisord] -logfile_maxbytes=1MB -logfile_backups=2 -nodaemon=true - -[program:docker-teamd-start.sh] -command=/usr/bin/docker-teamd-start.sh -priority=1 -autostart=true -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -[program:rsyslogd] -command=/usr/sbin/rsyslogd -n -priority=2 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -[group:teamd] -programs=teamd-PortChannel01,teamd-PortChannel02,teamd-PortChannel03,teamd-PortChannel04 - -[program:teamd-PortChannel01] -command=/usr/bin/teamd.sh /sonic/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel01.conf -priority=3 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -[program:teamd-PortChannel02] -command=/usr/bin/teamd.sh /sonic/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel02.conf -priority=3 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -[program:teamd-PortChannel03] -command=/usr/bin/teamd.sh /sonic/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel03.conf -priority=3 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -[program:teamd-PortChannel04] -command=/usr/bin/teamd.sh /sonic/src/sonic-config-engine/tests/sample_output/t0_sample_output/PortChannel04.conf -priority=3 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -[program:teamsyncd] -command=/usr/bin/teamsyncd -priority=4 -autostart=false -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - diff --git a/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh b/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh deleted file mode 100644 index 26c453d487af..000000000000 --- a/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash - -function wait_until_iface_exists -{ - IFACE=$1 - - echo "Waiting for interface ${IFACE}..." - - # Wait for the interface to come up (i.e., 'ip link show' returns 0) - until ip link show $IFACE > /dev/null 2>&1; do - sleep 1 - done - - echo "Interface ${IFACE} is created" -} - - -# Wait for all interfaces to come up before starting the DHCP relay -wait_until_iface_exists Vlan1000 -wait_until_iface_exists PortChannel04 -wait_until_iface_exists PortChannel02 -wait_until_iface_exists PortChannel03 -wait_until_iface_exists PortChannel03 -wait_until_iface_exists PortChannel01 -wait_until_iface_exists PortChannel02 -wait_until_iface_exists PortChannel04 -wait_until_iface_exists PortChannel01 - diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index fb450ba77ae2..d1cc0d2a3296 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -33,19 +33,6 @@ def test_alias_map(self): data = json.loads(output) self.assertEqual(data["Ethernet4"], "fortyGigE0/4") - def test_dhcp_relay(self): - # Test generation of wait_for_intf.sh - template_path = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-dhcp-relay', 'wait_for_intf.sh.j2') - argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + template_path + ' > ' + self.output_file - self.run_script(argument) - self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'wait_for_intf.sh'), self.output_file)) - - # Test generation of docker-dhcp-relay.supervisord.conf - template_path = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-dhcp-relay', 'docker-dhcp-relay.supervisord.conf.j2') - argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + template_path + ' > ' + self.output_file - self.run_script(argument) - self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'docker-dhcp-relay.supervisord.conf'), self.output_file)) - def test_lldp(self): lldpd_conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-lldp-sv2', 'lldpd.conf.j2') argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + lldpd_conf_template + ' > ' + self.output_file @@ -62,7 +49,7 @@ def test_render_teamd(self, pc, minigraph, sample_output): # Test T0 minigraph argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -v "PORTCHANNEL.keys() | join(\' \') if PORTCHANNEL"' - output = self.run_script(argument) # Mock the output via docker-teamd-init.sh in docker-teamd + output = self.run_script(argument) # Mock the output via config.sh in docker-teamd pc_list = output.split() for i in range(1, 5): @@ -71,9 +58,9 @@ def test_render_teamd(self, pc, minigraph, sample_output): sample_output = os.path.join(self.test_dir, 'sample_output', 't0_sample_output', pc_name + '.conf') test_render_teamd(self, pc_name, self.t0_minigraph, sample_output) - # Test port channel test minigraph (for testing proper 'min_ports' attribute generation) + # Test port channel test minigraph argument = '-m ' + self.pc_minigraph + ' -p ' + self.t0_port_config + ' -v "PORTCHANNEL.keys() | join(\' \') if PORTCHANNEL"' - output = self.run_script(argument) # Mock the output via docker-teamd-init.sh in docker-teamd + output = self.run_script(argument) # Mock the output via config.sh in docker-teamd pc_list = output.split() pc_name = 'PortChannel01' @@ -81,17 +68,6 @@ def test_render_teamd(self, pc, minigraph, sample_output): sample_output = os.path.join(self.test_dir, 'sample_output', 'pc_sample_output', pc_name + '.conf') test_render_teamd(self, pc_name, self.pc_minigraph, sample_output) - # Test generation of docker-teamd.supervisord.conf - template_path = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-teamd', 'docker-teamd.supervisord.conf.j2') - teamd_conf_dir = os.path.join(self.test_dir, 'sample_output', 't0_sample_output') - - lags_dict = {} - lags_dict['lags'] = [{'name': os.path.basename(file).split('.')[0], 'file': os.path.join(teamd_conf_dir, file)} for file in sorted(os.listdir(teamd_conf_dir))] - argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -a \'' + json.dumps(lags_dict) + '\' -t ' + template_path + ' > ' + self.output_file - - self.run_script(argument) - self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'docker-teamd.supervisord.conf'), self.output_file)) - def test_ipinip(self): ipinip_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ipinip.json.j2') argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + ipinip_file + ' > ' + self.output_file From e784aafbdacec7016f3e8f00a9d8704ed7eb6cdf Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 16 Nov 2017 12:17:58 -0800 Subject: [PATCH 0929/1011] [submodule update] update swss, swss-common and sairedis submodules (#1158) --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index d11f5501ff15..f1f7f267f973 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit d11f5501ff15cff7361c397ec937327ce343c94b +Subproject commit f1f7f267f97316fd02359e796c8af2fa971862f8 diff --git a/src/sonic-swss b/src/sonic-swss index 0be8b8b757e4..4cb542f1d933 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 0be8b8b757e40ac9f66e8175a2f978a8cba312ac +Subproject commit 4cb542f1d933ea016bcf247a79d92684bb959284 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index adf7d4cb3c22..a67ee684ed33 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit adf7d4cb3c22061bf781ef6ce7b79964ce505730 +Subproject commit a67ee684ed33083f61df83cd1ba9c047e5ed8b68 From f4e37a66f92099cc5d3bbde33823cd38b30a48a8 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 16 Nov 2017 12:27:03 -0800 Subject: [PATCH 0930/1011] add INSTALLS, LAZY_INSTALLS, DEPENDS targets to image build (#1159) 1. _INSTALLS defines the packages to be installed in the image at the build time. 2. _LAZY_INSTALLS defines the packages to be installed in the image at the first run time 3. _DEPENDS defines the packages to at the build dependency of the image --- platform/broadcom/one-aboot.mk | 2 +- platform/broadcom/one-image.mk | 4 ++-- platform/broadcom/raw-image.mk | 4 ++-- platform/cavium/one-image.mk | 4 ++-- platform/centec/one-image.mk | 2 +- platform/generic/aboot-image.mk | 2 +- platform/generic/onie-image.mk | 2 +- platform/mellanox/one-image.mk | 2 +- slave.mk | 19 ++++++++++++++++--- 9 files changed, 27 insertions(+), 14 deletions(-) diff --git a/platform/broadcom/one-aboot.mk b/platform/broadcom/one-aboot.mk index fde8e06ff787..d13ce392b425 100644 --- a/platform/broadcom/one-aboot.mk +++ b/platform/broadcom/one-aboot.mk @@ -3,6 +3,6 @@ SONIC_ONE_ABOOT_IMAGE = sonic-aboot-broadcom.swi $(SONIC_ONE_ABOOT_IMAGE)_MACHINE = broadcom $(SONIC_ONE_ABOOT_IMAGE)_IMAGE_TYPE = aboot -$(SONIC_ONE_ABOOT_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) $(ARISTA_PLATFORM_MODULE) +$(SONIC_ONE_ABOOT_IMAGE)_INSTALLS += $(BRCM_OPENNSL_KERNEL) $(ARISTA_PLATFORM_MODULE) $(SONIC_ONE_ABOOT_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_ABOOT_IMAGE) diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 60305c292b6b..ca9da1134eb2 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -3,8 +3,8 @@ SONIC_ONE_IMAGE = sonic-broadcom.bin $(SONIC_ONE_IMAGE)_MACHINE = broadcom $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_ONE_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) -$(SONIC_ONE_IMAGE)_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ +$(SONIC_ONE_IMAGE)_INSTALLS += $(BRCM_OPENNSL_KERNEL) +$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(DELL_Z9100_PLATFORM_MODULE) \ $(DELL_S6100_PLATFORM_MODULE) \ $(INGRASYS_S8900_54XC_PLATFORM_MODULE) \ diff --git a/platform/broadcom/raw-image.mk b/platform/broadcom/raw-image.mk index ae93683c543d..2591d32c1be8 100644 --- a/platform/broadcom/raw-image.mk +++ b/platform/broadcom/raw-image.mk @@ -3,7 +3,7 @@ SONIC_RAW_IMAGE = sonic-broadcom.raw $(SONIC_RAW_IMAGE)_MACHINE = broadcom $(SONIC_RAW_IMAGE)_IMAGE_TYPE = raw -$(SONIC_RAW_IMAGE)_DEPENDS += $(BRCM_OPENNSL_KERNEL) -$(SONIC_RAW_IMAGE)_INSTALLS += $($(SONIC_ONE_IMAGE)_INSTALLS) +$(SONIC_RAW_IMAGE)_INSTALLS += $(BRCM_OPENNSL_KERNEL) +$(SONIC_RAW_IMAGE)_LAZY_INSTALLS += $($(SONIC_ONE_IMAGE)_LAZY_INSTALLS) $(SONIC_RAW_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_RAW_IMAGE) diff --git a/platform/cavium/one-image.mk b/platform/cavium/one-image.mk index 33bcd92cc047..696578451990 100644 --- a/platform/cavium/one-image.mk +++ b/platform/cavium/one-image.mk @@ -3,7 +3,7 @@ SONIC_ONE_IMAGE = sonic-cavium.bin $(SONIC_ONE_IMAGE)_MACHINE = cavium $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_ONE_IMAGE)_DEPENDS += $(CAVM_PLATFORM_DEB) -$(SONIC_ONE_IMAGE)_DEPENDS += $(CAVM_XPNET_DEB) +$(SONIC_ONE_IMAGE)_INSTALLS += $(CAVM_PLATFORM_DEB) +$(SONIC_ONE_IMAGE)_INSTALLS += $(CAVM_XPNET_DEB) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/centec/one-image.mk b/platform/centec/one-image.mk index 49c27aea4261..7ad205dce521 100644 --- a/platform/centec/one-image.mk +++ b/platform/centec/one-image.mk @@ -3,6 +3,6 @@ SONIC_ONE_IMAGE = sonic-centec.bin $(SONIC_ONE_IMAGE)_MACHINE = centec $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_ONE_IMAGE)_DEPENDS += $(CENTEC_SDK_KERNEL) +$(SONIC_ONE_IMAGE)_INSTALLS += $(CENTEC_SDK_KERNEL) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/generic/aboot-image.mk b/platform/generic/aboot-image.mk index 7f5b4639e4e9..ecc91bba54c0 100644 --- a/platform/generic/aboot-image.mk +++ b/platform/generic/aboot-image.mk @@ -3,6 +3,6 @@ SONIC_GENERIC_ABOOT_IMAGE = sonic-aboot-generic.swi $(SONIC_GENERIC_ABOOT_IMAGE)_MACHINE = generic $(SONIC_GENERIC_ABOOT_IMAGE)_IMAGE_TYPE = aboot -$(SONIC_GENERIC_ABOOT_IMAGE)_DEPENDS = +$(SONIC_GENERIC_ABOOT_IMAGE)_INSTALLS = $(SONIC_GENERIC_ABOOT_IMAGE)_DOCKERS = SONIC_INSTALLERS += $(SONIC_GENERIC_ABOOT_IMAGE) diff --git a/platform/generic/onie-image.mk b/platform/generic/onie-image.mk index 67f8adba61e1..1a2ddb143505 100644 --- a/platform/generic/onie-image.mk +++ b/platform/generic/onie-image.mk @@ -3,6 +3,6 @@ SONIC_GENERIC_ONIE_IMAGE = sonic-generic.bin $(SONIC_GENERIC_ONIE_IMAGE)_MACHINE = generic $(SONIC_GENERIC_ONIE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_GENERIC_ONIE_IMAGE)_DEPENDS = +$(SONIC_GENERIC_ONIE_IMAGE)_INSTALLS = $(SONIC_GENERIC_ONIE_IMAGE)_DOCKERS = SONIC_INSTALLERS += $(SONIC_GENERIC_ONIE_IMAGE) diff --git a/platform/mellanox/one-image.mk b/platform/mellanox/one-image.mk index db8826951ca8..6f478ba76a51 100644 --- a/platform/mellanox/one-image.mk +++ b/platform/mellanox/one-image.mk @@ -3,7 +3,7 @@ SONIC_ONE_IMAGE = sonic-mellanox.bin $(SONIC_ONE_IMAGE)_MACHINE = mellanox $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie -$(SONIC_ONE_IMAGE)_DEPENDS += $(SX_KERNEL) $(KERNEL_MFT) $(MFT) $(MLNX_HW_MANAGEMENT) +$(SONIC_ONE_IMAGE)_INSTALLS += $(SX_KERNEL) $(KERNEL_MFT) $(MFT) $(MLNX_HW_MANAGEMENT) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) $(SONIC_ONE_IMAGE)_FILES += $(MLNX_FW_FILE) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/slave.mk b/slave.mk index 6f823cf98340..71cee41e3d0a 100644 --- a/slave.mk +++ b/slave.mk @@ -380,7 +380,20 @@ $(DOCKER_LOAD_TARGETS) : $(TARGET_PATH)/%.gz-load : .platform docker-start $$(TA ############################################################################### # targets for building installers with base image -$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform onie-image.conf $$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS)) $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) $$(addprefix $(FILES_PATH)/,$$($$*_FILES)) $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) $(LINUX_KERNEL) $(IGB_DRIVER) $(SONIC_DEVICE_DATA) $(SONIC_UTILS)) $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) +$(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ + .platform \ + onie-image.conf \ + $$(addsuffix -install,$$(addprefix $(DEBS_PATH)/,$$($$*_DEPENDS))) \ + $$(addprefix $(DEBS_PATH)/,$$($$*_INSTALLS)) \ + $$(addprefix $(DEBS_PATH)/,$$($$*_LAZY_INSTALLS)) \ + $$(addprefix $(FILES_PATH)/,$$($$*_FILES)) \ + $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) \ + $(LINUX_KERNEL) \ + $(IGB_DRIVER) \ + $(SONIC_DEVICE_DATA) \ + $(SONIC_UTILS)) \ + $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) \ + $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) $(HEADER) # Pass initramfs and linux kernel explicitly. They are used for all platforms export initramfs_tools="$(DEBS_PATH)/$(INITRAMFS_TOOLS)" @@ -392,8 +405,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export enable_organization_extensions="$(ENABLE_ORGANIZATION_EXTENSIONS)" 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_debs="$(addprefix $(DEBS_PATH)/,$($*_INSTALLS))" + export lazy_installer_debs="$(foreach deb, $($*_LAZY_INSTALLS),$(foreach device, $($(deb)_PLATFORM),$(addprefix $(device)@, $(DEBS_PATH)/$(deb))))" export installer_images="$(addprefix $(TARGET_PATH)/,$($*_DOCKERS))" export config_engine_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE))" export swsssdk_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SWSSSDK_PY2))" From 9e12678410ef6c6b4cc4c513807ca8b754123182 Mon Sep 17 00:00:00 2001 From: Volodymyr Samotiy Date: Fri, 17 Nov 2017 10:32:36 +0200 Subject: [PATCH 0931/1011] [docker-syncd-mlnx-rpc]: Configure send and receive buffers for PTF agent (#1157) Signed-off-by: Volodymyr Samotiy --- platform/mellanox/docker-syncd-mlnx-rpc/ptf_nn_agent.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/docker-syncd-mlnx-rpc/ptf_nn_agent.conf b/platform/mellanox/docker-syncd-mlnx-rpc/ptf_nn_agent.conf index fa1ed0eb1622..cd6a7d4db75d 100644 --- a/platform/mellanox/docker-syncd-mlnx-rpc/ptf_nn_agent.conf +++ b/platform/mellanox/docker-syncd-mlnx-rpc/ptf_nn_agent.conf @@ -1,5 +1,5 @@ [program:ptf_nn_agent] -command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-iface-rcv-buffer=109430400 +command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-nn-rcv-buffer=109430400 --set-iface-rcv-buffer=109430400 --set-nn-snd-buffer=109430400 --set-iface-snd-buffer=109430400 process_name=ptf_nn_agent stdout_logfile=/tmp/ptf_nn_agent.out.log stderr_logfile=/tmp/ptf_nn_agent.err.log From 343597ce22b76faeb4bcd043e358fdc2116ada1b Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 17 Nov 2017 09:36:02 -0800 Subject: [PATCH 0932/1011] [Broadcom]: Update Broadcom SAI package to 3.0.3.2-13 (#1161) Fix crash due to dirty pointers Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 5fbfc47e980d..376882d95825 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-12_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-12_amd64.deb?sv=2015-04-05&sr=b&sig=iIHm3VuMr%2BcvLP4Mcq0I90JUmxuw35%2FbktTwt13%2FqbE%3D&se=2031-07-23T23%3A48%3A11Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-13_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-13_amd64.deb?sv=2015-04-05&sr=b&sig=YeXV0av6rUxy3s5VlQf4wsv6dLOKIGkkkP8lldlGr00%3D&se=2031-07-27T07%3A49%3A38Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-12_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-13_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-12_amd64.deb?sv=2015-04-05&sr=b&sig=Guh0wkJFpWssS10eiwxeuzAOQEsAtbdfVzpRS%2F9uC6k%3D&se=2031-07-23T23%3A48%3A26Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-13_amd64.deb?sv=2015-04-05&sr=b&sig=u4dKbtc%2FAvlqq7l7BT9WcmLVEsWoV1LqOxSbBy0CkiA%3D&se=2031-07-27T07%3A50%3A08Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From 2a69f372c3edc145165a0b5a26d6a36bf28f8d64 Mon Sep 17 00:00:00 2001 From: yurypm Date: Fri, 17 Nov 2017 20:03:51 +0000 Subject: [PATCH 0933/1011] [Arista7260cx3] fancontrol configuration file (#1163) Signed-off-by: Yury Murashka --- device/arista/x86_64-arista_7260cx3_64/fancontrol | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 device/arista/x86_64-arista_7260cx3_64/fancontrol diff --git a/device/arista/x86_64-arista_7260cx3_64/fancontrol b/device/arista/x86_64-arista_7260cx3_64/fancontrol new file mode 100644 index 000000000000..a9f3f97c051d --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/fancontrol @@ -0,0 +1,10 @@ +INTERVAL=5 +DEVPATH=hwmon1=devices/pci0000:00/0000:00:1c.0/0000:06:00.0/i2c-1/1-004c hwmon3=devices/pci0000:ff/0000:ff:0b.3/i2c-85/85-0060 +DEVNAME=hwmon1=max6658 hwmon3=rook_cpld +FCTEMPS=hwmon3/pwm4=hwmon1/temp1_input hwmon3/pwm3=hwmon1/temp1_input hwmon3/pwm2=hwmon1/temp1_input hwmon3/pwm1=hwmon1/temp1_input +FCFANS=hwmon3/pwm4=hwmon3/fan4_input hwmon3/pwm3=hwmon3/fan3_input hwmon3/pwm2=hwmon3/fan2_input hwmon3/pwm1=hwmon3/fan1_input +MINTEMP=hwmon3/pwm4=50 hwmon3/pwm3=50 hwmon3/pwm2=50 hwmon3/pwm1=50 +MINPWM=hwmon3/pwm4=102 hwmon3/pwm3=102 hwmon3/pwm2=102 hwmon3/pwm1=102 +MAXTEMP=hwmon3/pwm4=60 hwmon3/pwm3=60 hwmon3/pwm2=60 hwmon3/pwm1=60 +MINSTART=hwmon3/pwm4=102 hwmon3/pwm3=102 hwmon3/pwm2=102 hwmon3/pwm1=102 +MINSTOP=hwmon3/pwm4=102 hwmon3/pwm3=102 hwmon3/pwm2=102 hwmon3/pwm1=102 From 223a38c02f735bca216f636dd4d6d14af2440e02 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Fri, 17 Nov 2017 14:51:48 -0800 Subject: [PATCH 0934/1011] Update isc-dhcp source to v4.3.3-6; create new patch against it (#1164) - Found a bug in v4.3.1-6 in which dhcrelay would not start if passed an interface name with a length of 15 characters due to truncated copy of interface name in common/lpf.c. Bug was fixed in v4.3.2. - v4.3.3-6 is the newest version we can build for Debian Jessie, as all newer versions require newer versions of debhelper and libbind-export-dev dependencies than are available for Jessie. --- rules/isc-dhcp.mk | 2 +- src/isc-dhcp/Makefile | 4 +- ...d-remote_id-and-bridge-iface-support.patch | 442 ------------------ ...d-remote_id-and-bridge-iface-support.patch | 442 ++++++++++++++++++ 4 files changed, 445 insertions(+), 445 deletions(-) delete mode 100644 src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch create mode 100644 src/isc-dhcp/isc-dhcp-4.3.3-6_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch diff --git a/rules/isc-dhcp.mk b/rules/isc-dhcp.mk index 82f5c3844c6f..7b7f69c6cfc6 100644 --- a/rules/isc-dhcp.mk +++ b/rules/isc-dhcp.mk @@ -1,6 +1,6 @@ # isc-dhcp packages -ISC_DHCP_VERSION = 4.3.1-6 +ISC_DHCP_VERSION = 4.3.3-6 export ISC_DHCP_VERSION diff --git a/src/isc-dhcp/Makefile b/src/isc-dhcp/Makefile index d2304876d1cf..ec4c185b79f9 100644 --- a/src/isc-dhcp/Makefile +++ b/src/isc-dhcp/Makefile @@ -12,11 +12,11 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Clone isc-dhcp repo git clone https://anonscm.debian.org/cgit/pkg-dhcp/isc-dhcp.git pushd ./isc-dhcp - git checkout -f debian/4.3.1-6 + git checkout -f debian/$(ISC_DHCP_VERSION) popd # Apply patch - patch -p1 < isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch + patch -p1 < isc-dhcp-$(ISC_DHCP_VERSION)_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch # Build source and Debian packages pushd ./isc-dhcp diff --git a/src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch b/src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch deleted file mode 100644 index 4dee30238acd..000000000000 --- a/src/isc-dhcp/isc-dhcp-4.3.1_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch +++ /dev/null @@ -1,442 +0,0 @@ -This patch adds the following functionality to dhcrelay in isc-dhcp v4.3.1-6: -* Add customizable Circuit ID and Remote ID fields -* Support for obtaining name of physical interfaces that are part of a bridge interface - -diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c ---- a/isc-dhcp/relay/dhcrelay.c 2017-10-03 01:46:19.811524700 +0000 -+++ b/isc-dhcp/relay/dhcrelay.c 2017-10-03 01:45:50.699524700 +0000 -@@ -73,6 +73,8 @@ - did not match any known circuit ID. */ - int missing_circuit_id = 0; /* Circuit ID option in matching RAI option - was missing. */ -+const char *agent_circuit_id_fmt = NULL; /* Circuit ID custom format string. */ -+const char *agent_remote_id_fmt = NULL; /* Remote ID custom format string. */ - int max_hop_count = 10; /* Maximum hop count */ - - #ifdef DHCPv6 -@@ -120,6 +122,14 @@ - char *dhcrelay_sub_id = NULL; - #endif - -+struct interface_name_alias_tuple { -+ char if_name[IFNAMSIZ + 1]; -+ char if_alias[IFNAMSIZ + 1]; -+}; -+ -+static struct interface_name_alias_tuple *g_interface_name_alias_map = NULL; -+static size_t g_interface_name_alias_map_size = 0; -+ - static void do_relay4(struct interface_info *, struct dhcp_packet *, - unsigned int, unsigned int, struct iaddr, - struct hardware *); -@@ -132,6 +142,10 @@ - struct interface_info **, - struct dhcp_packet *, unsigned); - -+static int load_interface_alias_map(const char *port_alias_map_file_path); -+static int get_interface_alias_by_name(const char *if_name, char *if_alias_out); -+static void free_interface_alias_map(void); -+ - static const char copyright[] = - "Copyright 2004-2014 Internet Systems Consortium."; - static const char arr[] = "All rights reserved."; -@@ -140,28 +154,42 @@ - static const char url[] = - "For info, please visit https://www.isc.org/software/dhcp/"; - -+#define DHCRELAY_OPTION82_USAGE \ -+"circuit_id/remote_id interpreted sequences are:\n" \ -+"\n" \ -+" %%%% A single %%\n" \ -+" %%h Hostname of device\n" \ -+" %%p Alias of interface that generated the request\n" \ -+" %%P Hardware address of interface that generated the request\n" \ -+" %%C Client hardware address\n" \ -+" %%I DHCP relay agent IP Address\n" \ -+ - #ifdef DHCPv6 - #define DHCRELAY_USAGE \ --"Usage: dhcrelay [-4] [-d] [-q] [-a] [-D]\n"\ -+"Usage: dhcrelay [-4] [-d] [-q] [-a ] [-D]\n"\ - " [-A ] [-c ] [-p ]\n" \ - " [-pf ] [--no-pid]\n"\ - " [-m append|replace|forward|discard]\n" \ -+" [--name-alias-map-file ]\n" \ - " [-i interface0 [ ... -i interfaceN]\n" \ - " server0 [ ... serverN]\n\n" \ - " dhcrelay -6 [-d] [-q] [-I] [-c ] [-p ]\n" \ - " [-pf ] [--no-pid]\n" \ -+" [--name-alias-map-file ]\n" \ - " [-s ]\n" \ - " -l lower0 [ ... -l lowerN]\n" \ - " -u upper0 [ ... -u upperN]\n" \ - " lower (client link): [address%%]interface[#index]\n" \ --" upper (server link): [address%%]interface" -+" upper (server link): [address%%]interface\n\n" DHCRELAY_OPTION82_USAGE - #else - #define DHCRELAY_USAGE \ --"Usage: dhcrelay [-d] [-q] [-a] [-D] [-A ] [-c ] [-p ]\n" \ --" [-pf ] [--no-pid]\n" \ -+"Usage: dhcrelay [-d] [-q] [-a ] [-D]\n" \ -+" [-A ] [-c ] [-p ]\n" \ -+" [-pf ] [--no-pid]\n"\ - " [-m append|replace|forward|discard]\n" \ -+" [--name-alias-map-file ]\n" \ - " [-i interface0 [ ... -i interfaceN]\n" \ --" server0 [ ... serverN]\n\n" -+" server0 [ ... serverN]\n\n" DHCRELAY_OPTION82_USAGE - #endif - - static void usage() { -@@ -287,6 +315,15 @@ - local_family_set = 1; - local_family = AF_INET; - #endif -+ if (++i == argc) -+ usage(); -+ -+ if (argv[i] != NULL && argv[i][0] != '-') -+ agent_circuit_id_fmt = argv[i++]; -+ -+ if (argv[i] != NULL && argv[i][0] != '-') -+ agent_remote_id_fmt = argv[i]; -+ - add_agent_options = 1; - } else if (!strcmp(argv[i], "-A")) { - #ifdef DHCPv6 -@@ -383,6 +420,13 @@ - no_dhcrelay_pid = ISC_TRUE; - } else if (!strcmp(argv[i], "--no-pid")) { - no_pid_file = ISC_TRUE; -+ } else if (!strcmp(argv[i], "--name-alias-map-file")) { -+ if (++i == argc) -+ usage(); -+ if (load_interface_alias_map(argv[i]) != 0) -+ log_fatal("Failed to load interface name-alias map."); -+ path_dhcrelay_pid = argv[i]; -+ no_dhcrelay_pid = ISC_TRUE; - } else if (!strcmp(argv[i], "--version")) { - log_info("isc-dhcrelay-%s", PACKAGE_VERSION); - exit(0); -@@ -602,6 +646,8 @@ - dispatch(); - - /* In fact dispatch() never returns. */ -+ free_interface_alias_map(); -+ - return (0); - } - -@@ -690,10 +736,9 @@ - &to, htop) < 0) { - ++server_packet_errors; - } else { -- log_debug("Forwarded BOOTREPLY for %s to %s", -- print_hw_addr(packet->htype, packet->hlen, -- packet->chaddr), -- inet_ntoa(to.sin_addr)); -+ //log_debug("Forwarded BOOTREPLY for %s to %s", -+ // print_hw_addr(packet->htype, packet->hlen, packet->chaddr), -+ // inet_ntoa(to.sin_addr)); - - ++server_packets_relayed; - } -@@ -732,10 +777,10 @@ - &sp->to, NULL) < 0) { - ++client_packet_errors; - } else { -- log_debug("Forwarded BOOTREQUEST for %s to %s", -- print_hw_addr(packet->htype, packet->hlen, -- packet->chaddr), -- inet_ntoa(sp->to.sin_addr)); -+ //log_debug("Forwarded BOOTREQUEST for %s to %s", -+ // print_hw_addr(packet->htype, packet->hlen, packet->chaddr), -+ // inet_ntoa(sp->to.sin_addr)); -+ - ++client_packets_relayed; - } - } -@@ -937,6 +982,152 @@ - return (-1); - } - -+static int -+_bridgefdbquery(const char *hwAddr, char *interface, int *vlanid) { -+ -+#define xstr(s) str(s) -+#define str(s) #s -+#define FDB_STRING_LEN 100 -+#define FDB_BUFFER_LEN (FDB_STRING_LEN + 1) -+ -+/* -+ * Format for sscanf() to read the 1st, 3th, and 5th -+ * space-delimited fields -+ * -+ * bridge fdb show output -+ * 6c:64:1a:00:06:13 dev swp35 vlan 0 master bridge permanent -+ */ -+#define FDB_LINE_FORMAT "%" xstr(FDB_STRING_LEN) "s %*s " \ -+ "%" xstr(FDB_STRING_LEN) "s %*s %d %*s" -+ -+ char cmdstr[FDB_BUFFER_LEN]; -+ char buf[FDB_BUFFER_LEN]; -+ char macAddr[FDB_BUFFER_LEN]; -+ -+ if ((interface == NULL) || (vlanid == NULL)) { -+ return 0; -+ } -+ sprintf(cmdstr, "bridge fdb show | grep -m 1 %s", hwAddr); -+ FILE *cmd = popen(cmdstr, "r"); -+ -+ if (cmd != NULL) { -+ while (fgets(buf, sizeof(buf), cmd)) { -+ sscanf(buf, FDB_LINE_FORMAT, macAddr, interface, vlanid); -+ //log_debug("bridgefdbquery: macAddr:%s interface: %s vlanid %d", -+ // macAddr, interface, *vlanid); -+ } -+ pclose(cmd); -+ return 0; -+ } -+ -+ return -1; -+} -+ -+/* -+ * Format the message that will be used by circuit_id and remote_id -+ */ -+static int -+format_relay_agent_rfc3046_msg(struct interface_info *ip, struct dhcp_packet *packet, -+ const char *format, char *msg, size_t msgn) { -+ size_t len = 0; -+ char hostname[HOST_NAME_MAX + 1] = { 0 }; -+ char ifname[IFNAMSIZ + 1] = { 0 }; -+ char *buf = msg; -+ -+ for ( ; format && *format && len < msgn; ++format) { -+ size_t strn = 0; -+ const char *str = NULL; -+ -+ if (*format == '%') { -+ switch (*++format) { -+ case '\0': -+ --format; -+ break; -+ -+ case '%': /* A literal '%' */ -+ str = "%"; -+ break; -+ -+ case 'h': /* Hostname */ -+ gethostname(hostname, HOST_NAME_MAX); -+ str = hostname; -+ break; -+ -+ case 'p': /* Name of interface that we received the request from */ -+ /* -+ * Query FDB to identify the exact physical interface only when source MAC address -+ * is present and '20: DHCP relay agent IP address' (giaddr) is not present -+ */ -+ if (packet->htype && !packet->giaddr.s_addr) { -+ int ret = 0, vlanid = 0; -+ -+ ret = _bridgefdbquery(print_hw_addr(packet->htype, packet->hlen, packet->chaddr), -+ ip->name, -+ &vlanid); -+ -+ if (ret < 0) { -+ //log_debug("MAC Address: %s (interface:%s vlan:%d) not found in bridge fdb show", -+ // print_hw_addr (packet->htype, packet->hlen, packet->chaddr), -+ // ip->name, -+ // vlanid); -+ -+ strncpy(ifname, ip->name, IFNAMSIZ); -+ } -+ else if (strlen(ip->name) > 0) { -+ // Translate SONiC interface name to vendor alias -+ if (get_interface_alias_by_name(ip->name, ifname) < 0) { -+ log_error("Failed to retrieve alias for interface name '%s'. Defaulting to interface name.", ip->name); -+ strncpy(ifname, ip->name, IFNAMSIZ); -+ } -+ -+ //log_debug("Mapped interface name '%s' to alias '%s'", ip->name, ifname); -+ -+ //log_debug("Adding option 82 interface alias for MAC Address %s as '%s'", -+ // print_hw_addr (packet->htype, packet->hlen, packet->chaddr), -+ // ifname); -+ } -+ -+ str = ifname; -+ } -+ break; -+ -+ case 'P': /* Physical address of interface that we received the request from */ -+ str = print_hw_addr(ip->hw_address.hbuf[0], ip->hw_address.hlen - 1, &ip->hw_address.hbuf[1]); -+ break; -+ -+ case 'C': /* 24: Client hardware address */ -+ str = print_hw_addr(packet->htype, packet->hlen, packet->chaddr); -+ break; -+ -+ case 'I': /* 20: DHCP relay agent IP address */ -+ str = inet_ntoa(packet->giaddr); -+ break; -+ -+ default: -+ log_error("Option %%%c is unrecognized and will not be formatted!", *format); -+ continue; -+ } -+ -+ if (str) -+ strn = strlen(str); -+ } else { -+ str = format; -+ strn += 1; -+ } -+ -+ // Do we have room? -+ if ((strn+len) > msgn) { -+ return 0; -+ } -+ -+ memcpy(buf+len, str, strn); -+ len += strn; -+ } -+ -+ return len; -+} -+ -+ - /* - * Examine a packet to see if it's a candidate to have a Relay - * Agent Information option tacked onto its tail. If it is, tack -@@ -948,6 +1139,8 @@ - int is_dhcp = 0, mms; - unsigned optlen; - u_int8_t *op, *nextop, *sp, *max, *end_pad = NULL; -+ char circuit_id_buf[255] = { '\0', }; -+ char remote_id_buf[255] = { '\0', }; - - /* If we're not adding agent options to packets, we can skip - this. */ -@@ -1077,6 +1270,38 @@ - op = sp; - #endif - -+ /* option82: custom string for circuit_id */ -+ if (agent_circuit_id_fmt) { -+ size_t len = 0; -+ -+ len = format_relay_agent_rfc3046_msg(ip, packet, agent_circuit_id_fmt, -+ circuit_id_buf, sizeof(circuit_id_buf)); -+ -+ if (len > 0) { -+ ip->circuit_id = (uint8_t *)circuit_id_buf; -+ ip->circuit_id_len = len; -+ -+ //log_debug("Sending on %s option82:circuit_id='%s' (%d)", -+ // ip->name, (char *)ip->circuit_id, ip->circuit_id_len); -+ } -+ } -+ -+ /* option82: custom string for remote_id */ -+ if (agent_remote_id_fmt) { -+ size_t len = 0; -+ -+ len = format_relay_agent_rfc3046_msg(ip, packet, agent_remote_id_fmt, -+ remote_id_buf, sizeof(remote_id_buf)); -+ -+ if (len > 0) { -+ ip->remote_id = (uint8_t *)remote_id_buf; -+ ip->remote_id_len = len; -+ -+ //log_debug("Sending on %s option82:remote_id='%s' (%d)", -+ // ip->name, (char *)ip->remote_id, ip->remote_id_len); -+ } -+ } -+ - /* Sanity check. Had better not ever happen. */ - if ((ip->circuit_id_len > 255) ||(ip->circuit_id_len < 1)) - log_fatal("Circuit ID length %d out of range [1-255] on " -@@ -1102,7 +1327,7 @@ - * If not, forward without adding the option. - */ - if (max - sp >= optlen + 3) { -- log_debug("Adding %d-byte relay agent option", optlen + 3); -+ //log_debug("Adding %d-byte relay agent option", optlen + 3); - - /* Okay, cons up *our* Relay Agent Information option. */ - *sp++ = DHO_DHCP_AGENT_OPTIONS; -@@ -1726,3 +1951,73 @@ - - exit(0); - } -+ -+#define MAX_PORT_CONFIG_LINE_LEN 1024 -+ -+// Allocates and loads global map g_interface_name_alias_map -+// Also sets global g_interface_name_alias_map_size -+static int -+load_interface_alias_map(const char *port_alias_map_file_path) { -+ int i = 0; -+ FILE *fp = NULL; -+ char line[MAX_PORT_CONFIG_LINE_LEN] = { 0 }; -+ -+ fp = fopen(port_alias_map_file_path,"r"); -+ if (fp == NULL) { -+ log_error("Unable to open %s", port_alias_map_file_path); -+ return -1; -+ } -+ -+ g_interface_name_alias_map_size = 0; -+ -+ // Count the number of interfaces listed in the file -+ while (fgets(line, sizeof(line), fp)) { -+ g_interface_name_alias_map_size++; -+ } -+ -+ // Allocate our map accordingly -+ g_interface_name_alias_map = ((struct interface_name_alias_tuple *) -+ dmalloc((sizeof(struct interface_name_alias_tuple) * g_interface_name_alias_map_size), -+ MDL)); -+ -+ // Reset file position indicator to beginning of file -+ fseek(fp, 0, SEEK_SET); -+ -+ // Every line should contain exactly one name-alias pair -+ while (fgets(line, sizeof(line), fp)) { -+ // Each line should read as "" -+ sscanf(line, "%s %s", g_interface_name_alias_map[i].if_name, g_interface_name_alias_map[i].if_alias); -+ i++; -+ } -+ -+ fclose(fp); -+ -+ log_info("Loaded %d interface name-alias mappings", i); -+ -+ return 0; -+} -+ -+// Locates alias for port named if_name, copies alias into if_alias_out, up to a -+// max of IFNAMSIZ bytes. -+// Returns 0 on success, -1 on failure -+static int -+get_interface_alias_by_name(const char *if_name, char *if_alias_out) { -+ int i = 0; -+ -+ for (i = 0; i < g_interface_name_alias_map_size; i++) { -+ if (strncmp(if_name, g_interface_name_alias_map[i].if_name, IFNAMSIZ) == 0) { -+ strncpy(if_alias_out, g_interface_name_alias_map[i].if_alias, IFNAMSIZ); -+ return 0; -+ } -+ } -+ -+ return -1; -+} -+ -+// Frees global map g_interface_name_alias_map -+// Sets g_interface_name_alias_map_size to 0 -+static void -+free_interface_alias_map(void) { -+ free(g_interface_name_alias_map); -+ g_interface_name_alias_map_size = 0; -+} diff --git a/src/isc-dhcp/isc-dhcp-4.3.3-6_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch b/src/isc-dhcp/isc-dhcp-4.3.3-6_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch new file mode 100644 index 000000000000..6d2a850379cd --- /dev/null +++ b/src/isc-dhcp/isc-dhcp-4.3.3-6_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch @@ -0,0 +1,442 @@ +This patch adds the following functionality to dhcrelay in isc-dhcp v4.3.3-6: +* Add customizable Circuit ID and Remote ID fields +* Support for obtaining name of physical interfaces that are part of a bridge interface + +diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c +--- a/isc-dhcp/relay/dhcrelay.c 2017-11-17 00:36:51.575121900 +0000 ++++ b/isc-dhcp/relay/dhcrelay.c 2017-11-17 00:52:51.024607833 +0000 +@@ -73,6 +73,8 @@ + did not match any known circuit ID. */ + int missing_circuit_id = 0; /* Circuit ID option in matching RAI option + was missing. */ ++const char *agent_circuit_id_fmt = NULL; /* Circuit ID custom format string. */ ++const char *agent_remote_id_fmt = NULL; /* Remote ID custom format string. */ + int max_hop_count = 10; /* Maximum hop count */ + + #ifdef DHCPv6 +@@ -120,6 +122,14 @@ + char *dhcrelay_sub_id = NULL; + #endif + ++struct interface_name_alias_tuple { ++ char if_name[IFNAMSIZ + 1]; ++ char if_alias[IFNAMSIZ + 1]; ++}; ++ ++static struct interface_name_alias_tuple *g_interface_name_alias_map = NULL; ++static size_t g_interface_name_alias_map_size = 0; ++ + static void do_relay4(struct interface_info *, struct dhcp_packet *, + unsigned int, unsigned int, struct iaddr, + struct hardware *); +@@ -132,6 +142,10 @@ + struct interface_info **, + struct dhcp_packet *, unsigned); + ++static int load_interface_alias_map(const char *port_alias_map_file_path); ++static int get_interface_alias_by_name(const char *if_name, char *if_alias_out); ++static void free_interface_alias_map(void); ++ + static const char copyright[] = + "Copyright 2004-2015 Internet Systems Consortium."; + static const char arr[] = "All rights reserved."; +@@ -140,28 +154,41 @@ + static const char url[] = + "For info, please visit https://www.isc.org/software/dhcp/"; + ++#define DHCRELAY_OPTION82_USAGE \ ++"circuit_id/remote_id interpreted sequences are:\n" \ ++"\n" \ ++" %%%% A single %%\n" \ ++" %%h Hostname of device\n" \ ++" %%p Alias of interface that generated the request\n" \ ++" %%P Hardware address of interface that generated the request\n" \ ++" %%C Client hardware address\n" \ ++" %%I DHCP relay agent IP Address\n" \ ++ + #ifdef DHCPv6 + #define DHCRELAY_USAGE \ +-"Usage: dhcrelay [-4] [-d] [-q] [-a] [-D]\n"\ ++"Usage: dhcrelay [-4] [-d] [-q] [-a ] [-D]\n"\ + " [-A ] [-c ] [-p ]\n" \ + " [-pf ] [--no-pid]\n"\ + " [-m append|replace|forward|discard]\n" \ ++" [--name-alias-map-file ]\n" \ + " [-i interface0 [ ... -i interfaceN]\n" \ + " server0 [ ... serverN]\n\n" \ + " dhcrelay -6 [-d] [-q] [-I] [-c ] [-p ]\n" \ + " [-pf ] [--no-pid]\n" \ ++" [--name-alias-map-file ]\n" \ + " [-s ]\n" \ + " -l lower0 [ ... -l lowerN]\n" \ + " -u upper0 [ ... -u upperN]\n" \ + " lower (client link): [address%%]interface[#index]\n" \ +-" upper (server link): [address%%]interface" ++" upper (server link): [address%%]interface\n\n" DHCRELAY_OPTION82_USAGE + #else + #define DHCRELAY_USAGE \ +-"Usage: dhcrelay [-d] [-q] [-a] [-D] [-A ] [-c ] [-p ]\n" \ +-" [-pf ] [--no-pid]\n" \ ++"Usage: dhcrelay [-d] [-q] [-a ] [-D]\n" \ ++" [-A ] [-c ] [-p ]\n" \ ++" [-pf ] [--no-pid]\n"\ + " [-m append|replace|forward|discard]\n" \ + " [-i interface0 [ ... -i interfaceN]\n" \ +-" server0 [ ... serverN]\n\n" ++" server0 [ ... serverN]\n\n" DHCRELAY_OPTION82_USAGE + #endif + + static void usage() { +@@ -287,6 +314,15 @@ + local_family_set = 1; + local_family = AF_INET; + #endif ++ if (++i == argc) ++ usage(); ++ ++ if (argv[i] != NULL && argv[i][0] != '-') ++ agent_circuit_id_fmt = argv[i++]; ++ ++ if (argv[i] != NULL && argv[i][0] != '-') ++ agent_remote_id_fmt = argv[i]; ++ + add_agent_options = 1; + } else if (!strcmp(argv[i], "-A")) { + #ifdef DHCPv6 +@@ -383,6 +419,13 @@ + no_dhcrelay_pid = ISC_TRUE; + } else if (!strcmp(argv[i], "--no-pid")) { + no_pid_file = ISC_TRUE; ++ } else if (!strcmp(argv[i], "--name-alias-map-file")) { ++ if (++i == argc) ++ usage(); ++ if (load_interface_alias_map(argv[i]) != 0) ++ log_fatal("Failed to load interface name-alias map."); ++ path_dhcrelay_pid = argv[i]; ++ no_dhcrelay_pid = ISC_TRUE; + } else if (!strcmp(argv[i], "--version")) { + log_info("isc-dhcrelay-%s", PACKAGE_VERSION); + exit(0); +@@ -602,6 +645,8 @@ + dispatch(); + + /* In fact dispatch() never returns. */ ++ free_interface_alias_map(); ++ + return (0); + } + +@@ -690,10 +735,10 @@ + &to, htop) < 0) { + ++server_packet_errors; + } else { +- log_debug("Forwarded BOOTREPLY for %s to %s", +- print_hw_addr(packet->htype, packet->hlen, +- packet->chaddr), +- inet_ntoa(to.sin_addr)); ++ //log_debug("Forwarded BOOTREPLY for %s to %s", ++ // print_hw_addr(packet->htype, packet->hlen, ++ // packet->chaddr), ++ // inet_ntoa(to.sin_addr)); + + ++server_packets_relayed; + } +@@ -732,10 +777,11 @@ + &sp->to, NULL) < 0) { + ++client_packet_errors; + } else { +- log_debug("Forwarded BOOTREQUEST for %s to %s", +- print_hw_addr(packet->htype, packet->hlen, +- packet->chaddr), +- inet_ntoa(sp->to.sin_addr)); ++ //log_debug("Forwarded BOOTREQUEST for %s to %s", ++ // print_hw_addr(packet->htype, packet->hlen, ++ // packet->chaddr), ++ // inet_ntoa(sp->to.sin_addr)); ++ + ++client_packets_relayed; + } + } +@@ -937,6 +983,151 @@ + return (-1); + } + ++static int ++_bridgefdbquery(const char *hwAddr, char *interface, int *vlanid) { ++ ++#define xstr(s) str(s) ++#define str(s) #s ++#define FDB_STRING_LEN 100 ++#define FDB_BUFFER_LEN (FDB_STRING_LEN + 1) ++ ++/* ++ * Format for sscanf() to read the 1st, 3th, and 5th ++ * space-delimited fields ++ * ++ * bridge fdb show output ++ * 6c:64:1a:00:06:13 dev swp35 vlan 0 master bridge permanent ++ */ ++#define FDB_LINE_FORMAT "%" xstr(FDB_STRING_LEN) "s %*s " \ ++ "%" xstr(FDB_STRING_LEN) "s %*s %d %*s" ++ ++ char cmdstr[FDB_BUFFER_LEN]; ++ char buf[FDB_BUFFER_LEN]; ++ char macAddr[FDB_BUFFER_LEN]; ++ ++ if ((interface == NULL) || (vlanid == NULL)) { ++ return 0; ++ } ++ sprintf(cmdstr, "bridge fdb show | grep -m 1 %s", hwAddr); ++ FILE *cmd = popen(cmdstr, "r"); ++ ++ if (cmd != NULL) { ++ while (fgets(buf, sizeof(buf), cmd)) { ++ sscanf(buf, FDB_LINE_FORMAT, macAddr, interface, vlanid); ++ //log_debug("bridgefdbquery: macAddr:%s interface: %s vlanid %d", ++ // macAddr, interface, *vlanid); ++ } ++ pclose(cmd); ++ return 0; ++ } ++ ++ return -1; ++} ++ ++/* ++ * Format the message that will be used by circuit_id and remote_id ++ */ ++static int ++format_relay_agent_rfc3046_msg(struct interface_info *ip, struct dhcp_packet *packet, ++ const char *format, char *msg, size_t msgn) { ++ size_t len = 0; ++ char hostname[HOST_NAME_MAX + 1] = { 0 }; ++ char ifname[IFNAMSIZ + 1] = { 0 }; ++ char *buf = msg; ++ ++ for ( ; format && *format && len < msgn; ++format) { ++ size_t strn = 0; ++ const char *str = NULL; ++ ++ if (*format == '%') { ++ switch (*++format) { ++ case '\0': ++ --format; ++ break; ++ ++ case '%': /* A literal '%' */ ++ str = "%"; ++ break; ++ ++ case 'h': /* Hostname */ ++ gethostname(hostname, HOST_NAME_MAX); ++ str = hostname; ++ break; ++ ++ case 'p': /* Name of interface that we received the request from */ ++ /* ++ * Query FDB to identify the exact physical interface only when source MAC address ++ * is present and '20: DHCP relay agent IP address' (giaddr) is not present ++ */ ++ if (packet->htype && !packet->giaddr.s_addr) { ++ int ret = 0, vlanid = 0; ++ ++ ret = _bridgefdbquery(print_hw_addr(packet->htype, packet->hlen, packet->chaddr), ++ ip->name, ++ &vlanid); ++ ++ if (ret < 0) { ++ //log_debug("MAC Address: %s (interface:%s vlan:%d) not found in bridge fdb show", ++ // print_hw_addr (packet->htype, packet->hlen, packet->chaddr), ++ // ip->name, ++ // vlanid); ++ ++ strncpy(ifname, ip->name, IFNAMSIZ); ++ } ++ else if (strlen(ip->name) > 0) { ++ // Translate SONiC interface name to vendor alias ++ if (get_interface_alias_by_name(ip->name, ifname) < 0) { ++ log_error("Failed to retrieve alias for interface name '%s'. Defaulting to interface name.", ip->name); ++ strncpy(ifname, ip->name, IFNAMSIZ); ++ } ++ ++ //log_debug("Mapped interface name '%s' to alias '%s'", ip->name, ifname); ++ ++ //log_debug("Adding option 82 interface alias for MAC Address %s as '%s'", ++ // print_hw_addr (packet->htype, packet->hlen, packet->chaddr), ++ // ifname); ++ } ++ ++ str = ifname; ++ } ++ break; ++ ++ case 'P': /* Physical address of interface that we received the request from */ ++ str = print_hw_addr(ip->hw_address.hbuf[0], ip->hw_address.hlen - 1, &ip->hw_address.hbuf[1]); ++ break; ++ ++ case 'C': /* 24: Client hardware address */ ++ str = print_hw_addr(packet->htype, packet->hlen, packet->chaddr); ++ break; ++ ++ case 'I': /* 20: DHCP relay agent IP address */ ++ str = inet_ntoa(packet->giaddr); ++ break; ++ ++ default: ++ log_error("Option %%%c is unrecognized and will not be formatted!", *format); ++ continue; ++ } ++ ++ if (str) ++ strn = strlen(str); ++ } else { ++ str = format; ++ strn += 1; ++ } ++ ++ // Do we have room? ++ if ((strn+len) > msgn) { ++ return 0; ++ } ++ ++ memcpy(buf+len, str, strn); ++ len += strn; ++ } ++ ++ return len; ++} ++ + /* + * Examine a packet to see if it's a candidate to have a Relay + * Agent Information option tacked onto its tail. If it is, tack +@@ -948,6 +1139,8 @@ + int is_dhcp = 0, mms; + unsigned optlen; + u_int8_t *op, *nextop, *sp, *max, *end_pad = NULL; ++ char circuit_id_buf[255] = { '\0', }; ++ char remote_id_buf[255] = { '\0', }; + + /* If we're not adding agent options to packets, we can skip + this. */ +@@ -1077,6 +1270,38 @@ + op = sp; + #endif + ++ /* option82: custom string for circuit_id */ ++ if (agent_circuit_id_fmt) { ++ size_t len = 0; ++ ++ len = format_relay_agent_rfc3046_msg(ip, packet, agent_circuit_id_fmt, ++ circuit_id_buf, sizeof(circuit_id_buf)); ++ ++ if (len > 0) { ++ ip->circuit_id = (uint8_t *)circuit_id_buf; ++ ip->circuit_id_len = len; ++ ++ //log_debug("Sending on %s option82:circuit_id='%s' (%d)", ++ // ip->name, (char *)ip->circuit_id, ip->circuit_id_len); ++ } ++ } ++ ++ /* option82: custom string for remote_id */ ++ if (agent_remote_id_fmt) { ++ size_t len = 0; ++ ++ len = format_relay_agent_rfc3046_msg(ip, packet, agent_remote_id_fmt, ++ remote_id_buf, sizeof(remote_id_buf)); ++ ++ if (len > 0) { ++ ip->remote_id = (uint8_t *)remote_id_buf; ++ ip->remote_id_len = len; ++ ++ //log_debug("Sending on %s option82:remote_id='%s' (%d)", ++ // ip->name, (char *)ip->remote_id, ip->remote_id_len); ++ } ++ } ++ + /* Sanity check. Had better not ever happen. */ + if ((ip->circuit_id_len > 255) ||(ip->circuit_id_len < 1)) + log_fatal("Circuit ID length %d out of range [1-255] on " +@@ -1102,7 +1327,7 @@ + * If not, forward without adding the option. + */ + if (max - sp >= optlen + 3) { +- log_debug("Adding %d-byte relay agent option", optlen + 3); ++ //log_debug("Adding %d-byte relay agent option", optlen + 3); + + /* Okay, cons up *our* Relay Agent Information option. */ + *sp++ = DHO_DHCP_AGENT_OPTIONS; +@@ -1735,3 +1960,73 @@ + + exit(0); + } ++ ++#define MAX_PORT_CONFIG_LINE_LEN 1024 ++ ++// Allocates and loads global map g_interface_name_alias_map ++// Also sets global g_interface_name_alias_map_size ++static int ++load_interface_alias_map(const char *port_alias_map_file_path) { ++ int i = 0; ++ FILE *fp = NULL; ++ char line[MAX_PORT_CONFIG_LINE_LEN] = { 0 }; ++ ++ fp = fopen(port_alias_map_file_path,"r"); ++ if (fp == NULL) { ++ log_error("Unable to open %s", port_alias_map_file_path); ++ return -1; ++ } ++ ++ g_interface_name_alias_map_size = 0; ++ ++ // Count the number of interfaces listed in the file ++ while (fgets(line, sizeof(line), fp)) { ++ g_interface_name_alias_map_size++; ++ } ++ ++ // Allocate our map accordingly ++ g_interface_name_alias_map = ((struct interface_name_alias_tuple *) ++ dmalloc((sizeof(struct interface_name_alias_tuple) * g_interface_name_alias_map_size), ++ MDL)); ++ ++ // Reset file position indicator to beginning of file ++ fseek(fp, 0, SEEK_SET); ++ ++ // Every line should contain exactly one name-alias pair ++ while (fgets(line, sizeof(line), fp)) { ++ // Each line should read as "" ++ sscanf(line, "%s %s", g_interface_name_alias_map[i].if_name, g_interface_name_alias_map[i].if_alias); ++ i++; ++ } ++ ++ fclose(fp); ++ ++ log_info("Loaded %d interface name-alias mappings", i); ++ ++ return 0; ++} ++ ++// Locates alias for port named if_name, copies alias into if_alias_out, up to a ++// max of IFNAMSIZ bytes. ++// Returns 0 on success, -1 on failure ++static int ++get_interface_alias_by_name(const char *if_name, char *if_alias_out) { ++ int i = 0; ++ ++ for (i = 0; i < g_interface_name_alias_map_size; i++) { ++ if (strncmp(if_name, g_interface_name_alias_map[i].if_name, IFNAMSIZ) == 0) { ++ strncpy(if_alias_out, g_interface_name_alias_map[i].if_alias, IFNAMSIZ); ++ return 0; ++ } ++ } ++ ++ return -1; ++} ++ ++// Frees global map g_interface_name_alias_map ++// Sets g_interface_name_alias_map_size to 0 ++static void ++free_interface_alias_map(void) { ++ free(g_interface_name_alias_map); ++ g_interface_name_alias_map_size = 0; ++} From eef4a89dc4b6312fe0d86b72240be3b90c5757bb Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 17 Nov 2017 17:20:18 -0800 Subject: [PATCH 0935/1011] [swss]: Update sonic-swss submodule (#1165) It contains: [pfcactionhandler]: match correct value when aclhandler creates ACL rules (#393) [orchagent]: Fix issue with bind ACL table group to port (#386) [vlanmgrd]: Use sonic-swss-common instead of exec redis-cli (#392) Signed-off-by: Shu0T1an ChenG --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 4cb542f1d933..7c9f01c5cb72 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 4cb542f1d933ea016bcf247a79d92684bb959284 +Subproject commit 7c9f01c5cb72dcfb9a142fa2cde4cb1c0191678b From df529efef706b5ea35abd6c7da079f34ae92cf30 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 20 Nov 2017 10:05:08 -0800 Subject: [PATCH 0936/1011] [baseimage]: fix mac address calculation on mellanox and centec platform (#1166) --- files/image_config/platform/rc.local | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index f4dd9cb3ad78..c7915db9eb7c 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -84,7 +84,7 @@ if [ -f /host/image-$sonic_version/platform/firsttime ]; then SYSTEM_MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') # Align last byte of MAC if necessary - if [ "$SONIC_ASIC_TYPE" == "mellanox" -o "$SONIC_ASIC_TYPE" == "centec" ]; then + if [ "$SONIC_ASIC_TYPE" = "mellanox" ] || [ "$SONIC_ASIC_TYPE" = "centec" ]; then last_byte=$(python -c "print '$SYSTEM_MAC_ADDRESS'[-2:]") aligned_last_byte=$(python -c "print format(int(int('$last_byte', 16) & 0b11000000), '02x')") # put mask and take away the 0x prefix SYSTEM_MAC_ADDRESS=$(python -c "print '$SYSTEM_MAC_ADDRESS'[:-2] + '$aligned_last_byte'") # put aligned byte into the end of MAC From b8e5c9f9044ef2eca9d76b76282e4b850dcb0f11 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Mon, 20 Nov 2017 14:23:13 -0800 Subject: [PATCH 0937/1011] [Mellanox]: Add Mellanox-SN2700 symlink (#1169) Signed-off-by: Qi Luo --- device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700 | 1 + 1 file changed, 1 insertion(+) create mode 120000 device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700 b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700 new file mode 120000 index 000000000000..9f12504c7c5a --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/Mellanox-SN2700 @@ -0,0 +1 @@ +ACS-MSN2700 \ No newline at end of file From dc9f19e90d4eae88d50a2df2625c02be6c48ebcf Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 20 Nov 2017 18:46:59 -0800 Subject: [PATCH 0938/1011] [swss]: Update swss/sairedis submodules (#1172) sairedis: [syncd]: Only query queue counters that are needed by the application swss: [pfcwdorch]: Set correct polling interval for pfcWdOrch object [portsorch]: Only add stat IDs that are needed to query Signed-off-by: Shu0T1an ChenG --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index f1f7f267f973..0187c64a57b2 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit f1f7f267f97316fd02359e796c8af2fa971862f8 +Subproject commit 0187c64a57b288f9e4898bc9db00f7427eb61ca6 diff --git a/src/sonic-swss b/src/sonic-swss index 7c9f01c5cb72..00e38bef0803 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 7c9f01c5cb72dcfb9a142fa2cde4cb1c0191678b +Subproject commit 00e38bef0803eec5172930ba854d38fdf34ab186 From 1f9107d044190078dfc884249563d0eb8c28a4d7 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 20 Nov 2017 21:07:28 -0800 Subject: [PATCH 0939/1011] [DHCP relay]: Wait for all interfaces to be assigned IPv4 addresses before starting relay agent(s) (#1173) --- dockers/docker-dhcp-relay/start.sh | 7 ++++- dockers/docker-dhcp-relay/wait_for_intf.sh.j2 | 31 ++++++++++++++----- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/dockers/docker-dhcp-relay/start.sh b/dockers/docker-dhcp-relay/start.sh index b53d7e4e238a..2ee80c4e3388 100755 --- a/dockers/docker-dhcp-relay/start.sh +++ b/dockers/docker-dhcp-relay/start.sh @@ -6,7 +6,12 @@ rm -f /var/run/rsyslogd.pid # Start rsyslog supervisorctl start rsyslogd -# Wait for all interfaces to come up before starting the DHCP relay agent(s) +# Wait for all interfaces to come up and be assigned IPv4 addresses before +# starting the DHCP relay agent(s). If an interface the relay should listen +# on is down, the relay agent will not start. If an interface the relay should +# listen on is up but does not have an IP address assigned when the relay +# agent starts, it will not listen or send on that interface for the lifetime +# of the process. /usr/bin/wait_for_intf.sh # Start the DHCP relay agent(s) diff --git a/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 index 1524b3221312..037dc66ead63 100644 --- a/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 +++ b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 @@ -1,27 +1,42 @@ #!/usr/bin/env bash -function wait_until_iface_exists +function wait_until_iface_ready { IFACE=$1 - echo "Waiting for interface ${IFACE}..." + echo "Waiting until interface $IFACE is up..." # Wait for the interface to come up (i.e., 'ip link show' returns 0) - until ip link show $IFACE > /dev/null 2>&1; do + until ip link show dev $IFACE up > /dev/null 2>&1; do sleep 1 done - echo "Interface ${IFACE} is created" + echo "Interface $IFACE is up" + + echo "Waiting until interface $IFACE has an IPv4 address..." + + # Wait until the interface gets assigned an IPv4 address + while true; do + IP=$(ip -4 addr show dev $IFACE | grep "inet " | awk '{ print $2 }' | cut -d '/' -f1) + + if [ -n "$IP" ]; then + break + fi + + sleep 1 + done + + echo "Interface $IFACE is configured with IP $IP" } -# Wait for all interfaces to come up before starting the DHCP relay +# Wait for all interfaces to come up and have IPv4 addresses assigned {% for (name, prefix) in INTERFACE %} -wait_until_iface_exists {{ name }} +wait_until_iface_ready {{ name }} {% endfor %} {% for (name, prefix) in VLAN_INTERFACE %} -wait_until_iface_exists {{ name }} +wait_until_iface_ready {{ name }} {% endfor %} {% for (name, prefix) in PORTCHANNEL_INTERFACE %} -wait_until_iface_exists {{ name }} +wait_until_iface_ready {{ name }} {% endfor %} From c5eba7dd34c0a9d92683a42f8e03b9ee1df82d6c Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 22 Nov 2017 00:51:05 -0800 Subject: [PATCH 0940/1011] [baseimage]: Fix racing condition between updategraph and rc.local (#1175) --- files/image_config/updategraph/updategraph.service | 1 + 1 file changed, 1 insertion(+) diff --git a/files/image_config/updategraph/updategraph.service b/files/image_config/updategraph/updategraph.service index c66e9be75702..0162754ab2db 100644 --- a/files/image_config/updategraph/updategraph.service +++ b/files/image_config/updategraph/updategraph.service @@ -1,5 +1,6 @@ [Unit] Description=download minigraph from graph service +After=rc-local.service Before=database.service [Service] From 21764008da7ea3ef013cd8c3a9662b6da48aac61 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Wed, 22 Nov 2017 02:58:20 -0800 Subject: [PATCH 0941/1011] [Aboot] Declare flash_size for all platform (#1171) The flash_size parameter can then be used to compute the varlog_size --- files/Aboot/boot0.j2 | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 18d1ee126c00..4f2367807d90 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -110,24 +110,26 @@ platform_specific() { # set varlog size to 100MB local varlog_size=100 - # This is temporary as the platform= and sid= parameters don't provide enough - # information to identify the SKU - # An initramfs hook or a later processing done by the initscripts will be - # required to read the system eeprom + local flash_size=$(($(df | grep flash | tr -s ' ' | cut -f2 -d' ') / 1000)) + if [ "$platform" = "raven" ]; then aboot_machine=arista_7050_qx32 + flash_size=2000 echo "modprobe.blacklist=radeon" >>/tmp/append fi if [ "$platform" = "crow" ]; then aboot_machine=arista_7050_qx32s + flash_size=3700 echo "modprobe.blacklist=radeon" >>/tmp/append fi if [ "$sid" = "Upperlake" ] || [ "$sid" = "UpperlakeES" ]; then aboot_machine=arista_7060_cx32s + flash_size=3700 echo "amd_iommu=off" >> /tmp/append fi if [ "$sid" = "Gardena" ] || [ "$sid" = "GardenaSsd" ]; then aboot_machine=arista_7260cx3_64 + flash_size=28000 fi if [ "$platform" = "rook" ]; then varlog_size=4096 From 0f903d008bbd3adb3463f70be6d762d4f9b40675 Mon Sep 17 00:00:00 2001 From: Polly Hsu Date: Wed, 22 Nov 2017 18:59:28 +0800 Subject: [PATCH 0942/1011] [Accton]: Add a new supported platform, AS5712-54X (#1167) * Switch Vendor: Edge-core * Switch SKU: AS5712-54X * ASIC Vendor: Broadcom * Swich ASIC: TRIDENT2 * Port Configuration: 48x10G+6x40G * SONiC Image: SONiC-ONIE-Broadcom Signed-off-by: polly_hsu@accton.com --- .../Accton-AS5712-54X/port_config.ini | 147 ++++++------ .../Accton-AS5712-54X/sai.profile | 1 - .../x86_64-accton_as5712_54x-r0/minigraph.xml | 92 +++----- .../plugins/sfputil.py | 215 ++++++++---------- platform/broadcom/one-image.mk | 1 + platform/broadcom/platform-modules-accton.mk | 10 +- .../broadcom/sonic-platform-modules-accton | 2 +- 7 files changed, 220 insertions(+), 248 deletions(-) mode change 100644 => 100755 device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/port_config.ini mode change 100644 => 100755 device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile mode change 100644 => 100755 device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml mode change 100644 => 100755 device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py mode change 100644 => 100755 platform/broadcom/one-image.mk mode change 100644 => 100755 platform/broadcom/platform-modules-accton.mk diff --git a/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/port_config.ini b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/port_config.ini old mode 100644 new mode 100755 index 61325e1ec43c..f41bf2ef648f --- a/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/port_config.ini +++ b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/port_config.ini @@ -1,74 +1,73 @@ -# name lanes alias -Ethernet0 13 tenGigE0 -Ethernet1 14 tenGigE1 -Ethernet2 15 tenGigE2 -Ethernet3 16 tenGigE3 -Ethernet4 21 tenGigE4 -Ethernet5 22 tenGigE5 -Ethernet6 23 tenGigE6 -Ethernet7 24 tenGigE7 -Ethernet8 25 tenGigE8 -Ethernet9 26 tenGigE9 -Ethernet10 27 tenGigE10 -Ethernet11 28 tenGigE11 -Ethernet12 29 tenGigE12 -Ethernet13 30 tenGigE13 -Ethernet14 31 tenGigE14 -Ethernet15 32 tenGigE15 -Ethernet16 45 tenGigE16 -Ethernet17 46 tenGigE17 -Ethernet18 47 tenGigE18 -Ethernet19 48 tenGigE19 -Ethernet20 49 tenGigE20 -Ethernet21 50 tenGigE21 -Ethernet22 51 tenGigE22 -Ethernet23 52 tenGigE23 -Ethernet24 53 tenGigE24 -Ethernet25 54 tenGigE25 -Ethernet26 55 tenGigE26 -Ethernet27 56 tenGigE27 -Ethernet28 57 tenGigE28 -Ethernet29 58 tenGigE29 -Ethernet30 59 tenGigE30 -Ethernet31 60 tenGigE31 -Ethernet32 61 tenGigE32 -Ethernet33 62 tenGigE33 -Ethernet34 63 tenGigE34 -Ethernet35 64 tenGigE35 -Ethernet36 65 tenGigE36 -Ethernet37 66 tenGigE37 -Ethernet38 67 tenGigE38 -Ethernet39 68 tenGigE39 -Ethernet40 69 tenGigE40 -Ethernet41 70 tenGigE41 -Ethernet42 71 tenGigE42 -Ethernet43 72 tenGigE43 -Ethernet44 73 tenGigE44 -Ethernet45 74 tenGigE45 -Ethernet46 75 tenGigE46 -Ethernet47 76 tenGigE47 -Ethernet48 97 tenGigE48 -Ethernet49 98 tenGigE49 -Ethernet50 99 tenGigE50 -Ethernet51 100 tenGigE51 -Ethernet52 101 tenGigE52 -Ethernet53 102 tenGigE53 -Ethernet54 103 tenGigE54 -Ethernet55 104 tenGigE55 -Ethernet56 81 tenGigE56 -Ethernet57 82 tenGigE57 -Ethernet58 83 tenGigE58 -Ethernet59 84 tenGigE59 -Ethernet60 105 tenGigE60 -Ethernet61 106 tenGigE61 -Ethernet62 107 tenGigE62 -Ethernet63 108 tenGigE63 -Ethernet64 109 tenGigE64 -Ethernet65 110 tenGigE65 -Ethernet66 111 tenGigE66 -Ethernet67 112 tenGigE67 -Ethernet68 77 tenGigE68 -Ethernet69 78 tenGigE69 -Ethernet70 79 tenGigE70 -Ethernet71 80 tenGigE71 - +# name lanes alias index +Ethernet0 13 tenGigE0 0 +Ethernet1 14 tenGigE1 1 +Ethernet2 15 tenGigE2 2 +Ethernet3 16 tenGigE3 3 +Ethernet4 21 tenGigE4 4 +Ethernet5 22 tenGigE5 5 +Ethernet6 23 tenGigE6 6 +Ethernet7 24 tenGigE7 7 +Ethernet8 25 tenGigE8 8 +Ethernet9 26 tenGigE9 9 +Ethernet10 27 tenGigE10 10 +Ethernet11 28 tenGigE11 11 +Ethernet12 29 tenGigE12 12 +Ethernet13 30 tenGigE13 13 +Ethernet14 31 tenGigE14 14 +Ethernet15 32 tenGigE15 15 +Ethernet16 45 tenGigE16 16 +Ethernet17 46 tenGigE17 17 +Ethernet18 47 tenGigE18 18 +Ethernet19 48 tenGigE19 19 +Ethernet20 49 tenGigE20 20 +Ethernet21 50 tenGigE21 21 +Ethernet22 51 tenGigE22 22 +Ethernet23 52 tenGigE23 23 +Ethernet24 53 tenGigE24 24 +Ethernet25 54 tenGigE25 25 +Ethernet26 55 tenGigE26 26 +Ethernet27 56 tenGigE27 27 +Ethernet28 57 tenGigE28 28 +Ethernet29 58 tenGigE29 29 +Ethernet30 59 tenGigE30 30 +Ethernet31 60 tenGigE31 31 +Ethernet32 61 tenGigE32 32 +Ethernet33 62 tenGigE33 33 +Ethernet34 63 tenGigE34 34 +Ethernet35 64 tenGigE35 35 +Ethernet36 65 tenGigE36 36 +Ethernet37 66 tenGigE37 37 +Ethernet38 67 tenGigE38 38 +Ethernet39 68 tenGigE39 39 +Ethernet40 69 tenGigE40 40 +Ethernet41 70 tenGigE41 41 +Ethernet42 71 tenGigE42 42 +Ethernet43 72 tenGigE43 43 +Ethernet44 73 tenGigE44 44 +Ethernet45 74 tenGigE45 45 +Ethernet46 75 tenGigE46 46 +Ethernet47 76 tenGigE47 47 +Ethernet48 97 tenGigE48 48 +Ethernet49 98 tenGigE49 49 +Ethernet50 99 tenGigE50 50 +Ethernet51 100 tenGigE51 51 +Ethernet52 101 tenGigE52 52 +Ethernet53 102 tenGigE53 53 +Ethernet54 103 tenGigE54 54 +Ethernet55 104 tenGigE55 55 +Ethernet56 81 tenGigE56 56 +Ethernet57 82 tenGigE57 57 +Ethernet58 83 tenGigE58 58 +Ethernet59 84 tenGigE59 59 +Ethernet60 105 tenGigE60 60 +Ethernet61 106 tenGigE61 61 +Ethernet62 107 tenGigE62 62 +Ethernet63 108 tenGigE63 63 +Ethernet64 109 tenGigE64 64 +Ethernet65 110 tenGigE65 65 +Ethernet66 111 tenGigE66 66 +Ethernet67 112 tenGigE67 67 +Ethernet68 77 tenGigE68 68 +Ethernet69 78 tenGigE69 69 +Ethernet70 79 tenGigE70 70 +Ethernet71 80 tenGigE71 71 diff --git a/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile old mode 100644 new mode 100755 index 7fafa54db963..01d0f6642549 --- a/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile +++ b/device/accton/x86_64-accton_as5712_54x-r0/Accton-AS5712-54X/sai.profile @@ -1,2 +1 @@ SAI_INIT_CONFIG_FILE=/etc/bcm/td2-as5712-72x10G.config.bcm - diff --git a/device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml b/device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml old mode 100644 new mode 100755 index 8d89f28b0d86..bf0b2e9c0fcd --- a/device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml +++ b/device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml @@ -4,18 +4,18 @@ OCPSCH0104001MS - 10.10.1.26 - switch1 - 10.10.1.25 + 10.10.1.2 + OCPSCH01040AALF + 10.10.1.1 1 10 3 OCPSCH0104002MS - 10.10.2.26 - switch1 - 10.10.2.25 + 10.10.2.2 + OCPSCH01040AALF + 10.10.2.1 1 10 3 @@ -24,15 +24,15 @@ 64536 - switch1 + OCPSCH01040AALF -

10.10.1.26
+
10.10.1.1
-
10.10.2.26
+
10.10.2.1
@@ -59,29 +59,37 @@ HostIP Loopback0 - 100.0.0.9/32 + 100.0.0.3/32 - 100.0.0.9/32 + 100.0.0.3/32 + + ManagementIP1 + Management0 + + 192.168.200.12/24 + + 192.168.200.12/24 + - switch1 + OCPSCH01040AALF - Ethernet48 - 10.10.1.25/30 + tenGigE0 + 10.10.1.1/30 - Ethernet52 - 10.10.2.25/30 + tenGigE4 + 10.10.2.1/30 @@ -93,59 +101,33 @@ - 40000 + 10000 DeviceInterfaceLink OCPSCH0104001MS - Ethernet24 - switch1 - Ethernet48 + tenGigE0 + OCPSCH01040AALF + tenGigE0 - 40000 + 10000 DeviceInterfaceLink OCPSCH0104002MS - Ethernet24 - switch1 - Ethernet52 + tenGigE0 + OCPSCH01040AALF + tenGigE4 - + - switch1 + OCPSCH01040AALF Accton-AS5712-54X - + - - - switch1 - - - DhcpResources - - - - - NtpResources - - 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org - - - SyslogResources - - - - - ErspanDestinationIpv4 - - 2.2.2.2 - - - - + - switch1 + OCPSCH01040AALF Accton-AS5712-54X diff --git a/device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py old mode 100644 new mode 100755 index 070b1da934cb..c9862957bf31 --- a/device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py @@ -14,12 +14,90 @@ class SfpUtil(SfpUtilBase): """Platform-specific SfpUtil class""" PORT_START = 0 - PORT_END = 31 - PORTS_IN_BLOCK = 32 + PORT_END = 71 + PORTS_IN_BLOCK = 72 + QSFP_PORT_START = 72 + QSFP_PORT_END = 72 - EEPROM_OFFSET = 20 + BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/" + + _port_to_is_present = {} _port_to_eeprom_mapping = {} + _port_to_i2c_mapping = { + 0: [2, 2], + 1: [3, 3], + 2: [4, 4], + 3: [5, 5], + 4: [6, 6], + 5: [7, 7], + 6: [8, 8], + 7: [9, 9], + 8: [10, 10], + 9: [11, 11], + 10: [12, 12], + 11: [13, 13], + 12: [14, 14], + 13: [15, 15], + 14: [16, 16], + 15: [17, 17], + 16: [18, 18], + 17: [19, 19], + 18: [20, 20], + 19: [21, 21], + 20: [22, 22], + 21: [23, 23], + 22: [24, 24], + 23: [25, 25], + 24: [26, 26], + 25: [27, 27], + 26: [28, 28], + 27: [29, 29], + 28: [30, 30], + 29: [31, 31], + 30: [32, 32], + 31: [33, 33], + 32: [34, 34], + 33: [35, 35], + 34: [36, 36], + 35: [37, 37], + 36: [38, 38], + 37: [39, 39], + 38: [40, 40], + 39: [41, 41], + 40: [42, 42], + 41: [43, 43], + 42: [44, 44], + 43: [45, 45], + 44: [46, 46], + 45: [47, 47], + 46: [48, 48], + 47: [49, 49], + 48: [50, 50], #QSFP49 + 49: [50, 50], + 50: [50, 50], + 51: [50, 50], + 52: [52, 52], #QSFP50 + 53: [52, 52], + 54: [52, 52], + 55: [52, 52], + 56: [54, 54], #QSFP51 + 57: [54, 54], + 58: [54, 54], + 59: [54, 54], + 60: [51, 51], #QSFP52 + 61: [51, 51], + 62: [51, 51], + 63: [51, 51], + 64: [53, 53], #QSFP53 + 65: [53, 53], + 66: [53, 53], + 67: [53, 53], + 68: [55, 55], #QSFP54 + 69: [55, 55], + 70: [55, 55], + 71: [55, 55], + } @property def port_start(self): @@ -31,17 +109,19 @@ def port_end(self): @property def qsfp_ports(self): - return range(0, self.PORTS_IN_BLOCK + 1) + return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) @property def port_to_eeprom_mapping(self): return self._port_to_eeprom_mapping def __init__(self): - eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + eeprom_path = self.BASE_VAL_PATH + "sfp_eeprom" - for x in range(0, self.port_end + 1): - self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = eeprom_path.format( + self._port_to_i2c_mapping[x][0], + self._port_to_i2c_mapping[x][1]) SfpUtilBase.__init__(self) @@ -50,126 +130,29 @@ def get_presence(self, port_num): if port_num < self.port_start or port_num > self.port_end: return False + present_path = self.BASE_VAL_PATH + "sfp_is_present" + self.__port_to_is_present = present_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][1]) + try: - reg_file = open("/sys/devices/platform/accton/qsfp_modprs") + val_file = open(self.__port_to_is_present) except IOError as e: - print "Error: unable to open file: %s" % str(e) + print "Error: unable to open file: %s" % str(e) return False - content = reg_file.readline().rstrip() - - # content is a string containing the hex representation of the register - reg_value = int(content, 16) - - # Mask off the bit corresponding to our port - mask = (1 << port_num) + content = val_file.readline().rstrip() + val_file.close() - # ModPrsL is active low - if reg_value & mask == 0: + # content is a string, either "0" or "1" + if content == "1": return True return False def get_low_power_mode(self, port_num): - # Check for invalid port_num - if port_num < self.port_start or port_num > self.port_end: - return False - - try: - reg_file = open("/sys/devices/platform/accton/qsfp_lpmode") - except IOError as e: - print "Error: unable to open file: %s" % str(e) - - content = reg_file.readline().rstrip() - - # content is a string containing the hex representation of the register - reg_value = int(content, 16) - - # Mask off the bit corresponding to our port - mask = (1 << port_num) - - # LPMode is active high - if reg_value & mask == 0: - return False - - return True + raise NotImplementedError def set_low_power_mode(self, port_num, lpmode): - # Check for invalid port_num - if port_num < self.port_start or port_num > self.port_end: - return False - - try: - reg_file = open("/sys/devices/platform/accton/qsfp_lpmode", "r+") - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - - content = reg_file.readline().rstrip() - - # content is a string containing the hex representation of the register - reg_value = int(content, 16) - - # Mask off the bit corresponding to our port - mask = (1 << port_num) - - # LPMode is active high; set or clear the bit accordingly - if lpmode is True: - reg_value = reg_value | mask - else: - reg_value = reg_value & ~mask - - # Convert our register value back to a hex string and write back - content = hex(reg_value) - - reg_file.seek(0) - reg_file.write(content) - reg_file.close() - - return True + raise NotImplementedError def reset(self, port_num): - QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/devices/platform/accton/qsfp_reset" - - # Check for invalid port_num - if port_num < self.port_start or port_num > self.port_end: - return False - - try: - reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - - content = reg_file.readline().rstrip() - - # File content is a string containing the hex representation of the register - reg_value = int(content, 16) - - # Mask off the bit corresponding to our port - mask = (1 << port_num) - - # ResetL is active low - reg_value = reg_value & ~mask - - # Convert our register value back to a hex string and write back - reg_file.seek(0) - reg_file.write(hex(reg_value)) - reg_file.close() - - # Sleep 1 second to allow it to settle - time.sleep(1) - - # Flip the bit back high and write back to the register to take port out of reset - try: - reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "w") - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - - reg_value = reg_value | mask - reg_file.seek(0) - reg_file.write(hex(reg_value)) - reg_file.close() - - return True + raise NotImplementedError diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk old mode 100644 new mode 100755 index ca9da1134eb2..378129d4da03 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -12,6 +12,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(INGRASYS_S9100_PLATFORM_MODULE) \ $(INGRASYS_S8810_32Q_PLATFORM_MODULE) \ $(ACCTON_AS7712_32X_PLATFORM_MODULE) \ + $(ACCTON_AS5712_54X_PLATFORM_MODULE) \ $(INVENTEC_D7032Q28B_PLATFORM_MODULE) \ $(INVENTEC_D7054Q28B_PLATFORM_MODULE) \ $(CEL_DX010_PLATFORM_MODULE) diff --git a/platform/broadcom/platform-modules-accton.mk b/platform/broadcom/platform-modules-accton.mk old mode 100644 new mode 100755 index e5357c5e9f14..6a2bf8c04b6f --- a/platform/broadcom/platform-modules-accton.mk +++ b/platform/broadcom/platform-modules-accton.mk @@ -1,11 +1,19 @@ # Accton Platform modules -ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION = 1.0 +ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION = 1.1 +ACCTON_AS5712_54X_PLATFORM_MODULE_VERSION = 1.1 export ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION +export ACCTON_AS5712_54X_PLATFORM_MODULE_VERSION ACCTON_AS7712_32X_PLATFORM_MODULE = sonic-platform-accton-as7712-32x_$(ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION)_amd64.deb $(ACCTON_AS7712_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-accton $(ACCTON_AS7712_32X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) $(ACCTON_AS7712_32X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as7712_32x-r0 SONIC_DPKG_DEBS += $(ACCTON_AS7712_32X_PLATFORM_MODULE) + +ACCTON_AS5712_54X_PLATFORM_MODULE = sonic-platform-accton-as5712-54x_$(ACCTON_AS5712_54X_PLATFORM_MODULE_VERSION)_amd64.deb +$(ACCTON_AS5712_54X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-accton +$(ACCTON_AS5712_54X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(ACCTON_AS5712_54X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as5712_54x-r0 +SONIC_DPKG_DEBS += $(ACCTON_AS5712_54X_PLATFORM_MODULE) diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton index 99607d63220d..3fbde584ba15 160000 --- a/platform/broadcom/sonic-platform-modules-accton +++ b/platform/broadcom/sonic-platform-modules-accton @@ -1 +1 @@ -Subproject commit 99607d63220de336a61d81f6b4d1e64062761abe +Subproject commit 3fbde584ba15f0178dc22cb7e56f2bb8481692d4 From 6d0329af3db1fa66ee17a70fe318cd5c478872f0 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Wed, 22 Nov 2017 18:58:22 +0200 Subject: [PATCH 0943/1011] Move QoS configuration to Config DB (#1178) * Move Mellanox QoS configuration to config DB Signed-off-by: Andriy Moroz * Move qos.json to hwsku subfolder Signed-off-by: Andriy Moroz * Remove copying of old qos config Signed-off-by: Andriy Moroz * Update WRED threshold values Signed-off-by: Andriy Moroz * hwsku2 Signed-off-by: Andriy Moroz * Fix syntax error in json Signed-off-by: Andriy Moroz * Add qos config for some Dell and Arista platforms Signed-off-by: Andriy Moroz * Fix inital qos config on clean boot Signed-off-by: Andriy Moroz * Updated swss-common and swss pointers (QoS in Config DB) Signed-off-by: Andriy Moroz --- .../Arista-7050-QX32/qos.json | 166 ++++++++++++++++++ .../Force10-S6000/qos.json | 166 ++++++++++++++++++ .../Force10-S6100/qos.json | 166 ++++++++++++++++++ .../ACS-MSN2700/qos.json | 166 ++++++++++++++++++ .../ACS-MSN2740/qos.json | 1 + dockers/docker-orchagent/swssconfig.sh | 2 +- files/image_config/platform/rc.local | 6 + src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 9 files changed, 674 insertions(+), 3 deletions(-) create mode 100644 device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/qos.json create mode 100644 device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/qos.json create mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json create mode 100644 device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/qos.json create mode 120000 device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/qos.json diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/qos.json b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/qos.json new file mode 100644 index 000000000000..8de48a2d8d86 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/qos.json @@ -0,0 +1,166 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type":"DWRR", + "weight": "25" + }, + "scheduler.1": { + "type":"DWRR", + "weight": "30" + }, + "scheduler.2": { + "type":"DWRR", + "weight": "20" + } + }, + "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "PORT_QOS_MAP": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124": { + "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]", + "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]", + "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]", + "pfc_to_pg_map" : "[PFC_PRIORITY_TO_PRIORITY_GROUP_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSY": { + "wred_green_enable":"true", + "wred_yellow_enable":"true", + "ecn":"ecn_all", + "red_max_threshold":"512000", + "red_min_threshold":"512000", + "yellow_max_threshold":"512000", + "yellow_min_threshold":"512000", + "green_max_threshold": "184320", + "green_min_threshold": "184320" + }, + "AZURE_LOSSLESS": { + "wred_green_enable":"true", + "wred_yellow_enable":"true", + "ecn":"ecn_all", + "red_max_threshold":"512000", + "red_min_threshold":"512000", + "yellow_max_threshold":"512000", + "yellow_min_threshold":"512000", + "green_max_threshold": "184320", + "green_min_threshold": "184320" + } + }, + "QUEUE": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0": { + "scheduler" : "[SCHEDULER|scheduler.1]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1": { + "scheduler" : "[SCHEDULER|scheduler.2]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0-1": { + "wred_profile" : "[WRED_PROFILE|AZURE_LOSSY]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { + "scheduler" : "[SCHEDULER|scheduler.0]", + "wred_profile" : "[WRED_PROFILE|AZURE_LOSSLESS]" + } + } +} + diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/qos.json b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/qos.json new file mode 100644 index 000000000000..8de48a2d8d86 --- /dev/null +++ b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/qos.json @@ -0,0 +1,166 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type":"DWRR", + "weight": "25" + }, + "scheduler.1": { + "type":"DWRR", + "weight": "30" + }, + "scheduler.2": { + "type":"DWRR", + "weight": "20" + } + }, + "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "PORT_QOS_MAP": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124": { + "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]", + "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]", + "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]", + "pfc_to_pg_map" : "[PFC_PRIORITY_TO_PRIORITY_GROUP_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSY": { + "wred_green_enable":"true", + "wred_yellow_enable":"true", + "ecn":"ecn_all", + "red_max_threshold":"512000", + "red_min_threshold":"512000", + "yellow_max_threshold":"512000", + "yellow_min_threshold":"512000", + "green_max_threshold": "184320", + "green_min_threshold": "184320" + }, + "AZURE_LOSSLESS": { + "wred_green_enable":"true", + "wred_yellow_enable":"true", + "ecn":"ecn_all", + "red_max_threshold":"512000", + "red_min_threshold":"512000", + "yellow_max_threshold":"512000", + "yellow_min_threshold":"512000", + "green_max_threshold": "184320", + "green_min_threshold": "184320" + } + }, + "QUEUE": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0": { + "scheduler" : "[SCHEDULER|scheduler.1]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1": { + "scheduler" : "[SCHEDULER|scheduler.2]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0-1": { + "wred_profile" : "[WRED_PROFILE|AZURE_LOSSY]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { + "scheduler" : "[SCHEDULER|scheduler.0]", + "wred_profile" : "[WRED_PROFILE|AZURE_LOSSLESS]" + } + } +} + diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json new file mode 100644 index 000000000000..8de48a2d8d86 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json @@ -0,0 +1,166 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type":"DWRR", + "weight": "25" + }, + "scheduler.1": { + "type":"DWRR", + "weight": "30" + }, + "scheduler.2": { + "type":"DWRR", + "weight": "20" + } + }, + "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "PORT_QOS_MAP": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124": { + "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]", + "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]", + "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]", + "pfc_to_pg_map" : "[PFC_PRIORITY_TO_PRIORITY_GROUP_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSY": { + "wred_green_enable":"true", + "wred_yellow_enable":"true", + "ecn":"ecn_all", + "red_max_threshold":"512000", + "red_min_threshold":"512000", + "yellow_max_threshold":"512000", + "yellow_min_threshold":"512000", + "green_max_threshold": "184320", + "green_min_threshold": "184320" + }, + "AZURE_LOSSLESS": { + "wred_green_enable":"true", + "wred_yellow_enable":"true", + "ecn":"ecn_all", + "red_max_threshold":"512000", + "red_min_threshold":"512000", + "yellow_max_threshold":"512000", + "yellow_min_threshold":"512000", + "green_max_threshold": "184320", + "green_min_threshold": "184320" + } + }, + "QUEUE": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0": { + "scheduler" : "[SCHEDULER|scheduler.1]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1": { + "scheduler" : "[SCHEDULER|scheduler.2]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0-1": { + "wred_profile" : "[WRED_PROFILE|AZURE_LOSSY]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { + "scheduler" : "[SCHEDULER|scheduler.0]", + "wred_profile" : "[WRED_PROFILE|AZURE_LOSSLESS]" + } + } +} + diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/qos.json b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/qos.json new file mode 100644 index 000000000000..3e01af3f2c64 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/ACS-MSN2700/qos.json @@ -0,0 +1,166 @@ +{ + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "TC_TO_QUEUE_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type":"DWRR", + "weight": "25" + }, + "scheduler.1": { + "type":"DWRR", + "weight": "30" + }, + "scheduler.2": { + "type":"DWRR", + "weight": "20" + } + }, + "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "1", + "3": "3", + "4": "4" + } + }, + "PORT_QOS_MAP": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124": { + "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]", + "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]", + "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]", + "pfc_to_pg_map" : "[PFC_PRIORITY_TO_PRIORITY_GROUP_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSY": { + "wred_green_enable":"true", + "wred_yellow_enable":"true", + "ecn":"ecn_all", + "red_max_threshold":"516096", + "red_min_threshold":"516096", + "yellow_max_threshold":"516096", + "yellow_min_threshold":"516096", + "green_max_threshold": "184320", + "green_min_threshold": "184320" + }, + "AZURE_LOSSLESS": { + "wred_green_enable":"true", + "wred_yellow_enable":"true", + "ecn":"ecn_all", + "red_max_threshold":"516096", + "red_min_threshold":"516096", + "yellow_max_threshold":"516096", + "yellow_min_threshold":"516096", + "green_max_threshold": "184320", + "green_min_threshold": "184320" + } + }, + "QUEUE": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0": { + "scheduler" : "[SCHEDULER|scheduler.1]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1": { + "scheduler" : "[SCHEDULER|scheduler.2]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0-1": { + "wred_profile" : "[WRED_PROFILE|AZURE_LOSSY]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { + "scheduler" : "[SCHEDULER|scheduler.0]", + "wred_profile" : "[WRED_PROFILE|AZURE_LOSSLESS]" + } + } +} + diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/qos.json b/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/qos.json new file mode 120000 index 000000000000..ae738e606a9d --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/ACS-MSN2740/qos.json @@ -0,0 +1 @@ +../../x86_64-mlnx_msn2700-r0/ACS-MSN2700/qos.json \ No newline at end of file diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index aee3ffaaa8cb..eb73e342d7b9 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -39,7 +39,7 @@ elif [ "$HWSKU" == "Arista-7050-QX32" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [[ "$HWSKU" == "ACS-MSN27"* ]]; then sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/msn27xx.32ports.buffers.json.j2 > /etc/swss/config.d/msn27xx.32ports.buffers.json - SWSSCONFIG_ARGS+="msn27xx.32ports.buffers.json msn27xx.32ports.qos.json " + SWSSCONFIG_ARGS+="msn27xx.32ports.buffers.json " fi for file in $SWSSCONFIG_ARGS; do diff --git a/files/image_config/platform/rc.local b/files/image_config/platform/rc.local index c7915db9eb7c..436a7de9071e 100755 --- a/files/image_config/platform/rc.local +++ b/files/image_config/platform/rc.local @@ -112,6 +112,12 @@ if [ -f /host/image-$sonic_version/platform/firsttime ]; then else # Use default minigraph.xml cp /usr/share/sonic/device/$platform/minigraph.xml /etc/sonic/ + HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -v "DEVICE_METADATA['localhost']['hwsku']"` + if [ -f /usr/share/sonic/device/$platform/$HWSKU/qos.json ]; then + # merge qos configuration into init config file + sonic-cfggen -j /etc/sonic/init_cfg.json -j /usr/share/sonic/device/$platform/$HWSKU/qos.json --print-data > /tmp/init_cfg.json + mv /tmp/init_cfg.json /etc/sonic/init_cfg.json + fi sonic-cfggen -m -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json fi diff --git a/src/sonic-swss b/src/sonic-swss index 00e38bef0803..3a9cf8f47847 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 00e38bef0803eec5172930ba854d38fdf34ab186 +Subproject commit 3a9cf8f478474dd0bf23af283ba7779575faae6d diff --git a/src/sonic-swss-common b/src/sonic-swss-common index a67ee684ed33..3d07426bc155 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit a67ee684ed33083f61df83cd1ba9c047e5ed8b68 +Subproject commit 3d07426bc155435290a0c81365436be5fbb31b17 From 617b3e43b1a5cdc0d8f4cf624506b43f73717c71 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Wed, 22 Nov 2017 14:36:25 -0800 Subject: [PATCH 0944/1011] Add service to config hostname based on configdb (#1174) --- files/build_templates/sonic_debian_extension.j2 | 5 +++++ files/image_config/hostname/hostname-config.service | 11 +++++++++++ files/image_config/hostname/hostname-config.sh | 11 +++++++++++ 3 files changed, 27 insertions(+) create mode 100644 files/image_config/hostname/hostname-config.service create mode 100755 files/image_config/hostname/hostname-config.sh diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 37fcfbc56fcb..0159be571f88 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -120,6 +120,11 @@ sudo cp $IMAGE_CONFIGS/interfaces/*.j2 $FILESYSTEM_ROOT/usr/share/sonic/template # Copy initial interfaces configuration file, will be overwritten on first boot sudo cp $IMAGE_CONFIGS/interfaces/init_interfaces $FILESYSTEM_ROOT/etc/network +# Copy hostname configuration scripts +sudo cp $IMAGE_CONFIGS/hostname/hostname-config.service $FILESYSTEM_ROOT/etc/systemd/system/ +sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable hostname-config.service +sudo cp $IMAGE_CONFIGS/hostname/hostname-config.sh $FILESYSTEM_ROOT/usr/bin/ + # Copy updategraph script and service file sudo cp $IMAGE_CONFIGS/updategraph/updategraph.service $FILESYSTEM_ROOT/etc/systemd/system/ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable updategraph.service diff --git a/files/image_config/hostname/hostname-config.service b/files/image_config/hostname/hostname-config.service new file mode 100644 index 000000000000..e6e8f489883f --- /dev/null +++ b/files/image_config/hostname/hostname-config.service @@ -0,0 +1,11 @@ +[Unit] +Description=Update hostname based on configdb +Requires=database.service +After=database.service + +[Service] +Type=oneshot +ExecStart=/usr/bin/hostname-config.sh + +[Install] +WantedBy=multi-user.target diff --git a/files/image_config/hostname/hostname-config.sh b/files/image_config/hostname/hostname-config.sh new file mode 100755 index 000000000000..eec7c2f732dc --- /dev/null +++ b/files/image_config/hostname/hostname-config.sh @@ -0,0 +1,11 @@ +#!/bin/bash -e + +CURRENT_HOSTNAME=`hostname` +HOSTNAME=`sonic-cfggen -d -v DEVICE_METADATA[\'localhost\'][\'hostname\']` + +echo $HOSTNAME > /etc/hostname +hostname -F /etc/hostname + +sed -i "/\s$CURRENT_HOSTNAME$/d" /etc/hosts +echo "127.0.0.1 $HOSTNAME" >> /etc/hosts + From ded9fbb7647b975426ba07d3f9d2d729152dfd44 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Thu, 23 Nov 2017 22:23:07 +0200 Subject: [PATCH 0945/1011] [Mellanox]: Update FW to 13_1534_0164 (#1180) This version has a fix for rx_pause_duration counter Signed-off-by: marian-pritsak --- platform/mellanox/fw.mk | 2 +- platform/mellanox/sdk.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index 201e5205daf7..3eef7ca37b5f 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -1,6 +1,6 @@ # mellanox firmware -MLNX_FW_VERSION = 13.1530.0152 +MLNX_FW_VERSION = 13.1534.0164 MLNX_FW_FILE = fw-SPC-rel-$(subst .,_,$(MLNX_FW_VERSION))-EVB.mfa $(MLNX_FW_FILE)_URL = $(MLNX_SDK_BASE_URL)/$(MLNX_FW_FILE) SONIC_ONLINE_FILES += $(MLNX_FW_FILE) diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index ad34ba84e277..d9bca2ed5af7 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,4 +1,4 @@ -MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/16900748ee3c97bc5836ab3684ee05b8db6ec31b/sdk +MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/564703412781016766b248b98266bd6f2c161431/sdk MLNX_SDK_VERSION = 4.2.6011 MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2) $(SX_ACL_RM) $(SX_COMPLIB) \ $(SX_EXAMPLES) $(SX_GEN_UTILS) $(SX_SCEW) $(SX_SDN_HAL) \ From dd7e9240c83f029cfdc9cd8c772c94de5bd19bb4 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 23 Nov 2017 16:31:37 -0800 Subject: [PATCH 0946/1011] [dockers] Remove dependency to minigraph (#1179) * Remove dependency to minigraph * Remove -m in swssconfig.sh --- dockers/docker-fpm-quagga/start.sh | 8 ++++---- dockers/docker-orchagent/start.sh | 6 +++--- dockers/docker-orchagent/swssconfig.sh | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dockers/docker-fpm-quagga/start.sh b/dockers/docker-fpm-quagga/start.sh index 1e7a49809d55..06fdd3bb3961 100755 --- a/dockers/docker-fpm-quagga/start.sh +++ b/dockers/docker-fpm-quagga/start.sh @@ -1,15 +1,15 @@ #!/usr/bin/env bash mkdir -p /etc/quagga -sonic-cfggen -m -d -y /etc/sonic/deployment_id_asn_map.yml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf +sonic-cfggen -d -y /etc/sonic/deployment_id_asn_map.yml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf -sonic-cfggen -m -d -t /usr/share/sonic/templates/zebra.conf.j2 > /etc/quagga/zebra.conf +sonic-cfggen -d -t /usr/share/sonic/templates/zebra.conf.j2 > /etc/quagga/zebra.conf -sonic-cfggen -m -d -t /usr/share/sonic/templates/isolate.j2 > /usr/sbin/bgp-isolate +sonic-cfggen -d -t /usr/share/sonic/templates/isolate.j2 > /usr/sbin/bgp-isolate chown root:root /usr/sbin/bgp-isolate chmod 0755 /usr/sbin/bgp-isolate -sonic-cfggen -m -d -t /usr/share/sonic/templates/unisolate.j2 > /usr/sbin/bgp-unisolate +sonic-cfggen -d -t /usr/share/sonic/templates/unisolate.j2 > /usr/sbin/bgp-unisolate chown root:root /usr/sbin/bgp-unisolate chmod 0755 /usr/sbin/bgp-unisolate diff --git a/dockers/docker-orchagent/start.sh b/dockers/docker-orchagent/start.sh index 9f3ba3cb078d..dfdb5b897bbb 100755 --- a/dockers/docker-orchagent/start.sh +++ b/dockers/docker-orchagent/start.sh @@ -2,9 +2,9 @@ mkdir -p /etc/swss/config.d/ -sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/switch.json.j2 > /etc/swss/config.d/switch.json -sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json -sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ports.json.j2 > /etc/swss/config.d/ports.json +sonic-cfggen -d -t /usr/share/sonic/templates/switch.json.j2 > /etc/swss/config.d/switch.json +sonic-cfggen -d -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json +sonic-cfggen -d -t /usr/share/sonic/templates/ports.json.j2 > /etc/swss/config.d/ports.json export platform=`sonic-cfggen -v platform` diff --git a/dockers/docker-orchagent/swssconfig.sh b/dockers/docker-orchagent/swssconfig.sh index eb73e342d7b9..c8ee8759333c 100755 --- a/dockers/docker-orchagent/swssconfig.sh +++ b/dockers/docker-orchagent/swssconfig.sh @@ -25,7 +25,7 @@ function fast_reboot { # Restore FDB and ARP table ASAP fast_reboot -HWSKU=`sonic-cfggen -m /etc/sonic/minigraph.xml -d -v "DEVICE_METADATA['localhost']['hwsku']"` +HWSKU=`sonic-cfggen -d -v "DEVICE_METADATA['localhost']['hwsku']"` SWSSCONFIG_ARGS="00-copp.config.json ipinip.json ports.json switch.json " @@ -38,7 +38,7 @@ elif [ "$HWSKU" == "Force10-S6100" ]; then elif [ "$HWSKU" == "Arista-7050-QX32" ]; then SWSSCONFIG_ARGS+="td2.32ports.buffers.json td2.32ports.qos.json " elif [[ "$HWSKU" == "ACS-MSN27"* ]]; then - sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/msn27xx.32ports.buffers.json.j2 > /etc/swss/config.d/msn27xx.32ports.buffers.json + sonic-cfggen -d -t /usr/share/sonic/templates/msn27xx.32ports.buffers.json.j2 > /etc/swss/config.d/msn27xx.32ports.buffers.json SWSSCONFIG_ARGS+="msn27xx.32ports.buffers.json " fi From 7f25b9437884c35c864616728245dc4b4f462922 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 24 Nov 2017 17:30:11 -0800 Subject: [PATCH 0947/1011] [aboot]: Add setfacl in the initramfs (#1185) Arista platforms need the filesystem ACLs to be removed on boot to prevent invalid permission to be set for new files. --- build_debian.sh | 2 ++ files/initramfs-tools/arista-convertfs.j2 | 3 +++ files/initramfs-tools/setfacl | 20 ++++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 files/initramfs-tools/setfacl diff --git a/build_debian.sh b/build_debian.sh index 3c6673a53ec4..0c765fdb6424 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -123,6 +123,8 @@ sudo cp files/initramfs-tools/arista-convertfs $FILESYSTEM_ROOT/etc/initramfs-to sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-convertfs sudo cp files/initramfs-tools/mke2fs $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/mke2fs sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/mke2fs +sudo cp files/initramfs-tools/setfacl $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/setfacl +sudo chmod +x $FILESYSTEM_ROOT/etc/initramfs-tools/hooks/setfacl # Hook into initramfs: rename the management interfaces on arista switches sudo cp files/initramfs-tools/arista-net $FILESYSTEM_ROOT/etc/initramfs-tools/scripts/init-premount/arista-net diff --git a/files/initramfs-tools/arista-convertfs.j2 b/files/initramfs-tools/arista-convertfs.j2 index cea25bd39837..dfd2fc1d7407 100644 --- a/files/initramfs-tools/arista-convertfs.j2 +++ b/files/initramfs-tools/arista-convertfs.j2 @@ -87,6 +87,9 @@ fixup_flash_permissions() { # this allows the sonic admin user to have read access on the flash local flash_mnt="$1" chmod o+rx "$flash_mnt" + + # remove all the filesystem acls from the flash + setfacl -Rb "$flash_mnt" } # Extract kernel parameters diff --git a/files/initramfs-tools/setfacl b/files/initramfs-tools/setfacl new file mode 100644 index 000000000000..96564e06b245 --- /dev/null +++ b/files/initramfs-tools/setfacl @@ -0,0 +1,20 @@ +#!/bin/sh +#Part of the code is revised based on initramfs-tools/hooks/fsck and initramfs-tool is under GPL v2. + +PREREQ="" + +prereqs() +{ + echo "$PREREQ" +} + +case $1 in +prereqs) + prereqs + exit 0 + ;; +esac + +. /usr/share/initramfs-tools/hook-functions + +copy_exec /usr/bin/setfacl /sbin/setfacl From 98fbddf60ffe0a02f3913ce5ce4708377c4f4019 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 27 Nov 2017 00:30:11 -0800 Subject: [PATCH 0948/1011] [kernel]: update kernel to 3.16.43 (#1181) --- rules/linux-kernel.mk | 4 ++-- src/sonic-linux-kernel | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rules/linux-kernel.mk b/rules/linux-kernel.mk index 228b48a9d34b..1e7fad0fd840 100644 --- a/rules/linux-kernel.mk +++ b/rules/linux-kernel.mk @@ -2,8 +2,8 @@ KVERSION_SHORT = 3.16.0-4 KVERSION = $(KVERSION_SHORT)-amd64 -KERNEL_VERSION = 3.16.36 -KERNEL_SUBVERSION = 1+deb8u2 +KERNEL_VERSION = 3.16.43 +KERNEL_SUBVERSION = 2+deb8u5 export KVERSION_SHORT KVERSION KERNEL_VERSION KERNEL_SUBVERSION diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index b386d52bd68b..c9832d5e0835 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit b386d52bd68bdc5facbd837e265f49a8350e14a1 +Subproject commit c9832d5e08351d2f661374f51cf81e60677d2f42 From 8602360ffdd1f4fc9df6261dc2a5694a928ad0ce Mon Sep 17 00:00:00 2001 From: nealtai <33504193+nealtai@users.noreply.github.com> Date: Tue, 28 Nov 2017 06:29:22 +0800 Subject: [PATCH 0949/1011] [platform] Add a new supported platform, Delta-ag9032v1 (#1168) CPU : Intel Rangeley C2538 Swich ASIC: Broadcom Tomahawk BCM56960 Ports : 32x100G Switch SKU : Delta-ag9032v1 Signed-off-by: neal --- .../Delta-ag9032v1/port_config.ini | 33 + .../Delta-ag9032v1/sai.profile | 1 + .../delta/x86_64-delta_ag9032v1-r0/fancontrol | 10 + .../fancontrol.service | 244 +++ .../x86_64-delta_ag9032v1-r0/installer.conf | 2 + .../led_proc_init.soc | 45 + .../x86_64-delta_ag9032v1-r0/minigraph.xml | 1079 ++++++++++++ .../plugins/eeprom.py | 32 + .../plugins/sfputil.py | 175 ++ .../x86_64-delta_ag9032v1-r0/sensors.conf | 61 + platform/broadcom/one-image.mk | 3 +- platform/broadcom/platform-modules-delta.mk | 12 + platform/broadcom/rules.mk | 1 + .../sonic-platform-modules-delta/LICENSE | 16 + .../ag9032v1/cfg/ag9032v1-modules.conf | 13 + .../ag9032v1/modules/Makefile | 2 + .../ag9032v1/modules/at24.c | 698 ++++++++ .../modules/delta_ag9032v1_platform.c | 1530 +++++++++++++++++ .../ag9032v1/modules/dni_ag9032v1_psu.c | 545 ++++++ .../ag9032v1/modules/dni_emc2305.c | 381 ++++ .../scripts/ag9032v1_platform_init.sh | 9 + .../ag9032v1/scripts/led_status.sh | 225 +++ .../debian/changelog | 5 + .../debian/compat | 1 + .../debian/control | 11 + .../sonic-platform-modules-delta/debian/files | 1 + .../debian/platform-modules-ag9032v1.init | 49 + .../debian/platform-modules-ag9032v1.install | 3 + .../sonic-platform-modules-delta/debian/rules | 33 + 29 files changed, 5219 insertions(+), 1 deletion(-) create mode 100644 device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/port_config.ini create mode 100644 device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/sai.profile create mode 100644 device/delta/x86_64-delta_ag9032v1-r0/fancontrol create mode 100755 device/delta/x86_64-delta_ag9032v1-r0/fancontrol.service create mode 100644 device/delta/x86_64-delta_ag9032v1-r0/installer.conf create mode 100644 device/delta/x86_64-delta_ag9032v1-r0/led_proc_init.soc create mode 100644 device/delta/x86_64-delta_ag9032v1-r0/minigraph.xml create mode 100644 device/delta/x86_64-delta_ag9032v1-r0/plugins/eeprom.py create mode 100644 device/delta/x86_64-delta_ag9032v1-r0/plugins/sfputil.py create mode 100644 device/delta/x86_64-delta_ag9032v1-r0/sensors.conf create mode 100644 platform/broadcom/platform-modules-delta.mk create mode 100644 platform/broadcom/sonic-platform-modules-delta/LICENSE create mode 100644 platform/broadcom/sonic-platform-modules-delta/ag9032v1/cfg/ag9032v1-modules.conf create mode 100644 platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/at24.c create mode 100644 platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/delta_ag9032v1_platform.c create mode 100644 platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/dni_ag9032v1_psu.c create mode 100644 platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/dni_emc2305.c create mode 100755 platform/broadcom/sonic-platform-modules-delta/ag9032v1/scripts/ag9032v1_platform_init.sh create mode 100755 platform/broadcom/sonic-platform-modules-delta/ag9032v1/scripts/led_status.sh create mode 100644 platform/broadcom/sonic-platform-modules-delta/debian/changelog create mode 100644 platform/broadcom/sonic-platform-modules-delta/debian/compat create mode 100644 platform/broadcom/sonic-platform-modules-delta/debian/control create mode 100644 platform/broadcom/sonic-platform-modules-delta/debian/files create mode 100755 platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9032v1.init create mode 100644 platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9032v1.install create mode 100644 platform/broadcom/sonic-platform-modules-delta/debian/rules diff --git a/device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/port_config.ini b/device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/port_config.ini new file mode 100644 index 000000000000..e000f29bef38 --- /dev/null +++ b/device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias +Ethernet0 49,50,51,52 hundredGigE1/1 +Ethernet4 53,54,55,56 hundredGigE1/2 +Ethernet8 57,58,59,60 hundredGigE1/3 +Ethernet12 61,62,63,64 hundredGigE1/4 +Ethernet16 65,66,67,68 hundredGigE1/5 +Ethernet20 69,70,71,72 hundredGigE1/6 +Ethernet24 73,74,75,76 hundredGigE1/7 +Ethernet28 77,78,79,80 hundredGigE1/8 +Ethernet32 37,38,39,40 hundredGigE1/9 +Ethernet36 33,34,35,36 hundredGigE1/10 +Ethernet40 45,46,47,48 hundredGigE1/11 +Ethernet44 41,42,43,44 hundredGigE1/12 +Ethernet48 81,82,83,84 hundredGigE1/13 +Ethernet52 85,86,87,88 hundredGigE1/14 +Ethernet56 89,90,91,92 hundredGigE1/15 +Ethernet60 93,94,95,96 hundredGigE1/16 +Ethernet64 97,98,99,100 hundredGigE1/17 +Ethernet68 101,102,103,104 hundredGigE1/18 +Ethernet72 105,106,107,108 hundredGigE1/19 +Ethernet76 109,110,111,112 hundredGigE1/20 +Ethernet80 21,22,23,24 hundredGigE1/21 +Ethernet84 17,18,19,20 hundredGigE1/22 +Ethernet88 29,30,31,32 hundredGigE1/23 +Ethernet92 25,26,27,28 hundredGigE1/24 +Ethernet96 117,118,119,120 hundredGigE1/25 +Ethernet100 113,114,115,116 hundredGigE1/26 +Ethernet104 125,126,127,128 hundredGigE1/27 +Ethernet108 121,122,123,124 hundredGigE1/28 +Ethernet112 5,6,7,8 hundredGigE1/29 +Ethernet116 1,2,3,4 hundredGigE1/30 +Ethernet120 13,14,15,16 hundredGigE1/31 +Ethernet124 9,10,11,12 hundredGigE1/32 diff --git a/device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/sai.profile b/device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/sai.profile new file mode 100644 index 000000000000..08d9e7fa3b47 --- /dev/null +++ b/device/delta/x86_64-delta_ag9032v1-r0/Delta-ag9032v1/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th-ag9032v1-32x100G.config.bcm diff --git a/device/delta/x86_64-delta_ag9032v1-r0/fancontrol b/device/delta/x86_64-delta_ag9032v1-r0/fancontrol new file mode 100644 index 000000000000..4a1cde92478f --- /dev/null +++ b/device/delta/x86_64-delta_ag9032v1-r0/fancontrol @@ -0,0 +1,10 @@ +INTERVAL=10 +DEVPATH=hwmon1=/sys/bus/i2c/devices +DEVNAME=hwmon1=emc2305 +FCTEMPS=hwmon1/2-004d/hwmon/hwmon*/temp1_input hwmon1/7-004c/hwmon/hwmon*/temp1_input hwmon1/7-004d/hwmon/hwmon*/temp1_input hwmon1/7-004e/hwmon/hwmon*/temp1_input hwmon1/30-004f/hwmon/hwmon*/temp1_input hwmon1/40-0058/temp1_input hwmon1/41-0058/temp1_input + +FCFANS=hwmon1/37-002c/fan1_input hwmon1/37-002c/fan2_input hwmon1/37-002c/fan3_input hwmon1/37-002c/fan4_input hwmon1/37-002c/fan5_input hwmon1/38-002d/fan1_input hwmon1/38-002d/fan2_input hwmon1/38-002d/fan3_input hwmon1/38-002d/fan4_input hwmon1/38-002d/fan5_input +MINTEMP=20 +MAXTEMP=60 +MINSTART=75 +MINSTOP=22 diff --git a/device/delta/x86_64-delta_ag9032v1-r0/fancontrol.service b/device/delta/x86_64-delta_ag9032v1-r0/fancontrol.service new file mode 100755 index 000000000000..17f647effb5b --- /dev/null +++ b/device/delta/x86_64-delta_ag9032v1-r0/fancontrol.service @@ -0,0 +1,244 @@ +#!/bin/bash +# +# Simple script implementing a temperature dependent fan speed control +# Supported Linux kernel versions: 2.6.5 and later +# +# Version 0.70 +# +# Usage: fancontrol [CONFIGFILE] +# +# Dependencies: +# bash, egrep, sed, cut, sleep, readlink, lm_sensors :) +# +# Please send any questions, comments or success stories to +# marius.reiner@hdev.de +# Thanks! +# +# For configuration instructions and warnings please see fancontrol.txt, which +# can be found in the doc/ directory or at the website mentioned above. +# +# +# Copyright 2003 Marius Reiner +# Copyright (C) 2007-2009 Jean Delvare +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301 USA. +# +# + +PIDFILE="/var/run/fancontrol.pid" + +#DEBUG=1 +MAX=255 + +function LoadConfig +{ + local fcvcount fcv + + echo "Loading configuration from $1 ..." + if [ ! -r "$1" ] + then + echo "Error: Can't read configuration file" >&2 + exit 1 + fi + + # grep configuration from file + INTERVAL=`egrep '^INTERVAL=.*$' $1 | sed -e 's/INTERVAL=//g'` + DEVPATH=`egrep '^DEVPATH=.*$' $1 | sed -e 's/DEVPATH= *//g'` + DEVNAME=`egrep '^DEVNAME=.*$' $1 | sed -e 's/DEVNAME= *//g'` + FCTEMPS=`egrep '^FCTEMPS=.*$' $1 | sed -e 's/FCTEMPS=//g'` + MINTEMP=`egrep '^MINTEMP=.*$' $1 | sed -e 's/MINTEMP=//g'` + MAXTEMP=`egrep '^MAXTEMP=.*$' $1 | sed -e 's/MAXTEMP=//g'` + MINSTART=`egrep '^MINSTART=.*$' $1 | sed -e 's/MINSTART=//g'` + MINSTOP=`egrep '^MINSTOP=.*$' $1 | sed -e 's/MINSTOP=//g'` + HWMON=$( echo "$DEVPATH" | sed 's/=.*$//g') + FCDEVPATH=$( echo "$DEVPATH" | sed 's/^.*=//g') + FCMINTEMP=$MINTEMP + FCMAXTEMP=$MAXTEMP + FCMINSTART=$MINSTART + FCMINSTOP=$MINSTOP + + FCFANS=`egrep '^FCFANS=.*$' $1 | sed -e 's/FCFANS=//g'` + + # Check whether all mandatory settings are set + if [[ -z ${INTERVAL} || -z ${FCTEMPS} || -z ${MINTEMP} || -z ${MAXTEMP} || -z ${MINSTART} || -z ${MINSTOP} ]] + then + echo "Some mandatory settings missing, please check your config file!" >&2 + exit 1 + fi + if [ "$INTERVAL" -le 0 ] + then + echo "Error in configuration file:" >&2 + echo "INTERVAL must be at least 1" >&2 + exit 1 + fi + + # write settings to arrays for easier use and print them + echo + echo "Common settings:" + + temp_string=$FCTEMPS + + let fcvcount=0 + for fcv in $FCTEMPS + do + fcvcount=$((fcvcount+1)) + AFCTEMP[$fcvcount]=$( echo "$temp_string" | cut -d" " -f $fcvcount ) + AFCTEMP[$fcvcount]=$( echo "${AFCTEMP[$fcvcount]}" | sed 's/hwmon1/\/sys\/bus\/i2c\/devices/g' ) + AFCTEMP_PATH[$fcvcount]=$( echo "${AFCTEMP[$fcvcount]}" | sed 's/hwmon1/\/sys\/bus\/i2c\/devices/g' ) + + AFCTEMP[$fcvcount]=$( cat ${AFCTEMP[$fcvcount]} ) + AFCTEMP[$fcvcount]=$(( AFCTEMP[$fcvcount]/1000 )) + done + + fan_string=$FCFANS + fcvcount=0 + zero=0 + for fcv in $FCFANS + do + fcvcount=$((fcvcount+1)) + AFCFAN[$fcvcount]=$( echo "$fan_string" | cut -d" " -f $fcvcount ) + AFCFAN_PATH[$fcvcount]=$( echo "${AFCFAN[$fcvcount]}" | sed 's/hwmon1/\/sys\/bus\/i2c\/devices/g' ) + AFCFAN_TARGET[$fcvcount]=$( echo "${AFCFAN_PATH[$fcvcount]}" | sed 's/hwmon1/\/sys\/bus\/i2c\/devices/g' ) + AFCFAN_TARGET[$fcvcount]=$( echo "${AFCFAN_TARGET[$fcvcount]}" | sed 's/$/_percentage/g') + AFCFAN[$fcvcount]=$( cat ${AFCFAN_PATH[$fcvcount]} ) + if [ "${AFCFAN[$fcvcount]}" == 960 ] + then + AFCFAN[$fcvcount]=$zero + fi + done +} + +# Check that all referenced sysfs files exist +function CheckFiles +{ + local outdated=0 fcvcount tsen fan + if [ $outdated -eq 1 ] + then + echo >&2 + echo "At least one referenced file is missing. Either some required kernel" >&2 + echo "modules haven't been loaded, or your configuration file is outdated." >&2 + echo "In the latter case, you should run pwmconfig again." >&2 + fi + return $outdated +} + +LoadConfig $1 + +# Detect path to sensors +if [ ! -d $DIR ] +then + echo $0: 'No sensors found! (did you load the necessary modules?)' >&2 + exit 1 +fi +cd $DIR + +# Check for configuration change +if [ "$DIR" != "/" ] && [ -z "$DEVPATH" -o -z "$DEVNAME" ] +then + echo "Configuration is too old, please run pwmconfig again" >&2 + exit 1 +fi +if [ "$DIR" = "/" -a -n "$DEVPATH" ] +then + echo "Unneeded DEVPATH with absolute device paths" >&2 + exit 1 +fi +CheckFiles || exit 1 + +if [ -f "$PIDFILE" ] +then + echo "File $PIDFILE exists, is fancontrol already running?" >&2 + exit 1 +fi +echo $$ > "$PIDFILE" + + +# main function +function UpdateThermalSensors +{ + echo "" + TEMP_HIGHEST=0 + FAN_PERCENTAGE=0 + + for i in ${AFCTEMP_PATH[@]}; do + if (( $(cat $i) > $TEMP_HIGHEST )); then + TEMP_HIGHEST=$(cat $i); + fi; + done + TEMP_HIGHEST=$((TEMP_HIGHEST/1000)) + echo "The highest temperature of thermal sensors: $TEMP_HIGHEST °C" +} + +function UpdateFanSpeeds +{ + if [ $TEMP_HIGHEST -lt 51 ]; then #TEMP<=50 + FAN_PERCENTAGE=40 + elif [ $TEMP_HIGHEST -lt 56 -a $TEMP_HIGHEST -gt 50 ]; then #50 ${AFCFAN_TARGET[$fcvcount]} + AFCFAN[$fcvcount]=$( cat ${AFCFAN_PATH[$fcvcount]} ) + + if [ "${AFCFAN[$fcvcount]}" == 960 ] + then + AFCFAN[$fcvcount]=$zero + fi + done + + if [ $TEMP_HIGHEST -lt 51 ]; then #TEMP<=50 + FAN_ON_PSU_PERCENTAGE=50 + elif [ $TEMP_HIGHEST -lt 100 -a $TEMP_HIGHEST -gt 50 ]; then #50 '/sys/bus/i2c/devices/4-0058/psu_select_member' + echo "$FAN_ON_PSU_PERCENTAGE" > '/sys/bus/i2c/devices/40-0058/fan1_set_percentage' + echo "PSU fan1 =$( cat '/sys/bus/i2c/devices/40-0058/fan1_input' ) (rpm)" + #Set speed to PSU_FAN2 + #echo "0x20" > '/sys/bus/i2c/devices/4-0058/psu_select_member' + echo "$FAN_ON_PSU_PERCENTAGE" > '/sys/bus/i2c/devices/41-0058/fan1_set_percentage' + echo "PSU fan2 =$( cat '/sys/bus/i2c/devices/41-0058/fan1_input' ) (rpm)" + + rm -f "$PIDFILE" +} +# main loop calling the main function at specified intervals +while true +do + UpdateThermalSensors + UpdateFanSpeeds + echo "Sleep $INTERVAL seconds ..." + # Sleep while still handling signals + sleep $INTERVAL & + wait $! +done diff --git a/device/delta/x86_64-delta_ag9032v1-r0/installer.conf b/device/delta/x86_64-delta_ag9032v1-r0/installer.conf new file mode 100644 index 000000000000..fa2af8b7a007 --- /dev/null +++ b/device/delta/x86_64-delta_ag9032v1-r0/installer.conf @@ -0,0 +1,2 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_SPEED=115200 diff --git a/device/delta/x86_64-delta_ag9032v1-r0/led_proc_init.soc b/device/delta/x86_64-delta_ag9032v1-r0/led_proc_init.soc new file mode 100644 index 000000000000..7f6789e90123 --- /dev/null +++ b/device/delta/x86_64-delta_ag9032v1-r0/led_proc_init.soc @@ -0,0 +1,45 @@ +s CMIC_LEDUP0_PROGRAM_RAM 0 +s CMIC_LEDUP1_PROGRAM_RAM 0 + +led 0 stop +led 0 prog 02 00 60 E0 86 ED 2E E0 32 08 97 02 00 0E 00 60 E3 2E E0 32 00 32 01 B7 97 02 00 0E 00 12 E7 50 86 E0 86 E0 86 E0 86 E0 16 E7 61 EB 06 E3 67 4E 67 66 67 66 67 66 67 66 67 66 67 66 67 66 67 66 67 66 67 66 67 66 06 E0 D2 40 74 06 3A C0 D2 01 74 66 06 EB D2 00 70 62 16 ED 99 99 1A 00 71 62 77 66 32 0F 87 57 32 0E 87 57 +led 0 auto on +led 0 start +m CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=31 REMAP_PORT_1=30 REMAP_PORT_2=29 REMAP_PORT_3=28 +m CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=27 REMAP_PORT_5=26 REMAP_PORT_6=25 REMAP_PORT_7=24 +m CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=23 REMAP_PORT_9=22 REMAP_PORT_10=21 REMAP_PORT_11=20 +m CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=19 REMAP_PORT_13=18 REMAP_PORT_14=17 REMAP_PORT_15=16 +m CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=15 REMAP_PORT_17=14 REMAP_PORT_18=13 REMAP_PORT_19=12 +m CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=11 REMAP_PORT_21=10 REMAP_PORT_22=9 REMAP_PORT_23=8 +m CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=7 REMAP_PORT_25=6 REMAP_PORT_26=5 REMAP_PORT_27=4 +m CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=3 REMAP_PORT_29=2 REMAP_PORT_30=1 REMAP_PORT_31=0 +m CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=63 REMAP_PORT_33=62 REMAP_PORT_34=61 REMAP_PORT_35=60 +m CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=59 REMAP_PORT_37=58 REMAP_PORT_38=57 REMAP_PORT_39=56 +m CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=55 REMAP_PORT_41=54 REMAP_PORT_42=53 REMAP_PORT_43=52 +m CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=51 REMAP_PORT_45=50 REMAP_PORT_46=49 REMAP_PORT_47=48 +m CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=47 REMAP_PORT_49=46 REMAP_PORT_50=45 REMAP_PORT_51=44 +m CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=43 REMAP_PORT_53=42 REMAP_PORT_54=41 REMAP_PORT_55=40 +m CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=39 REMAP_PORT_57=38 REMAP_PORT_58=37 REMAP_PORT_59=36 +m CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=35 REMAP_PORT_61=34 REMAP_PORT_62=33 REMAP_PORT_63=32 + +led 1 stop +led 1 prog 02 00 60 E0 86 ED 2E E0 32 08 97 02 00 0E 00 60 E3 2E E0 32 00 32 01 B7 97 02 00 0E 00 12 E7 50 86 E0 86 E0 86 E0 86 E0 16 E7 61 EB 06 E3 67 4E 67 66 67 66 67 66 67 66 67 66 67 66 67 66 67 66 67 66 67 66 67 66 06 E0 D2 40 74 06 3A C0 D2 01 74 66 06 EB D2 00 70 62 16 ED 99 99 1A 00 71 62 77 66 32 0F 87 57 32 0E 87 57 +led 1 auto on +led 1 start +m CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_0=3 REMAP_PORT_1=2 REMAP_PORT_2=1 REMAP_PORT_3=0 +m CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_4=7 REMAP_PORT_5=6 REMAP_PORT_6=5 REMAP_PORT_7=4 +m CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_8=11 REMAP_PORT_9=10 REMAP_PORT_10=9 REMAP_PORT_11=8 +m CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_12=15 REMAP_PORT_13=14 REMAP_PORT_14=13 REMAP_PORT_15=12 +m CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_16=19 REMAP_PORT_17=18 REMAP_PORT_18=17 REMAP_PORT_19=16 +m CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_20=23 REMAP_PORT_21=22 REMAP_PORT_22=21 REMAP_PORT_23=20 +m CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_24=27 REMAP_PORT_25=26 REMAP_PORT_26=25 REMAP_PORT_27=24 +m CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_28=31 REMAP_PORT_29=30 REMAP_PORT_30=29 REMAP_PORT_31=28 +m CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_32=35 REMAP_PORT_33=34 REMAP_PORT_34=33 REMAP_PORT_35=32 +m CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_36=39 REMAP_PORT_37=38 REMAP_PORT_38=37 REMAP_PORT_39=36 +m CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_40=43 REMAP_PORT_41=42 REMAP_PORT_42=41 REMAP_PORT_43=40 +m CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_44=47 REMAP_PORT_45=46 REMAP_PORT_46=45 REMAP_PORT_47=44 +m CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_48=51 REMAP_PORT_49=50 REMAP_PORT_50=49 REMAP_PORT_51=48 +m CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_52=55 REMAP_PORT_53=54 REMAP_PORT_54=53 REMAP_PORT_55=52 +m CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_56=59 REMAP_PORT_57=58 REMAP_PORT_58=57 REMAP_PORT_59=56 +m CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_60=63 REMAP_PORT_61=62 REMAP_PORT_62=61 REMAP_PORT_63=60 + diff --git a/device/delta/x86_64-delta_ag9032v1-r0/minigraph.xml b/device/delta/x86_64-delta_ag9032v1-r0/minigraph.xml new file mode 100644 index 000000000000..db8d62440534 --- /dev/null +++ b/device/delta/x86_64-delta_ag9032v1-r0/minigraph.xml @@ -0,0 +1,1079 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + hundredGigE1/1 + 10.0.0.0/31 + + + + hundredGigE1/2 + 10.0.0.2/31 + + + + hundredGigE1/3 + 10.0.0.4/31 + + + + hundredGigE1/4 + 10.0.0.6/31 + + + + hundredGigE1/5 + 10.0.0.8/31 + + + + hundredGigE1/6 + 10.0.0.10/31 + + + + hundredGigE1/7 + 10.0.0.12/31 + + + + hundredGigE1/8 + 10.0.0.14/31 + + + + hundredGigE1/9 + 10.0.0.16/31 + + + + hundredGigE1/10 + 10.0.0.18/31 + + + + hundredGigE1/11 + 10.0.0.20/31 + + + + hundredGigE1/12 + 10.0.0.22/31 + + + + hundredGigE1/13 + 10.0.0.24/31 + + + + hundredGigE1/14 + 10.0.0.26/31 + + + + hundredGigE1/15 + 10.0.0.28/31 + + + + hundredGigE1/16 + 10.0.0.30/31 + + + + hundredGigE1/17 + 10.0.0.32/31 + + + + hundredGigE1/18 + 10.0.0.34/31 + + + + hundredGigE1/19 + 10.0.0.36/31 + + + + hundredGigE1/20 + 10.0.0.38/31 + + + + hundredGigE1/21 + 10.0.0.40/31 + + + + hundredGigE1/22 + 10.0.0.42/31 + + + + hundredGigE1/23 + 10.0.0.44/31 + + + + hundredGigE1/24 + 10.0.0.46/31 + + + + hundredGigE1/25 + 10.0.0.48/31 + + + + hundredGigE1/26 + 10.0.0.50/31 + + + + hundredGigE1/27 + 10.0.0.52/31 + + + + hundredGigE1/28 + 10.0.0.54/31 + + + + hundredGigE1/29 + 10.0.0.56/31 + + + + hundredGigE1/30 + 10.0.0.58/31 + + + + hundredGigE1/31 + 10.0.0.60/31 + + + + hundredGigE1/32 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + hundredGigE1/1 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/2 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/3 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/4 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/5 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/6 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/7 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/8 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/9 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/10 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/11 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/12 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/13 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/14 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/15 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/16 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/17 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/18 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/19 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/20 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/21 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/22 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/23 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/24 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/25 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/26 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/27 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/28 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/29 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/30 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/31 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + hundredGigE1/32 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Delta-ag9032v1 + + + + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + switch1 + Delta-ag9032v1 +
diff --git a/device/delta/x86_64-delta_ag9032v1-r0/plugins/eeprom.py b/device/delta/x86_64-delta_ag9032v1-r0/plugins/eeprom.py new file mode 100644 index 000000000000..786e1fdc85e3 --- /dev/null +++ b/device/delta/x86_64-delta_ag9032v1-r0/plugins/eeprom.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + _TLV_INFO_MAX_LEN = 256 + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-2/2-0053/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/delta/x86_64-delta_ag9032v1-r0/plugins/sfputil.py b/device/delta/x86_64-delta_ag9032v1-r0/plugins/sfputil.py new file mode 100644 index 000000000000..54d69446b1d8 --- /dev/null +++ b/device/delta/x86_64-delta_ag9032v1-r0/plugins/sfputil.py @@ -0,0 +1,175 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 + + EEPROM_OFFSET = 50 + + _port_to_eeprom_mapping = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + + for x in range(0, self.port_end + 1): + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/delta-ag9032v1-cpld.0/sfp_present") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ModPrsL is active low + if reg_value & mask == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/delta-ag9032v1-cpld.0/sfp_lpmode") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # LPMode is active high + if reg_value & mask == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/devices/platform/delta-ag9032v1-cpld.0/sfp_lpmode", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = hex(reg_value) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/devices/platform/delta-ag9032v1-cpld.0/sfp_reset" + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # File content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_value | mask + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + return True \ No newline at end of file diff --git a/device/delta/x86_64-delta_ag9032v1-r0/sensors.conf b/device/delta/x86_64-delta_ag9032v1-r0/sensors.conf new file mode 100644 index 000000000000..d3b2aea2a5af --- /dev/null +++ b/device/delta/x86_64-delta_ag9032v1-r0/sensors.conf @@ -0,0 +1,61 @@ +# libsensors configuration file for DCS-7060CX-32S +# ------------------------------------------------ +# + +bus "i2c-2" "i2c-1-mux (chan_id 0)" +bus "i2c-3" "i2c-1-mux (chan_id 1)" +bus "i2c-4" "i2c-1-mux (chan_id 2)" +bus "i2c-7" "i2c-1-mux (chan_id 5)" + + +# tmp75-i2c-2-4d CPU below side thermal sensor. +# tmp75-i2c-3-4f Wind thermal sensor. +# tmp75-i2c-7-4c MAC up side thermal sensor. +# tmp75-i2c-7-4d MAC down side thermal sensor. +# tmp75-i2c-7-4e Surroundings thermal sensor. + +chip "tmp75-i2c-2-4d" + label temp1 "CPU below side thermal sensor" + set temp1_max 60 + set temp1_max_hyst 55 + +chip "tmp75-i2c-*-4f" + label temp1 "Wind thermal sensor" + set temp1_max 65 + set temp1_max_hyst 60 +chip "tmp75-i2c-7-4c" + label temp1 "MAC up side thermal sensor" + set temp1_max 80 + set temp1_max_hyst 75 +chip "tmp75-i2c-7-4d" + label temp1 "MAC down side thermal sensor" + set temp1_max 75 + set temp1_max_hyst 70 +chip "tmp75-i2c-7-4e" + label temp1 "Surroundings thermal sensor" + set temp1_max 65 + set temp1_max_hyst 60 + + +chip "emc2305-i2c-3-2d" + label fan1 "FANTRAY 1 REAR" + label fan2 "FANTRAY 2 REAR" + label fan3 "FANTRAY 3 REAR" + label fan4 "FANTRAY 4 REAR" + label fan5 "FANTRAY 5 REAR" +chip "emc2305-i2c-3-2c" + label fan1 "FANTRAY 1 FRONT" + label fan2 "FANTRAY 2 FRONT" + label fan3 "FANTRAY 3 FRONT" + label fan4 "FANTRAY 4 FRONT" + label fan5 "FANTRAY 5 FRONT" +chip "pmbus-i2c-4-50" + label temp1 "Fan of power supply controller 1 sensor 1" + label temp2 "Fan of Power supply controller 1 sensor 2" + +chip "pmbus-i2c-4-40" + label temp1 "Power supply 1 hotspot sensor" + +chip "pmbus-i2c-4-40" + label temp1 "Power supply 2 hotspot sensor" + diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 378129d4da03..717ba7fa0f6b 100755 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -15,6 +15,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(ACCTON_AS5712_54X_PLATFORM_MODULE) \ $(INVENTEC_D7032Q28B_PLATFORM_MODULE) \ $(INVENTEC_D7054Q28B_PLATFORM_MODULE) \ - $(CEL_DX010_PLATFORM_MODULE) + $(CEL_DX010_PLATFORM_MODULE) \ + $(DELTA_AG9032V1_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/broadcom/platform-modules-delta.mk b/platform/broadcom/platform-modules-delta.mk new file mode 100644 index 000000000000..c73b128106a9 --- /dev/null +++ b/platform/broadcom/platform-modules-delta.mk @@ -0,0 +1,12 @@ +# Delta AG9032v1 Platform modules + +DELTA_AG9032V1_PLATFORM_MODULE_VERSION = 1.1 + +export DELTA_AG9032V1_PLATFORM_MODULE_VERSION + +DELTA_AG9032V1_PLATFORM_MODULE = platform-modules-ag9032v1_$(DELTA_AG9032V1_PLATFORM_MODULE_VERSION)_amd64.deb +$(DELTA_AG9032V1_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-delta +$(DELTA_AG9032V1_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(DELTA_AG9032V1_PLATFORM_MODULE)_PLATFORM = x86_64-delta_ag9032v1-r0 +SONIC_DPKG_DEBS += $(DELTA_AG9032V1_PLATFORM_MODULE) + diff --git a/platform/broadcom/rules.mk b/platform/broadcom/rules.mk index b52118570251..e94361987963 100755 --- a/platform/broadcom/rules.mk +++ b/platform/broadcom/rules.mk @@ -7,6 +7,7 @@ include $(PLATFORM_PATH)/platform-modules-ingrasys.mk include $(PLATFORM_PATH)/platform-modules-accton.mk include $(PLATFORM_PATH)/platform-modules-inventec.mk include $(PLATFORM_PATH)/platform-modules-cel.mk +include $(PLATFORM_PATH)/platform-modules-delta.mk include $(PLATFORM_PATH)/docker-orchagent-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm.mk include $(PLATFORM_PATH)/docker-syncd-brcm-rpc.mk diff --git a/platform/broadcom/sonic-platform-modules-delta/LICENSE b/platform/broadcom/sonic-platform-modules-delta/LICENSE new file mode 100644 index 000000000000..ea87fe9caabe --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/LICENSE @@ -0,0 +1,16 @@ +Copyright (C) 2016 Microsoft, Inc +Copyright (C) 2017 Delta Networks, Inc. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9032v1/cfg/ag9032v1-modules.conf b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/cfg/ag9032v1-modules.conf new file mode 100644 index 000000000000..552b4103ed02 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/cfg/ag9032v1-modules.conf @@ -0,0 +1,13 @@ +# /etc/modules: kernel modules to load at boot time. +# +# This file contains the names of kernel modules that should be loaded +# at boot time, one per line. Lines beginning with "#" are ignored. + +i2c-i801 +i2c-isch +i2c-ismt +i2c-dev +i2c-mux +i2c-smbus +i2c-mux-gpio +i2c-mux-pca954x diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/Makefile b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/Makefile new file mode 100644 index 000000000000..69b3b48885d3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/Makefile @@ -0,0 +1,2 @@ +obj-m := at24.o dni_ag9032v1_psu.o dni_emc2305.o delta_ag9032v1_platform.o + diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/at24.c b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/at24.c new file mode 100644 index 000000000000..8e73691647d8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/at24.c @@ -0,0 +1,698 @@ +/* + * at24.c - handle most I2C EEPROMs + * + * Copyright (C) 2005-2007 David Brownell + * Copyright (C) 2008 Wolfram Sang, Pengutronix + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * I2C EEPROMs from most vendors are inexpensive and mostly interchangeable. + * Differences between different vendor product lines (like Atmel AT24C or + * MicroChip 24LC, etc) won't much matter for typical read/write access. + * There are also I2C RAM chips, likewise interchangeable. One example + * would be the PCF8570, which acts like a 24c02 EEPROM (256 bytes). + * + * However, misconfiguration can lose data. "Set 16-bit memory address" + * to a part with 8-bit addressing will overwrite data. Writing with too + * big a page size also loses data. And it's not safe to assume that the + * conventional addresses 0x50..0x57 only hold eeproms; a PCF8563 RTC + * uses 0x51, for just one example. + * + * Accordingly, explicit board-specific configuration data should be used + * in almost all cases. (One partial exception is an SMBus used to access + * "SPD" data for DRAM sticks. Those only use 24c02 EEPROMs.) + * + * So this driver uses "new style" I2C driver binding, expecting to be + * told what devices exist. That may be in arch/X/mach-Y/board-Z.c or + * similar kernel-resident tables; or, configuration data coming from + * a bootloader. + * + * Other than binding model, current differences from "eeprom" driver are + * that this one handles write access and isn't restricted to 24c02 devices. + * It also handles larger devices (32 kbit and up) with two-byte addresses, + * which won't work on pure SMBus systems. + */ + +struct at24_data { + struct at24_platform_data chip; + struct memory_accessor macc; + int use_smbus; + + /* + * Lock protects against activities from other Linux tasks, + * but not from changes by other I2C masters. + */ + struct mutex lock; + struct bin_attribute bin; + + u8 *writebuf; + unsigned write_max; + unsigned num_addresses; + + /* + * Some chips tie up multiple I2C addresses; dummy devices reserve + * them for us, and we'll use them with SMBus calls. + */ + struct i2c_client *client[]; +}; + +/* + * This parameter is to help this driver avoid blocking other drivers out + * of I2C for potentially troublesome amounts of time. With a 100 kHz I2C + * clock, one 256 byte read takes about 1/43 second which is excessive; + * but the 1/170 second it takes at 400 kHz may be quite reasonable; and + * at 1 MHz (Fm+) a 1/430 second delay could easily be invisible. + * + * This value is forced to be a power of two so that writes align on pages. + */ +static unsigned io_limit = 32; +module_param(io_limit, uint, 0); +MODULE_PARM_DESC(io_limit, "Maximum bytes per I/O (default 32)"); + +/* + * Specs often allow 5 msec for a page write, sometimes 20 msec; + * it's important to recover from write timeouts. + */ +static unsigned write_timeout = 25; +module_param(write_timeout, uint, 0); +MODULE_PARM_DESC(write_timeout, "Time (in ms) to try writes (default 25)"); + +#define AT24_SIZE_BYTELEN 5 +#define AT24_SIZE_FLAGS 8 + +#define AT24_BITMASK(x) (BIT(x) - 1) + +/* create non-zero magic value for given eeprom parameters */ +#define AT24_DEVICE_MAGIC(_len, _flags) \ + ((1 << AT24_SIZE_FLAGS | (_flags)) \ + << AT24_SIZE_BYTELEN | ilog2(_len)) + +static const struct i2c_device_id at24_ids[] = { + /* needs 8 addresses as A0-A2 are ignored */ + { "24c00", AT24_DEVICE_MAGIC(128 / 8, AT24_FLAG_TAKE8ADDR) }, + /* old variants can't be handled with this generic entry! */ + { "24c01", AT24_DEVICE_MAGIC(1024 / 8, 0) }, + { "24c02", AT24_DEVICE_MAGIC(2048 / 8, 0) }, + /* spd is a 24c02 in memory DIMMs */ + { "spd", AT24_DEVICE_MAGIC(2048 / 8, + AT24_FLAG_READONLY | AT24_FLAG_IRUGO) }, + { "24c04", AT24_DEVICE_MAGIC(4096 / 8, 0) }, + /* 24rf08 quirk is handled at i2c-core */ + { "24c08", AT24_DEVICE_MAGIC(8192 / 8, 0) }, + { "24c16", AT24_DEVICE_MAGIC(16384 / 8, 0) }, + { "24c32", AT24_DEVICE_MAGIC(32768 / 8, AT24_FLAG_ADDR16) }, + { "24c64", AT24_DEVICE_MAGIC(65536 / 8, AT24_FLAG_ADDR16) }, + { "24c128", AT24_DEVICE_MAGIC(131072 / 8, AT24_FLAG_ADDR16) }, + { "24c256", AT24_DEVICE_MAGIC(262144 / 8, AT24_FLAG_ADDR16) }, + { "24c512", AT24_DEVICE_MAGIC(524288 / 8, AT24_FLAG_ADDR16) }, + { "24c1024", AT24_DEVICE_MAGIC(1048576 / 8, AT24_FLAG_ADDR16) }, + { "at24", 0 }, + { /* END OF LIST */ } +}; +MODULE_DEVICE_TABLE(i2c, at24_ids); + +/*-------------------------------------------------------------------------*/ + +/* + * This routine supports chips which consume multiple I2C addresses. It + * computes the addressing information to be used for a given r/w request. + * Assumes that sanity checks for offset happened at sysfs-layer. + */ +static struct i2c_client *at24_translate_offset(struct at24_data *at24, + unsigned *offset) +{ + unsigned i; + + if (at24->chip.flags & AT24_FLAG_ADDR16) { + i = *offset >> 16; + *offset &= 0xffff; + } else { + i = *offset >> 8; + *offset &= 0xff; + } + + return at24->client[i]; +} + +static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf, + unsigned offset, size_t count) +{ + struct i2c_msg msg[2]; + u8 msgbuf[2]; + struct i2c_client *client; + unsigned long timeout, read_time; + int status, i; + + memset(msg, 0, sizeof(msg)); + + /* + * REVISIT some multi-address chips don't rollover page reads to + * the next slave address, so we may need to truncate the count. + * Those chips might need another quirk flag. + * + * If the real hardware used four adjacent 24c02 chips and that + * were misconfigured as one 24c08, that would be a similar effect: + * one "eeprom" file not four, but larger reads would fail when + * they crossed certain pages. + */ + + /* + * Slave address and byte offset derive from the offset. Always + * set the byte address; on a multi-master board, another master + * may have changed the chip's "current" address pointer. + */ + client = at24_translate_offset(at24, &offset); + + if (count > io_limit) + count = io_limit; + + switch (at24->use_smbus) { + case I2C_SMBUS_I2C_BLOCK_DATA: + /* Smaller eeproms can work given some SMBus extension calls */ + if (count > I2C_SMBUS_BLOCK_MAX) + count = I2C_SMBUS_BLOCK_MAX; + break; + case I2C_SMBUS_WORD_DATA: + /* Check for odd length transaction */ + count = (count == 1) ? 1 : 2; + break; + case I2C_SMBUS_BYTE_DATA: + count = 1; + break; + default: + /* + * When we have a better choice than SMBus calls, use a + * combined I2C message. Write address; then read up to + * io_limit data bytes. Note that read page rollover helps us + * here (unlike writes). msgbuf is u8 and will cast to our + * needs. + */ + i = 0; + if (at24->chip.flags & AT24_FLAG_ADDR16) + msgbuf[i++] = offset >> 8; + msgbuf[i++] = offset; + + msg[0].addr = client->addr; + msg[0].buf = msgbuf; + msg[0].len = i; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = buf; + msg[1].len = count; + } + + /* + * Reads fail if the previous write didn't complete yet. We may + * loop a few times until this one succeeds, waiting at least + * long enough for one entire page write to work. + */ + timeout = jiffies + msecs_to_jiffies(write_timeout); + do { + read_time = jiffies; + switch (at24->use_smbus) { + case I2C_SMBUS_I2C_BLOCK_DATA: + status = i2c_smbus_read_i2c_block_data(client, offset, + count, buf); + break; + case I2C_SMBUS_WORD_DATA: + status = i2c_smbus_read_word_data(client, offset); + if (status >= 0) { + buf[0] = status & 0xff; + if (count == 2) + buf[1] = status >> 8; + status = count; + } + break; + case I2C_SMBUS_BYTE_DATA: + status = i2c_smbus_read_byte_data(client, offset); + if (status >= 0) { + buf[0] = status; + status = count; + } + break; + default: + status = i2c_transfer(client->adapter, msg, 2); + if (status == 2) + status = count; + } + dev_dbg(&client->dev, "read %zu@%d --> %d (%ld)\n", + count, offset, status, jiffies); + + if (status == count) + return count; + + /* REVISIT: at HZ=100, this is sloooow */ + msleep(1); + } while (time_before(read_time, timeout)); + + return -ETIMEDOUT; +} + +static ssize_t at24_read(struct at24_data *at24, + char *buf, loff_t off, size_t count) +{ + ssize_t retval = 0; + + if (unlikely(!count)) + return count; + + /* + * Read data from chip, protecting against concurrent updates + * from this host, but not from other I2C masters. + */ + mutex_lock(&at24->lock); + + while (count) { + ssize_t status; + + status = at24_eeprom_read(at24, buf, off, count); + if (status <= 0) { + if (retval == 0) + retval = status; + break; + } + buf += status; + off += status; + count -= status; + retval += status; + } + + mutex_unlock(&at24->lock); + + return retval; +} + +static ssize_t at24_bin_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct at24_data *at24; + + at24 = dev_get_drvdata(container_of(kobj, struct device, kobj)); + return at24_read(at24, buf, off, count); +} + + +/* + * Note that if the hardware write-protect pin is pulled high, the whole + * chip is normally write protected. But there are plenty of product + * variants here, including OTP fuses and partial chip protect. + * + * We only use page mode writes; the alternative is sloooow. This routine + * writes at most one page. + */ +static ssize_t at24_eeprom_write(struct at24_data *at24, const char *buf, + unsigned offset, size_t count) +{ + struct i2c_client *client; + struct i2c_msg msg; + ssize_t status; + unsigned long timeout, write_time; + unsigned next_page; + + /* Get corresponding I2C address and adjust offset */ + client = at24_translate_offset(at24, &offset); + + /* write_max is at most a page */ + if (count > at24->write_max) + count = at24->write_max; + + /* Never roll over backwards, to the start of this page */ + next_page = roundup(offset + 1, at24->chip.page_size); + if (offset + count > next_page) + count = next_page - offset; + + /* If we'll use I2C calls for I/O, set up the message */ + if (!at24->use_smbus) { + int i = 0; + + msg.addr = client->addr; + msg.flags = 0; + + /* msg.buf is u8 and casts will mask the values */ + msg.buf = at24->writebuf; + if (at24->chip.flags & AT24_FLAG_ADDR16) + msg.buf[i++] = offset >> 8; + + msg.buf[i++] = offset; + memcpy(&msg.buf[i], buf, count); + msg.len = i + count; + } + + /* + * Writes fail if the previous one didn't complete yet. We may + * loop a few times until this one succeeds, waiting at least + * long enough for one entire page write to work. + */ + timeout = jiffies + msecs_to_jiffies(write_timeout); + do { + write_time = jiffies; + if (at24->use_smbus) { + status = i2c_smbus_write_i2c_block_data(client, + offset, count, buf); + if (status == 0) + status = count; + } else { + status = i2c_transfer(client->adapter, &msg, 1); + if (status == 1) + status = count; + } + dev_dbg(&client->dev, "write %zu@%d --> %zd (%ld)\n", + count, offset, status, jiffies); + + if (status == count) + return count; + + /* REVISIT: at HZ=100, this is sloooow */ + msleep(1); + } while (time_before(write_time, timeout)); + + return -ETIMEDOUT; +} + +static ssize_t at24_write(struct at24_data *at24, const char *buf, loff_t off, + size_t count) +{ + ssize_t retval = 0; + + if (unlikely(!count)) + return count; + + /* + * Write data to chip, protecting against concurrent updates + * from this host, but not from other I2C masters. + */ + mutex_lock(&at24->lock); + + while (count) { + ssize_t status; + + status = at24_eeprom_write(at24, buf, off, count); + if (status <= 0) { + if (retval == 0) + retval = status; + break; + } + buf += status; + off += status; + count -= status; + retval += status; + } + + mutex_unlock(&at24->lock); + + return retval; +} + +static ssize_t at24_bin_write(struct file *filp, struct kobject *kobj, + struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct at24_data *at24; + + if (unlikely(off >= attr->size)) + return -EFBIG; + + at24 = dev_get_drvdata(container_of(kobj, struct device, kobj)); + return at24_write(at24, buf, off, count); +} + +/*-------------------------------------------------------------------------*/ + +/* + * This lets other kernel code access the eeprom data. For example, it + * might hold a board's Ethernet address, or board-specific calibration + * data generated on the manufacturing floor. + */ + +static ssize_t at24_macc_read(struct memory_accessor *macc, char *buf, + off_t offset, size_t count) +{ + struct at24_data *at24 = container_of(macc, struct at24_data, macc); + + return at24_read(at24, buf, offset, count); +} + +static ssize_t at24_macc_write(struct memory_accessor *macc, const char *buf, + off_t offset, size_t count) +{ + struct at24_data *at24 = container_of(macc, struct at24_data, macc); + + return at24_write(at24, buf, offset, count); +} + +/*-------------------------------------------------------------------------*/ + +#ifdef CONFIG_OF +static void at24_get_ofdata(struct i2c_client *client, + struct at24_platform_data *chip) +{ + const __be32 *val; + struct device_node *node = client->dev.of_node; + + if (node) { + if (of_get_property(node, "read-only", NULL)) + chip->flags |= AT24_FLAG_READONLY; + val = of_get_property(node, "pagesize", NULL); + if (val) + chip->page_size = be32_to_cpup(val); + } +} +#else +static void at24_get_ofdata(struct i2c_client *client, + struct at24_platform_data *chip) +{ } +#endif /* CONFIG_OF */ + +static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct at24_platform_data chip; + bool writable; + int use_smbus = 0; + struct at24_data *at24; + int err; + unsigned i, num_addresses; + kernel_ulong_t magic; + + if (client->dev.platform_data) { + chip = *(struct at24_platform_data *)client->dev.platform_data; + } else { + if (!id->driver_data) + return -ENODEV; + + magic = id->driver_data; + chip.byte_len = BIT(magic & AT24_BITMASK(AT24_SIZE_BYTELEN)); + magic >>= AT24_SIZE_BYTELEN; + chip.flags = magic & AT24_BITMASK(AT24_SIZE_FLAGS); + /* + * This is slow, but we can't know all eeproms, so we better + * play safe. Specifying custom eeprom-types via platform_data + * is recommended anyhow. + */ + chip.page_size = 1; + + /* update chipdata if OF is present */ + at24_get_ofdata(client, &chip); + + chip.setup = NULL; + chip.context = NULL; + } + + if (!is_power_of_2(chip.byte_len)) + dev_warn(&client->dev, + "byte_len looks suspicious (no power of 2)!\n"); + if (!chip.page_size) { + dev_err(&client->dev, "page_size must not be 0!\n"); + return -EINVAL; + } + if (!is_power_of_2(chip.page_size)) + dev_warn(&client->dev, + "page_size looks suspicious (no power of 2)!\n"); + + /* Use I2C operations unless we're stuck with SMBus extensions. */ + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + if (chip.flags & AT24_FLAG_ADDR16) + return -EPFNOSUPPORT; + + if (i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_I2C_BLOCK)) { + use_smbus = I2C_SMBUS_I2C_BLOCK_DATA; + } else if (i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_WORD_DATA)) { + use_smbus = I2C_SMBUS_WORD_DATA; + } else if (i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_BYTE_DATA)) { + use_smbus = I2C_SMBUS_BYTE_DATA; + } else { + return -EPFNOSUPPORT; + } + } + + if (chip.flags & AT24_FLAG_TAKE8ADDR) + num_addresses = 8; + else + num_addresses = DIV_ROUND_UP(chip.byte_len, + (chip.flags & AT24_FLAG_ADDR16) ? 65536 : 256); + + at24 = devm_kzalloc(&client->dev, sizeof(struct at24_data) + + num_addresses * sizeof(struct i2c_client *), GFP_KERNEL); + if (!at24) + return -ENOMEM; + + mutex_init(&at24->lock); + at24->use_smbus = use_smbus; + at24->chip = chip; + at24->num_addresses = num_addresses; + + /* + * Export the EEPROM bytes through sysfs, since that's convenient. + * By default, only root should see the data (maybe passwords etc) + */ + sysfs_bin_attr_init(&at24->bin); + at24->bin.attr.name = "eeprom"; + at24->bin.attr.mode = chip.flags & AT24_FLAG_IRUGO ? S_IRUGO : S_IRUSR; + at24->bin.read = at24_bin_read; + at24->bin.size = chip.byte_len; + + at24->macc.read = at24_macc_read; + + writable = !(chip.flags & AT24_FLAG_READONLY); + if (writable) { + if (!use_smbus || i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)) { + + unsigned write_max = chip.page_size; + + at24->macc.write = at24_macc_write; + + at24->bin.write = at24_bin_write; + at24->bin.attr.mode |= S_IWUSR; + + if (write_max > io_limit) + write_max = io_limit; + if (use_smbus && write_max > I2C_SMBUS_BLOCK_MAX) + write_max = I2C_SMBUS_BLOCK_MAX; + at24->write_max = write_max; + + /* buffer (data + address at the beginning) */ + at24->writebuf = devm_kzalloc(&client->dev, + write_max + 2, GFP_KERNEL); + if (!at24->writebuf) + return -ENOMEM; + } else { + dev_warn(&client->dev, + "cannot write due to controller restrictions."); + } + } + + at24->client[0] = client; + + /* use dummy devices for multiple-address chips */ + for (i = 1; i < num_addresses; i++) { + at24->client[i] = i2c_new_dummy(client->adapter, + client->addr + i); + if (!at24->client[i]) { + dev_err(&client->dev, "address 0x%02x unavailable\n", + client->addr + i); + err = -EADDRINUSE; + goto err_clients; + } + } + + err = sysfs_create_bin_file(&client->dev.kobj, &at24->bin); + if (err) + goto err_clients; + + i2c_set_clientdata(client, at24); + + dev_info(&client->dev, "%zu byte %s EEPROM, %s, %u bytes/write\n", + at24->bin.size, client->name, + writable ? "writable" : "read-only", at24->write_max); + if (use_smbus == I2C_SMBUS_WORD_DATA || + use_smbus == I2C_SMBUS_BYTE_DATA) { + dev_notice(&client->dev, "Falling back to %s reads, " + "performance will suffer\n", use_smbus == + I2C_SMBUS_WORD_DATA ? "word" : "byte"); + } + + /* export data to kernel code */ + if (chip.setup) + chip.setup(&at24->macc, chip.context); + + return 0; + +err_clients: + for (i = 1; i < num_addresses; i++) + if (at24->client[i]) + i2c_unregister_device(at24->client[i]); + + return err; +} + +static int at24_remove(struct i2c_client *client) +{ + struct at24_data *at24; + int i; + + at24 = i2c_get_clientdata(client); + sysfs_remove_bin_file(&client->dev.kobj, &at24->bin); + + for (i = 1; i < at24->num_addresses; i++) + i2c_unregister_device(at24->client[i]); + + return 0; +} + +/*-------------------------------------------------------------------------*/ + +static struct i2c_driver at24_driver = { + .driver = { + .name = "at24", + .owner = THIS_MODULE, + }, + .probe = at24_probe, + .remove = at24_remove, + .id_table = at24_ids, +}; + +static int __init at24_init(void) +{ + if (!io_limit) { + pr_err("at24: io_limit must not be 0!\n"); + return -EINVAL; + } + + io_limit = rounddown_pow_of_two(io_limit); + return i2c_add_driver(&at24_driver); +} +module_init(at24_init); + +static void __exit at24_exit(void) +{ + i2c_del_driver(&at24_driver); +} +module_exit(at24_exit); + +MODULE_DESCRIPTION("Driver for most I2C EEPROMs"); +MODULE_AUTHOR("David Brownell and Wolfram Sang"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/delta_ag9032v1_platform.c b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/delta_ag9032v1_platform.c new file mode 100644 index 000000000000..90454a5bdb4a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/delta_ag9032v1_platform.c @@ -0,0 +1,1530 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUS3_DEV_NUM 9 +#define BUS4_DEV_NUM 6 +#define BUS5_DEV_NUM 32 +#define DEFAULT_NUM 1 +#define BUS3_BASE_NUM 30 +#define BUS4_BASE_NUM 40 +#define BUS5_BASE_NUM 50 + +#define BUS3_MUX_REG 0x21 +#define BUS4_MUX_REG 0x21 +#define BUS5_MUX_REG 0x20 + +#define TEMP_FAN_VAL 0x06 +#define FANIO_CTL_VAL 0x07 +#define FAN_CTRL_VAL 0x05 +#define PSU1_VAL 0x00 +#define PSU2_VAL 0x20 +#define HOT_SWAP1_VAL 0x10 +#define HOT_SWAP2_VAL 0x30 +#define FAN_EEPROM1_VAL 0x00 +#define FAN_EEPROM2_VAL 0x01 +#define FAN_EEPROM3_VAL 0x02 +#define FAN_EEPROM4_VAL 0x03 +#define FAN_EEPROM5_VAL 0x04 + +#define SWPLD_REG 0x31 +#define SWPLD_SFP_MUX_REG 0x20 + +#define SYS_LED_REG 0x1C +#define FAN1_LED_REG 0x1D +#define FAN2_LED_REG 0x1E + +#define SFP_PRESENCE_1 0x38 +#define SFP_PRESENCE_2 0x39 +#define SFP_PRESENCE_3 0x3A +#define SFP_PRESENCE_4 0x3B + +#define SFP_LP_MODE_1 0x34 +#define SFP_LP_MODE_2 0x35 +#define SFP_LP_MODE_3 0x36 +#define SFP_LP_MODE_4 0x37 + +#define SFP_RESET_1 0x3C +#define SFP_RESET_2 0x3D +#define SFP_RESET_3 0x3E +#define SFP_RESET_4 0x3F + +#define SFP_RESPONSE_1 0x30 +#define SFP_RESPONSE_2 0x31 +#define SFP_RESPONSE_3 0x32 +#define SFP_RESPONSE_4 0x33 + +#define SFF8436_INFO(data) \ + .type = "sff8436", .addr = 0x50, .platform_data = (data) + +#define SFF_8346_PORT(eedata) \ + .byte_len = 256, .page_size = 1, .flags = SFF_8436_FLAG_READONLY + +#define ag9032v1_i2c_device_num(NUM){ \ + .name = "delta-ag9032v1-i2c-device", \ + .id = NUM, \ + .dev = { \ + .platform_data = &ag9032v1_i2c_device_platform_data[NUM], \ + .release = device_release, \ + }, \ +} + +/*Define struct to get client of i2c_new_deivce */ +struct i2c_client * i2c_client_9547; + +enum{ + BUS0 = 0, + BUS1, + BUS2, + BUS3, + BUS4, + BUS5, + BUS6, + BUS7, +}; + +unsigned char reverse_8bits(unsigned char c) +{ + unsigned char s = 0; + int i; + for (i = 0; i < 8; ++i) { + s <<= 1; + s |= c & 1; + c >>= 1; + } + return s; +} +/*---------------- I2C device - start ------------- */ +static void device_release(struct device *dev) +{ + return; +} + +struct i2c_device_platform_data { + int parent; + struct i2c_board_info info; + struct i2c_client *client; +}; +/* pca9547 - add 8 bus */ +static struct pca954x_platform_mode pca954x_mode[] = { + { .adap_id = 2, + .deselect_on_exit = 1, + }, + { .adap_id = 3, + .deselect_on_exit = 1, + }, + { .adap_id = 4, + .deselect_on_exit = 1, + }, + { .adap_id = 5, + .deselect_on_exit = 1, + }, + { .adap_id = 6, + .deselect_on_exit = 1, + }, + { .adap_id = 7, + .deselect_on_exit = 1, + }, + { .adap_id = 8, + .deselect_on_exit = 1, + }, + { .adap_id = 9, + .deselect_on_exit = 1, + }, +}; + +static struct pca954x_platform_data pca954x_data = { + .modes = pca954x_mode, + .num_modes = ARRAY_SIZE(pca954x_mode), +}; + +static struct i2c_board_info __initdata i2c_info_pca9547[] = +{ + { + I2C_BOARD_INFO("pca9547", 0x71), + .platform_data = &pca954x_data, + }, +}; + + +static struct sff_8436_platform_data sff_8436_port[] = { + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, + { SFF_8346_PORT() }, +}; + +static struct i2c_device_platform_data ag9032v1_i2c_device_platform_data[] = { + { + /* tmp75 (0x4d) */ + .parent = 2, + .info = { I2C_BOARD_INFO("tmp75", 0x4d) }, + .client = NULL, + }, + { + /* id eeprom (0x53) */ + .parent = 2, + .info = { I2C_BOARD_INFO("24c02", 0x53) }, + .client = NULL, + }, + { + /* tmp75 (0x4c) */ + .parent = 7, + .info = { I2C_BOARD_INFO("tmp75", 0x4c) }, + .client = NULL, + }, + { + /* tmp75 (0x4d) */ + .parent = 7, + .info = { I2C_BOARD_INFO("tmp75", 0x4d) }, + .client = NULL, + }, + { + /* tmp75 (0x4e) */ + .parent = 7, + .info = { I2C_BOARD_INFO("tmp75", 0x4e) }, + .client = NULL, + }, + { + /* tmp75 (0x4f) */ + .parent = 30, + .info = { I2C_BOARD_INFO("tmp75", 0x4f) }, + .client = NULL, + }, + { + /* FAN 1 Controller (0x2c) */ + .parent = 37, + .info = { I2C_BOARD_INFO("emc2305", 0x2c) }, + .client = NULL, + }, + { + /* FAN 2 Controller (0x2d) */ + .parent = 38, + .info = { I2C_BOARD_INFO("emc2305", 0x2d) }, + .client = NULL, + }, + { + /* psu 1 (0x58) */ + .parent = 40, + .info = { .type = "dni_ag9032v1_psu", .addr = 0x58, .platform_data = 0 }, + .client = NULL, + }, + { + /* psu 2 (0x58) */ + .parent = 41, + .info = { .type = "dni_ag9032v1_psu", .addr = 0x58, .platform_data = 1 }, + .client = NULL, + }, + { + /* hot-swap 1 (0x40) */ + .parent = 42, + .info = { .type = "ltc4215", .addr = 0x40, .platform_data = 0 }, + .client = NULL, + }, + { + /* hot-swap 2 (0x40) */ + .parent = 43, + .info = { .type = "ltc4215", .addr = 0x40, .platform_data = 1 }, + .client = NULL, + }, + { + /* qsfp 1 (0x50) */ + .parent = 50, + .info = { SFF8436_INFO(&sff_8436_port[0]) }, + .client = NULL, + }, + { + /* qsfp 2 (0x50) */ + .parent = 51, + .info = { SFF8436_INFO(&sff_8436_port[1]) }, + .client = NULL, + }, + { + /* qsfp 3 (0x50) */ + .parent = 52, + .info = { SFF8436_INFO(&sff_8436_port[2]) }, + .client = NULL, + }, + { + /* qsfp 4 (0x50) */ + .parent = 53, + .info = { SFF8436_INFO(&sff_8436_port[3]) }, + .client = NULL, + }, + { + /* qsfp 5 (0x50) */ + .parent = 54, + .info = { SFF8436_INFO(&sff_8436_port[4]) }, + .client = NULL, + }, + { + /* qsfp 6 (0x50) */ + .parent = 55, + .info = { SFF8436_INFO(&sff_8436_port[5]) }, + .client = NULL, + }, + { + /* qsfp 7 (0x50) */ + .parent = 56, + .info = { SFF8436_INFO(&sff_8436_port[6]) }, + .client = NULL, + }, + { + /* qsfp 8 (0x50) */ + .parent = 57, + .info = { SFF8436_INFO(&sff_8436_port[7]) }, + .client = NULL, + }, + { + /* qsfp 9 (0x50) */ + .parent = 58, + .info = { SFF8436_INFO(&sff_8436_port[8]) }, + .client = NULL, + }, + { + /* qsfp 10 (0x50) */ + .parent = 59, + .info = { SFF8436_INFO(&sff_8436_port[9]) }, + .client = NULL, + }, + { + /* qsfp 11 (0x50) */ + .parent = 60, + .info = { SFF8436_INFO(&sff_8436_port[10]) }, + .client = NULL, + }, + { + /* qsfp 12 (0x50) */ + .parent = 61, + .info = { SFF8436_INFO(&sff_8436_port[11]) }, + .client = NULL, + }, + { + /* qsfp 13 (0x50) */ + .parent = 62, + .info = { SFF8436_INFO(&sff_8436_port[12]) }, + .client = NULL, + }, + { + /* qsfp 14 (0x50) */ + .parent = 63, + .info = { SFF8436_INFO(&sff_8436_port[13]) }, + .client = NULL, + }, + { + /* qsfp 15 (0x50) */ + .parent = 64, + .info = { SFF8436_INFO(&sff_8436_port[14]) }, + .client = NULL, + }, + { + /* qsfp 16 (0x50) */ + .parent = 65, + .info = { SFF8436_INFO(&sff_8436_port[15]) }, + .client = NULL, + }, + { + /* qsfp 17 (0x50) */ + .parent = 66, + .info = { SFF8436_INFO(&sff_8436_port[16]) }, + .client = NULL, + }, + { + /* qsfp 18 (0x50) */ + .parent = 67, + .info = { SFF8436_INFO(&sff_8436_port[17]) }, + .client = NULL, + }, + { + /* qsfp 19 (0x50) */ + .parent = 68, + .info = { SFF8436_INFO(&sff_8436_port[18]) }, + .client = NULL, + }, + { + /* qsfp 20 (0x50) */ + .parent = 69, + .info = { SFF8436_INFO(&sff_8436_port[19]) }, + .client = NULL, + }, + { + /* qsfp 21 (0x50) */ + .parent = 70, + .info = { SFF8436_INFO(&sff_8436_port[20]) }, + .client = NULL, + }, + { + /* qsfp 22 (0x50) */ + .parent = 71, + .info = { SFF8436_INFO(&sff_8436_port[21]) }, + .client = NULL, + }, + { + /* qsfp 23 (0x50) */ + .parent = 72, + .info = { SFF8436_INFO(&sff_8436_port[22]) }, + .client = NULL, + }, + { + /* qsfp 24 (0x50) */ + .parent = 73, + .info = { SFF8436_INFO(&sff_8436_port[23]) }, + .client = NULL, + }, + { + /* qsfp 25 (0x50) */ + .parent = 74, + .info = { SFF8436_INFO(&sff_8436_port[24]) }, + .client = NULL, + }, + { + /* qsfp 26 (0x50) */ + .parent = 75, + .info = { SFF8436_INFO(&sff_8436_port[25]) }, + .client = NULL, + }, + { + /* qsfp 27 (0x50) */ + .parent = 76, + .info = { SFF8436_INFO(&sff_8436_port[26]) }, + .client = NULL, + }, + { + /* qsfp 28 (0x50) */ + .parent = 77, + .info = { SFF8436_INFO(&sff_8436_port[27]) }, + .client = NULL, + }, + { + /* qsfp 29 (0x50) */ + .parent = 78, + .info = { SFF8436_INFO(&sff_8436_port[28]) }, + .client = NULL, + }, + { + /* qsfp 30 (0x50) */ + .parent = 79, + .info = { SFF8436_INFO(&sff_8436_port[29]) }, + .client = NULL, + }, + { + /* qsfp 31 (0x50) */ + .parent = 80, + .info = { SFF8436_INFO(&sff_8436_port[30]) }, + .client = NULL, + }, + { + /* qsfp 32 (0x50) */ + .parent = 81, + .info = { SFF8436_INFO(&sff_8436_port[31]) }, + .client = NULL, + }, +}; + + +static struct platform_device ag9032v1_i2c_device[] = { + ag9032v1_i2c_device_num(0), + ag9032v1_i2c_device_num(1), + ag9032v1_i2c_device_num(2), + ag9032v1_i2c_device_num(3), + ag9032v1_i2c_device_num(4), + ag9032v1_i2c_device_num(5), + ag9032v1_i2c_device_num(6), + ag9032v1_i2c_device_num(7), + ag9032v1_i2c_device_num(8), + ag9032v1_i2c_device_num(9), + ag9032v1_i2c_device_num(10), + ag9032v1_i2c_device_num(11), + ag9032v1_i2c_device_num(12), + ag9032v1_i2c_device_num(13), + ag9032v1_i2c_device_num(14), + ag9032v1_i2c_device_num(15), + ag9032v1_i2c_device_num(16), + ag9032v1_i2c_device_num(17), + ag9032v1_i2c_device_num(18), + ag9032v1_i2c_device_num(19), + ag9032v1_i2c_device_num(20), + ag9032v1_i2c_device_num(21), + ag9032v1_i2c_device_num(22), + ag9032v1_i2c_device_num(23), + ag9032v1_i2c_device_num(24), + ag9032v1_i2c_device_num(25), + ag9032v1_i2c_device_num(26), + ag9032v1_i2c_device_num(27), + ag9032v1_i2c_device_num(28), + ag9032v1_i2c_device_num(29), + ag9032v1_i2c_device_num(30), + ag9032v1_i2c_device_num(31), + ag9032v1_i2c_device_num(32), + ag9032v1_i2c_device_num(33), + ag9032v1_i2c_device_num(34), + ag9032v1_i2c_device_num(35), + ag9032v1_i2c_device_num(36), + ag9032v1_i2c_device_num(37), + ag9032v1_i2c_device_num(38), + ag9032v1_i2c_device_num(39), + ag9032v1_i2c_device_num(40), + ag9032v1_i2c_device_num(41), + ag9032v1_i2c_device_num(42), + ag9032v1_i2c_device_num(43), +}; + +/*---------------- I2C device - end ------------- */ + +/*---------------- I2C driver - start ------------- */ +static int __init i2c_device_probe(struct platform_device *pdev) +{ + struct i2c_device_platform_data *pdata; + struct i2c_adapter *parent; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "Missing platform data\n"); + return -ENODEV; + } + + parent = i2c_get_adapter(pdata->parent); + if (!parent) { + dev_err(&pdev->dev, "Parent adapter (%d) not found\n", + pdata->parent); + return -ENODEV; + } + + pdata->client = i2c_new_device(parent, &pdata->info); + if (!pdata->client) { + dev_err(&pdev->dev, "Failed to create i2c client %s at %d\n", + pdata->info.type, pdata->parent); + return -ENODEV; + } + + return 0; +} + +static int __exit i2c_deivce_remove(struct platform_device *pdev) +{ + struct i2c_adapter *parent; + struct i2c_device_platform_data *pdata; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "Missing platform data\n"); + return -ENODEV; + } + + if (pdata->client) { + parent = i2c_get_adapter(pdata->parent); + i2c_unregister_device(pdata->client); + i2c_put_adapter(parent); + } + + return 0; +} +static struct platform_driver i2c_device_driver = { + .probe = i2c_device_probe, + .remove = __exit_p(i2c_deivce_remove), + .driver = { + .owner = THIS_MODULE, + .name = "delta-ag9032v1-i2c-device", + } +}; + +/*---------------- I2C driver - end ------------- */ + +/*---------------- CPLD - start ------------- */ + +/* CPLD -- device */ + +enum cpld_type { + system_cpld, +}; + +struct cpld_platform_data { + int reg_addr; + struct i2c_client *client; +}; + +static struct cpld_platform_data ag9032v1_cpld_platform_data[] = { + [system_cpld] = { + .reg_addr = SWPLD_REG, + }, +}; + +static struct platform_device ag9032v1_cpld = { + .name = "delta-ag9032v1-cpld", + .id = 0, + .dev = { + .platform_data = ag9032v1_cpld_platform_data, + .release = device_release + }, +}; + +static ssize_t get_present(struct device *dev, struct device_attribute \ + *dev_attr, char *buf) +{ + int ret; + u32 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_PRESENCE_1); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data = (u32)reverse_8bits(ret) & 0xff; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_PRESENCE_2); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 8; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_PRESENCE_3); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 16; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_PRESENCE_4); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 24; + + return sprintf(buf, "0x%08x\n", data); //return 32bits data +} + +static ssize_t get_lpmode(struct device *dev, struct device_attribute *devattr, char *buf) +{ + int ret; + u32 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_LP_MODE_1); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data = (u32)(reverse_8bits(ret) & 0xff); + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_LP_MODE_2); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 8; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_LP_MODE_3); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 16; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_LP_MODE_4); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 24; + + return sprintf(buf, "0x%08x\n", data); //return 32bits data +} + +static ssize_t set_lpmode(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + unsigned long data; + int err; + struct cpld_platform_data *pdata = dev->platform_data; + + err = kstrtoul(buf, 16, &data); + if (err) + return err; + + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_LP_MODE_1, (u8)reverse_8bits(data & 0xff)); + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_LP_MODE_2, (u8)(reverse_8bits(data >> 8) & 0xff)); + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_LP_MODE_3, (u8)(reverse_8bits(data >> 16) & 0xff)); + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_LP_MODE_4, (u8)(reverse_8bits(data >> 24) & 0xff)); + + return count; +} + +static ssize_t get_reset(struct device *dev, struct device_attribute *devattr, char *buf) +{ + int ret; + u32 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESET_1); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data = (u32)(reverse_8bits(ret) & 0xff); + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESET_2); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 8; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESET_3); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 16; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESET_4); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 24; + + return sprintf(buf, "0x%08x\n", data); //return 32bits data +} + +static ssize_t set_reset(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + unsigned long data; + int err; + struct cpld_platform_data *pdata = dev->platform_data; + + err = kstrtoul(buf, 16, &data); + if (err) + return err; + + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_RESET_1, (u8)reverse_8bits(data & 0xff)); + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_RESET_2, (u8)reverse_8bits((data >> 8)& 0xff)); + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_RESET_3, (u8)reverse_8bits((data >> 16) & 0xff)); + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_RESET_4, (u8)reverse_8bits((data >> 24) & 0xff)); + + return count; +} + +static ssize_t get_response(struct device *dev, struct device_attribute *devattr, char *buf) +{ + int ret; + u32 data = 0; + struct cpld_platform_data *pdata = dev->platform_data; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESPONSE_1); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data = (u32)(reverse_8bits(ret) & 0xff); + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESPONSE_2); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 8; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESPONSE_3); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 16; + + ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, SFP_RESPONSE_4); + if (ret < 0) + return sprintf(buf, "error number(%ld)",ret); + data |= (u32)(reverse_8bits(ret) & 0xff) << 24; + + return sprintf(buf, "0x%08x\n", data); //return 32bits data +} + +static ssize_t set_response(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + unsigned long data; + int err; + struct cpld_platform_data *pdata = dev->platform_data; + + err = kstrtoul(buf, 16, &data); + if (err) + return err; + + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_RESPONSE_1, (u8)reverse_8bits(data & 0xff)); + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_RESPONSE_2, (u8)reverse_8bits((data >> 8)& 0xff)); + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_RESPONSE_3, (u8)reverse_8bits((data >> 16) & 0xff)); + i2c_smbus_write_byte_data(pdata[system_cpld].client, SFP_RESPONSE_4, (u8)reverse_8bits((data >> 24) & 0xff)); + + return count; +} + +struct platform_led_status{ + int reg_data; + char *led_status; + int led_id; +}; + +static struct platform_led_status led_info[] = { + { + .reg_data = 0x40, + .led_status = "pwr1_green", + .led_id = 0, + }, + { + .reg_data = 0x80, + .led_status = "pwr1_amber", + .led_id = 0, + }, + { + .reg_data = 0x00, + .led_status = "pwr1_off", + .led_id = 0, + }, + { + .reg_data = 0xc0, + .led_status = "pwr1_off", + .led_id = 0, + }, + { + .reg_data = 0x10, + .led_status = "pwr2_green", + .led_id = 1, + }, + { + .reg_data = 0x20, + .led_status = "pwr2_amber", + .led_id = 1, + }, + { + .reg_data = 0x00, + .led_status = "pwr2_off", + .led_id = 1, + }, + { + .reg_data = 0x30, + .led_status = "pwr2_off", + .led_id = 1, + }, + { + .reg_data = 0x04, + .led_status = "sys_green", + .led_id = 2, + }, + { + .reg_data = 0x08, + .led_status = "sys_blinking_green", + .led_id = 2, + }, + { + .reg_data = 0x0c, + .led_status = "sys_red", + .led_id = 2, + }, + { + .reg_data = 0x00, + .led_status = "sys_off", + .led_id = 2, + }, + { + .reg_data = 0x01, + .led_status = "fan_green", + .led_id = 3, + }, + { + .reg_data = 0x02, + .led_status = "fan_amber", + .led_id = 3, + }, + { + .reg_data = 0x00, + .led_status = "fan_off", + .led_id = 3, + }, + { + .reg_data = 0x03, + .led_status = "fan_off", + .led_id = 3, + }, + { + .reg_data = 0x40, + .led_status = "fan1_green", + .led_id = 4, + }, + { + .reg_data = 0x80, + .led_status = "fan1_red", + .led_id = 4, + }, + { + .reg_data = 0x00, + .led_status = "fan1_off", + .led_id = 4, + }, + { + .reg_data = 0x10, + .led_status = "fan2_green", + .led_id = 5, + }, + { + .reg_data = 0x20, + .led_status = "fan2_red", + .led_id = 5, + }, + { + .reg_data = 0x00, + .led_status = "fan2_off", + .led_id = 5, + }, + { + .reg_data = 0x04, + .led_status = "fan3_green", + .led_id = 6, + }, + { + .reg_data = 0x08, + .led_status = "fan3_red", + .led_id = 6, + }, + { + .reg_data = 0x00, + .led_status = "fan3_off", + .led_id = 6, + }, + { + .reg_data = 0x01, + .led_status = "fan4_green", + .led_id = 7, + }, + { + .reg_data = 0x02, + .led_status = "fan4_red", + .led_id = 7, + }, + { + .reg_data = 0x00, + .led_status = "fan4_off", + .led_id = 7, + }, + { + .reg_data = 0x40, + .led_status = "fan5_green", + .led_id = 8, + }, + { + .reg_data = 0x80, + .led_status = "fan5_red", + .led_id = 8, + }, + { + .reg_data = 0x00, + .led_status = "fan5_off", + .led_id = 8, + }, +}; + +struct platform_led_data{ + int reg_addr; + int mask; +}; + +static struct platform_led_data led_data[] = { + { + .reg_addr = SYS_LED_REG, + .mask = 0xc0, + }, + { + .reg_addr = SYS_LED_REG, + .mask = 0x30, + }, + { + .reg_addr = SYS_LED_REG, + .mask = 0x0c, + }, + { + .reg_addr = SYS_LED_REG, + .mask = 0x03, + }, + { + .reg_addr = FAN1_LED_REG, + .mask = 0xc0, + }, + { + .reg_addr = FAN1_LED_REG, + .mask = 0x30, + }, + { + .reg_addr = FAN1_LED_REG, + .mask = 0x0c, + }, + { + .reg_addr = FAN1_LED_REG, + .mask = 0x03, + }, + { + .reg_addr = FAN2_LED_REG, + .mask = 0xc0, + }, +}; + + +static ssize_t get_led_color(struct device *dev, struct device_attribute *devattr, char *buf) +{ + char str[9][20] = {0}; + int board_data; + int led_data_number; + int led_info_number; + struct cpld_platform_data *pdata = dev->platform_data; + + for(led_data_number = 0; led_data_number < ARRAY_SIZE(led_data); led_data_number++){ + board_data = i2c_smbus_read_byte_data(pdata[system_cpld].client, led_data[led_data_number].reg_addr); + if(board_data >= 0){ + board_data &= led_data[led_data_number].mask; + for(led_info_number = 0; led_info_number < ARRAY_SIZE(led_info); led_info_number++){ + if (led_data_number == led_info[led_info_number].led_id){ + if(board_data == led_info[led_info_number].reg_data){ + sprintf(str[led_data_number], "%s", led_info[led_info_number].led_status); + } + } + } + } + else + printk( KERN_ERR "Missing LED board data\n"); + } + return sprintf(buf,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",str[0],str[1],str[2],str[3],str[4],str[5],str[6],str[7],str[8]); +} + +static ssize_t set_led_color(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) +{ + int led_info_number; + int led_data_number; + int str_compar; + int led_reg_value; + struct cpld_platform_data *pdata = dev->platform_data; + + for(led_info_number = 0; led_info_number < ARRAY_SIZE(led_info); led_info_number++){ + str_compar = strncmp(buf,led_info[led_info_number].led_status,strlen(led_info[led_info_number].led_status)); + if(str_compar == 0){ + for(led_data_number = 0; led_data_number < ARRAY_SIZE(led_data); led_data_number++){ + if(led_info[led_info_number].led_id == led_data_number){ + led_reg_value = i2c_smbus_read_byte_data(pdata[system_cpld].client, led_data[led_data_number].reg_addr); + if(led_reg_value >= 0){ + led_reg_value &= (~led_data[led_data_number].mask); + led_reg_value |= led_info[led_info_number].reg_data; + i2c_smbus_write_byte_data(pdata[system_cpld].client, (u8)(led_data[led_data_number].reg_addr & 0xff), (u8)(led_reg_value & 0xff)); + } + else + printk( KERN_ERR "Missing LED reg. data\n"); + } + } + } + } + return count; +} + + +static DEVICE_ATTR(sfp_present, S_IRUGO, get_present, NULL ); +static DEVICE_ATTR(sfp_lpmode, S_IWUSR | S_IRUGO, get_lpmode, set_lpmode ); +static DEVICE_ATTR(sfp_reset, S_IWUSR | S_IRUGO, get_reset, set_reset ); +static DEVICE_ATTR(sfp_response, S_IWUSR | S_IRUGO, get_response, set_response ); +static DEVICE_ATTR(led_control, S_IRUGO | S_IWUSR, get_led_color, set_led_color); + +static struct attribute *ag9032v1_cpld_attrs[] = { + &dev_attr_sfp_response.attr, + &dev_attr_sfp_present.attr, + &dev_attr_sfp_lpmode.attr, + &dev_attr_sfp_reset.attr, + &dev_attr_led_control.attr, + NULL, +}; + +static struct attribute_group ag9032v1_cpld_attr_grp = { + .attrs = ag9032v1_cpld_attrs, +}; + +/* CPLD -- driver */ +static int __init cpld_probe(struct platform_device *pdev) +{ + struct cpld_platform_data *pdata; + struct i2c_adapter *parent; + int ret; + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "CPLD platform data not found\n"); + return -ENODEV; + } + + parent = i2c_get_adapter(BUS6); + if (!parent) { + printk(KERN_WARNING "Parent adapter (%d) not found\n",BUS6); + return -ENODEV; + } + + pdata[system_cpld].client = i2c_new_dummy(parent, pdata[system_cpld].reg_addr); + if (!pdata[system_cpld].client) { + printk(KERN_WARNING "Fail to create dummy i2c client for addr %d\n", pdata[system_cpld].reg_addr); + goto error; + } + + ret = sysfs_create_group(&pdev->dev.kobj, &ag9032v1_cpld_attr_grp); + if (ret) { + printk(KERN_WARNING "Fail to create cpld attribute group"); + goto error; + } + + return 0; + +error: + i2c_unregister_device(pdata[system_cpld].client); + i2c_put_adapter(parent); + + return -ENODEV; +} + +static int __exit cpld_remove(struct platform_device *pdev) +{ + struct i2c_adapter *parent = NULL; + struct cpld_platform_data *pdata = pdev->dev.platform_data; + sysfs_remove_group(&pdev->dev.kobj, &ag9032v1_cpld_attr_grp); + + if (!pdata) { + dev_err(&pdev->dev, "Missing platform data\n"); + } + else { + if (pdata[system_cpld].client) { + if (!parent) { + parent = (pdata[system_cpld].client)->adapter; + } + i2c_unregister_device(pdata[system_cpld].client); + } + } + i2c_put_adapter(parent); + + return 0; +} + +static struct platform_driver cpld_driver = { + .probe = cpld_probe, + .remove = __exit_p(cpld_remove), + .driver = { + .owner = THIS_MODULE, + .name = "delta-ag9032v1-cpld", + }, +}; + +/*---------------- CPLD - end ------------- */ + +/*---------------- MUX - start ------------- */ + +struct swpld_mux_platform_data { + int parent; + int base_nr; + int reg_addr; + struct i2c_client *cpld; +}; + +struct swpld_mux { + struct i2c_adapter *parent; + struct i2c_adapter **child; + struct swpld_mux_platform_data data; +}; +static struct swpld_mux_platform_data ag9032v1_swpld_mux_platform_data[] = { + { + .parent = BUS3, + .base_nr = BUS3_BASE_NUM, + .cpld = NULL, + .reg_addr = BUS3_MUX_REG ,// the i2c register address which for select mux TEMP(FAN) + }, + { + .parent = BUS4, + .base_nr = BUS4_BASE_NUM , + .cpld = NULL, + .reg_addr = BUS4_MUX_REG , + }, + { + .parent = BUS5, + .base_nr = BUS5_BASE_NUM , + .cpld = NULL, + .reg_addr = BUS5_MUX_REG , + }, +}; + +static struct platform_device ag9032v1_swpld_mux[] = { + { + .name = "delta-ag9032v1-swpld-mux", + .id = 0, + .dev = { + .platform_data = &ag9032v1_swpld_mux_platform_data[0], + .release = device_release, + }, + }, + { + .name = "delta-ag9032v1-swpld-mux", + .id = 1, + .dev = { + .platform_data = &ag9032v1_swpld_mux_platform_data[1], + .release = device_release, + }, + }, + { + .name = "delta-ag9032v1-swpld-mux", + .id = 2, + .dev = { + .platform_data = &ag9032v1_swpld_mux_platform_data[2], + .release = device_release, + }, + }, +}; + +static int cpld_reg_write_byte(struct i2c_client *client, u8 regaddr, u8 val) +{ + union i2c_smbus_data data; + + data.byte = val; + return client->adapter->algo->smbus_xfer(client->adapter, client->addr, + client->flags, + I2C_SMBUS_WRITE, + regaddr, I2C_SMBUS_BYTE_DATA, &data); +} + +static int swpld_mux_select(struct i2c_adapter *adap, void *data, u8 chan) +{ + struct swpld_mux *mux = data; + u8 swpld_mux_val=0; + + if ( mux->data.base_nr == BUS3_BASE_NUM ) + { + switch (chan) { + case 0: + swpld_mux_val = TEMP_FAN_VAL; + break; + case 1: + swpld_mux_val = FAN_EEPROM1_VAL; + break; + case 2: + swpld_mux_val = FAN_EEPROM2_VAL; + break; + case 3: + swpld_mux_val = FAN_EEPROM3_VAL; + break; + case 4: + swpld_mux_val = FAN_EEPROM4_VAL; + break; + case 5: + swpld_mux_val = FAN_EEPROM5_VAL; + break; + case 6: + swpld_mux_val = FANIO_CTL_VAL; + break; + case 7: + case 8: + swpld_mux_val = FAN_CTRL_VAL; + break; + } + } + else if ( mux->data.base_nr == BUS4_BASE_NUM ) + { + switch (chan) { + case 0: + swpld_mux_val = PSU1_VAL; + break; + case 1: + swpld_mux_val = PSU2_VAL; + break; + case 2: + swpld_mux_val = HOT_SWAP1_VAL; + break; + case 3: + swpld_mux_val = HOT_SWAP2_VAL; + break; + } + } + else if ( mux->data.base_nr == BUS5_BASE_NUM ){ + if (chan < 9){ + swpld_mux_val = (u8)(chan) + 0x01; + } + else if (8 < chan && chan < 19){ + swpld_mux_val = (u8)(chan - 9) + 0x10; + } + else if (18 < chan && chan < 29){ + swpld_mux_val = (u8)(chan - 19) + 0x20; + } + else if (28 < chan && chan < 39){ + swpld_mux_val = (u8)(chan - 29) + 0x30; + } + else{ + swpld_mux_val = 0x00; + } + } + else + { + swpld_mux_val = 0x00; + } + return cpld_reg_write_byte(mux->data.cpld, mux->data.reg_addr, (u8)(swpld_mux_val & 0xff)); +} + +static int __init swpld_mux_probe(struct platform_device *pdev) +{ + struct swpld_mux *mux; + struct swpld_mux_platform_data *pdata; + struct i2c_adapter *parent; + int i, ret, dev_num; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "SWPLD platform data not found\n"); + return -ENODEV; + } + + parent = i2c_get_adapter(pdata->parent); + if (!parent) { + dev_err(&pdev->dev, "Parent adapter (%d) not found\n", pdata->parent); + return -ENODEV; + } + /* Judge bus number to decide how many devices*/ + switch (pdata->parent) { + case BUS3: + dev_num = BUS3_DEV_NUM; + break; + case BUS4: + dev_num = BUS4_DEV_NUM; + break; + case BUS5: + dev_num = BUS5_DEV_NUM; + break; + default : + dev_num = DEFAULT_NUM; + break; + } + + mux = kzalloc(sizeof(*mux), GFP_KERNEL); + if (!mux) { + ret = -ENOMEM; + printk(KERN_ERR "Failed to allocate memory for mux\n"); + goto alloc_failed; + } + + mux->parent = parent; + mux->data = *pdata; + mux->child = kzalloc(sizeof(struct i2c_adapter *) * dev_num, GFP_KERNEL); + if (!mux->child) { + ret = -ENOMEM; + printk(KERN_ERR "Failed to allocate memory for device on mux\n"); + goto alloc_failed2; + } + + for (i = 0; i < dev_num; i++) { + int nr = pdata->base_nr + i; + unsigned int class = 0; + + mux->child[i] = i2c_add_mux_adapter(parent, &pdev->dev, mux, + nr, i, class, + swpld_mux_select, NULL); + if (!mux->child[i]) { + ret = -ENODEV; + dev_err(&pdev->dev, "Failed to add adapter %d\n", i); + goto add_adapter_failed; + } + } + + platform_set_drvdata(pdev, mux); + return 0; + +add_adapter_failed: + for (; i > 0; i--) + i2c_del_mux_adapter(mux->child[i - 1]); + kfree(mux->child); +alloc_failed2: + kfree(mux); +alloc_failed: + i2c_put_adapter(parent); + + return ret; +} + + +static int __exit swpld_mux_remove(struct platform_device *pdev) +{ + int i; + struct swpld_mux *mux = platform_get_drvdata(pdev); + struct swpld_mux_platform_data *pdata; + struct i2c_adapter *parent; + int dev_num; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "SWPLD platform data not found\n"); + return -ENODEV; + } + + parent = i2c_get_adapter(pdata->parent); + if (!parent) { + dev_err(&pdev->dev, "Parent adapter (%d) not found\n", + pdata->parent); + return -ENODEV; + } + switch (pdata->parent) { + case BUS3: + dev_num = BUS3_DEV_NUM; + break; + case BUS4: + dev_num = BUS4_DEV_NUM; + break; + case BUS5: + dev_num = BUS5_DEV_NUM; + break; + default : + dev_num = DEFAULT_NUM; + break; + } + + for (i = 0; i < dev_num; i++) + i2c_del_mux_adapter(mux->child[i]); + + platform_set_drvdata(pdev, NULL); + i2c_put_adapter(mux->parent); + kfree(mux->child); + kfree(mux); + + return 0; +} + +static struct platform_driver swpld_mux_driver = { + .probe = swpld_mux_probe, + .remove = __exit_p(swpld_mux_remove), /* TODO */ + .driver = { + .owner = THIS_MODULE, + .name = "delta-ag9032v1-swpld-mux", + }, +}; +/*---------------- MUX - end ------------- */ + +/*---------------- module initialization ------------- */ +static void __init delta_ag9032v1_platform_init(void) +{ + struct i2c_client *client; + struct i2c_adapter *adapter; + struct cpld_platform_data *cpld_pdata; + struct swpld_mux_platform_data *swpld_pdata; + int ret,i = 0; + printk("ag9032v1_platform module initialization\n"); + + //Use pca9547 in i2c_mux_pca954x.c + adapter = i2c_get_adapter(BUS1); + //client = i2c_new_device(adapter, &i2c_info_pca9547[0]); + i2c_client_9547 = i2c_new_device(adapter, &i2c_info_pca9547[0]); + + i2c_put_adapter(adapter); + + // set the CPLD prob and remove + ret = platform_driver_register(&cpld_driver); + if (ret) { + printk(KERN_WARNING "Fail to register cpld driver\n"); + goto error_cpld_driver; + } + // register the mux prob which call the CPLD + ret = platform_driver_register(&swpld_mux_driver); + if (ret) { + printk(KERN_WARNING "Fail to register swpld mux driver\n"); + goto error_swpld_mux_driver; + } + + // register the i2c devices + ret = platform_driver_register(&i2c_device_driver); + if (ret) { + printk(KERN_WARNING "Fail to register i2c device driver\n"); + goto error_i2c_device_driver; + } + + // register the CPLD + ret = platform_device_register(&ag9032v1_cpld); + if (ret) { + printk(KERN_WARNING "Fail to create cpld device\n"); + goto error_ag9032v1_cpld; + } + // link the CPLD and the Mux + cpld_pdata = ag9032v1_cpld.dev.platform_data; + + for (i = 0; i < ARRAY_SIZE(ag9032v1_swpld_mux); i++) + { + swpld_pdata = ag9032v1_swpld_mux[i].dev.platform_data; + swpld_pdata->cpld = cpld_pdata[system_cpld].client; + ret = platform_device_register(&ag9032v1_swpld_mux[i]); + if (ret) { + printk(KERN_WARNING "Fail to create swpld mux %d\n", i); + goto error_ag9032v1_swpld_mux; + } + } + + for (i = 0; i < ARRAY_SIZE(ag9032v1_i2c_device); i++) + { + ret = platform_device_register(&ag9032v1_i2c_device[i]); + if (ret) { + printk(KERN_WARNING "Fail to create i2c device %d\n", i); + goto error_ag9032v1_i2c_device; + } + } + + if (ret) + goto error_ag9032v1_swpld_mux; + + return 0; + +error_ag9032v1_i2c_device: + i--; + for (; i >= 0; i--) { + platform_device_unregister(&ag9032v1_i2c_device[i]); + } + i = ARRAY_SIZE(ag9032v1_swpld_mux); +error_ag9032v1_swpld_mux: + i--; + for (; i >= 0; i--) { + platform_device_unregister(&ag9032v1_swpld_mux[i]); + } + platform_driver_unregister(&ag9032v1_cpld); +error_ag9032v1_cpld: + platform_driver_unregister(&i2c_device_driver); +error_i2c_device_driver: + platform_driver_unregister(&swpld_mux_driver); +error_swpld_mux_driver: + platform_driver_unregister(&cpld_driver); +error_cpld_driver: + return ret; +} + +static void __exit delta_ag9032v1_platform_exit(void) +{ + int i = 0; + + for ( i = 0; i < ARRAY_SIZE(ag9032v1_i2c_device); i++ ) { + platform_device_unregister(&ag9032v1_i2c_device[i]); + } + + for (i = 0; i < ARRAY_SIZE(ag9032v1_swpld_mux); i++) { + platform_device_unregister(&ag9032v1_swpld_mux[i]); + } + + platform_device_unregister(&ag9032v1_cpld); + platform_driver_unregister(&i2c_device_driver); + platform_driver_unregister(&cpld_driver); + platform_driver_unregister(&swpld_mux_driver); + + i2c_unregister_device(i2c_client_9547); +} + +module_init(delta_ag9032v1_platform_init); +module_exit(delta_ag9032v1_platform_exit); + +MODULE_DESCRIPTION("DNI ag9032v1 Platform Support"); +MODULE_AUTHOR("Neal Tai "); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/dni_ag9032v1_psu.c b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/dni_ag9032v1_psu.c new file mode 100644 index 000000000000..b9ddb979a29b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/dni_ag9032v1_psu.c @@ -0,0 +1,545 @@ +/* + * An hwmon driver for delta AG9032v1 PSU + * dps_800ab_16_d.c - Support for DPS-800AB-16 D Power Supply Module + * + * Copyright (C) 2017 Delta Networks, Inc. + * + * Aries Lin + * + * Based on ym2651y.c + * Based on ad7414.c + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_FAN_DUTY_CYCLE 100 +#define SWPLD_REG 0x31 +#define SWPLD_PSU_MUX_REG 0x21 +#define SELECT_PSU1_EEPROM 0x00 +#define SELECT_PSU2_EEPROM 0x20 + +u8 psu_member_data = 0x00; + +/* Address scanned */ +static const unsigned short normal_i2c[] = { 0x58, I2C_CLIENT_END }; + +/* This is additional data */ +struct dps_800ab_16_d_data { + struct device *hwmon_dev; + struct mutex update_lock; + char valid; + unsigned long last_updated; /* In jiffies */ + + /* Registers value */ + u8 vout_mode; + u16 in1_input; + u16 in2_input; + u16 curr1_input; + u16 curr2_input; + u16 power1_input; + u16 power2_input; + u16 temp_input[2]; + u8 fan_target; + u16 fan_duty_cycle_input[2]; + u16 fan_speed_input[2]; + u8 mfr_model[16]; + u8 mfr_serial[16]; +}; + +static int two_complement_to_int(u16 data, u8 valid_bit, int mask); +static ssize_t set_fan_duty_cycle_input(struct device *dev, struct device_attribute \ + *dev_attr, const char *buf, size_t count); +static ssize_t for_linear_data(struct device *dev, struct device_attribute \ + *dev_attr, char *buf); +static ssize_t for_fan_target(struct device *dev, struct device_attribute \ + *dev_attr, char *buf); +static ssize_t for_vout_data(struct device *dev, struct device_attribute \ + *dev_attr, char *buf); +static int dps_800ab_16_d_read_byte(struct i2c_client *client, u8 reg); +static int dps_800ab_16_d_read_word(struct i2c_client *client, u8 reg); +static int dps_800ab_16_d_write_word(struct i2c_client *client, u8 reg, \ + u16 value); +static int dps_800ab_16_d_read_block(struct i2c_client *client, u8 command, \ + u8 *data, int data_len); +static struct dps_800ab_16_d_data *dps_800ab_16_d_update_device( \ + struct device *dev); +static ssize_t for_ascii(struct device *dev, struct device_attribute \ + *dev_attr, char *buf); +static ssize_t set_w_member_data(struct device *dev, struct device_attribute \ + *dev_att, const char *buf, size_t count); +static ssize_t for_r_member_data(struct device *dev, struct device_attribute \ + *dev_attr, char *buf); + +enum dps_800ab_16_d_sysfs_attributes { + PSU_V_IN, + PSU_V_OUT, + PSU_I_IN, + PSU_I_OUT, + PSU_P_IN, + PSU_P_OUT, + PSU_TEMP1_INPUT, + PSU_FAN1_FAULT, + PSU_FAN1_DUTY_CYCLE, + PSU_FAN1_SPEED, + PSU_MFR_MODEL, + PSU_MFR_SERIAL, + PSU_SELECT_MEMBER, +}; + +static ssize_t set_w_member_data(struct device *dev, struct device_attribute \ + *dev_attr, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); + long data; + int error; + if (attr->index == PSU_SELECT_MEMBER) { + error = kstrtol(buf, 16, &data); + if (error) + return error; + if (SELECT_PSU1_EEPROM == data) { + psu_member_data = SELECT_PSU1_EEPROM; + } else if (SELECT_PSU2_EEPROM == data) { + psu_member_data = SELECT_PSU2_EEPROM; + } else { + return -EINVAL; + } + } + return count; +} + +static ssize_t for_r_member_data(struct device *dev, struct device_attribute \ + *dev_attr, char *buf) +{ + return sprintf(buf, "0x%02X\n", psu_member_data); +} + +static int two_complement_to_int(u16 data, u8 valid_bit, int mask) +{ + u16 valid_data = data & mask; + bool is_negative = valid_data >> (valid_bit - 1); + + return is_negative ? (-(((~valid_data) & mask) + 1)) : valid_data; +} + +static ssize_t set_fan_duty_cycle_input(struct device *dev, struct device_attribute \ + *dev_attr, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); + struct i2c_client *client = to_i2c_client(dev); + struct dps_800ab_16_d_data *data = i2c_get_clientdata(client); + int nr = (attr->index == PSU_FAN1_DUTY_CYCLE) ? 0 : 1; + long speed; + int error; + + error = kstrtol(buf, 10, &speed); + if (error) + return error; + + if (speed < 0 || speed > MAX_FAN_DUTY_CYCLE) + return -EINVAL; + + /* Select SWPLD PSU offset */ + + mutex_lock(&data->update_lock); + data->fan_duty_cycle_input[nr] = speed; + dps_800ab_16_d_write_word(client, 0x3B + nr, data->fan_duty_cycle_input[nr]); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t for_linear_data(struct device *dev, struct device_attribute \ + *dev_attr, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); + struct dps_800ab_16_d_data *data = dps_800ab_16_d_update_device(dev); + + u16 value = 0; + int exponent, mantissa; + int multiplier = 1000; + + switch (attr->index) { + case PSU_V_IN: + value = data->in1_input; + break; + case PSU_I_IN: + value = data->curr1_input; + break; + case PSU_I_OUT: + value = data->curr2_input; + break; + case PSU_P_IN: + value = data->power1_input; + multiplier = 1000*1000; + break; + case PSU_P_OUT: + value = data->power2_input; + multiplier = 1000*1000; + break; + case PSU_TEMP1_INPUT: + value = data->temp_input[0]; + break; + case PSU_FAN1_DUTY_CYCLE: + multiplier = 1; + value = data->fan_duty_cycle_input[0]; + break; + case PSU_FAN1_SPEED: + multiplier = 1; + value = data->fan_speed_input[0]; + break; + default: + break; + } + + exponent = two_complement_to_int(value >> 11, 5, 0x1f); + mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); + + return (exponent >= 0) ? sprintf(buf, "%d\n", \ + (mantissa << exponent) * multiplier) : \ + sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); +} + +static ssize_t for_fan_target(struct device *dev, struct device_attribute \ + *dev_attr, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); + struct dps_800ab_16_d_data *data = dps_800ab_16_d_update_device(dev); + + u8 shift = (attr->index == PSU_FAN1_FAULT) ? 7 : 6; + + return sprintf(buf, "%d\n", data->fan_target >> shift); +} + +static ssize_t for_vout_data(struct device *dev, struct device_attribute \ + *dev_attr, char *buf) +{ + struct dps_800ab_16_d_data *data = dps_800ab_16_d_update_device(dev); + int exponent, mantissa; + int multiplier = 1000; + + exponent = two_complement_to_int(data->vout_mode, 5, 0x1f); + mantissa = data->in2_input; + + return (exponent > 0) ? sprintf(buf, "%d\n", \ + (mantissa * multiplier) / (1 << exponent)): \ + sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); +} + +static ssize_t for_ascii(struct device *dev, struct device_attribute \ + *dev_attr, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); + struct dps_800ab_16_d_data *data = dps_800ab_16_d_update_device(dev); + u8 *ptr = NULL; + + if (!data->valid) + return 0; + + switch (attr->index) { + case PSU_MFR_MODEL: + ptr = data->mfr_model + 1; + break; + case PSU_MFR_SERIAL: + ptr = data->mfr_serial + 1; + break; + default: + return 0; + } + return sprintf(buf, "%s\n", ptr); +} +static int dps_800ab_16_d_read_byte(struct i2c_client *client, u8 reg) +{ + return i2c_smbus_read_byte_data(client, reg); +} + +static int dps_800ab_16_d_read_word(struct i2c_client *client, u8 reg) +{ + return i2c_smbus_read_word_data(client, reg); +} + +static int dps_800ab_16_d_write_word(struct i2c_client *client, u8 reg, \ + u16 value) +{ + union i2c_smbus_data data; + data.word = value; + return i2c_smbus_xfer(client->adapter, client->addr, + client->flags |= I2C_CLIENT_PEC, + I2C_SMBUS_WRITE, reg, + I2C_SMBUS_WORD_DATA, &data); + +} + +static int dps_800ab_16_d_read_block(struct i2c_client *client, u8 command, \ + u8 *data, int data_len) +{ + int result = i2c_smbus_read_i2c_block_data(client, command, data_len, + data); + if (unlikely(result < 0)) + goto abort; + if (unlikely(result != data_len)) { + result = -EIO; + goto abort; + } + + result = 0; +abort: + return result; + +} + +struct reg_data_byte { + u8 reg; + u8 *value; +}; + +struct reg_data_word { + u8 reg; + u16 *value; +}; + +static struct dps_800ab_16_d_data *dps_800ab_16_d_update_device( \ + struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct dps_800ab_16_d_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->update_lock); + + /* Select SWPLD PSU offset */ + + if (time_after(jiffies, data->last_updated)) { + int i, status; + u8 command; + struct reg_data_byte regs_byte[] = { + {0x20, &data->vout_mode}, + {0x81, &data->fan_target} + }; + struct reg_data_word regs_word[] = { + {0x88, &data->in1_input}, + {0x8b, &data->in2_input}, + {0x89, &data->curr1_input}, + {0x8c, &data->curr2_input}, + {0x96, &data->power2_input}, + {0x97, &data->power1_input}, + {0x8d, &(data->temp_input[0])}, + {0x8e, &(data->temp_input[1])}, + {0x3b, &(data->fan_duty_cycle_input[0])}, + {0x90, &(data->fan_speed_input[0])}, + }; + + dev_dbg(&client->dev, "start data update\n"); + + /* one milliseconds from now */ + data->last_updated = jiffies + HZ / 1000; + + for (i = 0; i < ARRAY_SIZE(regs_byte); i++) { + status = dps_800ab_16_d_read_byte(client, + regs_byte[i].reg); + if (status < 0) { + dev_dbg(&client->dev, "reg %d, err %d\n", + regs_byte[i].reg, status); + } else { + *(regs_byte[i].value) = status; + } + } + + for (i = 0; i < ARRAY_SIZE(regs_word); i++) { + status = dps_800ab_16_d_read_word(client, + regs_word[i].reg); + if (status < 0) { + dev_dbg(&client->dev, "reg %d, err %d\n", + regs_word[i].reg, status); + } else { + *(regs_word[i].value) = status; + } + } + + command = 0x9a; /* PSU mfr_model */ + status = dps_800ab_16_d_read_block(client, command, + data->mfr_model, ARRAY_SIZE(data->mfr_model) - 1); + data->mfr_model[ARRAY_SIZE(data->mfr_model) - 1] = '\0'; + if (status < 0) { + dev_dbg(&client->dev, "reg %d, err %d\n", command, + status); + } + + command = 0x9e; /* PSU mfr_serial */ + status = dps_800ab_16_d_read_block(client, command, + data->mfr_serial, ARRAY_SIZE(data->mfr_serial) - 1); + data->mfr_serial[ARRAY_SIZE(data->mfr_serial) - 1] = '\0'; + if (status < 0) { + dev_dbg(&client->dev, "reg %d, err %d\n", command, + status); + } + + data->valid = 1; + } + + mutex_unlock(&data->update_lock); + + return data; + +} + +/* sysfs attributes for hwmon */ +static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, for_linear_data, NULL, PSU_V_IN); +static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, for_vout_data, NULL, PSU_V_OUT); +static SENSOR_DEVICE_ATTR(curr1_input, S_IRUGO, for_linear_data, NULL, PSU_I_IN); +static SENSOR_DEVICE_ATTR(curr2_input, S_IRUGO, for_linear_data, NULL, PSU_I_OUT); +static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, for_linear_data, NULL, PSU_P_IN); +static SENSOR_DEVICE_ATTR(power2_input, S_IRUGO, for_linear_data, NULL, PSU_P_OUT); +static SENSOR_DEVICE_ATTR(temp1_input, \ + S_IRUGO, for_linear_data, NULL, PSU_TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(fan1_target, \ + S_IRUGO, for_fan_target, NULL, PSU_FAN1_FAULT); +static SENSOR_DEVICE_ATTR(fan1_set_percentage, S_IWUGO | S_IRUGO, \ + for_linear_data, set_fan_duty_cycle_input, PSU_FAN1_DUTY_CYCLE); +static SENSOR_DEVICE_ATTR(fan1_input, \ + S_IRUGO, for_linear_data, NULL, PSU_FAN1_SPEED); +static SENSOR_DEVICE_ATTR(psu_mfr_model, \ + S_IRUGO, for_ascii, NULL, PSU_MFR_MODEL); +static SENSOR_DEVICE_ATTR(psu_mfr_serial, \ + S_IRUGO, for_ascii, NULL, PSU_MFR_SERIAL); +static SENSOR_DEVICE_ATTR(psu_select_member, S_IWUGO | S_IRUGO, \ + for_r_member_data, set_w_member_data, PSU_SELECT_MEMBER); + +static struct attribute *dps_800ab_16_d_attributes[] = { + &sensor_dev_attr_in1_input.dev_attr.attr, + &sensor_dev_attr_in2_input.dev_attr.attr, + &sensor_dev_attr_curr1_input.dev_attr.attr, + &sensor_dev_attr_curr2_input.dev_attr.attr, + &sensor_dev_attr_power1_input.dev_attr.attr, + &sensor_dev_attr_power2_input.dev_attr.attr, + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_fan1_target.dev_attr.attr, + &sensor_dev_attr_fan1_set_percentage.dev_attr.attr, + &sensor_dev_attr_fan1_input.dev_attr.attr, + &sensor_dev_attr_psu_mfr_model.dev_attr.attr, + &sensor_dev_attr_psu_mfr_serial.dev_attr.attr, + &sensor_dev_attr_psu_select_member.dev_attr.attr, + NULL +}; + +static const struct attribute_group dps_800ab_16_d_group = { + .attrs = dps_800ab_16_d_attributes, +}; + +static int dps_800ab_16_d_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct dps_800ab_16_d_data *data; + int status; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) { + status = -EIO; + goto exit; + } + + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + data->valid = 0; + mutex_init(&data->update_lock); + + dev_info(&client->dev, "new chip found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &dps_800ab_16_d_group); + if (status) + goto exit_sysfs_create_group; + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_hwmon_device_register; + } + + return 0; + +exit_hwmon_device_register: + sysfs_remove_group(&client->dev.kobj, &dps_800ab_16_d_group); +exit_sysfs_create_group: + kfree(data); +exit: + return status; +} + +static int dps_800ab_16_d_remove(struct i2c_client *client) +{ + struct dps_800ab_16_d_data *data = i2c_get_clientdata(client); + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &dps_800ab_16_d_group); + kfree(data); + + return 0; +} + +enum id_name { + dni_ag9032v1_psu, + dps_800ab_16_d +}; + +static const struct i2c_device_id dps_800ab_16_d_id[] = { + { "dni_ag9032v1_psu", dni_ag9032v1_psu }, + { "dps_800ab_16_d", dps_800ab_16_d }, + {} +}; +MODULE_DEVICE_TABLE(i2c, dps_800ab_16_d_id); + +/* This is the driver that will be inserted */ +static struct i2c_driver dps_800ab_16_d_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "dps_800ab_16_d", + }, + .probe = dps_800ab_16_d_probe, + .remove = dps_800ab_16_d_remove, + .id_table = dps_800ab_16_d_id, + .address_list = normal_i2c, +}; + +static int __init dps_800ab_16_d_init(void) +{ + return i2c_add_driver(&dps_800ab_16_d_driver); +} + +static void __exit dps_800ab_16_d_exit(void) +{ + i2c_del_driver(&dps_800ab_16_d_driver); +} + + +MODULE_AUTHOR("Aries Lin "); +MODULE_DESCRIPTION("DPS_800AB_16_D Driver"); +MODULE_LICENSE("GPL"); + +module_init(dps_800ab_16_d_init); +module_exit(dps_800ab_16_d_exit); diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/dni_emc2305.c b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/dni_emc2305.c new file mode 100644 index 000000000000..73d9900af5b4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/modules/dni_emc2305.c @@ -0,0 +1,381 @@ +/* + * + * + * Copyright (C) 2017 Delta Networks, Inc. + * + * This program is free software; you can redistribute it + * and/or modify it under the terms ofthe GNU General Public License as + * published by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. + * + * + * + * + * + * A hwmon driver for the SMSC EMC2305 fan controller + * Complete datasheet is available (6/2013) at: + * http://www.smsc.com/media/Downloads_Public/Data_Sheets/2305.pdf + */ + +#include +#include +#include +#include +#include + + +static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count); +static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, + char *buf); +static ssize_t set_fan(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count); +static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, + char *buf); +static ssize_t set_fan_percentage(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count); +static ssize_t show_fan_percentage(struct device *dev, struct device_attribute * devattr, + char *buf); +static const unsigned short normal_i2c[] = { 0x2C, 0x2D, 0x2E, 0x2F, 0x4C, + 0x4D, I2C_CLIENT_END + }; + + +#define EMC2305_REG_DEVICE 0xFD +#define EMC2305_REG_VENDOR 0xFE + +//#define FAN_MINIMUN 0x33 /*20%*/ +#define FAN_MINIMUN 0x0 /*0%*/ +#define FAN_RPM_BASED 0xAB + +#define EMC2305_REG_FAN_DRIVE(n) (0x30 + 0x10 * n) +#define EMC2305_REG_FAN_MIN_DRIVE(n) (0x38 + 0x10 * n) +#define EMC2305_REG_FAN_TACH(n) (0x3E + 0x10 * n) +#define EMC2305_REG_FAN_CONF(n) (0x32 + 0x10 * n) +#define EMC2305_REG_FAN_REAR_H_RPM(n) (0x3D + 0x10 * n) +#define EMC2305_REG_FAN_REAR_L_RPM(n) (0x3C + 0x10 * n) + +#define EMC2305_DEVICE 0x34 +#define EMC2305_VENDOR 0x5D +#define MAX_FAN_SPEED 23000 + +struct emc2305_data +{ + struct device *hwmon_dev; + struct attribute_group attrs; + struct mutex lock; +}; + +static int emc2305_probe(struct i2c_client *client, + const struct i2c_device_id *id); +static int emc2305_detect(struct i2c_client *client, + struct i2c_board_info *info); +static int emc2305_remove(struct i2c_client *client); + +static const struct i2c_device_id emc2305_id[] = +{ + { "emc2305", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, emc2305_id); + +static struct i2c_driver emc2305_driver = +{ + .class = I2C_CLASS_HWMON, + .driver = { + .name = "emc2305", + }, + .probe = emc2305_probe, + .remove = emc2305_remove, + .id_table = emc2305_id, + .detect = emc2305_detect, + .address_list = normal_i2c, +}; + +static SENSOR_DEVICE_ATTR(fan1_input, S_IWUSR | S_IRUGO, show_fan, set_fan, 0); +static SENSOR_DEVICE_ATTR(fan2_input, S_IWUSR | S_IRUGO, show_fan, set_fan, 1); +static SENSOR_DEVICE_ATTR(fan3_input, S_IWUSR | S_IRUGO, show_fan, set_fan, 2); +static SENSOR_DEVICE_ATTR(fan4_input, S_IWUSR | S_IRUGO, show_fan, set_fan, 3); +static SENSOR_DEVICE_ATTR(fan5_input, S_IWUSR | S_IRUGO, show_fan, set_fan, 4); +static SENSOR_DEVICE_ATTR(fan1_input_percentage, S_IWUSR | S_IRUGO, show_fan_percentage, set_fan_percentage, 0); +static SENSOR_DEVICE_ATTR(fan2_input_percentage, S_IWUSR | S_IRUGO, show_fan_percentage, set_fan_percentage, 1); +static SENSOR_DEVICE_ATTR(fan3_input_percentage, S_IWUSR | S_IRUGO, show_fan_percentage, set_fan_percentage, 2); +static SENSOR_DEVICE_ATTR(fan4_input_percentage, S_IWUSR | S_IRUGO, show_fan_percentage, set_fan_percentage, 3); +static SENSOR_DEVICE_ATTR(fan5_input_percentage, S_IWUSR | S_IRUGO, show_fan_percentage, set_fan_percentage, 4); +static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0); +static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1); +static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2); +static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3); +static SENSOR_DEVICE_ATTR(pwm5, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 4); + +static struct attribute *emc2305_attr[] = +{ + &sensor_dev_attr_fan1_input.dev_attr.attr, + &sensor_dev_attr_fan2_input.dev_attr.attr, + &sensor_dev_attr_fan3_input.dev_attr.attr, + &sensor_dev_attr_fan4_input.dev_attr.attr, + &sensor_dev_attr_fan5_input.dev_attr.attr, + &sensor_dev_attr_fan1_input_percentage.dev_attr.attr, + &sensor_dev_attr_fan2_input_percentage.dev_attr.attr, + &sensor_dev_attr_fan3_input_percentage.dev_attr.attr, + &sensor_dev_attr_fan4_input_percentage.dev_attr.attr, + &sensor_dev_attr_fan5_input_percentage.dev_attr.attr, + &sensor_dev_attr_pwm1.dev_attr.attr, + &sensor_dev_attr_pwm2.dev_attr.attr, + &sensor_dev_attr_pwm3.dev_attr.attr, + &sensor_dev_attr_pwm4.dev_attr.attr, + &sensor_dev_attr_pwm5.dev_attr.attr, + NULL +}; + +static ssize_t show_fan_percentage(struct device *dev, struct device_attribute * devattr, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + int val; + + mutex_lock(&data->lock); + val = i2c_smbus_read_word_swapped(client, + EMC2305_REG_FAN_TACH(attr->index)); + mutex_unlock(&data->lock); + /* Left shift 3 bits for showing correct RPM */ + val = val >> 3; + if ((int)(3932160 * 2 / (val > 0 ? val : 1) == 960))return sprintf(buf, "%d\n", 0); + return sprintf(buf, "%d\n", (int)(3932160 * 2 / (val > 0 ? val : 1) * 100 / MAX_FAN_SPEED)); +} + + +static ssize_t set_fan_percentage(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + unsigned long hsb, lsb; + unsigned long tech; + unsigned long val; + int ret; + + ret = kstrtoul(buf, 10, &val); + if (ret) + { + return ret; + } + if (val > 100) + { + return -EINVAL; + } + + if (val <= 5) + { + hsb = 0xff; /*high bit*/ + lsb = 0xe0; /*low bit*/ + } + else + { + val = val * 230; + tech = (3932160 * 2) / (val > 0 ? val : 1); + hsb = (uint8_t)(((tech << 3) >> 8) & 0x0ff); + lsb = (uint8_t)((tech << 3) & 0x0f8); + } + + mutex_lock(&data->lock); + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_REAR_H_RPM(attr->index), hsb); + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_REAR_L_RPM(attr->index), lsb); + mutex_unlock(&data->lock); + return count; +} + + +static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + int val; + + + mutex_lock(&data->lock); + val = i2c_smbus_read_word_swapped(client, + EMC2305_REG_FAN_TACH(attr->index)); + mutex_unlock(&data->lock); + /* Left shift 3 bits for showing correct RPM */ + val = val >> 3; + return sprintf(buf, "%d\n", 3932160 * 2 / (val > 0 ? val : 1)); +} + +static ssize_t set_fan(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + unsigned long hsb, lsb; + unsigned long tech; + unsigned long val; + int ret; + + ret = kstrtoul(buf, 10, &val); + if (ret) + { + return ret; + } + if (val > 23000) + { + return -EINVAL; + } + + if (val <= 960) + { + hsb = 0xff; /*high bit*/ + lsb = 0xe0; /*low bit*/ + } + else + { + tech = (3932160 * 2) / (val > 0 ? val : 1); + hsb = (uint8_t)(((tech << 3) >> 8) & 0x0ff); + lsb = (uint8_t)((tech << 3) & 0x0f8); + } + + mutex_lock(&data->lock); + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_REAR_H_RPM(attr->index), hsb); + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_REAR_L_RPM(attr->index), lsb); + mutex_unlock(&data->lock); + return count; +} + +static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + int val; + + mutex_lock(&data->lock); + val = i2c_smbus_read_byte_data(client, + EMC2305_REG_FAN_DRIVE(attr->index)); + mutex_unlock(&data->lock); + return sprintf(buf, "%d\n", val); +} + +static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 10, &val); + if (ret) + { + return ret; + } + if (val > 255) + { + return -EINVAL; + } + + mutex_lock(&data->lock); + i2c_smbus_write_byte_data(client, + EMC2305_REG_FAN_DRIVE(attr->index), + val); + mutex_unlock(&data->lock); + return count; +} + +static int emc2305_detect(struct i2c_client *client, + struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = client->adapter; + int vendor, device; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA)) + { + return -ENODEV; + } + + vendor = i2c_smbus_read_byte_data(client, EMC2305_REG_VENDOR); + if (vendor != EMC2305_VENDOR) + { + return -ENODEV; + } + + device = i2c_smbus_read_byte_data(client, EMC2305_REG_DEVICE); + if (device != EMC2305_DEVICE) + { + return -ENODEV; + } + + strlcpy(info->type, "emc2305", I2C_NAME_SIZE); + + return 0; +} + +static int emc2305_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct emc2305_data *data; + int err; + int i; + + data = devm_kzalloc(&client->dev, sizeof(struct emc2305_data), + GFP_KERNEL); + if (!data) + { + return -ENOMEM; + } + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + + dev_info(&client->dev, "%s chip found\n", client->name); + + data->attrs.attrs = emc2305_attr; + err = sysfs_create_group(&client->dev.kobj, &data->attrs); + if (err) + { + return err; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + err = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + for (i = 0; i < 5; i++) + { + /* set minimum drive to 0% */ + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_MIN_DRIVE(i), FAN_MINIMUN); + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_CONF(i), FAN_RPM_BASED); + } + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &data->attrs); + return err; +} + +static int emc2305_remove(struct i2c_client *client) +{ + struct emc2305_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &data->attrs); + return 0; +} + +module_i2c_driver(emc2305_driver); + +MODULE_AUTHOR("Neal Tai"); +MODULE_DESCRIPTION("SMSC EMC2305 fan controller driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9032v1/scripts/ag9032v1_platform_init.sh b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/scripts/ag9032v1_platform_init.sh new file mode 100755 index 000000000000..c5f897ff007f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/scripts/ag9032v1_platform_init.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +#platform init script for Delta ag9032v1 + +#fan speed monitol start +/usr/share/sonic/device/x86_64-delta_ag9032v1-r0/fancontrol.service /usr/share/sonic/device/x86_64-delta_ag9032v1-r0/fancontrol & + +exit 0 + diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9032v1/scripts/led_status.sh b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/scripts/led_status.sh new file mode 100755 index 000000000000..5685bd71f58c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/ag9032v1/scripts/led_status.sh @@ -0,0 +1,225 @@ +#!/bin/bash + +FAN1_EEPROM="-y 31 0x51 0x0a" +FAN2_EEPROM="-y 32 0x52 0x0a" +FAN3_EEPROM="-y 33 0x53 0x0a" +FAN4_EEPROM="-y 34 0x54 0x0a" +FAN5_EEPROM="-y 35 0x55 0x0a" +LED_CONTROL="/sys/devices/platform/delta-ag9032v1-cpld.0/led_control" +FAN1_FRONT_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-3/i2c-37/37-002c/fan5_input" +FAN1_REAR_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-3/i2c-38/38-002d/fan5_input" +FAN2_FRONT_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-3/i2c-37/37-002c/fan4_input" +FAN2_REAR_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-3/i2c-38/38-002d/fan4_input" +FAN3_FRONT_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-3/i2c-37/37-002c/fan3_input" +FAN3_REAR_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-3/i2c-38/38-002d/fan3_input" +FAN4_FRONT_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-3/i2c-37/37-002c/fan2_input" +FAN4_REAR_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-3/i2c-38/38-002d/fan2_input" +FAN5_FRONT_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-3/i2c-37/37-002c/fan1_input" +FAN5_REAR_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-3/i2c-38/38-002d/fan1_input" + +PSU1_EEPROM="-y 40 0x50 0x00" +PSU2_EEPROM="-y 41 0x50 0x00" +PSU1_FAN_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-4/i2c-40/40-0058/fan1_input" +PSU2_FAN_RPM="/sys/devices/pci0000:00/0000:00:13.0/i2c-1/i2c-4/i2c-41/41-0058/fan1_input" + +catfaneeprom(){ + fan_eeprom_num=0 + i2cget $FAN1_EEPROM > /dev/null 2>&1 + if [ "`echo $?`" -eq "0" ]; then + fan_eeprom_num=$((fan_eeprom_num+1)) + elif [ "`echo $?`" -eq "2" ]; then + fan_eeprom_num=$((fan_eeprom_num)) + fi + i2cget $FAN2_EEPROM > /dev/null 2>&1 + if [ "`echo $?`" -eq "0" ]; then + fan_eeprom_num=$((fan_eeprom_num+1)) + elif [ "`echo $?`" -eq "2" ]; then + fan_eeprom_num=$((fan_eeprom_num_num)) + fi + + i2cget $FAN3_EEPROM > /dev/null 2>&1 + if [ "`echo $?`" -eq "0" ]; then + fan_eeprom_num=$((fan_eeprom_num+1)) + elif [ "`echo $?`" -eq "2" ]; then + fan_eeprom_num=$((fan_eeprom_num)) + fi + + i2cget $FAN4_EEPROM > /dev/null 2>&1 + if [ "`echo $?`" -eq "0" ]; then + fan_eeprom_num=$((fan_eeprom_num+1)) + elif [ "`echo $?`" -eq "2" ]; then + fan_eeprom_num=$((fan_eeprom_num)) + fi + + i2cget $FAN5_EEPROM > /dev/null 2>&1 + if [ "`echo $?`" -eq "0" ]; then + fan_eeprom_num=$((fan_eeprom_num+1)) + elif [ "`echo $?`" -eq "2" ]; then + fan_eeprom_num=$((fan_eeprom_num)) + fi +} + +catfanspeed(){ + fan_rpm_normal_num=0 + fan1_rpm_normal_num=0 + fan1_front_rpm=`cat $FAN1_FRONT_RPM` + fan1_rear_rpm=`cat $FAN1_REAR_RPM` + if [ "${fan1_front_rpm}" -ne "960" ] && [ "${fan1_rear_rpm}" -ne "960" ] && [ "${fan1_front_rpm}" -ne "0" ] && [ "${fan1_rear_rpm}" -ne "0" ]; then + fan1_rpm_normal_num=$((fan1_rpm_normal_num+1)) + elif [ "${fan1_front_rpm}" -eq "960" ] || [ "${fan1_rear_rpm}" -eq "960" ] || [ "${fan1_front_rpm}" -eq "0" ] || [ "${fan1_rear_rpm}" -eq "0" ]; then + fan1_rpm_normal_num=$((fan1_rpm_normal_num)) + fi + + fan2_rpm_normal_num=0 + fan2_front_rpm=`cat $FAN2_FRONT_RPM` + fan2_rear_rpm=`cat $FAN2_REAR_RPM` + if [ "${fan2_front_rpm}" -ne "960" ] && [ "${fan2_rear_rpm}" -ne "960" ] && [ "${fan2_front_rpm}" -ne "0" ] && [ "${fan2_rear_rpm}" -ne "0" ]; then + fan2_rpm_normal_num=$((fan2_rpm_normal_num+1)) + elif [ "${fan2_front_rpm}" -eq "960" ] || [ "${fan2_rear_rpm}" -eq "960" ] || [ "${fan2_front_rpm}" -eq "0" ] || [ "${fan2_rear_rpm}" -eq "0" ]; then + fan2_rpm_normal_num=$((fan2_rpm_normal_num)) + fi + + fan3_rpm_normal_num=0 + fan3_front_rpm=`cat $FAN3_FRONT_RPM` + fan3_rear_rpm=`cat $FAN3_REAR_RPM` + if [ "${fan3_front_rpm}" -ne "960" ] && [ "${fan3_rear_rpm}" -ne "960" ] && [ "${fan3_front_rpm}" -ne "0" ] && [ "${fan3_rear_rpm}" -ne "0" ]; then + fan3_rpm_normal_num=$((fan3_rpm_normal_num+1)) + elif [ "${fan3_front_rpm}" -eq "960" ] || [ "${fan3_rear_rpm}" -eq "960" ] || [ "${fan3_front_rpm}" -eq "0" ] || [ "${fan3_rear_rpm}" -eq "0" ]; then + fan3_rpm_normal_num=$((fan3_rpm_normal_num)) + fi + + fan4_rpm_normal_num=0 + fan4_front_rpm=`cat $FAN4_FRONT_RPM` + fan4_rear_rpm=`cat $FAN4_REAR_RPM` + if [ "${fan4_front_rpm}" -ne "960" ] && [ "${fan4_rear_rpm}" -ne "960" ] && [ "${fan4_front_rpm}" -ne "0" ] && [ "${fan4_rear_rpm}" -ne "0" ]; then + fan4_rpm_normal_num=$((fan4_rpm_normal_num+1)) + elif [ "${fan4_front_rpm}" -eq "960" ] || [ "${fan4_rear_rpm}" -eq "960" ] || [ "${fan4_front_rpm}" -eq "0" ] || [ "${fan4_rear_rpm}" -eq "0" ]; then + fan4_rpm_normal_num=$((fan4_rpm_normal_num)) + fi + + fan5_rpm_normal_num=0 + fan5_front_rpm=`cat $FAN5_FRONT_RPM` + fan5_rear_rpm=`cat $FAN5_REAR_RPM` + if [ "${fan5_front_rpm}" -ne "960" ] && [ "${fan5_rear_rpm}" -ne "960" ] && [ "${fan5_front_rpm}" -ne "0" ] && [ "${fan5_rear_rpm}" -ne "0" ]; then + fan5_rpm_normal_num=$((fan5_rpm_normal_num+1)) + elif [ "${fan5_front_rpm}" -eq "960" ] || [ "${fan5_rear_rpm}" -eq "960" ] || [ "${fan5_front_rpm}" -eq "0" ] || [ "${fan5_rear_rpm}" -eq "0" ]; then + fan5_rpm_normal_num=$((fan5_rpm_normal_num)) + fi + + fan_rpm_normal_num=$((fan1_rpm_normal_num+fan2_rpm_normal_num+fan3_rpm_normal_num+fan4_rpm_normal_num+fan5_rpm_normal_num)) + +} + +catpsueeprom(){ + psu1_eeprom_num=0 + i2cget $PSU1_EEPROM > /dev/null 2>&1 + if [ "`echo $?`" -eq "0" ]; then + psu1_eeprom_num=$((psu1_eeprom_num+1)) + elif [ "`echo $?`" -eq "2" ]; then + psu1_eeprom_num=$((psu1_eeprom_num)) + fi + + psu2_eeprom_num=0 + i2cget $PSU2_EEPROM > /dev/null 2>&1 + if [ "`echo $?`" -eq "0" ]; then + psu2_eeprom_num=$((psu2_eeprom_num+1)) + elif [ "`echo $?`" -eq "2" ]; then + psu2_eeprom_num=$((psu2_eeprom_num)) + fi +} + +catpsufanspeed(){ + + psu1_rpm_normal_num=0 + psu1_rpm=`cat $PSU1_FAN_RPM` + + if [ "${psu1_rpm}" -ne "960" ] && [ "${psu1_rpm}" -ne "0" ]; then + psu1_rpm_normal_num=$((psu1_rpm_normal_num+1)) + elif [ "${psu1_rpm}" -eq "960" ] || [ "${psu1_rpm}" -eq "0" ]; then + psu1_rpm_normal_num=$((psu1_rpm_normal_num)) + fi + + psu2_rpm_normal_num=0 + psu2_rpm=`cat $PSU2_FAN_RPM` + + if [ "${psu2_rpm}" -ne "960" ] && [ "${psu2_rpm}" -ne "0" ]; then + psu2_rpm_normal_num=$((psu2_rpm_normal_num+1)) + elif [ "${psu2_rpm}" -eq "960" ] || [ "${psu2_rpm}" -eq "0" ]; then + psu2_rpm_normal_num=$((psu2_rpm_normal_num)) + fi + +} + +setfanled(){ + if [ "${fan_eeprom_num}" -eq "5" ] && [ "${fan_rpm_normal_num}" -eq "5" ]; then + echo "fan_green" > $LED_CONTROL + elif [ "${fan_eeprom_num}" -lt "5" ] || [ "${fan_rpm_normal_num}" -lt "5" ]; then + echo "fan_amber" > $LED_CONTROL + fi +} + +setpsuled(){ + if [ "${psu1_eeprom_num}" -eq "1" ] && [ "${psu1_rpm_normal_num}" -eq "1" ]; then + echo "pwr1_green" > $LED_CONTROL + elif [ "${psu1_eeprom_num}" -eq "0" ] || [ "${psu1_rpm_normal_num}" -eq "0" ]; then + echo "pwr1_amber" > $LED_CONTROL + fi + + if [ "${psu2_eeprom_num}" -eq "1" ] && [ "${psu2_rpm_normal_num}" -eq "1" ]; then + echo "pwr2_green" > $LED_CONTROL + elif [ "${psu2_eeprom_num}" -eq "0" ] || [ "${psu2_rpm_normal_num}" -eq "0" ]; then + echo "pwr2_amber" > $LED_CONTROL + fi +} + +setfantrayled(){ + if [ "${fan1_rpm_normal_num}" -eq "1" ]; then + echo "fan1_green" > $LED_CONTROL + else + echo "fan1_red" > $LED_CONTROL + fi + + if [ "${fan2_rpm_normal_num}" -eq "1" ]; then + echo "fan2_green" > $LED_CONTROL + else + echo "fan2_red" > $LED_CONTROL + fi + + if [ "${fan3_rpm_normal_num}" -eq "1" ]; then + echo "fan3_green" > $LED_CONTROL + else + echo "fan3_red" > $LED_CONTROL + fi + + if [ "${fan4_rpm_normal_num}" -eq "1" ]; then + echo "fan4_green" > $LED_CONTROL + else + echo "fan4_red" > $LED_CONTROL + fi + + if [ "${fan5_rpm_normal_num}" -eq "1" ]; then + echo "fan5_green" > $LED_CONTROL + else + echo "fan5_red" > $LED_CONTROL + fi +} + +platformstatus(){ + + echo "sys_green" > $LED_CONTROL + catfaneeprom + catfanspeed + setfanled + setfantrayled + + catpsueeprom + catpsufanspeed + setpsuled +} + +while true +do + platformstatus + sleep 1 +done + diff --git a/platform/broadcom/sonic-platform-modules-delta/debian/changelog b/platform/broadcom/sonic-platform-modules-delta/debian/changelog new file mode 100644 index 000000000000..ec8327e8ae7a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/debian/changelog @@ -0,0 +1,5 @@ +sonic-delta-platform-modules (1.1) unstable; urgency=low + + * Initial release + + -- Neal Tai Fri, 21 APR 2017 11:11:11 -0800 diff --git a/platform/broadcom/sonic-platform-modules-delta/debian/compat b/platform/broadcom/sonic-platform-modules-delta/debian/compat new file mode 100644 index 000000000000..ec635144f600 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/debian/compat @@ -0,0 +1 @@ +9 diff --git a/platform/broadcom/sonic-platform-modules-delta/debian/control b/platform/broadcom/sonic-platform-modules-delta/debian/control new file mode 100644 index 000000000000..7ad1550415be --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/debian/control @@ -0,0 +1,11 @@ +Source: sonic-delta-platform-modules +Section: main +Priority: extra +Maintainer: Neal Tai +Build-Depends: debhelper (>= 8.0.0), bzip2 +Standards-Version: 3.9.3 + +Package: platform-modules-ag9032v1 +Architecture: amd64 +Depends: linux-image-3.16.0-4-amd64 +Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/broadcom/sonic-platform-modules-delta/debian/files b/platform/broadcom/sonic-platform-modules-delta/debian/files new file mode 100644 index 000000000000..ece02f8e80e2 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/debian/files @@ -0,0 +1 @@ +platform-modules-ag9032v1_1.1_amd64.deb main extra diff --git a/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9032v1.init b/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9032v1.init new file mode 100755 index 000000000000..9b829652fd57 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9032v1.init @@ -0,0 +1,49 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: setup-board +# Required-Start: +# Required-Stop: +# Should-Start: +# Should-Stop: +# Default-Start: S +# Default-Stop: 0 6 +# Short-Description: Setup ag9032v1 board. +### END INIT INFO + +case "$1" in +start) + echo -n "Setting up board... " + depmod -a + rmmod i2c-i801 + rmmod i2c-ismt + modprobe i2c-dev + modprobe i2c-i801 + modprobe i2c-ismt + modprobe i2c-mux-pca954x + modprobe dni_ag9032v1_psu + modprobe dni_emc2305 + modprobe at24 + modprobe delta_ag9032v1_platform + + /usr/local/bin/ag9032v1_platform_init.sh + + echo "done." + ;; + +stop) + echo "done." + + ;; + +force-reload|restart) + echo "Not supported" + ;; + +*) + echo "Usage: /etc/init.d/platform-modules-ag9032v1.init {start|stop}" + exit 1 + ;; +esac + +exit 0 diff --git a/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9032v1.install b/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9032v1.install new file mode 100644 index 000000000000..40f7e56d832d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9032v1.install @@ -0,0 +1,3 @@ +ag9032v1/scripts/ag9032v1_platform_init.sh usr/local/bin +ag9032v1/scripts/led_status.sh usr/local/bin +ag9032v1/cfg/ag9032v1-modules.conf etc/modules-load.d diff --git a/platform/broadcom/sonic-platform-modules-delta/debian/rules b/platform/broadcom/sonic-platform-modules-delta/debian/rules new file mode 100644 index 000000000000..ae590626c817 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/debian/rules @@ -0,0 +1,33 @@ +#!/usr/bin/make -f + +export INSTALL_MOD_DIR:=extra + +KVERSION ?= $(shell uname -r) +KERNEL_SRC := /lib/modules/$(KVERSION) +MOD_SRC_DIR:= $(shell pwd) +MODULE_DIRS:= ag9032v1 + +%: + dh $@ + +override_dh_auto_build: + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ + done) + +override_dh_auto_install: + (for mod in $(MODULE_DIRS); do \ + dh_installdirs -pplatform-modules-$${mod} \ + $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + cp $(MOD_SRC_DIR)/$${mod}/modules/*.ko \ + debian/platform-modules-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + done) + +override_dh_usrlocal: + +override_dh_clean: + dh_clean + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ + done) + From b7c2ffa73aa9bb97be25c34477a84cc4de8085b1 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 27 Nov 2017 19:07:58 -0800 Subject: [PATCH 0950/1011] [Broadcom]: Update Broadcom SAI package to 3.0.3.2-15 (#1186) Add support for TD2 BCM 56854 Add th-ag9032v1-32x100G.config.bcm for Delta AG9032v1 Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 376882d95825..28785d369395 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-13_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-13_amd64.deb?sv=2015-04-05&sr=b&sig=YeXV0av6rUxy3s5VlQf4wsv6dLOKIGkkkP8lldlGr00%3D&se=2031-07-27T07%3A49%3A38Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.2-15_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-15_amd64.deb?sv=2015-04-05&sr=b&sig=U1jDC%2FrbcCn3KgZsP9GoKFa9PtyXhliMd9iJrx8%2B%2F5M%3D&se=2031-08-07T00%3A51%3A44Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-13_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-15_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-13_amd64.deb?sv=2015-04-05&sr=b&sig=u4dKbtc%2FAvlqq7l7BT9WcmLVEsWoV1LqOxSbBy0CkiA%3D&se=2031-07-27T07%3A50%3A08Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-15_amd64.deb?sv=2015-04-05&sr=b&sig=nLvctIrLerXpG0SdQisirbOn1OBNLKl%2BQ7xLHRzgczM%3D&se=2031-08-07T00%3A52%3A02Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From 6e57e1d272f0a1e6fbf79379359945760fc4b376 Mon Sep 17 00:00:00 2001 From: zhenggen-xu Date: Tue, 28 Nov 2017 14:52:26 -0800 Subject: [PATCH 0951/1011] [FRR]: Fix FRR tempelate for router-id (#1187) --- dockers/docker-fpm-frr/bgpd.conf.j2 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dockers/docker-fpm-frr/bgpd.conf.j2 b/dockers/docker-fpm-frr/bgpd.conf.j2 index 07e2dd0c571e..9afd6a5a8bf0 100644 --- a/dockers/docker-fpm-frr/bgpd.conf.j2 +++ b/dockers/docker-fpm-frr/bgpd.conf.j2 @@ -23,8 +23,13 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }} bgp bestpath as-path multipath-relax no bgp default ipv4-unicast {# TODO: use lo[0] for backward compatibility, will revisit the case with multiple lo interfaces #} - bgp router-id {{ LOOPBACK_INTERFACE.keys()[0][1] }} +{% for (name, prefix) in LOOPBACK_INTERFACE %} +{% if prefix | ipv4 and name == 'Loopback0' %} + bgp router-id {{ prefix | ip }} +{% endif %} +{% endfor %} {# advertise loopback #} + {% for (name, prefix) in LOOPBACK_INTERFACE %} {% if prefix | ipv4 %} network {{ prefix | ip }}/32 From 33d5e93b0ab4796601e96e14c159e8441b536e7e Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Tue, 28 Nov 2017 18:31:43 -0800 Subject: [PATCH 0952/1011] [devices]: Update 6000, 6100, 7050 QOS configurations (#1191) --- .../Arista-7050-QX32/qos.json | 34 ++++++----------- .../Force10-S6000/qos.json | 34 ++++++----------- .../Force10-S6100/qos.json | 38 +++++++------------ 3 files changed, 38 insertions(+), 68 deletions(-) diff --git a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/qos.json b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/qos.json index 8de48a2d8d86..2539513d8e1f 100644 --- a/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/qos.json +++ b/device/arista/x86_64-arista_7050_qx32/Arista-7050-QX32/qos.json @@ -105,21 +105,12 @@ "weight": "20" } }, - "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": { - "AZURE": { - "0": "0", - "1": "1", - "3": "3", - "4": "4" - } - }, "PORT_QOS_MAP": { "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124": { - "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]", - "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]", - "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", - "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]", - "pfc_to_pg_map" : "[PFC_PRIORITY_TO_PRIORITY_GROUP_MAP|AZURE]", + "dscp_to_tc_map" : "[DSCP_TO_TC_MAP:AZURE]", + "tc_to_queue_map" : "[TC_TO_QUEUE_MAP:AZURE]", + "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE:AZURE]", "pfc_enable": "3,4" } }, @@ -148,19 +139,18 @@ } }, "QUEUE": { - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0": { - "scheduler" : "[SCHEDULER|scheduler.1]" - }, - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1": { - "scheduler" : "[SCHEDULER|scheduler.2]" - }, - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0-1": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124:0-1" : { "wred_profile" : "[WRED_PROFILE|AZURE_LOSSY]" }, - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124:3-4" : { "scheduler" : "[SCHEDULER|scheduler.0]", "wred_profile" : "[WRED_PROFILE|AZURE_LOSSLESS]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124:0" : { + "scheduler" : "[SCHEDULER|scheduler.1]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124:1" : { + "scheduler" : "[SCHEDULER|scheduler.2]" } } } - diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/qos.json b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/qos.json index 8de48a2d8d86..2539513d8e1f 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/qos.json +++ b/device/dell/x86_64-dell_s6000_s1220-r0/Force10-S6000/qos.json @@ -105,21 +105,12 @@ "weight": "20" } }, - "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": { - "AZURE": { - "0": "0", - "1": "1", - "3": "3", - "4": "4" - } - }, "PORT_QOS_MAP": { "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124": { - "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]", - "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]", - "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", - "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]", - "pfc_to_pg_map" : "[PFC_PRIORITY_TO_PRIORITY_GROUP_MAP|AZURE]", + "dscp_to_tc_map" : "[DSCP_TO_TC_MAP:AZURE]", + "tc_to_queue_map" : "[TC_TO_QUEUE_MAP:AZURE]", + "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE:AZURE]", "pfc_enable": "3,4" } }, @@ -148,19 +139,18 @@ } }, "QUEUE": { - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0": { - "scheduler" : "[SCHEDULER|scheduler.1]" - }, - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1": { - "scheduler" : "[SCHEDULER|scheduler.2]" - }, - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0-1": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124:0-1" : { "wred_profile" : "[WRED_PROFILE|AZURE_LOSSY]" }, - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124:3-4" : { "scheduler" : "[SCHEDULER|scheduler.0]", "wred_profile" : "[WRED_PROFILE|AZURE_LOSSLESS]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124:0" : { + "scheduler" : "[SCHEDULER|scheduler.1]" + }, + "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124:1" : { + "scheduler" : "[SCHEDULER|scheduler.2]" } } } - diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json index 8de48a2d8d86..32f337770c0f 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json +++ b/device/dell/x86_64-dell_s6100_c2538-r0/Force10-S6100/qos.json @@ -105,21 +105,12 @@ "weight": "20" } }, - "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": { - "AZURE": { - "0": "0", - "1": "1", - "3": "3", - "4": "4" - } - }, "PORT_QOS_MAP": { - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124": { - "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]", - "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]", - "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", - "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]", - "pfc_to_pg_map" : "[PFC_PRIORITY_TO_PRIORITY_GROUP_MAP|AZURE]", + "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet5,Ethernet6,Ethernet7,Ethernet8,Ethernet9,Ethernet10,Ethernet11,Ethernet12,Ethernet13,Ethernet14,Ethernet15,Ethernet16,Ethernet17,Ethernet18,Ethernet19,Ethernet20,Ethernet21,Ethernet22,Ethernet23,Ethernet24,Ethernet25,Ethernet26,Ethernet27,Ethernet28,Ethernet29,Ethernet30,Ethernet31,Ethernet32,Ethernet33,Ethernet34,Ethernet35,Ethernet36,Ethernet37,Ethernet38,Ethernet39,Ethernet40,Ethernet41,Ethernet42,Ethernet43,Ethernet44,Ethernet45,Ethernet46,Ethernet47,Ethernet48,Ethernet49,Ethernet50,Ethernet51,Ethernet52,Ethernet53,Ethernet54,Ethernet55,Ethernet56,Ethernet57,Ethernet58,Ethernet59,Ethernet60,Ethernet61,Ethernet62,Ethernet63": { + "dscp_to_tc_map" : "[DSCP_TO_TC_MAP:AZURE]", + "tc_to_queue_map" : "[TC_TO_QUEUE_MAP:AZURE]", + "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE:AZURE]", "pfc_enable": "3,4" } }, @@ -148,19 +139,18 @@ } }, "QUEUE": { - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0": { - "scheduler" : "[SCHEDULER|scheduler.1]" + "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet5,Ethernet6,Ethernet7,Ethernet8,Ethernet9,Ethernet10,Ethernet11,Ethernet12,Ethernet13,Ethernet14,Ethernet15,Ethernet16,Ethernet17,Ethernet18,Ethernet19,Ethernet20,Ethernet21,Ethernet22,Ethernet23,Ethernet24,Ethernet25,Ethernet26,Ethernet27,Ethernet28,Ethernet29,Ethernet30,Ethernet31,Ethernet32,Ethernet33,Ethernet34,Ethernet35,Ethernet36,Ethernet37,Ethernet38,Ethernet39,Ethernet40,Ethernet41,Ethernet42,Ethernet43,Ethernet44,Ethernet45,Ethernet46,Ethernet47,Ethernet48,Ethernet49,Ethernet50,Ethernet51,Ethernet52,Ethernet53,Ethernet54,Ethernet55,Ethernet56,Ethernet57,Ethernet58,Ethernet59,Ethernet60,Ethernet61,Ethernet62,Ethernet63:0-1" : { + "wred_profile" : "[WRED_PROFILE:AZURE]" }, - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1": { - "scheduler" : "[SCHEDULER|scheduler.2]" + "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet5,Ethernet6,Ethernet7,Ethernet8,Ethernet9,Ethernet10,Ethernet11,Ethernet12,Ethernet13,Ethernet14,Ethernet15,Ethernet16,Ethernet17,Ethernet18,Ethernet19,Ethernet20,Ethernet21,Ethernet22,Ethernet23,Ethernet24,Ethernet25,Ethernet26,Ethernet27,Ethernet28,Ethernet29,Ethernet30,Ethernet31,Ethernet32,Ethernet33,Ethernet34,Ethernet35,Ethernet36,Ethernet37,Ethernet38,Ethernet39,Ethernet40,Ethernet41,Ethernet42,Ethernet43,Ethernet44,Ethernet45,Ethernet46,Ethernet47,Ethernet48,Ethernet49,Ethernet50,Ethernet51,Ethernet52,Ethernet53,Ethernet54,Ethernet55,Ethernet56,Ethernet57,Ethernet58,Ethernet59,Ethernet60,Ethernet61,Ethernet62,Ethernet63:3-4" : { + "scheduler" : "[SCHEDULER:scheduler.0]", + "wred_profile" : "[WRED_PROFILE|AZURE_LOSSLESS]" }, - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0-1": { - "wred_profile" : "[WRED_PROFILE|AZURE_LOSSY]" + "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet5,Ethernet6,Ethernet7,Ethernet8,Ethernet9,Ethernet10,Ethernet11,Ethernet12,Ethernet13,Ethernet14,Ethernet15,Ethernet16,Ethernet17,Ethernet18,Ethernet19,Ethernet20,Ethernet21,Ethernet22,Ethernet23,Ethernet24,Ethernet25,Ethernet26,Ethernet27,Ethernet28,Ethernet29,Ethernet30,Ethernet31,Ethernet32,Ethernet33,Ethernet34,Ethernet35,Ethernet36,Ethernet37,Ethernet38,Ethernet39,Ethernet40,Ethernet41,Ethernet42,Ethernet43,Ethernet44,Ethernet45,Ethernet46,Ethernet47,Ethernet48,Ethernet49,Ethernet50,Ethernet51,Ethernet52,Ethernet53,Ethernet54,Ethernet55,Ethernet56,Ethernet57,Ethernet58,Ethernet59,Ethernet60,Ethernet61,Ethernet62,Ethernet63:0" : { + "scheduler" : "[SCHEDULER:scheduler.1]" }, - "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4": { - "scheduler" : "[SCHEDULER|scheduler.0]", - "wred_profile" : "[WRED_PROFILE|AZURE_LOSSLESS]" + "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet5,Ethernet6,Ethernet7,Ethernet8,Ethernet9,Ethernet10,Ethernet11,Ethernet12,Ethernet13,Ethernet14,Ethernet15,Ethernet16,Ethernet17,Ethernet18,Ethernet19,Ethernet20,Ethernet21,Ethernet22,Ethernet23,Ethernet24,Ethernet25,Ethernet26,Ethernet27,Ethernet28,Ethernet29,Ethernet30,Ethernet31,Ethernet32,Ethernet33,Ethernet34,Ethernet35,Ethernet36,Ethernet37,Ethernet38,Ethernet39,Ethernet40,Ethernet41,Ethernet42,Ethernet43,Ethernet44,Ethernet45,Ethernet46,Ethernet47,Ethernet48,Ethernet49,Ethernet50,Ethernet51,Ethernet52,Ethernet53,Ethernet54,Ethernet55,Ethernet56,Ethernet57,Ethernet58,Ethernet59,Ethernet60,Ethernet61,Ethernet62,Ethernet63:1" : { + "scheduler" : "[SCHEDULER:scheduler.2]" } } } - From 51dfa1768db51252a1d310211cc6d68f36ee99e4 Mon Sep 17 00:00:00 2001 From: Jason Tsai Date: Thu, 30 Nov 2017 03:57:35 +0800 Subject: [PATCH 0953/1011] [Ingrasys] Update platform configuration files (#1194) --- .../minigraph.xml | 4 +- .../INGRASYS-S8900-54XC/port_config.ini | 108 ++++---- .../INGRASYS-S8900-64XC/port_config.ini | 96 +++---- .../INGRASYS-S9200-64X/port_config.ini | 65 +++++ .../INGRASYS-S9200-64X/sai.profile | 1 + .../x86_64-ingrasys_s9200_64x-r0/fancontrol | 9 + .../installer.conf | 3 + .../led_proc_init.soc | 111 ++++++++ .../minigraph.xml | 151 ++++++++++ .../plugins/eeprom.py | 24 ++ .../plugins/sfputil.py | 260 ++++++++++++++++++ .../x86_64-ingrasys_s9200_64x-r0/sensors.conf | 68 +++++ platform/broadcom/one-image.mk | 1 + .../broadcom/platform-modules-ingrasys.mk | 6 + .../broadcom/sonic-platform-modules-ingrasys | 2 +- 15 files changed, 804 insertions(+), 105 deletions(-) create mode 100644 device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/port_config.ini create mode 100644 device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/sai.profile create mode 100644 device/ingrasys/x86_64-ingrasys_s9200_64x-r0/fancontrol create mode 100644 device/ingrasys/x86_64-ingrasys_s9200_64x-r0/installer.conf create mode 100644 device/ingrasys/x86_64-ingrasys_s9200_64x-r0/led_proc_init.soc create mode 100644 device/ingrasys/x86_64-ingrasys_s9200_64x-r0/minigraph.xml create mode 100644 device/ingrasys/x86_64-ingrasys_s9200_64x-r0/plugins/eeprom.py create mode 100644 device/ingrasys/x86_64-ingrasys_s9200_64x-r0/plugins/sfputil.py create mode 100644 device/ingrasys/x86_64-ingrasys_s9200_64x-r0/sensors.conf diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/minigraph.xml index ab90ada24274..991591585cca 100644 --- a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/minigraph.xml +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/minigraph.xml @@ -103,7 +103,7 @@ 40000 DeviceInterfaceLink - OCPSCH8810MS + OCPSCH0104002MS Ethernet0 OCPSCH01040HHLF Ethernet52 @@ -111,7 +111,7 @@ - OCPSCH8810HHLF + OCPSCH01040HHLF INGRASYS-S8810-32Q diff --git a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini index 3350b68172cb..079bb63455f2 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini +++ b/device/ingrasys/x86_64-ingrasys_s8900_54xc-r0/INGRASYS-S8900-54XC/port_config.ini @@ -1,55 +1,55 @@ # name lanes alias index -Ethernet0 1 Ethernet1 0 -Ethernet1 2 Ethernet2 1 -Ethernet2 3 Ethernet3 2 -Ethernet3 4 Ethernet4 3 -Ethernet4 5 Ethernet5 4 -Ethernet5 6 Ethernet6 5 -Ethernet6 7 Ethernet7 6 -Ethernet7 8 Ethernet8 7 -Ethernet8 9 Ethernet9 8 -Ethernet9 10 Ethernet10 9 -Ethernet10 11 Ethernet11 10 -Ethernet11 12 Ethernet12 11 -Ethernet12 21 Ethernet13 12 -Ethernet13 22 Ethernet14 13 -Ethernet14 23 Ethernet15 14 -Ethernet15 24 Ethernet16 15 -Ethernet16 33 Ethernet17 16 -Ethernet17 34 Ethernet18 17 -Ethernet18 35 Ethernet19 18 -Ethernet19 36 Ethernet20 19 -Ethernet20 37 Ethernet21 20 -Ethernet21 38 Ethernet22 21 -Ethernet22 39 Ethernet23 22 -Ethernet23 40 Ethernet24 23 -Ethernet24 41 Ethernet25 24 -Ethernet25 42 Ethernet26 25 -Ethernet26 43 Ethernet27 26 -Ethernet27 44 Ethernet28 27 -Ethernet28 49 Ethernet29 28 -Ethernet29 50 Ethernet30 29 -Ethernet30 51 Ethernet31 30 -Ethernet31 52 Ethernet32 31 -Ethernet32 53 Ethernet33 32 -Ethernet33 54 Ethernet34 33 -Ethernet34 55 Ethernet35 34 -Ethernet35 56 Ethernet36 35 -Ethernet36 65 Ethernet37 36 -Ethernet37 66 Ethernet38 37 -Ethernet38 67 Ethernet39 38 -Ethernet39 68 Ethernet40 39 -Ethernet40 69 Ethernet41 40 -Ethernet41 70 Ethernet42 41 -Ethernet42 71 Ethernet43 42 -Ethernet43 72 Ethernet44 43 -Ethernet44 81 Ethernet45 44 -Ethernet45 82 Ethernet46 45 -Ethernet46 83 Ethernet47 46 -Ethernet47 84 Ethernet48 47 -Ethernet48 85,86,87,88 Ethernet49/1 48 -Ethernet52 97,98,99,100 Ethernet50/1 49 -Ethernet56 101,102,103,104 Ethernet51/1 50 -Ethernet60 105,106,107,108 Ethernet52/1 51 -Ethernet64 109,110,111,112 Ethernet53/1 52 -Ethernet68 117,118,119,120 Ethernet54/1 53 +Ethernet0 1 Ethernet1/1 0 +Ethernet1 2 Ethernet2/1 1 +Ethernet2 3 Ethernet3/1 2 +Ethernet3 4 Ethernet4/1 3 +Ethernet4 5 Ethernet5/1 4 +Ethernet5 6 Ethernet6/1 5 +Ethernet6 7 Ethernet7/1 6 +Ethernet7 8 Ethernet8/1 7 +Ethernet8 9 Ethernet9/1 8 +Ethernet9 10 Ethernet10/1 9 +Ethernet10 11 Ethernet11/1 10 +Ethernet11 12 Ethernet12/1 11 +Ethernet12 21 Ethernet13/1 12 +Ethernet13 22 Ethernet14/1 13 +Ethernet14 23 Ethernet15/1 14 +Ethernet15 24 Ethernet16/1 15 +Ethernet16 33 Ethernet17/1 16 +Ethernet17 34 Ethernet18/1 17 +Ethernet18 35 Ethernet19/1 18 +Ethernet19 36 Ethernet20/1 19 +Ethernet20 37 Ethernet21/1 20 +Ethernet21 38 Ethernet22/1 21 +Ethernet22 39 Ethernet23/1 22 +Ethernet23 40 Ethernet24/1 23 +Ethernet24 41 Ethernet25/1 24 +Ethernet25 42 Ethernet26/1 25 +Ethernet26 43 Ethernet27/1 26 +Ethernet27 44 Ethernet28/1 27 +Ethernet28 49 Ethernet29/1 28 +Ethernet29 50 Ethernet30/1 29 +Ethernet30 51 Ethernet31/1 30 +Ethernet31 52 Ethernet32/1 31 +Ethernet32 53 Ethernet33/1 32 +Ethernet33 54 Ethernet34/1 33 +Ethernet34 55 Ethernet35/1 34 +Ethernet35 56 Ethernet36/1 35 +Ethernet36 65 Ethernet37/1 36 +Ethernet37 66 Ethernet38/1 37 +Ethernet38 67 Ethernet39/1 38 +Ethernet39 68 Ethernet40/1 39 +Ethernet40 69 Ethernet41/1 40 +Ethernet41 70 Ethernet42/1 41 +Ethernet42 71 Ethernet43/1 42 +Ethernet43 72 Ethernet44/1 43 +Ethernet44 81 Ethernet45/1 44 +Ethernet45 82 Ethernet46/1 45 +Ethernet46 83 Ethernet47/1 46 +Ethernet47 84 Ethernet48/1 47 +Ethernet48 85,86,87,88 Ethernet52/1 48 +Ethernet52 97,98,99,100 Ethernet56/1 49 +Ethernet56 101,102,103,104 Ethernet60/1 50 +Ethernet60 105,106,107,108 Ethernet64/1 51 +Ethernet64 109,110,111,112 Ethernet68/1 52 +Ethernet68 117,118,119,120 Ethernet69/1 53 diff --git a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini index b950538edba7..385056e6e8f0 100644 --- a/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini +++ b/device/ingrasys/x86_64-ingrasys_s8900_64xc-r0/INGRASYS-S8900-64XC/port_config.ini @@ -1,52 +1,52 @@ # name lanes alias index -Ethernet0 17 Ethernet1 0 -Ethernet1 18 Ethernet2 1 -Ethernet2 19 Ethernet3 2 -Ethernet3 20 Ethernet4 3 -Ethernet4 24 Ethernet5 4 -Ethernet5 23 Ethernet6 5 -Ethernet6 22 Ethernet7 6 -Ethernet7 21 Ethernet8 7 -Ethernet8 28 Ethernet9 8 -Ethernet9 27 Ethernet10 9 -Ethernet10 26 Ethernet11 10 -Ethernet11 25 Ethernet12 11 -Ethernet12 32 Ethernet13 12 -Ethernet13 31 Ethernet14 13 -Ethernet14 30 Ethernet15 14 -Ethernet15 29 Ethernet16 15 -Ethernet16 1 Ethernet17 16 -Ethernet17 2 Ethernet18 17 -Ethernet18 3 Ethernet19 18 -Ethernet19 4 Ethernet20 19 -Ethernet20 8 Ethernet21 20 -Ethernet21 7 Ethernet22 21 -Ethernet22 6 Ethernet23 22 -Ethernet23 5 Ethernet24 23 -Ethernet24 12 Ethernet25 24 -Ethernet25 11 Ethernet26 25 -Ethernet26 10 Ethernet27 26 -Ethernet27 9 Ethernet28 27 -Ethernet28 13 Ethernet29 28 -Ethernet29 14 Ethernet30 29 -Ethernet30 15 Ethernet31 30 -Ethernet31 16 Ethernet32 31 -Ethernet32 33 Ethernet33 32 -Ethernet33 34 Ethernet34 33 -Ethernet34 35 Ethernet35 34 -Ethernet35 36 Ethernet36 35 -Ethernet36 38 Ethernet37 36 -Ethernet37 39 Ethernet38 37 -Ethernet38 40 Ethernet39 38 -Ethernet39 37 Ethernet40 39 -Ethernet40 41 Ethernet41 40 -Ethernet41 42 Ethernet42 41 -Ethernet42 43 Ethernet43 42 -Ethernet43 44 Ethernet44 43 -Ethernet44 48 Ethernet45 44 -Ethernet45 45 Ethernet46 45 -Ethernet46 46 Ethernet47 46 -Ethernet47 47 Ethernet48 47 +Ethernet0 17 Ethernet1/1 0 +Ethernet1 18 Ethernet2/1 1 +Ethernet2 19 Ethernet3/1 2 +Ethernet3 20 Ethernet4/1 3 +Ethernet4 24 Ethernet5/1 4 +Ethernet5 23 Ethernet6/1 5 +Ethernet6 22 Ethernet7/1 6 +Ethernet7 21 Ethernet8/1 7 +Ethernet8 28 Ethernet9/1 8 +Ethernet9 27 Ethernet10/1 9 +Ethernet10 26 Ethernet11/1 10 +Ethernet11 25 Ethernet12/1 11 +Ethernet12 32 Ethernet13/1 12 +Ethernet13 31 Ethernet14/1 13 +Ethernet14 30 Ethernet15/1 14 +Ethernet15 29 Ethernet16/1 15 +Ethernet16 1 Ethernet17/1 16 +Ethernet17 2 Ethernet18/1 17 +Ethernet18 3 Ethernet19/1 18 +Ethernet19 4 Ethernet20/1 19 +Ethernet20 8 Ethernet21/1 20 +Ethernet21 7 Ethernet22/1 21 +Ethernet22 6 Ethernet23/1 22 +Ethernet23 5 Ethernet24/1 23 +Ethernet24 12 Ethernet25/1 24 +Ethernet25 11 Ethernet26/1 25 +Ethernet26 10 Ethernet27/1 26 +Ethernet27 9 Ethernet28/1 27 +Ethernet28 13 Ethernet29/1 28 +Ethernet29 14 Ethernet30/1 29 +Ethernet30 15 Ethernet31/1 30 +Ethernet31 16 Ethernet32/1 31 +Ethernet32 33 Ethernet33/1 32 +Ethernet33 34 Ethernet34/1 33 +Ethernet34 35 Ethernet35/1 34 +Ethernet35 36 Ethernet36/1 35 +Ethernet36 38 Ethernet37/1 36 +Ethernet37 39 Ethernet38/1 37 +Ethernet38 40 Ethernet39/1 38 +Ethernet39 37 Ethernet40/1 39 +Ethernet40 41 Ethernet41/1 40 +Ethernet41 42 Ethernet42/1 41 +Ethernet42 43 Ethernet43/1 42 +Ethernet43 44 Ethernet44/1 43 +Ethernet44 48 Ethernet45/1 44 +Ethernet45 45 Ethernet46/1 45 +Ethernet46 46 Ethernet47/1 46 +Ethernet47 47 Ethernet48/1 47 Ethernet48 49,50,51,52 Ethernet49/1 48 Ethernet52 53,54,55,56 Ethernet50/1 49 Ethernet56 57,58,59,60 Ethernet51/1 50 diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/port_config.ini b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/port_config.ini new file mode 100644 index 000000000000..f1127a5aa046 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/port_config.ini @@ -0,0 +1,65 @@ +# name lanes alias index +Ethernet0 1,2,3,4 Ethernet1/1 0 +Ethernet4 5,6,7,8 Ethernet2/1 1 +Ethernet8 17,18,19,20 Ethernet3/1 2 +Ethernet12 21,22,23,24 Ethernet4/1 3 +Ethernet16 33,34,35,36 Ethernet5/1 4 +Ethernet20 37,38,39,40 Ethernet6/1 5 +Ethernet24 49,50,51,52 Ethernet7/1 6 +Ethernet28 53,54,55,56 Ethernet8/1 7 +Ethernet32 65,66,67,68 Ethernet9/1 8 +Ethernet36 69,70,71,72 Ethernet10/1 9 +Ethernet40 81,82,83,84 Ethernet11/1 10 +Ethernet44 85,86,87,88 Ethernet12/1 11 +Ethernet48 97,98,99,100 Ethernet13/1 12 +Ethernet52 101,102,103,104 Ethernet14/1 13 +Ethernet56 113,114,115,116 Ethernet15/1 14 +Ethernet60 117,118,119,120 Ethernet16/1 15 +Ethernet64 129,130,131,132 Ethernet17/1 16 +Ethernet68 133,134,135,136 Ethernet18/1 17 +Ethernet72 145,146,147,148 Ethernet19/1 18 +Ethernet76 149,150,151,152 Ethernet20/1 19 +Ethernet80 161,162,163,164 Ethernet21/1 20 +Ethernet84 165,166,167,168 Ethernet22/1 21 +Ethernet88 177,178,179,180 Ethernet23/1 22 +Ethernet92 181,182,183,184 Ethernet24/1 23 +Ethernet96 193,194,195,196 Ethernet25/1 24 +Ethernet100 197,198,199,200 Ethernet26/1 25 +Ethernet104 209,210,211,212 Ethernet27/1 26 +Ethernet108 213,214,215,216 Ethernet28/1 27 +Ethernet112 225,226,227,228 Ethernet29/1 28 +Ethernet116 229,230,231,232 Ethernet30/1 29 +Ethernet120 241,242,243,244 Ethernet31/1 30 +Ethernet124 245,246,247,248 Ethernet32/1 31 +Ethernet128 9,10,11,12 Ethernet33/1 32 +Ethernet132 13,14,15,16 Ethernet34/1 33 +Ethernet136 25,26,27,28 Ethernet35/1 34 +Ethernet140 29,30,31,32 Ethernet36/1 35 +Ethernet144 41,42,43,44 Ethernet37/1 36 +Ethernet148 45,46,47,48 Ethernet38/1 37 +Ethernet152 57,58,59,60 Ethernet39/1 38 +Ethernet156 61,62,63,64 Ethernet40/1 39 +Ethernet160 73,74,75,76 Ethernet41/1 40 +Ethernet164 77,78,79,80 Ethernet42/1 41 +Ethernet168 89,90,91,92 Ethernet43/1 42 +Ethernet172 93,94,95,96 Ethernet44/1 43 +Ethernet176 105,106,107,108 Ethernet45/1 44 +Ethernet180 109,110,111,112 Ethernet46/1 45 +Ethernet184 121,122,123,124 Ethernet47/1 46 +Ethernet188 125,126,127,128 Ethernet48/1 47 +Ethernet192 137,138,139,140 Ethernet49/1 48 +Ethernet196 141,142,143,144 Ethernet50/1 49 +Ethernet200 153,154,155,156 Ethernet51/1 50 +Ethernet204 157,158,159,160 Ethernet52/1 51 +Ethernet208 169,170,171,172 Ethernet53/1 52 +Ethernet212 173,174,175,176 Ethernet54/1 53 +Ethernet216 185,186,187,188 Ethernet55/1 54 +Ethernet220 189,190,191,192 Ethernet56/1 55 +Ethernet224 201,202,203,204 Ethernet57/1 56 +Ethernet228 205,206,207,208 Ethernet58/1 57 +Ethernet232 217,218,219,220 Ethernet59/1 58 +Ethernet236 221,222,223,224 Ethernet60/1 59 +Ethernet240 233,234,235,236 Ethernet61/1 60 +Ethernet244 237,238,239,240 Ethernet62/1 61 +Ethernet248 249,250,251,252 Ethernet63/1 62 +Ethernet252 253,254,255,256 Ethernet64/1 63 diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/sai.profile b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/sai.profile new file mode 100644 index 000000000000..20bbcc6a07df --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/INGRASYS-S9200-64X/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th2-s9200-64x100G.config.bcm diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/fancontrol new file mode 100644 index 000000000000..185ee3a2fc25 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/fancontrol @@ -0,0 +1,9 @@ +INTERVAL=10 +DEVPATH=hwmon5=devices/pci0000:00/0000:00:1f.3/i2c-0/i2c-16/16-002f hwmon1=devices/pci0000:00/0000:00:1f.3/i2c-0/i2c-7/7-004d +DEVNAME=hwmon5=w83795adg +FCTEMPS=hwmon5/device/pwm2=hwmon1/temp1_input +FCFANS=hwmon5/device/pwm2=hwmon5/device/fan7_input hwmon5/device/pwm2=hwmon5/device/fan5_input hwmon5/device/pwm2=hwmon5/device/fan3_input hwmon5/device/pwm2=hwmon5/device/fan1_input +MINTEMP=hwmon5/device/pwm2=20 +MAXTEMP=hwmon5/device/pwm2=60 +MINSTART=hwmon5/device/pwm2=75 +MINSTOP=hwmon5/device/pwm2=22 diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/installer.conf b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/installer.conf new file mode 100644 index 000000000000..925a32fc0c3a --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/led_proc_init.soc b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/led_proc_init.soc new file mode 100644 index 000000000000..774923ff868d --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/led_proc_init.soc @@ -0,0 +1,111 @@ +#processor initialization for Ingrasys S9200-64X + +led 0 stop +led 0 prog 12 00 61 F1 12 10 61 F2 12 04 61 F3 12 04 61 F4 67 16 86 F0 77 74 96 F2 2E F1 67 2B 67 3F 16 F3 FE F1 61 F1 12 00 DE F2 74 16 57 2E F1 32 00 32 01 B7 97 75 3A 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 58 77 48 06 FE D2 01 70 50 77 66 06 F0 C2 08 74 58 77 66 16 F4 91 22 0E 87 22 0E 87 DA 00 74 5A 57 16 F4 91 22 0F 87 22 0E 87 DA 00 74 68 57 02 80 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=56 REMAP_PORT_2=57 REMAP_PORT_1=58 REMAP_PORT_0=59 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=60 REMAP_PORT_6=61 REMAP_PORT_5=62 REMAP_PORT_4=63 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=52 REMAP_PORT_10=53 REMAP_PORT_9=54 REMAP_PORT_8=55 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=48 REMAP_PORT_14=49 REMAP_PORT_13=50 REMAP_PORT_12=51 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=40 REMAP_PORT_18=41 REMAP_PORT_17=42 REMAP_PORT_16=43 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=44 REMAP_PORT_22=45 REMAP_PORT_21=46 REMAP_PORT_20=47 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=36 REMAP_PORT_26=37 REMAP_PORT_25=38 REMAP_PORT_24=39 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=32 REMAP_PORT_30=33 REMAP_PORT_29=34 REMAP_PORT_28=35 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=24 REMAP_PORT_34=25 REMAP_PORT_33=26 REMAP_PORT_32=27 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=28 REMAP_PORT_38=29 REMAP_PORT_37=30 REMAP_PORT_36=31 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=20 REMAP_PORT_42=21 REMAP_PORT_41=22 REMAP_PORT_40=23 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=16 REMAP_PORT_46=17 REMAP_PORT_45=18 REMAP_PORT_44=19 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=8 REMAP_PORT_50=9 REMAP_PORT_49=10 REMAP_PORT_48=11 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=12 REMAP_PORT_54=13 REMAP_PORT_53=14 REMAP_PORT_52=15 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=4 REMAP_PORT_58=5 REMAP_PORT_57=6 REMAP_PORT_56=7 +modreg CMIC_LEDUP0_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0 REMAP_PORT_62=1 REMAP_PORT_61=2 REMAP_PORT_60=3 + +led 0 auto on +led 0 start + +led 1 stop +led 1 prog 12 00 61 F1 12 10 61 F2 12 04 61 F3 12 04 61 F4 67 16 86 F0 77 74 96 F2 2E F1 67 2B 67 3F 16 F3 FE F1 61 F1 12 00 DE F2 74 16 57 2E F1 32 00 32 01 B7 97 75 3A 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 58 77 48 06 FE D2 01 70 50 77 66 06 F0 C2 08 74 58 77 66 16 F4 91 22 0E 87 22 0E 87 DA 00 74 5A 57 16 F4 91 22 0F 87 22 0E 87 DA 00 74 68 57 02 80 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=0 REMAP_PORT_2=1 REMAP_PORT_1=2 REMAP_PORT_0=3 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=4 REMAP_PORT_6=5 REMAP_PORT_5=6 REMAP_PORT_4=7 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=12 REMAP_PORT_10=13 REMAP_PORT_9=14 REMAP_PORT_8=15 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=8 REMAP_PORT_14=9 REMAP_PORT_13=10 REMAP_PORT_12=11 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=16 REMAP_PORT_18=17 REMAP_PORT_17=18 REMAP_PORT_16=19 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=20 REMAP_PORT_22=21 REMAP_PORT_21=22 REMAP_PORT_20=23 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=28 REMAP_PORT_26=29 REMAP_PORT_25=30 REMAP_PORT_24=31 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=24 REMAP_PORT_30=25 REMAP_PORT_29=26 REMAP_PORT_28=27 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=32 REMAP_PORT_34=33 REMAP_PORT_33=34 REMAP_PORT_32=35 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=36 REMAP_PORT_38=37 REMAP_PORT_37=38 REMAP_PORT_36=39 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=44 REMAP_PORT_42=45 REMAP_PORT_41=46 REMAP_PORT_40=47 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=40 REMAP_PORT_46=41 REMAP_PORT_45=42 REMAP_PORT_44=43 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=48 REMAP_PORT_50=49 REMAP_PORT_49=50 REMAP_PORT_48=51 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=52 REMAP_PORT_54=53 REMAP_PORT_53=54 REMAP_PORT_52=55 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=60 REMAP_PORT_58=61 REMAP_PORT_57=62 REMAP_PORT_56=63 +modreg CMIC_LEDUP1_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=56 REMAP_PORT_62=57 REMAP_PORT_61=58 REMAP_PORT_60=59 + +led 1 auto on +led 1 start + +led 2 stop +led 2 prog 12 00 61 F1 12 10 61 F2 12 04 61 F3 12 04 61 F4 67 16 86 F0 77 74 96 F2 2E F1 67 2B 67 3F 16 F3 FE F1 61 F1 12 00 DE F2 74 16 57 2E F1 32 00 32 01 B7 97 75 3A 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 58 77 48 06 FE D2 01 70 50 77 66 06 F0 C2 08 74 58 77 66 16 F4 91 22 0E 87 22 0E 87 DA 00 74 5A 57 16 F4 91 22 0F 87 22 0E 87 DA 00 74 68 57 02 80 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=56 REMAP_PORT_2=57 REMAP_PORT_1=58 REMAP_PORT_0=59 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=60 REMAP_PORT_6=61 REMAP_PORT_5=62 REMAP_PORT_4=63 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=52 REMAP_PORT_10=53 REMAP_PORT_9=54 REMAP_PORT_8=55 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=48 REMAP_PORT_14=49 REMAP_PORT_13=50 REMAP_PORT_12=51 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=40 REMAP_PORT_18=41 REMAP_PORT_17=42 REMAP_PORT_16=43 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=44 REMAP_PORT_22=45 REMAP_PORT_21=46 REMAP_PORT_20=47 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=36 REMAP_PORT_26=37 REMAP_PORT_25=38 REMAP_PORT_24=39 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=32 REMAP_PORT_30=33 REMAP_PORT_29=34 REMAP_PORT_28=35 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=24 REMAP_PORT_34=25 REMAP_PORT_33=26 REMAP_PORT_32=27 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=28 REMAP_PORT_38=29 REMAP_PORT_37=30 REMAP_PORT_36=31 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=20 REMAP_PORT_42=21 REMAP_PORT_41=22 REMAP_PORT_40=23 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=16 REMAP_PORT_46=17 REMAP_PORT_45=18 REMAP_PORT_44=19 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=8 REMAP_PORT_50=9 REMAP_PORT_49=10 REMAP_PORT_48=11 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=12 REMAP_PORT_54=13 REMAP_PORT_53=14 REMAP_PORT_52=15 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=4 REMAP_PORT_58=5 REMAP_PORT_57=6 REMAP_PORT_56=7 +modreg CMIC_LEDUP2_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0 REMAP_PORT_62=1 REMAP_PORT_61=2 REMAP_PORT_60=3 + +led 2 auto on +led 2 start + +led 3 stop +led 3 prog 12 00 61 F1 12 10 61 F2 12 04 61 F3 12 04 61 F4 67 16 86 F0 77 74 96 F2 2E F1 67 2B 67 3F 16 F3 FE F1 61 F1 12 00 DE F2 74 16 57 2E F1 32 00 32 01 B7 97 75 3A 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 58 77 48 06 FE D2 01 70 50 77 66 06 F0 C2 08 74 58 77 66 16 F4 91 22 0E 87 22 0E 87 DA 00 74 5A 57 16 F4 91 22 0F 87 22 0E 87 DA 00 74 68 57 02 80 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=0 REMAP_PORT_2=1 REMAP_PORT_1=2 REMAP_PORT_0=3 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=4 REMAP_PORT_6=5 REMAP_PORT_5=6 REMAP_PORT_4=7 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=12 REMAP_PORT_10=13 REMAP_PORT_9=14 REMAP_PORT_8=15 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=8 REMAP_PORT_14=9 REMAP_PORT_13=10 REMAP_PORT_12=11 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=16 REMAP_PORT_18=17 REMAP_PORT_17=18 REMAP_PORT_16=19 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=20 REMAP_PORT_22=21 REMAP_PORT_21=22 REMAP_PORT_20=23 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=28 REMAP_PORT_26=29 REMAP_PORT_25=30 REMAP_PORT_24=31 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=24 REMAP_PORT_30=25 REMAP_PORT_29=26 REMAP_PORT_28=27 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=32 REMAP_PORT_34=33 REMAP_PORT_33=34 REMAP_PORT_32=35 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=36 REMAP_PORT_38=37 REMAP_PORT_37=38 REMAP_PORT_36=39 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=44 REMAP_PORT_42=45 REMAP_PORT_41=46 REMAP_PORT_40=47 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=40 REMAP_PORT_46=41 REMAP_PORT_45=42 REMAP_PORT_44=43 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=48 REMAP_PORT_50=49 REMAP_PORT_49=50 REMAP_PORT_48=51 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=52 REMAP_PORT_54=53 REMAP_PORT_53=54 REMAP_PORT_52=55 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=60 REMAP_PORT_58=61 REMAP_PORT_57=62 REMAP_PORT_56=63 +modreg CMIC_LEDUP3_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=56 REMAP_PORT_62=57 REMAP_PORT_61=58 REMAP_PORT_60=59 + +led 3 auto on +led 3 start + +led 4 stop +led 4 prog 12 00 61 F1 12 40 61 F2 12 01 61 F3 12 01 61 F4 67 16 86 F0 77 74 96 F2 2E F1 67 2B 67 3F 16 F3 FE F1 61 F1 12 00 DE F2 74 16 57 2E F1 32 00 32 01 B7 97 75 3A 02 01 60 FE 57 02 00 60 FE 57 2E F1 32 08 97 75 58 77 48 06 FE D2 01 70 50 77 66 06 F0 C2 08 74 58 77 66 16 F4 91 22 0E 87 22 0E 87 DA 00 74 5A 57 16 F4 91 22 0F 87 22 0E 87 DA 00 74 68 57 02 80 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_0_3 REMAP_PORT_3=62 REMAP_PORT_2=0 REMAP_PORT_1=63 REMAP_PORT_0=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_4_7 REMAP_PORT_7=0 REMAP_PORT_6=0 REMAP_PORT_5=0 REMAP_PORT_4=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_8_11 REMAP_PORT_11=0 REMAP_PORT_10=0 REMAP_PORT_9=0 REMAP_PORT_8=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_12_15 REMAP_PORT_15=0 REMAP_PORT_14=0 REMAP_PORT_13=0 REMAP_PORT_12=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_16_19 REMAP_PORT_19=0 REMAP_PORT_18=0 REMAP_PORT_17=0 REMAP_PORT_16=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_20_23 REMAP_PORT_23=0 REMAP_PORT_22=0 REMAP_PORT_21=0 REMAP_PORT_20=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_24_27 REMAP_PORT_27=0 REMAP_PORT_26=0 REMAP_PORT_25=0 REMAP_PORT_24=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_28_31 REMAP_PORT_31=0 REMAP_PORT_30=0 REMAP_PORT_29=0 REMAP_PORT_28=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_32_35 REMAP_PORT_35=0 REMAP_PORT_34=0 REMAP_PORT_33=0 REMAP_PORT_32=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_36_39 REMAP_PORT_39=0 REMAP_PORT_38=0 REMAP_PORT_37=0 REMAP_PORT_36=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_40_43 REMAP_PORT_43=0 REMAP_PORT_42=0 REMAP_PORT_41=0 REMAP_PORT_40=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_44_47 REMAP_PORT_47=0 REMAP_PORT_46=0 REMAP_PORT_45=0 REMAP_PORT_44=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_48_51 REMAP_PORT_51=0 REMAP_PORT_50=0 REMAP_PORT_49=0 REMAP_PORT_48=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_52_55 REMAP_PORT_55=0 REMAP_PORT_54=0 REMAP_PORT_53=0 REMAP_PORT_52=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_56_59 REMAP_PORT_59=0 REMAP_PORT_58=0 REMAP_PORT_57=0 REMAP_PORT_56=0 +modreg CMIC_LEDUP4_PORT_ORDER_REMAP_60_63 REMAP_PORT_63=0 REMAP_PORT_62=0 REMAP_PORT_61=0 REMAP_PORT_60=0 + +led 4 auto on +led 4 start diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/minigraph.xml new file mode 100644 index 000000000000..2b05e9ed15b7 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/minigraph.xml @@ -0,0 +1,151 @@ + + + + + + OCPSCH0104001MS + 10.10.1.26 + OCPSCH01040GGLF + 10.10.1.25 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.26 + OCPSCH01040GGLF + 10.10.2.25 + 1 + 10 + 3 + + + + + 64536 + OCPSCH01040GGLF + + +
10.10.1.26
+ + +
+ +
10.10.2.26
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.9/32 + + 100.0.0.9/32 + + + + + + + + OCPSCH01040GGLF + + + + + + Ethernet0 + 10.10.1.25/30 + + + + Ethernet4 + 10.10.2.25/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet24 + OCPSCH01040GGLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104002MS + Ethernet24 + OCPSCH01040GGLF + Ethernet4 + + + + + OCPSCH01040GGLF + INGRASYS-S9200-64X + + + + + + + OCPSCH01040GGLF + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + OCPSCH01040GGLF + INGRASYS-S9200-64X +
diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/plugins/eeprom.py b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/plugins/eeprom.py new file mode 100644 index 000000000000..3d01608ef7b2 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/plugins/eeprom.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +############################################################################# +# Ingrasys S9200-64X +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + i2c_bus = "0" + i2c_addr = "0055" + self.eeprom_path = "/sys/class/i2c-adapter/i2c-" + i2c_bus + "/" + i2c_bus + "-" + i2c_addr + "/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/plugins/sfputil.py new file mode 100644 index 000000000000..4d5651c63a68 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/plugins/sfputil.py @@ -0,0 +1,260 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 63 + PORTS_IN_BLOCK = 64 + + EEPROM_OFFSET = 29 + + _port_to_eeprom_mapping = {} + + _logic_to_phy_port_mapping = { + 0: 0, + 1: 1, + 2: 4, + 3: 5, + 4: 8, + 5: 9, + 6: 12, + 7: 13, + 8: 16, + 9: 17, + 10: 20, + 11: 21, + 12: 24, + 13: 25, + 14: 28, + 15: 29, + 16: 32, + 17: 33, + 18: 36, + 19: 37, + 20: 40, + 21: 41, + 22: 44, + 23: 45, + 24: 48, + 25: 49, + 26: 52, + 27: 53, + 28: 56, + 29: 57, + 30: 60, + 31: 61, + 32: 2, + 33: 3, + 34: 6, + 35: 7, + 36: 10, + 37: 11, + 38: 14, + 39: 15, + 40: 18, + 41: 19, + 42: 22, + 43: 23, + 44: 26, + 45: 27, + 46: 30, + 47: 31, + 48: 34, + 49: 35, + 50: 38, + 51: 39, + 52: 42, + 53: 43, + 54: 46, + 55: 47, + 56: 50, + 57: 51, + 58: 54, + 59: 55, + 60: 58, + 61: 59, + 62: 62, + 63: 63 + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + + for x in range(0, self.port_end + 1): + phy_port = self._logic_to_phy_port_mapping[x] + self._port_to_eeprom_mapping[x] = eeprom_path.format(phy_port + self.EEPROM_OFFSET) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # logic port to physical port mapping + port_num = self._logic_to_phy_port_mapping[port_num] + + try: + reg_file = open("/sys/devices/platform/ingrasys-s9200-cpld.0/qsfp_modprs") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ModPrsL is active low + if reg_value & mask == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # logic port to physical port mapping + port_num = self._logic_to_phy_port_mapping[port_num] + + try: + reg_file = open("/sys/devices/platform/ingrasys-s9200-cpld.0/qsfp_lpmode") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # LPMode is active high + if reg_value & mask == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # logic port to physical port mapping + port_num = self._logic_to_phy_port_mapping[port_num] + + try: + reg_file = open("/sys/devices/platform/ingrasys-s9200-cpld.0/qsfp_lpmode", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = format(reg_value, 'x') + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/devices/platform/ingrasys-s9200-cpld.0/qsfp_reset" + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # logic port to physical port mapping + port_num = self._logic_to_phy_port_mapping[port_num] + + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # File content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << port_num) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = format(reg_value, 'x') + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_value | mask + content = format(reg_value, 'x') + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True diff --git a/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/sensors.conf new file mode 100644 index 000000000000..ef694e96a056 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9200_64x-r0/sensors.conf @@ -0,0 +1,68 @@ +# libsensors configuration file +chip "i350bb-*" + ignore loc1 + +chip "jc42-*" + label temp1 "DIMM Temp" + set temp1_max 50 + set temp1_crit 85 + +chip "w83795adg-*" + ignore in0 + label in1 "P0V9" + set in1_min 0.90 * 0.97 + set in1_max 0.90 * 1.03 + ignore in2 + label in3 "P1V8" + set in3_min 1.8 * 0.97 + set in3_max 1.8 * 1.03 + label in4 "P1V0" + set in4_min 1.0 * 0.97 + set in4_max 1.0 * 1.03 + label in5 "P0V8" + set in5_min 0.8 * 0.97 + set in5_max 0.8 * 1.03 + ignore in6 + ignore in7 + ignore in8 + ignore in9 + ignore in10 + ignore in11 + ignore in12 + ignore in13 + ignore in14 + ignore in15 + ignore in16 + ignore in17 + ignore in18 + ignore in19 + label fan1 "FANTRAY 1" + ignore fan2 + label fan3 "FANTRAY 2" + ignore fan4 + label fan5 "FANTRAY 3" + ignore fan6 + label fan7 "FANTRAY 4" + ignore fan8 + ignore temp1 + ignore temp2 + ignore temp3 + ignore temp4 + ignore intrusion0 +bus "i2c-6" "i2c-0-mux (chan_id 5)" +chip "lm75-i2c-6-4E" + label temp1 "MAC Temp" + set temp1_max 50 + set temp1_max_hyst 45 + +bus "i2c-6" "i2c-0-mux (chan_id 5)" +chip "lm75-i2c-6-4D" + label temp1 "REAR Temp" + set temp1_max 50 + set temp1_max_hyst 45 + +bus "i2c-7" "i2c-0-mux (chan_id 6)" +chip "lm75-i2c-7-4D" + label temp1 "Front Temp" + set temp1_max 50 + set temp1_max_hyst 45 diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 717ba7fa0f6b..5b2afedee7d7 100755 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -11,6 +11,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(INGRASYS_S8900_64XC_PLATFORM_MODULE) \ $(INGRASYS_S9100_PLATFORM_MODULE) \ $(INGRASYS_S8810_32Q_PLATFORM_MODULE) \ + $(INGRASYS_S9200_64X_PLATFORM_MODULE) \ $(ACCTON_AS7712_32X_PLATFORM_MODULE) \ $(ACCTON_AS5712_54X_PLATFORM_MODULE) \ $(INVENTEC_D7032Q28B_PLATFORM_MODULE) \ diff --git a/platform/broadcom/platform-modules-ingrasys.mk b/platform/broadcom/platform-modules-ingrasys.mk index e5ef4021eff7..f402a7fed1c6 100644 --- a/platform/broadcom/platform-modules-ingrasys.mk +++ b/platform/broadcom/platform-modules-ingrasys.mk @@ -4,11 +4,13 @@ INGRASYS_S9100_PLATFORM_MODULE_VERSION = 1.1.0 INGRASYS_S8900_64XC_PLATFORM_MODULE_VERSION = 1.1.0 INGRASYS_S8900_54XC_PLATFORM_MODULE_VERSION = 1.1.0 INGRASYS_S8810_32Q_PLATFORM_MODULE_VERSION = 1.1.0 +INGRASYS_S9200_64X_PLATFORM_MODULE_VERSION = 1.1.0 export INGRASYS_S9100_PLATFORM_MODULE_VERSION export INGRASYS_S8900_64XC_PLATFORM_MODULE_VERSION export INGRASYS_S8900_54XC_PLATFORM_MODULE_VERSION export INGRASYS_S8810_32Q_PLATFORM_MODULE_VERSION +export INGRASYS_S9200_64X_PLATFORM_MODULE_VERSION INGRASYS_S9100_PLATFORM_MODULE = sonic-platform-ingrasys-s9100_$(INGRASYS_S9100_PLATFORM_MODULE_VERSION)_amd64.deb $(INGRASYS_S9100_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ingrasys @@ -25,6 +27,10 @@ $(INGRASYS_S8900_54XC_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s8900_54xc-r0 INGRASYS_S8810_32Q_PLATFORM_MODULE = sonic-platform-ingrasys-s8810-32q_$(INGRASYS_S8810_32Q_PLATFORM_MODULE_VERSION)_amd64.deb $(INGRASYS_S8810_32Q_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s8810_32q-r0 +INGRASYS_S9200_64X_PLATFORM_MODULE = sonic-platform-ingrasys-s9200-64x_$(INGRASYS_S9200_64X_PLATFORM_MODULE_VERSION)_amd64.deb +$(INGRASYS_S9200_64X_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s9200_64x-r0 + $(eval $(call add_extra_package,$(INGRASYS_S9100_PLATFORM_MODULE),$(INGRASYS_S8900_64XC_PLATFORM_MODULE))) $(eval $(call add_extra_package,$(INGRASYS_S9100_PLATFORM_MODULE),$(INGRASYS_S8900_54XC_PLATFORM_MODULE))) $(eval $(call add_extra_package,$(INGRASYS_S9100_PLATFORM_MODULE),$(INGRASYS_S8810_32Q_PLATFORM_MODULE))) +$(eval $(call add_extra_package,$(INGRASYS_S9100_PLATFORM_MODULE),$(INGRASYS_S9200_64X_PLATFORM_MODULE))) diff --git a/platform/broadcom/sonic-platform-modules-ingrasys b/platform/broadcom/sonic-platform-modules-ingrasys index e66b8839da21..e60d63d9b54d 160000 --- a/platform/broadcom/sonic-platform-modules-ingrasys +++ b/platform/broadcom/sonic-platform-modules-ingrasys @@ -1 +1 @@ -Subproject commit e66b8839da2180fd586aae040701faf180d59477 +Subproject commit e60d63d9b54dc3673433615c555a4fc62bfc488d From d39dd396b52b9f66a2b7b10b6f31f39f18c94c9f Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Wed, 29 Nov 2017 16:36:26 -0800 Subject: [PATCH 0954/1011] Move tcpdump into /usr/bin Otherwise it's impossible to run tcpdump due to a docker bug (#1195) --- dockers/docker-ptf/Dockerfile.j2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dockers/docker-ptf/Dockerfile.j2 b/dockers/docker-ptf/Dockerfile.j2 index 01312687b93c..2d9b1544d95a 100644 --- a/dockers/docker-ptf/Dockerfile.j2 +++ b/dockers/docker-ptf/Dockerfile.j2 @@ -100,6 +100,10 @@ RUN mkdir /var/run/sshd \ COPY ["supervisord.conf", "/etc/supervisor/"] COPY ["conf.d/supervisord.conf", "conf.d/sshd.conf", "conf.d/ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] +# Move tcpdump into /usr/bin Otherwise it's impossible to run tcpdump due to a docker bug +RUN mv /usr/sbin/tcpdump /usr/bin/tcpdump +RUN ln -s /usr/bin/tcpdump /usr/sbin/tcpdump + RUN mkdir -p /var/log/supervisor EXPOSE 22 From 397f513362506b5e3e4915a24b93585747633cad Mon Sep 17 00:00:00 2001 From: Roy Lee Date: Fri, 1 Dec 2017 03:19:41 +0800 Subject: [PATCH 0955/1011] [platform] Accton AS7712-32X. Update for sensors and sfputil (#1197) Revise kernel driver to duplicate nodes for support of lm-sensors, at fan and PSU. Update sfputil.py to to fit new SfpUtil prototype. Signed-off-by: roylee123 --- .../plugins/sfputil.py | 70 ++++++++++++++++--- .../broadcom/sonic-platform-modules-accton | 2 +- 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py index 6dc35d72bb21..c13eecfd1759 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py @@ -1,19 +1,19 @@ #!/usr/bin/env python try: - from sonic_sfp.sfputilbase import sfputilbase + from sonic_sfp.sfputilbase import SfpUtilBase except ImportError, e: raise ImportError (str(e) + "- required module not found") -class sfputil(sfputilbase): - """Platform specific sfputil class""" +class SfpUtil(SfpUtilBase): + """Platform specific SfpUtill class""" - port_start = 0 - port_end = 31 + _port_start = 0 + _port_end = 31 ports_in_block = 32 - port_to_eeprom_mapping = {} + _port_to_eeprom_mapping = {} port_to_i2c_mapping = { 9 : 18, 10 : 19, @@ -51,10 +51,58 @@ class sfputil(sfputilbase): _qsfp_ports = range(0, ports_in_block + 1) - def __init__(self, port_num): - # Override port_to_eeprom_mapping for class initialization + def __init__(self): eeprom_path = '/sys/bus/i2c/devices/{0}-0050/sfp_eeprom' - for x in range(self.port_start, self.port_end + 1): + for x in range(0, self._port_end + 1): port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x+1]) - self.port_to_eeprom_mapping[x] = port_eeprom_path - sfputilbase.__init__(self, port_num) + self._port_to_eeprom_mapping[x] = port_eeprom_path + SfpUtilBase.__init__(self) + + def reset(self, port_num): + return True + def set_low_power_mode(self, port_nuM, lpmode): + return True + def get_low_power_mode(self, port_num): + return True + +# def get_presence(self, port_num): +# return True + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self._port_start or port_num > self._port_end: + return False + + path = "/sys/bus/i2c/devices/{0}-0050/sfp_is_present" + port_ps = path.format(self.port_to_i2c_mapping[port_num+1]) + + + try: + reg_file = open(port_ps) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_file.readline().rstrip() + if reg_value == '1': + return True + + return False + + @property + def port_start(self): + return self._port_start + + @property + def port_end(self): + return self._port_end + + @property + def qsfp_ports(self): + return range(0, self.ports_in_block + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton index 3fbde584ba15..edfb5b2c1285 160000 --- a/platform/broadcom/sonic-platform-modules-accton +++ b/platform/broadcom/sonic-platform-modules-accton @@ -1 +1 @@ -Subproject commit 3fbde584ba15f0178dc22cb7e56f2bb8481692d4 +Subproject commit edfb5b2c1285cbfd30d8a662ab738aee53a80439 From 73e4204521f122bd9e2776f9dbf70afcdefeba24 Mon Sep 17 00:00:00 2001 From: Polly Hsu Date: Fri, 1 Dec 2017 03:21:47 +0800 Subject: [PATCH 0956/1011] [device/accton]: Update Accton-AS5712_54X minigraph (#1196) * UPDATE. minigraph.xml to initialize the default IP address of all interfaces Signed-off-by: polly_hsu@accton.com --- .../x86_64-accton_as5712_54x-r0/minigraph.xml | 1245 ++++++++++++++++- 1 file changed, 1193 insertions(+), 52 deletions(-) diff --git a/device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml b/device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml index bf0b2e9c0fcd..78c3876d8381 100755 --- a/device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml +++ b/device/accton/x86_64-accton_as5712_54x-r0/minigraph.xml @@ -1,38 +1,458 @@ - + - OCPSCH0104001MS - 10.10.1.2 - OCPSCH01040AALF - 10.10.1.1 + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 1 - 10 - 3 + 180 + 60 - OCPSCH0104002MS - 10.10.2.2 - OCPSCH01040AALF - 10.10.2.1 + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 1 - 10 - 3 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 - 64536 - OCPSCH01040AALF + 65100 + switch1 -
10.10.1.1
+
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
-
10.10.2.1
+
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
@@ -40,13 +460,163 @@
- 64542 - OCPSCH0104001MS + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 - 64543 - OCPSCH0104002MS + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2
@@ -58,38 +628,380 @@ HostIP Loopback0 - - 100.0.0.3/32 + + 10.1.0.32/32 - 100.0.0.3/32 + 10.1.0.32/32 - - ManagementIP1 - Management0 - - 192.168.200.12/24 - - 192.168.200.12/24 - - OCPSCH01040AALF + switch1 - + tenGigE0 - 10.10.1.1/30 + 10.0.0.0/31 + + + + tenGigE1 + 10.0.0.2/31 + + + + tenGigE2 + 10.0.0.4/31 + + + + tenGigE3 + 10.0.0.6/31 - + tenGigE4 - 10.10.2.1/30 + 10.0.0.8/31 + + + + tenGigE5 + 10.0.0.10/31 + + + + tenGigE6 + 10.0.0.12/31 + + + + tenGigE7 + 10.0.0.14/31 + + + + tenGigE8 + 10.0.0.16/31 + + + + tenGigE9 + 10.0.0.18/31 + + + + tenGigE10 + 10.0.0.20/31 + + + + tenGigE11 + 10.0.0.22/31 + + + + tenGigE12 + 10.0.0.24/31 + + + + tenGigE13 + 10.0.0.26/31 + + + + tenGigE14 + 10.0.0.28/31 + + + + tenGigE15 + 10.0.0.30/31 + + + + tenGigE16 + 10.0.0.32/31 + + + + tenGigE17 + 10.0.0.34/31 + + + + tenGigE18 + 10.0.0.36/31 + + + + tenGigE19 + 10.0.0.38/31 + + + + tenGigE20 + 10.0.0.40/31 + + + + tenGigE21 + 10.0.0.42/31 + + + + tenGigE22 + 10.0.0.44/31 + + + + tenGigE23 + 10.0.0.46/31 + + + + tenGigE24 + 10.0.0.48/31 + + + + tenGigE25 + 10.0.0.50/31 + + + + tenGigE26 + 10.0.0.52/31 + + + + tenGigE27 + 10.0.0.54/31 + + + + tenGigE28 + 10.0.0.56/31 + + + + tenGigE29 + 10.0.0.58/31 + + + + tenGigE30 + 10.0.0.60/31 + + + + tenGigE31 + 10.0.0.62/31 + + + + tenGigE32 + 10.0.0.64/31 + + + + tenGigE33 + 10.0.0.66/31 + + + + tenGigE34 + 10.0.0.68/31 + + + + tenGigE35 + 10.0.0.70/31 + + + + tenGigE36 + 10.0.0.72/31 + + + + tenGigE37 + 10.0.0.74/31 + + + + tenGigE38 + 10.0.0.76/31 + + + + tenGigE39 + 10.0.0.78/31 + + + + tenGigE40 + 10.0.0.80/31 + + + + tenGigE41 + 10.0.0.82/31 + + + + tenGigE42 + 10.0.0.84/31 + + + + tenGigE43 + 10.0.0.86/31 + + + + tenGigE44 + 10.0.0.88/31 + + + + tenGigE45 + 10.0.0.90/31 + + + + tenGigE46 + 10.0.0.92/31 + + + + tenGigE47 + 10.0.0.94/31 + + + + tenGigE48 + 10.0.0.96/31 + + + + tenGigE49 + 10.0.0.98/31 + + + + tenGigE50 + 10.0.0.100/31 + + + + tenGigE51 + 10.0.0.102/31 + + + + tenGigE52 + 10.0.0.104/31 + + + + tenGigE53 + 10.0.0.106/31 + + + + tenGigE54 + 10.0.0.108/31 + + + + tenGigE55 + 10.0.0.110/31 + + + + tenGigE56 + 10.0.0.112/31 + + + + tenGigE57 + 10.0.0.114/31 + + + + tenGigE58 + 10.0.0.116/31 + + + + tenGigE59 + 10.0.0.118/31 + + + + tenGigE60 + 10.0.0.120/31 + + + + tenGigE61 + 10.0.0.122/31 + + + + tenGigE62 + 10.0.0.124/31 + + + + tenGigE63 + 10.0.0.126/31 + + + + tenGigE64 + 10.0.0.128/31 + + + + tenGigE65 + 10.0.0.130/31 + + + + tenGigE66 + 10.0.0.132/31 + + + + tenGigE67 + 10.0.0.134/31 + + + + tenGigE68 + 10.0.0.136/31 + + + + tenGigE69 + 10.0.0.138/31 + + + + tenGigE70 + 10.0.0.140/31 + + + + tenGigE71 + 10.0.0.142/31 @@ -100,34 +1012,263 @@ - - 10000 + DeviceInterfaceLink - OCPSCH0104001MS + switch1 tenGigE0 - OCPSCH01040AALF - tenGigE0 + ARISTA01T2 + tenGigE1 - - 10000 + DeviceInterfaceLink - OCPSCH0104002MS - tenGigE0 - OCPSCH01040AALF - tenGigE4 + switch1 + tenGigE1 + ARISTA02T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE2 + ARISTA03T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE3 + ARISTA04T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE4 + ARISTA05T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE5 + ARISTA06T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE6 + ARISTA07T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE7 + ARISTA08T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE8 + ARISTA09T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE9 + ARISTA10T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE10 + ARISTA11T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE11 + ARISTA12T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE12 + ARISTA13T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE13 + ARISTA14T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE14 + ARISTA15T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE15 + ARISTA16T2 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE16 + ARISTA01T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE17 + ARISTA02T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE18 + ARISTA03T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE19 + ARISTA04T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE20 + ARISTA05T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE21 + ARISTA06T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE22 + ARISTA07T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE23 + ARISTA08T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE24 + ARISTA09T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE25 + ARISTA10T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE26 + ARISTA11T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE27 + ARISTA12T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE28 + ARISTA13T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE29 + ARISTA14T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE30 + ARISTA15T0 + tenGigE1 + + + DeviceInterfaceLink + switch1 + tenGigE31 + ARISTA16T0 + tenGigE1 - + - OCPSCH01040AALF + switch1 Accton-AS5712-54X - + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + - OCPSCH01040AALF + switch1 Accton-AS5712-54X
From b907e4e9f5b52b7c93b80d99959330230dffa2c6 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 30 Nov 2017 14:59:25 -0800 Subject: [PATCH 0957/1011] [vs]: add vlan configuration support in virtual switch (#1200) --- dockers/docker-database/Dockerfile.j2 | 2 +- dockers/docker-orchagent/Dockerfile.j2 | 3 +- .../scripts}/arp_update | 0 .../scripts}/configdb-load.sh | 0 platform/broadcom/docker-orchagent-brcm.mk | 1 + platform/cavium/docker-orchagent-cavm.mk | 1 + platform/centec/docker-orchagent-centec.mk | 1 + platform/marvell/docker-orchagent-mrvl.mk | 1 + platform/mellanox/docker-orchagent-mlnx.mk | 1 + platform/mellanox/sdk.mk | 10 +++--- platform/vs/docker-sonic-vs.mk | 14 +++++++- platform/vs/docker-sonic-vs/Dockerfile.j2 | 18 ++++++++++- platform/vs/docker-sonic-vs/sonic-dev.gpg.key | 30 +++++++++++++++++ platform/vs/docker-sonic-vs/start.sh | 32 ++++++++++++++++--- platform/vs/docker-sonic-vs/supervisord.conf | 30 +++++++++++++++-- rules/docker-database.mk | 1 + rules/iproute2.mk | 7 ++++ rules/scripts.mk | 11 +++++++ sonic-slave/Dockerfile | 12 ++++++- src/iproute2/Makefile | 20 ++++++++++++ src/sonic-swss | 2 +- 21 files changed, 178 insertions(+), 19 deletions(-) rename {dockers/docker-orchagent => files/scripts}/arp_update (100%) rename {dockers/docker-database => files/scripts}/configdb-load.sh (100%) create mode 100644 platform/vs/docker-sonic-vs/sonic-dev.gpg.key create mode 100644 rules/iproute2.mk create mode 100644 rules/scripts.mk create mode 100644 src/iproute2/Makefile diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index 19fd412b0387..7fb3401184f2 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -33,6 +33,6 @@ RUN sed -ri 's/^(save .*$)/# \1/g; ' /etc/redis/redis.conf COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] -COPY ["configdb-load.sh", "/usr/bin/"] +COPY ["files/configdb-load.sh", "/usr/bin/"] ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/dockers/docker-orchagent/Dockerfile.j2 b/dockers/docker-orchagent/Dockerfile.j2 index 9fba8d17b9d6..3d6671996358 100755 --- a/dockers/docker-orchagent/Dockerfile.j2 +++ b/dockers/docker-orchagent/Dockerfile.j2 @@ -26,7 +26,8 @@ debs/{{ deb }}{{' '}} RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -COPY ["arp_update", "start.sh", "orchagent.sh", "swssconfig.sh", "/usr/bin/"] +COPY ["files/arp_update", "/usr/bin"] +COPY ["start.sh", "orchagent.sh", "swssconfig.sh", "/usr/bin/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] ## Copy all Jinja2 template files into the templates folder diff --git a/dockers/docker-orchagent/arp_update b/files/scripts/arp_update similarity index 100% rename from dockers/docker-orchagent/arp_update rename to files/scripts/arp_update diff --git a/dockers/docker-database/configdb-load.sh b/files/scripts/configdb-load.sh similarity index 100% rename from dockers/docker-database/configdb-load.sh rename to files/scripts/configdb-load.sh diff --git a/platform/broadcom/docker-orchagent-brcm.mk b/platform/broadcom/docker-orchagent-brcm.mk index 196a4d589a24..066973967450 100644 --- a/platform/broadcom/docker-orchagent-brcm.mk +++ b/platform/broadcom/docker-orchagent-brcm.mk @@ -16,3 +16,4 @@ $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_BRCM)_RUN_OPT += -v /var/log/swss:/var/log/swss:rw $(DOCKER_ORCHAGENT_BRCM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel +$(DOCKER_ORCHAGENT_BRCM)_FILES += $(ARP_UPDATE_SCRIPT) diff --git a/platform/cavium/docker-orchagent-cavm.mk b/platform/cavium/docker-orchagent-cavm.mk index 57ebb2fd1534..a171a6c801d7 100644 --- a/platform/cavium/docker-orchagent-cavm.mk +++ b/platform/cavium/docker-orchagent-cavm.mk @@ -16,3 +16,4 @@ $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_CAVM)_RUN_OPT += -v /var/log/swss:/var/log/swss:rw $(DOCKER_ORCHAGENT_CAVM)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel +$(DOCKER_ORCHAGENT_CAVM)_FILES += $(ARP_UPDATE_SCRIPT) diff --git a/platform/centec/docker-orchagent-centec.mk b/platform/centec/docker-orchagent-centec.mk index 695e481546b1..e1d7fd6cf0d6 100644 --- a/platform/centec/docker-orchagent-centec.mk +++ b/platform/centec/docker-orchagent-centec.mk @@ -16,3 +16,4 @@ $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_CENTEC)_RUN_OPT += -v /var/log/swss:/var/log/swss:rw $(DOCKER_ORCHAGENT_CENTEC)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel +$(DOCKER_ORCHAGENT_CENTEC)_FILES += $(ARP_UPDATE_SCRIPT) diff --git a/platform/marvell/docker-orchagent-mrvl.mk b/platform/marvell/docker-orchagent-mrvl.mk index 9461cafe2e89..f2cb0c997d75 100644 --- a/platform/marvell/docker-orchagent-mrvl.mk +++ b/platform/marvell/docker-orchagent-mrvl.mk @@ -15,3 +15,4 @@ $(DOCKER_ORCHAGENT_MRVL)_RUN_OPT += -v /host/machine.conf:/host/machine.conf $(DOCKER_ORCHAGENT_MRVL)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_MRVL)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel +$(DOCKER_ORCHAGENT_MRVL)_FILES += $(ARP_UPDATE_SCRIPT) diff --git a/platform/mellanox/docker-orchagent-mlnx.mk b/platform/mellanox/docker-orchagent-mlnx.mk index 20aa38335361..6dda3c446b06 100644 --- a/platform/mellanox/docker-orchagent-mlnx.mk +++ b/platform/mellanox/docker-orchagent-mlnx.mk @@ -16,3 +16,4 @@ $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_ORCHAGENT_MLNX)_RUN_OPT += -v /var/log/swss:/var/log/swss:rw $(DOCKER_ORCHAGENT_MLNX)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel +$(DOCKER_ORCHAGENT_MLNX)_FILES += $(ARP_UPDATE_SCRIPT) diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index d9bca2ed5af7..5aaee09fdb1d 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,10 +1,10 @@ MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/564703412781016766b248b98266bd6f2c161431/sdk MLNX_SDK_VERSION = 4.2.6011 -MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2) $(SX_ACL_RM) $(SX_COMPLIB) \ +MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2_MLNX) $(SX_ACL_RM) $(SX_COMPLIB) \ $(SX_EXAMPLES) $(SX_GEN_UTILS) $(SX_SCEW) $(SX_SDN_HAL) \ $(SXD_LIBS) $(TESTX) -MLNX_SDK_DEBS += $(APPLIBS_DEV) $(IPROUTE2_DEV) $(SX_ACL_RM_DEV) \ +MLNX_SDK_DEBS += $(APPLIBS_DEV) $(IPROUTE2_MLNX_DEV) $(SX_ACL_RM_DEV) \ $(SX_COMPLIB_DEV) $(SX_COMPLIB_DEV_STATIC) $(SX_EXAMPLES_DEV) \ $(SX_GEN_UTILS_DEV) $(SX_SCEW_DEV) $(SX_SCEW_DEV_STATIC) \ $(SX_SDN_HAL_DEV) $(SX_SDN_HAL_DEV_STATIC) $(SXD_LIBS_DEV) \ @@ -14,9 +14,9 @@ APPLIBS = applibs_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(APPLIBS)_DEPENDS += $(SX_COMPLIB) $(SX_GEN_UTILS) $(SXD_LIBS) $(LIBNL3) $(LIBNL_GENL3) APPLIBS_DEV = applibs-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(APPLIBS),$(APPLIBS_DEV))) -IPROUTE2 = iproute2_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb -IPROUTE2_DEV = iproute2-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb -$(eval $(call add_derived_package,$(IPROUTE2),$(IPROUTE2_DEV))) +IPROUTE2_MLNX = iproute2_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +IPROUTE2_MLNX_DEV = iproute2-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb +$(eval $(call add_derived_package,$(IPROUTE2_MLNX),$(IPROUTE2_MLNX_DEV))) SX_COMPLIB = sx-complib_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb SX_COMPLIB_DEV = sx-complib-dev_1.mlnx.$(MLNX_SDK_VERSION)_amd64.deb $(eval $(call add_derived_package,$(SX_COMPLIB),$(SX_COMPLIB_DEV))) diff --git a/platform/vs/docker-sonic-vs.mk b/platform/vs/docker-sonic-vs.mk index e9d23db493db..656c53644637 100644 --- a/platform/vs/docker-sonic-vs.mk +++ b/platform/vs/docker-sonic-vs.mk @@ -2,7 +2,16 @@ DOCKER_SONIC_VS = docker-sonic-vs.gz $(DOCKER_SONIC_VS)_PATH = $(PLATFORM_PATH)/docker-sonic-vs -$(DOCKER_SONIC_VS)_DEPENDS += $(SWSS) $(SYNCD_VS) $(REDIS_SERVER) $(REDIS_TOOLS) $(PYTHON_SWSSCOMMON) $(LIBTEAMDCT) $(LIBTEAM_UTILS) $(SONIC_DEVICE_DATA) +$(DOCKER_SONIC_VS)_DEPENDS += $(SWSS) \ + $(SYNCD_VS) \ + $(REDIS_SERVER) \ + $(REDIS_TOOLS) \ + $(PYTHON_SWSSCOMMON) \ + $(LIBTEAMDCT) \ + $(LIBTEAM_UTILS) \ + $(SONIC_DEVICE_DATA) \ + $(SONIC_UTILS) \ + $(IPROUTE2) ifeq ($(SONIC_ROUTING_STACK), quagga) $(DOCKER_SONIC_VS)_DEPENDS += $(QUAGGA) @@ -12,5 +21,8 @@ else $(DOCKER_SONIC_VS)_DEPENDS += $(GOBGP) endif +$(DOCKER_SONIC_VS)_FILES += $(CONFIGDB_LOAD_SCRIPT) \ + $(ARP_UPDATE_SCRIPT) + $(DOCKER_SONIC_VS)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SONIC_VS) diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2 index 43f7f678e71e..a26c3f475fa6 100644 --- a/platform/vs/docker-sonic-vs/Dockerfile.j2 +++ b/platform/vs/docker-sonic-vs/Dockerfile.j2 @@ -3,9 +3,13 @@ FROM docker-config-engine ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive +COPY ["sonic-dev.gpg.key", "/etc/apt/"] +RUN apt-key add /etc/apt/sonic-dev.gpg.key +RUN echo "deb http://packages.microsoft.com/repos/sonic-dev/ jessie main" >> /etc/apt/sources.list RUN apt-get update RUN apt-get install -y net-tools \ + arping \ ethtool \ tcpdump \ ifupdown \ @@ -26,7 +30,15 @@ RUN apt-get install -y net-tools \ openssh-server \ libc-ares2 \ iproute \ - libpython2.7 + libpython2.7 \ + grub2-common \ + python-click-default-group \ + python-click \ + python-natsort \ + python-tabulate \ + bash-completion \ + libelf1 \ + libmnl0 RUN pip install setuptools RUN pip install py2_ipaddress @@ -51,6 +63,7 @@ RUN sed -ri 's/^(save .*$)/# \1/g; s/^logfile .*$/logfile ""/; \ s/^# syslog-enabled no$/syslog-enabled no/; \ s/^# unixsocket/unixsocket/; \ + s/notify-keyspace-events ""/notify-keyspace-events AKE/; \ s/^client-output-buffer-limit pubsub [0-9]+mb [0-9]+mb [0-9]+/client-output-buffer-limit pubsub 0 0 0/ \ ' /etc/redis/redis.conf @@ -58,7 +71,10 @@ COPY ["50-default.conf", "/etc/rsyslog.d/"] COPY ["start.sh", "orchagent.sh", "/usr/bin/"] COPY ["brcm.profile.ini", "/usr/share/sonic/device/vswitch/"] COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["files/configdb-load.sh", "/usr/bin/"] +COPY ["files/arp_update", "/usr/bin"] RUN echo "docker-sonic-vs" > /etc/hostname +RUN touch /etc/quagga/zebra.conf ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/vs/docker-sonic-vs/sonic-dev.gpg.key b/platform/vs/docker-sonic-vs/sonic-dev.gpg.key new file mode 100644 index 000000000000..fb9a37901bc7 --- /dev/null +++ b/platform/vs/docker-sonic-vs/sonic-dev.gpg.key @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQENBFQ1bTIBCAC7oGfkv/ck0XsLuG8cdcSB2ISqxFAcBvH9BitEtxmpW2uhykKk +xY4rVD/4Uys1s3PF1/64QfPR+hYcewueOwz0ZAcLyFXXk4McICXaPq3NrLiWYKKX +UZLnrPzcrGZoW/kHDDp4OmBiDmT1PGvZlpuimwkMCusUzIr7Cbbp2dIy8MERL5tA +LcgLu3KL6clJ+aTW2jgepI1D7sTepOeGd7eRSb5njKg2M7k/93v/7MipZxiVtyXH +B74YiK6jSbst5JpuYsLa/Dqryvx7Xq3n53oif892pv3euTduo1fYw8Hgh/OOYdeT +c9WCj03KA1jCSFURjdrug0kR8BPlfjqtRLXFABEBAAG0JE1TIE9wZW4gVGVjaCA8 +aW50ZXJvcEBtaWNyb3NvZnQuY29tPokBOAQTAQIAIgUCVDVtMgIbAwYLCQgHAwIG +FQgCCQoLBBYCAwECHgECF4AACgkQsCxG30F6CJO1uAf/cmL68bM8YgF/61hkaY56 +LqrppUTJH/w4fKq47Pf6KfgSLvxfNU6soi2KHYRjIvTRx3tV4vUM5n2plaQg2s8V +/Epg4FeIRTk75YwiHAzLhLnp5cdUaTvC4j4mwxoB6j9Ty+fXJwQ0MvpDhIZb9vM4 +GXw/fEQHCT4f3gx4nReeqE+FB2wVHleX9+Lpodu98JyJTKJRBRHYLqy6S+/lyp2W +aBlsI1LOqBcx1uRK24U7duIpbYwIyrx0cafSruqR2GjVdu+imkhHyUn52VbzYhq1 +af0rqYiZ1VOamVOG0By8+hVyNa1MLc1K2uWGs0o5fDe9F5/swbvLHVXI+M50Vs+m +J7kBDQRUNW0yAQgAu7DkTVj0ZQC4F7bFivAwrdby8gCakTXOl1kcK622hjRJ8nam +aZeW+eADfLRsTmdUmXgZu1YWS5Gn2ZVngC8SGPUBT071+oRETCz4uNB7IimB9QfP +++orI6o2vmnVVsq5wWCbEdNU+TCVv1zjrYev5lwckkKpjHt6o8MNoX2DFuQymSyR +eZKaqhdKmcji4Ke7OIYqwgPjch3wxzE1b5gNOR/iwxWyjjOffZPLr/VhIfIJRs86 +dSXrwjHtEh810SKDLghHM0VAdY34nyC5ZZ61yhts5HtQDFK+9mNpH1mkc4gDBlgG +266pVvknumK6lPNm/osF/cpjWmEw24ypcQIvOQARAQABiQEfBBgBAgAJBQJUNW0y +AhsMAAoJELAsRt9BegiTMBUH/0sZ6gZy7mCTSAYT+NSXLFtGC2zNUVL80SWvfgYm +k9XPVI22MrefZfQ6M01RylyxtWXjRM8UoN8SDKWPpXumzJf831f/7om5zwutaG7b +tjDPYqRKJSbAIFZu2mN+uLrNQ2SV6XK7FoV0dtcrEX9S7RICb6i19D+70+Oh/qgU +R04H1jqS29XBzqAlIzdBoA+sYAwbOIJsSL3YyNQcUv3B5+5yR/bo/L8pnUJt6iuL +nWW+mi7r8gWPHDSrcdYq1TmmlOM7CwZPgWRZzkQPSeZz52Tt7IP47eyGJ09U4PIf +FtMH1ElL2UgHoA/F9Q88e7LkztaTqE59uXWbIYyuSMJVvRU= +=sb3d +-----END PGP PUBLIC KEY BLOCK----- diff --git a/platform/vs/docker-sonic-vs/start.sh b/platform/vs/docker-sonic-vs/start.sh index 0782705bc912..876bfd835728 100755 --- a/platform/vs/docker-sonic-vs/start.sh +++ b/platform/vs/docker-sonic-vs/start.sh @@ -1,4 +1,18 @@ -#!/usr/bin/env bash +#!/bin/bash -e + +# generate configuration + +[ -d /etc/sonic ] || mkdir -p /etc/sonic + +SYSTEM_MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') +sonic-cfggen -a '{"DEVICE_METADATA":{"localhost": {"mac": "'$SYSTEM_MAC_ADDRESS'"}}}' --print-data > /etc/sonic/init_cfg.json + +if [ -f /etc/sonic/config_db.json ]; then + sonic-cfggen -j /etc/sonic/config_db.json -j /etc/sonic/init_cfg.json --print-data > /tmp/config_db.json + mv /tmp/config_db.json /etc/sonic/config_db.json +else + sonic-cfggen -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json +fi mkdir -p /etc/swss/config.d/ @@ -16,6 +30,8 @@ mkdir -p /var/run/redis supervisorctl start redis-server +/usr/bin/configdb-load.sh + supervisorctl start syncd supervisorctl start orchagent @@ -30,8 +46,14 @@ supervisorctl start teamsyncd supervisorctl start fpmsyncd +supervisorctl start intfmgrd + +supervisorctl start vlanmgrd + +supervisorctl start zebra + # Start arp_update when VLAN exists -# VLAN=`sonic-cfggen -d -v 'VLAN.keys() | join(" ") if VLAN'` -# if [ "$VLAN" != "" ]; then -# supervisorctl start arp_update -# fi +VLAN=`sonic-cfggen -d -v 'VLAN.keys() | join(" ") if VLAN'` +if [ "$VLAN" != "" ]; then + supervisorctl start arp_update +fi diff --git a/platform/vs/docker-sonic-vs/supervisord.conf b/platform/vs/docker-sonic-vs/supervisord.conf index c91d808b9856..2526aefe3a87 100644 --- a/platform/vs/docker-sonic-vs/supervisord.conf +++ b/platform/vs/docker-sonic-vs/supervisord.conf @@ -75,9 +75,25 @@ autorestart=false stdout_logfile=syslog stderr_logfile=syslog +[program:vlanmgrd] +command=/usr/bin/vlanmgrd +priority=10 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:intfmgrd] +command=/usr/bin/intfmgrd +priority=11 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + [program:zebra] command=/usr/lib/quagga/zebra -A 127.0.0.1 -priority=10 +priority=12 autostart=false autorestart=false stdout_logfile=syslog @@ -85,7 +101,7 @@ stderr_logfile=syslog [program:bgpd] command=/usr/lib/quagga/bgpd -A 127.0.0.1 -F -priority=11 +priority=13 autostart=false autorestart=false stdout_logfile=syslog @@ -93,8 +109,16 @@ stderr_logfile=syslog [program:fpmsyncd] command=/usr/bin/fpmsyncd -priority=12 +priority=14 autostart=false autorestart=false stdout_logfile=syslog stderr_logfile=syslog + +[program:arp_update] +command=bash -c "/usr/bin/arp_update; sleep 300" +priority=15 +autostart=false +autorestart=true +stdout_logfile=syslog +stderr_logfile=syslog diff --git a/rules/docker-database.mk b/rules/docker-database.mk index 147b6538a098..ef77047e8431 100644 --- a/rules/docker-database.mk +++ b/rules/docker-database.mk @@ -12,3 +12,4 @@ $(DOCKER_DATABASE)_RUN_OPT += --net=host --privileged -t $(DOCKER_DATABASE)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_DATABASE)_BASE_IMAGE_FILES += redis-cli:/usr/bin/redis-cli +$(DOCKER_DATABASE)_FILES += $(CONFIGDB_LOAD_SCRIPT) diff --git a/rules/iproute2.mk b/rules/iproute2.mk new file mode 100644 index 000000000000..10d8fe4cff3d --- /dev/null +++ b/rules/iproute2.mk @@ -0,0 +1,7 @@ +# iproute2 package + +IPROUTE2_VERSION = 4.9.0-1 + +IPROUTE2 = iproute2_$(IPROUTE2_VERSION)_amd64.deb +$(IPROUTE2)_SRC_PATH = $(SRC_PATH)/iproute2 +SONIC_MAKE_DEBS += $(IPROUTE2) diff --git a/rules/scripts.mk b/rules/scripts.mk new file mode 100644 index 000000000000..fbefdd68d2cd --- /dev/null +++ b/rules/scripts.mk @@ -0,0 +1,11 @@ + +ARP_UPDATE_SCRIPT = arp_update +$(ARP_UPDATE_SCRIPT)_PATH = files/scripts + +CONFIGDB_LOAD_SCRIPT = configdb-load.sh +$(CONFIGDB_LOAD_SCRIPT)_PATH = files/scripts + +SONIC_COPY_FILES += $(CONFIGDB_LOAD_SCRIPT) \ + $(ARP_UPDATE_SCRIPT) + + diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 603c3b6cb357..4e1bc644556b 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -202,7 +202,17 @@ RUN apt-get update && apt-get install -y \ libgtest-dev \ cmake \ # For python-based swsscommon - swig3.0 + swig3.0 \ +# For iproute2 + cm-super-minimal \ + libatm1-dev \ + libelf-dev \ + libmnl-dev \ + libselinux1-dev \ + linuxdoc-tools \ + lynx \ + texlive-latex-extra \ + texlive-latex-recommended # For linux build RUN apt-get -y build-dep linux diff --git a/src/iproute2/Makefile b/src/iproute2/Makefile new file mode 100644 index 000000000000..0181c9ca6d31 --- /dev/null +++ b/src/iproute2/Makefile @@ -0,0 +1,20 @@ +SHELL = /bin/bash +.ONESHELL: +.SHELLFLAGS += -e + +IPROUTE2_VERSION = 4.9.0 +IPROUTE2_VERSION_FULL = $(IPROUTE2_VERSION)-1 + +MAIN_TARGET = iproute2_$(IPROUTE2_VERSION_FULL)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + wget -O iproute2_$(IPROUTE2_VERSION).orig.tar.xz -N "https://sonicstorage.blob.core.windows.net/packages/iproute2_4.9.0.orig.tar.xz?sv=2015-04-05&sr=b&sig=9nvybd1xkXyRQbaG6Fy6wBazPA8IbZV0AO41GWXPEP8%3D&se=2154-10-23T11%3A59%3A00Z&sp=r" + wget -O iproute2_$(IPROUTE2_VERSION_FULL).dsc -N "https://sonicstorage.blob.core.windows.net/packages/iproute2_4.9.0-1.dsc?sv=2015-04-05&sr=b&sig=m6FcMH9dOh8ggipBgOsONiXvDxoi6bfUO%2BxvidsMNMQ%3D&se=2154-10-23T11%3A59%3A53Z&sp=r" + wget -O iproute2_$(IPROUTE2_VERSION_FULL).debian.tar.xz -N "https://sonicstorage.blob.core.windows.net/packages/iproute2_4.9.0-1.debian.tar.xz?sv=2015-04-05&sr=b&sig=U5NFuwG5C3vZXlUUNvoPMnKDtMKk66zbweA9rQYbEVY%3D&se=2154-10-23T12%3A00%3A15Z&sp=r" + dpkg-source -x iproute2_$(IPROUTE2_VERSION_FULL).dsc + + pushd iproute2-$(IPROUTE2_VERSION) + dpkg-buildpackage -us -uc -b -j$(SONIC_CONFIG_MAKE_JOBS) + popd + + mv $* $(DEST)/ diff --git a/src/sonic-swss b/src/sonic-swss index 3a9cf8f47847..57a98acb893c 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 3a9cf8f478474dd0bf23af283ba7779575faae6d +Subproject commit 57a98acb893c73063792bf6d7adf8bca71f8b9d6 From 414e43bb748b899a5acc7e212e7e1252b50f33b4 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 1 Dec 2017 19:24:55 -0800 Subject: [PATCH 0958/1011] [build]: start docker service if not already started (#1203) docker start fails when docker service is already started --- slave.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slave.mk b/slave.mk index 71cee41e3d0a..e3ffc7e91ce7 100644 --- a/slave.mk +++ b/slave.mk @@ -336,7 +336,7 @@ $(SONIC_INSTALL_WHEELS) : $(PYTHON_WHEELS_PATH)/%-install : .platform $$(addsuff # start docker daemon docker-start : - @sudo service docker start &> /dev/null && sleep 1 + @sudo service docker status &> /dev/null || ( sudo service docker start &> /dev/null && sleep 1 ) # targets for building simple docker images that do not depend on any debian packages $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) From db7fcd8a7a079be96bec7ee267db068b60f95245 Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 4 Dec 2017 02:43:39 -0800 Subject: [PATCH 0959/1011] [submodule]: update swss, swss-common, sairedis submodules (#1206) --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 0187c64a57b2..345f179482db 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 0187c64a57b288f9e4898bc9db00f7427eb61ca6 +Subproject commit 345f179482dbf5258cad088414bc9eb230decd97 diff --git a/src/sonic-swss b/src/sonic-swss index 57a98acb893c..226f96c94e76 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 57a98acb893c73063792bf6d7adf8bca71f8b9d6 +Subproject commit 226f96c94e76713f48ebdb114759584f0e1357e6 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 3d07426bc155..82ceea09b623 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 3d07426bc155435290a0c81365436be5fbb31b17 +Subproject commit 82ceea09b62374cd3110c00b19536ed4d10f3d57 From 7e457564da3635d73a7743fbac4654c5aba4dd25 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Mon, 4 Dec 2017 12:45:24 +0200 Subject: [PATCH 0960/1011] [mellanox]: Update Mellanox buffer profiles config (#1198) Signed-off-by: Andriy Moroz --- dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 | 8 ++++---- .../tests/sample_output/msn27.32ports.json | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 b/dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 index ce1ddedbba37..0a60f4584a19 100644 --- a/dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 +++ b/dockers/docker-orchagent/msn27xx.32ports.buffers.json.j2 @@ -32,7 +32,7 @@ "BUFFER_PROFILE_TABLE:ingress_lossless_profile": { "pool":"[BUFFER_POOL_TABLE:ingress_lossless_pool]", "size":"0", - "dynamic_th":"7" + "dynamic_th":"1" }, "OP": "SET" }, @@ -47,7 +47,7 @@ { "BUFFER_PROFILE_TABLE:egress_lossless_profile": { "pool":"[BUFFER_POOL_TABLE:egress_lossless_pool]", - "size":"1518", + "size":"0", "dynamic_th":"7" }, "OP": "SET" @@ -64,7 +64,7 @@ "BUFFER_PROFILE_TABLE:pg_lossy_profile": { "pool":"[BUFFER_POOL_TABLE:ingress_lossy_pool]", "size":"0", - "dynamic_th":"3" + "dynamic_th":"7" }, "OP": "SET" }, @@ -80,7 +80,7 @@ "BUFFER_PROFILE_TABLE:q_lossy_profile": { "pool":"[BUFFER_POOL_TABLE:egress_lossy_pool]", "size":"0", - "dynamic_th":"1" + "dynamic_th":"7" }, "OP": "SET" }, diff --git a/src/sonic-config-engine/tests/sample_output/msn27.32ports.json b/src/sonic-config-engine/tests/sample_output/msn27.32ports.json index c65ebb847d7b..a3cff0f0f0d5 100644 --- a/src/sonic-config-engine/tests/sample_output/msn27.32ports.json +++ b/src/sonic-config-engine/tests/sample_output/msn27.32ports.json @@ -27,7 +27,7 @@ "BUFFER_PROFILE_TABLE:ingress_lossless_profile": { "pool":"[BUFFER_POOL_TABLE:ingress_lossless_pool]", "size":"0", - "dynamic_th":"7" + "dynamic_th":"1" }, "OP": "SET" }, @@ -42,7 +42,7 @@ { "BUFFER_PROFILE_TABLE:egress_lossless_profile": { "pool":"[BUFFER_POOL_TABLE:egress_lossless_pool]", - "size":"1518", + "size":"0", "dynamic_th":"7" }, "OP": "SET" @@ -59,7 +59,7 @@ "BUFFER_PROFILE_TABLE:pg_lossy_profile": { "pool":"[BUFFER_POOL_TABLE:ingress_lossy_pool]", "size":"0", - "dynamic_th":"3" + "dynamic_th":"7" }, "OP": "SET" }, @@ -75,7 +75,7 @@ "BUFFER_PROFILE_TABLE:q_lossy_profile": { "pool":"[BUFFER_POOL_TABLE:egress_lossy_pool]", "size":"0", - "dynamic_th":"1" + "dynamic_th":"7" }, "OP": "SET" }, From 2e31a38617b9d2ff9810cbaf33ef79f51404eb83 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Mon, 4 Dec 2017 14:28:43 -0800 Subject: [PATCH 0961/1011] [LLDP] Send interface name instead of mac as PORT_ID for mgmt interface (#1204) * Send interface name instead of mac thru lldp for mgmt interface * Fix j2 template test failure --- dockers/docker-lldp-sv2/lldpd.conf.j2 | 1 + src/sonic-config-engine/tests/sample_output/lldpd.conf | 1 + 2 files changed, 2 insertions(+) diff --git a/dockers/docker-lldp-sv2/lldpd.conf.j2 b/dockers/docker-lldp-sv2/lldpd.conf.j2 index eb7202df7c67..165ded79f392 100644 --- a/dockers/docker-lldp-sv2/lldpd.conf.j2 +++ b/dockers/docker-lldp-sv2/lldpd.conf.j2 @@ -1,3 +1,4 @@ +configure ports eth0 lldp portidsubtype local {{ MGMT_INTERFACE.keys()[0][0] }} {% for local_port in DEVICE_NEIGHBOR %} configure ports {{ local_port }} lldp portidsubtype local {{ PORT[local_port]['alias'] }} description {{ DEVICE_NEIGHBOR[local_port]['name'] }}:{{ DEVICE_NEIGHBOR[local_port]['port'] }} {% endfor %} diff --git a/src/sonic-config-engine/tests/sample_output/lldpd.conf b/src/sonic-config-engine/tests/sample_output/lldpd.conf index 0328385cf307..d906f909bc7d 100644 --- a/src/sonic-config-engine/tests/sample_output/lldpd.conf +++ b/src/sonic-config-engine/tests/sample_output/lldpd.conf @@ -1,3 +1,4 @@ +configure ports eth0 lldp portidsubtype local eth0 configure ports Ethernet116 lldp portidsubtype local fortyGigE0/116 description ARISTA02T1:Ethernet1/1 configure ports Ethernet124 lldp portidsubtype local fortyGigE0/124 description ARISTA04T1:Ethernet1/1 configure ports Ethernet112 lldp portidsubtype local fortyGigE0/112 description ARISTA01T1:Ethernet1/1 From 744927acd3b5a88b73b53d371147c4e11ebecb86 Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Wed, 6 Dec 2017 15:13:18 -0800 Subject: [PATCH 0962/1011] Derive varlog size based on total flash size (#1209) --- files/Aboot/boot0.j2 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 4f2367807d90..a2c683b20c91 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -132,10 +132,15 @@ platform_specific() { flash_size=28000 fi if [ "$platform" = "rook" ]; then - varlog_size=4096 readprefdl -f /tmp/.system-prefdl -d > /mnt/flash/.system-prefdl fi + if [ $flash_size -ge 28000 ]; then + varlog_size=4096 + elif [ $flash_size -ge 3700 ]; then + varlog_size=400 + fi + echo "varlog_size=$varlog_size" >>/tmp/append } From eb086818d779a5455cfcfca3c9e45259c997bb20 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 6 Dec 2017 15:59:33 -0800 Subject: [PATCH 0963/1011] Install more debs for python3 in sonic-slave (#1211) Signed-off-by: Qi Luo --- sonic-slave/Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index 4e1bc644556b..d74c9adfebe5 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -164,10 +164,11 @@ RUN apt-get update && apt-get install -y \ cppcheck \ clang \ pylint \ - python-pytest \ gcovr \ python-pytest=2.6.3* \ + python3-pytest=2.6.3* \ python-pytest-cov \ + python3-pytest-cov \ python-parse \ # For snmpd libmysqlclient-dev \ @@ -196,6 +197,8 @@ RUN apt-get update && apt-get install -y \ python-netaddr \ python-ipaddr \ python-yaml \ +# For sonic utilities + python3-netaddr \ # For lockfile procmail \ # For gtest From 3d70b715d55dde24c7e5591f39b5cc7190be2caf Mon Sep 17 00:00:00 2001 From: Wataru Ishida Date: Thu, 7 Dec 2017 14:45:03 +0900 Subject: [PATCH 0964/1011] [sonic-cfggen] add option for redis connection (#1213) Signed-off-by: Wataru Ishida --- src/sonic-config-engine/sonic-cfggen | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index 9f1323dab2eb..bb778ddefbf0 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -135,6 +135,7 @@ def main(): parser.add_argument("-j", "--json", help="json file that contains additional variables", action='append', default=[]) parser.add_argument("-a", "--additional-data", help="addition data, in json string") parser.add_argument("-d", "--from-db", help="read config from configdb", action='store_true') + parser.add_argument("-s", "--redis-unix-sock-file", help="unix sock file for redis connection") group = parser.add_mutually_exclusive_group() group.add_argument("-t", "--template", help="render the data with the template file") group.add_argument("-v", "--var", help="print the value of a variable, support jinja2 expression") @@ -151,6 +152,10 @@ def main(): if platform_info != None: data['platform'] = platform_info + db_kwargs = {} + if args.redis_unix_sock_file != None: + db_kwargs['unix_socket_path'] = args.redis_unix_sock_file + if args.minigraph != None: minigraph = args.minigraph if data.has_key('platform'): @@ -180,7 +185,7 @@ def main(): deep_update(data, json.loads(args.additional_data)) if args.from_db: - configdb = ConfigDBConnector() + configdb = ConfigDBConnector(**db_kwargs) configdb.connect() deep_update(data, FormatConverter.db_to_output(configdb.get_config())) @@ -203,7 +208,7 @@ def main(): print json.dumps(FormatConverter.to_serialized(data[args.var_json]), indent=4, cls=minigraph_encoder) if args.write_to_db: - configdb = ConfigDBConnector() + configdb = ConfigDBConnector(**db_kwargs) configdb.connect(False) configdb.set_config(FormatConverter.output_to_db(data)) From 4213b2dcc749ea5adc488b457d1d44907d223c4b Mon Sep 17 00:00:00 2001 From: Rodny Molina Date: Wed, 6 Dec 2017 21:45:45 -0800 Subject: [PATCH 0965/1011] [sonic-utilities]: Final code-drop for interface-description and interface-status enhancements (#1207) * Final code-drop for interface-description and interface-status enhancements. Here i'm adding minor extensions to support "show interface description" command. Please refer to PR#158 for more details: https://github.com/Azure/sonic-utilities/pull/158 * Add interface-description UT and adjust logic to have 'description' field being optional RB= G=lnos-reviewers R=ntrianta,rjonnadu,rmolina,sfardeen,zxu A= * Updating reference to sonic-utilities to collect latest changes --- dockers/docker-orchagent/ports.json.j2 | 1 + src/sonic-config-engine/minigraph.py | 16 ++++++++++++---- .../tests/simple-sample-graph.xml | 1 + src/sonic-config-engine/tests/test_cfggen.py | 2 +- src/sonic-utilities | 2 +- 5 files changed, 16 insertions(+), 6 deletions(-) mode change 100644 => 100755 src/sonic-config-engine/minigraph.py diff --git a/dockers/docker-orchagent/ports.json.j2 b/dockers/docker-orchagent/ports.json.j2 index 48be831025f8..770440036058 100644 --- a/dockers/docker-orchagent/ports.json.j2 +++ b/dockers/docker-orchagent/ports.json.j2 @@ -5,6 +5,7 @@ { "PORT_TABLE:{{ port }}": { "speed": "{{ PORT[port]['speed'] }}" + "description": "{{ PORT[port]['description'] }}" }, "OP": "SET" }{% if not loop.last %},{% endif %} diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py old mode 100644 new mode 100755 index 826997063349..f33bd11f0b93 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -298,7 +298,8 @@ def parse_meta(meta, hname): return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst, deployment_id def parse_deviceinfo(meta, hwsku): - ethernet_interfaces = {} + port_speeds = {} + port_descriptions = {} for device_info in meta.findall(str(QName(ns, "DeviceInfo"))): dev_sku = device_info.find(str(QName(ns, "HwSku"))).text if dev_sku == hwsku: @@ -306,8 +307,11 @@ def parse_deviceinfo(meta, hwsku): for interface in interfaces.findall(str(QName(ns1, "EthernetInterface"))): alias = interface.find(str(QName(ns, "InterfaceName"))).text speed = interface.find(str(QName(ns, "Speed"))).text - ethernet_interfaces[port_alias_map.get(alias, alias)] = speed - return ethernet_interfaces + desc = interface.find(str(QName(ns, "Description"))) + if desc != None: + port_descriptions[port_alias_map.get(alias, alias)] = desc.text + port_speeds[port_alias_map.get(alias, alias)] = speed + return port_speeds, port_descriptions def parse_xml(filename, platform=None, port_config_file=None): root = ET.parse(filename).getroot() @@ -330,6 +334,7 @@ def parse_xml(filename, platform=None, port_config_file=None): devices = None hostname = None port_speeds = {} + port_descriptions = {} syslog_servers = [] dhcp_servers = [] ntp_servers = [] @@ -360,7 +365,7 @@ def parse_xml(filename, platform=None, port_config_file=None): elif child.tag == str(QName(ns, "MetadataDeclaration")): (syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst, deployment_id) = parse_meta(child, hostname) elif child.tag == str(QName(ns, "DeviceInfos")): - port_speeds = parse_deviceinfo(child, hwsku) + (port_speeds, port_descriptions) = parse_deviceinfo(child, hwsku) results = {} results['DEVICE_METADATA'] = {'localhost': { @@ -395,6 +400,9 @@ def parse_xml(filename, platform=None, port_config_file=None): for port_name in port_speeds: ports.setdefault(port_name, {})['speed'] = port_speeds[port_name] + for port_name in port_descriptions: + ports.setdefault(port_name, {})['description'] = port_descriptions[port_name] + results['PORT'] = ports results['PORTCHANNEL'] = pcs results['VLAN'] = vlans diff --git a/src/sonic-config-engine/tests/simple-sample-graph.xml b/src/sonic-config-engine/tests/simple-sample-graph.xml index 89f53af83e41..cce833cc950d 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph.xml @@ -243,6 +243,7 @@ 0 0 40000 + Interface description DeviceInterface diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 47cc006f4662..2eee6fe331c8 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -138,4 +138,4 @@ def test_minigraph_deployment_id(self): def test_minigraph_ethernet_interfaces(self): argument = '-m "' + self.sample_graph_simple + '" -p "' + self.port_config + '" -v "PORT[\'Ethernet8\']"' output = self.run_script(argument) - self.assertEqual(output.strip(), "{'alias': 'fortyGigE0/8', 'lanes': '37,38,39,40', 'speed': '40000'}") + self.assertEqual(output.strip(), "{'alias': 'fortyGigE0/8', 'lanes': '37,38,39,40', 'description': 'Interface description', 'speed': '40000'}") diff --git a/src/sonic-utilities b/src/sonic-utilities index e87bb97760a4..0c0a2f02c32a 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit e87bb97760a4cf069da51b2a0da732f7a40f3215 +Subproject commit 0c0a2f02c32a8cafb3020d8248ea829bbc959d4a From 8383b1f256219358fe3af2ceda68afeb3c0d9047 Mon Sep 17 00:00:00 2001 From: Liuqu Date: Thu, 7 Dec 2017 19:36:17 +0800 Subject: [PATCH 0966/1011] [TACACS+]: Add support for TACACS+ Authentication (#1019) * [TACACS+]: Add support for TACACS+ Authentication * pam_tacplus - A TACACS+ protocol client library and PAM module to supports core TACACS+ functions for AAA. * nss_tacplus - A NSS plugin for TACACS+ to extend function getpwnam, make the TACACS+ authenticated user which is not found in local could login successfully. * Add make rules for pam_tacplus and install script * Add a patch for pam_tacplus to disable pam-auth-update pam-tacplus by default * Add a patch for pam_tacplus to inlucde and build nss_tacplus Signed-off-by: chenchen.qcc@alibaba-inc.com * [TACACS+]: Add nss-tacplus as a separate src repo * Separate nss-tacplus from pam-tacplus, modify tacacs.mk and makefile, add a patch to adapt to the new user map profile. * Use the lastest stable version for pam-tacplus, add a dependent package in sonic-salve, add two patches to fix build error. * Add scripts to disable tacplus by default. * Remove hostcfgd service file Signed-off-by: Chenchen Qi * [TACACS+]: Fix nss-tacplus filter some valid TACACS+ username * The NAME_REGEX for username check in plugin nss-tacplus is the ANSI version "^[0-9a-zA-Z_-\ ]*$", but the regular expression in /etc/adduser.conf is not defined as ANSI version. To avoid nss-tacplus filter some valid TACACS+ username, remove username check. Signed-off-by: Chenchen Qi --- .../build_templates/sonic_debian_extension.j2 | 8 + rules/tacacs.mk | 29 + slave.mk | 4 +- sonic-slave/Dockerfile | 2 + .../nss/0001-Modify-user-map-profile.patch | 1459 +++++++++++++++++ src/tacacs/nss/Makefile | 22 + ...on-t-init-declarations-in-a-for-loop.patch | 45 + ...-libtac2-bin-install-directory-error.patch | 19 + src/tacacs/pam/Makefile | 25 + 9 files changed, 1612 insertions(+), 1 deletion(-) create mode 100644 rules/tacacs.mk create mode 100644 src/tacacs/nss/0001-Modify-user-map-profile.patch create mode 100644 src/tacacs/nss/Makefile create mode 100644 src/tacacs/pam/0001-Don-t-init-declarations-in-a-for-loop.patch create mode 100644 src/tacacs/pam/0002-Fix-libtac2-bin-install-directory-error.patch create mode 100644 src/tacacs/pam/Makefile diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 0159be571f88..fd67444fb475 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -89,6 +89,14 @@ sudo cp -f $IMAGE_CONFIGS/bash/bash.bashrc $FILESYSTEM_ROOT/etc/ sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/sonic-device-data_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f +# Install pam-tacplus and nss-tacplus +sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/libtac2_*.deb +sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/libpam-tacplus_*.deb +sudo dpkg --root=$FILESYSTEM_ROOT -i target/debs/libnss-tacplus_*.deb +# Disable tacplus by default +sudo LANG=C chroot $FILESYSTEM_ROOT pam-auth-update --remove tacplus +sudo sed -i -e '/^passwd/s/ tacplus//' $FILESYSTEM_ROOT/etc/nsswitch.conf + # Copy crontabs sudo cp -f $IMAGE_CONFIGS/cron.d/* $FILESYSTEM_ROOT/etc/cron.d/ diff --git a/rules/tacacs.mk b/rules/tacacs.mk new file mode 100644 index 000000000000..e31f52d9ab5d --- /dev/null +++ b/rules/tacacs.mk @@ -0,0 +1,29 @@ +# libpam-tacplus packages + +PAM_TACPLUS_VERSION = 1.4.1-1 + +export PAM_TACPLUS_VERSION + +LIBPAM_TACPLUS = libpam-tacplus_$(PAM_TACPLUS_VERSION)_amd64.deb +$(LIBPAM_TACPLUS)_RDEPENDS += $(LIBTAC2) +$(LIBPAM_TACPLUS)_SRC_PATH = $(SRC_PATH)/tacacs/pam +SONIC_MAKE_DEBS += $(LIBPAM_TACPLUS) + +LIBTAC_DEV = libtac-dev_$(PAM_TACPLUS_VERSION)_amd64.deb +$(LIBTAC_DEV)_DEPENDS += $(LIBTAC2) +$(eval $(call add_derived_package,$(LIBTAC2),$(LIBTAC_DEV))) + +LIBTAC2 = libtac2_$(PAM_TACPLUS_VERSION)_amd64.deb +$(eval $(call add_extra_package,$(LIBPAM_TACPLUS),$(LIBTAC2))) + + +# libnss-tacplus packages +NSS_TACPLUS_VERSION = 1.0.4-1 + +export NSS_TACPLUS_VERSION + +LIBNSS_TACPLUS = libnss-tacplus_$(NSS_TACPLUS_VERSION)_amd64.deb +$(LIBNSS_TACPLUS)_DEPENDS += $(LIBTAC_DEV) +$(LIBNSS_TACPLUS)_RDEPENDS += $(LIBTAC2) +$(LIBNSS_TACPLUS)_SRC_PATH = $(SRC_PATH)/tacacs/nss +SONIC_MAKE_DEBS += $(LIBNSS_TACPLUS) diff --git a/slave.mk b/slave.mk index e3ffc7e91ce7..1f00accb9e30 100644 --- a/slave.mk +++ b/slave.mk @@ -391,7 +391,9 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(LINUX_KERNEL) \ $(IGB_DRIVER) \ $(SONIC_DEVICE_DATA) \ - $(SONIC_UTILS)) \ + $(SONIC_UTILS) \ + $(LIBPAM_TACPLUS) \ + $(LIBNSS_TACPLUS)) \ $$(addprefix $(TARGET_PATH)/,$$($$*_DOCKERS)) \ $$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_CONFIG_ENGINE)) $(HEADER) diff --git a/sonic-slave/Dockerfile b/sonic-slave/Dockerfile index d74c9adfebe5..6e48a4ff7339 100644 --- a/sonic-slave/Dockerfile +++ b/sonic-slave/Dockerfile @@ -204,6 +204,8 @@ RUN apt-get update && apt-get install -y \ # For gtest libgtest-dev \ cmake \ +# For pam_tacplus build + autoconf-archive \ # For python-based swsscommon swig3.0 \ # For iproute2 diff --git a/src/tacacs/nss/0001-Modify-user-map-profile.patch b/src/tacacs/nss/0001-Modify-user-map-profile.patch new file mode 100644 index 000000000000..75d037977de4 --- /dev/null +++ b/src/tacacs/nss/0001-Modify-user-map-profile.patch @@ -0,0 +1,1459 @@ +From 43096cf9813d6def1d1f8f1d8a0c122466c8c06b Mon Sep 17 00:00:00 2001 +From: Liuqu +Date: Mon, 9 Oct 2017 02:44:37 -0700 +Subject: [PATCH] Modify user map profile + +* Removed dependence from libtacplus_map and libaudit +* Removed NSS entry point for getpwuid() +* Modified user map profile, create local user account for each TACACS+ user + which not found in local. +* Added "many_to_one" mode, create one local user for many TACACS+ users which + has the same privilege. +* Modified configuration parse and file to adapt to the new user map profile. +--- + Makefile.am | 4 +- + Makefile.in | 2 +- + configure.ac | 2 +- + debian/changelog | 11 + + debian/control | 11 +- + debian/libnss-tacplus.symbols | 1 - + nss_tacplus.c | 1004 +++++++++++++++++++---------------------- + tacplus_nss.conf | 91 ++-- + 8 files changed, 518 insertions(+), 608 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 293951e..b33c455 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -19,7 +19,7 @@ nss_tacplus.h + libnss_tacplus_la_CFLAGS = $(AM_CFLAGS) + # Version 2.0 because that's the NSS module version, and they must match + libnss_tacplus_la_LDFLAGS = -module -version-info 2:0:0 -shared +-libnss_tacplus_la_LIBADD = -ltacplus_map -ltac -laudit ++libnss_tacplus_la_LIBADD = -ltac + + + EXTRA_DIST = tacplus_nss.conf README ChangeLog +@@ -52,7 +52,7 @@ install-data-hook: + rm -f $(DESTDIR)$(libdir)/libnss_tacplus.so $(DESTDIR)$(libdir)/libnss_tacplus.so.2.0.0 + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(sysconfdir) + cd .libs && $(INSTALL_PROGRAM) libnss_tacplus.so $(DESTDIR)$(libdir)/$(NSS_TACPLUS_LIBC_VERSIONED) +- $(STRIP) --keep-symbol=_nss_tacplus_getpwnam_r --keep-symbol=_nss_tacplus_getpwuid_r $(DESTDIR)$(libdir)/$(NSS_TACPLUS_LIBC_VERSIONED) ++ $(STRIP) --keep-symbol=_nss_tacplus_getpwnam_r $(DESTDIR)$(libdir)/$(NSS_TACPLUS_LIBC_VERSIONED) + cd $(DESTDIR)$(libdir); ln -sf $(NSS_TACPLUS_LIBC_VERSIONED) $(NSS_TACPLUS_NSS_VERSIONED) + ${INSTALL} -m 644 tacplus_nss.conf $(DESTDIR)$(sysconfdir) + +diff --git a/Makefile.in b/Makefile.in +index 0d18ce7..5159b37 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -273,7 +273,7 @@ nss_tacplus.h + libnss_tacplus_la_CFLAGS = $(AM_CFLAGS) + # Version 2.0 because that's the NSS module version, and they must match + libnss_tacplus_la_LDFLAGS = -module -version-info 2:0:0 -shared +-libnss_tacplus_la_LIBADD = -ltacplus_map -ltac -laudit ++libnss_tacplus_la_LIBADD = -ltac + EXTRA_DIST = tacplus_nss.conf README ChangeLog + MAINTAINERCLEANFILES = Makefile.in config.h.in configure aclocal.m4 \ + config/config.guess config/config.sub config/depcomp \ +diff --git a/configure.ac b/configure.ac +index 42fb8f9..8c04668 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -53,7 +53,7 @@ dnl -------------------------------------------------------------------- + dnl Checks for header files. + AC_HEADER_STDC + AC_CHECK_HEADERS([nss.h fcntl.h stdlib.h string.h strings.h sys/socket.h sys/time.h syslog.h unistd.h]) +-AC_CHECK_HEADERS([tacplus/libtac.h]) ++AC_CHECK_HEADERS([libtac/libtac.h]) + + dnl -------------------------------------------------------------------- + dnl Checks for typedefs, structures, and compiler characteristics. +diff --git a/debian/changelog b/debian/changelog +index b24ac24..d4103ed 100644 +--- a/debian/changelog ++++ b/debian/changelog +@@ -1,3 +1,14 @@ ++libnss-tacplus (1.0.4-1) unstable; urgency=low ++ * Removed dependence from libtacplus_map and libaudit ++ * Removed NSS entry point for getpwuid() ++ * Modified user map profile, create local user account for each TACACS+ user ++ which not found in local. ++ * Added "many_to_one" mode, create one local user for many TACACS+ users which ++ has the same privilege. ++ * Modified configuration parse and file to adapt to the new user map profile. ++ ++ -- Chenchen Qi Tue, 10 Oct 2017 14:23:44 +0800 ++ + libnss-tacplus (1.0.3-2) unstable; urgency=low + * Fixed package remove to clean up plugin entries in nsswitch.conf + * New Disabled: added user_homedir config variable to allow per-user +diff --git a/debian/control b/debian/control +index ea65d0b..bdc888f 100644 +--- a/debian/control ++++ b/debian/control +@@ -1,17 +1,14 @@ + Source: libnss-tacplus + Priority: optional + Maintainer: Dave Olson +-Build-Depends: debhelper (>= 9), autotools-dev, libtac-dev (>= 1.4.1~), +- libtacplus-map-dev, libaudit-dev, autoconf, libpam-tacplus-dev, +- dpkg-dev (>= 1.16.1), git ++Build-Depends: debhelper (>= 9), autotools-dev, libtac-dev (>= 1.4.1~) + Section: libs + Standards-Version: 3.9.6 + Homepage: http://www.cumulusnetworks.com + + Package: libnss-tacplus + Architecture: any +-Depends: ${shlibs:Depends}, ${misc:Depends}, libtac2 (>= 1.4.1~), +- libtacplus-map1, libaudit1 ++Depends: ${shlibs:Depends}, ${misc:Depends}, libtac2 (>= 1.4.1~) + Description: NSS module for TACACS+ authentication without local passwd entry +- Performs getpwname and getpwuid lookups via NSS for users logged in via +- tacacs authentication, and mapping done with libtacplus_map ++ Performs getpwname lookups via NSS for users logged in via ++ tacacs authentication +diff --git a/debian/libnss-tacplus.symbols b/debian/libnss-tacplus.symbols +index 2bf9b88..f476e7d 100644 +--- a/debian/libnss-tacplus.symbols ++++ b/debian/libnss-tacplus.symbols +@@ -1,3 +1,2 @@ + libnss_tacplus.so.2 libnss-tacplus #MINVER# + _nss_tacplus_getpwnam_r@Base 1.0.1 +- _nss_tacplus_getpwuid_r@Base 1.0.1 +diff --git a/nss_tacplus.c b/nss_tacplus.c +index 79e62b9..ecfa0b0 100644 +--- a/nss_tacplus.c ++++ b/nss_tacplus.c +@@ -1,7 +1,9 @@ + /* +- * Copyright (C) 2014, 2015, 2016, 2017 Cumulus Networks, Inc. ++ * Copyright (C) 2014, 2015, 2016 Cumulus Networks, Inc. ++ * Copyright (C) 2017 Chenchen Qi + * All rights reserved. + * Author: Dave Olson ++ * Chenchen Qi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -18,15 +20,9 @@ + */ + + /* +- * This plugin implements getpwnam_r for NSS over TACACS+ +- * and implements getpwuid_r for UIDs if and only if a mapped +- * TACACS+ user is currently logged in (libtacplus_map) +- * This means that if you do, e.g.: ls -ld ~tacacs15, you will +- * sometimes get a mapped username, and other times get tacacs15, +- * depending on whether a mapped user is logged in or not. ++ * This plugin implements getpwnam_r for NSS over TACACS+. + */ + +- + #include + #include + #include +@@ -35,18 +31,18 @@ + #include + #include + #include ++#include + #include +-#include +-#include +-#include + +-#include +-#include ++#include + +-#include "nss_tacplus.h" ++#define MIN_TACACS_USER_PRIV (1) ++#define MAX_TACACS_USER_PRIV (15) + + static const char *nssname = "nss_tacplus"; /* for syslogs */ + static const char *config_file = "/etc/tacplus_nss.conf"; ++static const char *user_conf = "/etc/tacplus_user"; ++static const char *user_conf_tmp = "/tmp/tacplus_user_tmp"; + + /* + * pwbuf is used to reduce number of arguments passed around; the strings in +@@ -63,255 +59,239 @@ struct pwbuf { + typedef struct { + struct addrinfo *addr; + char *key; +-} tacplus_server_t; ++ int timeout; ++}tacplus_server_t; ++ ++typedef struct { ++ char *info; ++ int gid; ++ char *secondary_grp; ++ char *shell; ++}useradd_info_t; + + /* set from configuration file parsing */ + static tacplus_server_t tac_srv[TAC_PLUS_MAXSERVERS]; +-static int tac_srv_no, tac_key_no; +-static char tac_service[] = "shell"; +-static char tac_protocol[] = "ssh"; +-static char tac_rhost[INET6_ADDRSTRLEN]; +-static char vrfname[64]; +-static char *exclude_users; +-static uid_t min_uid = ~0U; /* largest possible */ +-static int debug; +-uint16_t use_tachome; +-static int conf_parsed = 0; +- +-static void get_remote_addr(void); +- +-#define MAX_INCL 8 /* max config level nesting */ +- +-/* reset all config variables when we are going to re-parse */ +-static void +-reset_config(void) +-{ +- int i, nservers; ++static int tac_srv_no; ++static useradd_info_t useradd_grp_list[MAX_TACACS_USER_PRIV + 1]; + +- /* reset the config variables that we use, freeing memory where needed */ +- nservers = tac_srv_no; +- tac_srv_no = 0; +- tac_key_no = 0; +- vrfname[0] = '\0'; +- if(exclude_users) { +- (void)free(exclude_users); +- exclude_users = NULL; +- } +- debug = 0; +- use_tachome = 0; +- tac_timeout = 0; +- min_uid = ~0U; +- +- for(i = 0; i < nservers; i++) { +- if(tac_srv[i].key) { +- free(tac_srv[i].key); +- tac_srv[i].key = NULL; +- } +- tac_srv[i].addr = NULL; +- } +-} ++static char *tac_service = "shell"; ++static char *tac_protocol = "ssh"; ++static bool debug = false; ++static bool many_to_one = false; + +-static int nss_tacplus_config(int *errnop, const char *cfile, int top) ++static int parse_tac_server(char *srv_buf) + { +- FILE *conf; +- char lbuf[256]; +- static struct stat lastconf[MAX_INCL]; +- static char *cfilelist[MAX_INCL]; +- struct stat st, *lst; +- +- if(top > MAX_INCL) { +- syslog(LOG_NOTICE, "%s: Config file include depth > %d, ignoring %s", +- nssname, MAX_INCL, cfile); +- return 1; +- } +- +- lst = &lastconf[top-1]; +- if(conf_parsed && top == 1) { +- /* +- * check to see if the config file(s) have changed since last time, +- * in case we are part of a long-lived daemon. If any changed, +- * reparse. If not, return the appropriate status (err or OK) +- * This is somewhat complicated by the include file mechanism. +- * When we have nested includes, we have to check all the config +- * files we saw previously, not just the top level config file. +- */ +- int i; +- for(i=0; i < MAX_INCL; i++) { +- struct stat *cst; +- cst = &lastconf[i]; +- if(!cst->st_ino || !cfilelist[i]) /* end of files */ +- return conf_parsed == 2 ? 0 : 1; +- if (stat(cfilelist[i], &st) || st.st_ino != cst->st_ino || +- st.st_mtime != cst->st_mtime || st.st_ctime != cst->st_ctime) +- break; /* found removed or different file, so re-parse */ +- } +- reset_config(); +- syslog(LOG_NOTICE, "%s: Configuration file(s) have changed, re-initializing", +- nssname); +- } +- +- /* don't check for failures, we'll just skip, don't want to error out */ +- cfilelist[top-1] = strdup(cfile); +- conf = fopen(cfile, "r"); +- if(conf == NULL) { +- *errnop = errno; +- if(!conf_parsed && debug) /* debug because privileges may not allow */ +- syslog(LOG_DEBUG, "%s: can't open config file %s: %m", +- nssname, cfile); +- return 1; +- } +- if (fstat(fileno(conf), lst) != 0) +- memset(lst, 0, sizeof *lst); /* avoid stale data, no warning */ +- +- while(fgets(lbuf, sizeof lbuf, conf)) { +- if(*lbuf == '#' || isspace(*lbuf)) +- continue; /* skip comments, white space lines, etc. */ +- strtok(lbuf, " \t\n\r\f"); /* terminate buffer at first whitespace */ +- if(!strncmp(lbuf, "include=", 8)) { +- /* +- * allow include files, useful for centralizing tacacs +- * server IP address and secret. When running non-privileged, +- * may not be able to read one or more config files. +- */ +- if(lbuf[8]) +- (void)nss_tacplus_config(errnop, &lbuf[8], top+1); +- } +- else if(!strncmp(lbuf, "debug=", 6)) +- debug = strtoul(lbuf+6, NULL, 0); +- else if (!strncmp (lbuf, "user_homedir=", 13)) +- use_tachome = (uint16_t)strtoul(lbuf+13, NULL, 0); +- else if (!strncmp (lbuf, "timeout=", 8)) { +- tac_timeout = (int)strtoul(lbuf+8, NULL, 0); +- if (tac_timeout < 0) /* explict neg values disable poll() use */ +- tac_timeout = 0; +- else /* poll() only used if timeout is explictly set */ +- tac_readtimeout_enable = 1; +- } +- /* +- * This next group is here to prevent a warning in the +- * final "else" case. We don't need them, but if there +- * is a common included file, we might see them. +- */ +- else if(!strncmp(lbuf, "service=", 8) || +- !strncmp(lbuf, "protocol=", 9) || +- !strncmp(lbuf, "login=", 6)) +- ; +- else if(!strncmp(lbuf, "secret=", 7)) { +- int i; +- /* no need to complain if too many on this one */ +- if(tac_key_no < TAC_PLUS_MAXSERVERS) { +- if((tac_srv[tac_key_no].key = strdup(lbuf+7))) +- tac_key_no++; +- else +- syslog(LOG_ERR, "%s: unable to copy server secret %s", +- nssname, lbuf+7); +- } +- /* handle case where 'secret=' was given after a 'server=' +- * parameter, fill in the current secret */ +- for(i = tac_srv_no-1; i >= 0; i--) { +- if (tac_srv[i].key) +- continue; +- tac_srv[i].key = strdup(lbuf+7); +- } +- } +- else if(!strncmp(lbuf, "exclude_users=", 14)) { +- /* +- * Don't lookup users in this comma-separated list for both +- * robustness and performnce. Typically root and other commonly +- * used local users. If set, we also look up the uids +- * locally, and won't do remote lookup on those uids either. +- */ +- exclude_users = strdup(lbuf+14); +- } +- else if(!strncmp(lbuf, "min_uid=", 8)) { +- /* +- * Don't lookup uids that are local, typically set to either +- * 0 or smallest always local user's uid +- */ +- unsigned long uid; +- char *valid; +- uid = strtoul(lbuf+8, &valid, 0); +- if (valid > (lbuf+8)) +- min_uid = (uid_t)uid; +- } +- else if(!strncmp(lbuf, "vrf=", 4)) +- strncpy(vrfname, lbuf + 4, sizeof(vrfname)); +- else if(!strncmp(lbuf, "server=", 7)) { +- if(tac_srv_no < TAC_PLUS_MAXSERVERS) { +- struct addrinfo hints, *servers, *server; ++ char *token; ++ char delim[] = " ,\t\n\r\f"; ++ ++ token = strsep(&srv_buf, delim); ++ while(token) { ++ if('\0' != token) { ++ if(!strncmp(token, "server=", 7)) { ++ struct addrinfo hints, *server; + int rv; +- char *port, server_buf[sizeof lbuf]; ++ char *srv, *port; + + memset(&hints, 0, sizeof hints); +- hints.ai_family = AF_UNSPEC; /* use IPv4 or IPv6, whichever */ ++ hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + +- strcpy(server_buf, lbuf + 7); +- +- port = strchr(server_buf, ':'); +- if(port != NULL) { ++ srv = token + 7; ++ port = strchr(srv, ':'); ++ if(port) { + *port = '\0'; +- port++; ++ port++; + } +- if((rv = getaddrinfo(server_buf, (port == NULL) ? +- "49" : port, &hints, &servers)) == 0) { +- for(server = servers; server != NULL && +- tac_srv_no < TAC_PLUS_MAXSERVERS; +- server = server->ai_next) { ++ ++ if((rv = getaddrinfo(srv, (port == NULL) ? "49" : port, &hints, ++ &server)) == 0) { ++ if(server) { ++ if(tac_srv[tac_srv_no].addr) ++ freeaddrinfo(tac_srv[tac_srv_no].addr); ++ if(tac_srv[tac_srv_no].key) ++ free(tac_srv[tac_srv_no].key); ++ memset(tac_srv + tac_srv_no, 0, sizeof(tacplus_server_t)); ++ + tac_srv[tac_srv_no].addr = server; +- /* use current key, if our index not yet set */ +- if(tac_key_no && !tac_srv[tac_srv_no].key) +- tac_srv[tac_srv_no].key = +- strdup(tac_srv[tac_key_no-1].key); +- tac_srv_no++; ++ } ++ else { ++ syslog(LOG_ERR, "%s: server NULL", nssname); + } + } + else { +- syslog(LOG_ERR, +- "%s: skip invalid server: %s (getaddrinfo: %s)", +- nssname, server_buf, gai_strerror(rv)); ++ syslog(LOG_ERR, "%s: invalid server: %s (getaddrinfo: %s)", ++ nssname, srv, gai_strerror(rv)); ++ return -1; ++ } ++ } ++ else if(!strncmp(token, "secret=", 7)) { ++ if(tac_srv[tac_srv_no].key) ++ free(tac_srv[tac_srv_no].key); ++ tac_srv[tac_srv_no].key = strdup(token + 7); ++ } ++ else if(!strncmp(token, "timeout=", 8)) { ++ tac_srv[tac_srv_no].timeout = (int)strtoul(token + 8, NULL, 0); ++ if(tac_srv[tac_srv_no].timeout < 0) ++ tac_srv[tac_srv_no].timeout = 0; ++ /* Limit timeout to make sure upper application not wait ++ * for a long time*/ ++ if(tac_srv[tac_srv_no].timeout > 5) ++ tac_srv[tac_srv_no].timeout = 5; ++ } ++ } ++ token = strsep(&srv_buf, delim); ++ } ++ ++ return 0; ++} ++ ++static int parse_user_priv(char *buf) ++{ ++ char *token; ++ char delim[] = ";\n\r"; ++ int priv = 0; ++ int gid = 0; ++ char *info = NULL; ++ char *group = NULL; ++ char *shell = NULL; ++ ++ token = strsep(&buf, delim); ++ while(token) { ++ if('\0' != token) { ++ if(!strncmp(token, "user_priv=", 10)) { ++ priv = (int)strtoul(token + 10, NULL, 0); ++ if(priv > MAX_TACACS_USER_PRIV || priv < MIN_TACACS_USER_PRIV) ++ { ++ priv = 0; ++ syslog(LOG_WARNING, "%s: user_priv %d out of range", ++ nssname, priv); + } + } +- else { +- syslog(LOG_WARNING, "%s: maximum number of servers (%d) " +- "exceeded, skipping", nssname, TAC_PLUS_MAXSERVERS); ++ else if(!strncmp(token, "pw_info=", 8)) { ++ if(!info) ++ info = strdup(token + 8); ++ } ++ else if(!strncmp(token, "gid=", 4)) { ++ gid = (int)strtoul(token + 4, NULL, 0); ++ } ++ else if(!strncmp(token, "group=", 6)) { ++ if(!group) ++ group = strdup(token + 6); ++ } ++ else if(!strncmp(token, "shell=", 6)) { ++ if(!shell) ++ shell = strdup(token + 6); + } + } +- else if(debug) /* ignore unrecognized lines, unless debug on */ +- syslog(LOG_WARNING, "%s: unrecognized parameter: %s", +- nssname, lbuf); ++ token = strsep(&buf, delim); + } +- fclose(conf); + ++ if(priv && gid && info && group && shell) { ++ useradd_info_t *user = &useradd_grp_list[priv]; ++ if(user->info) ++ free(user->info); ++ if(user->secondary_grp) ++ free(user->secondary_grp); ++ if(user->shell) ++ free(user->shell); ++ ++ user->gid = gid; ++ user->info = info; ++ user->secondary_grp = group; ++ user->shell = shell; ++ syslog(LOG_DEBUG, "%s: user_priv=%d info=%s gid=%d group=%s shell=%s", ++ nssname, priv, info, gid, group, shell); ++ } ++ else { ++ if(info) ++ free(info); ++ if(group) ++ free(group); ++ if(shell) ++ free(shell); ++ } + + return 0; + } + +-/* +- * Separate function so we can print first time we try to connect, +- * rather than during config. +- * Don't print at config, because often the uid lookup is one we +- * skip due to min_uid, so no reason to clutter the log. +- */ +-static void print_servers(void) ++static void init_useradd_info() + { +- static int printed = 0; +- int n; +- +- if (printed || !debug) +- return; +- printed = 1; +- +- if(tac_srv_no == 0) +- syslog(LOG_DEBUG, "%s:%s: no TACACS %s in config (or no perm)," +- " giving up", +- nssname, __FUNCTION__, tac_srv_no ? "service" : +- (*tac_service ? "server" : "service and no server")); +- +- for(n = 0; n < tac_srv_no; n++) +- syslog(LOG_DEBUG, "%s: server[%d] { addr=%s, key='%s' }", nssname, +- n, tac_srv[n].addr ? tac_ntop(tac_srv[n].addr->ai_addr) +- : "unknown", tac_srv[n].key); ++ useradd_info_t *user; ++ ++ user = &useradd_grp_list[MIN_TACACS_USER_PRIV]; ++ user->gid = 999; ++ user->info = strdup("remote_user"); ++ user->secondary_grp = strdup("docker"); ++ user->shell = strdup("/bin/bash"); ++ ++ user = &useradd_grp_list[MAX_TACACS_USER_PRIV]; ++ user->gid = 1000; ++ user->info = strdup("remote_user_su"); ++ user->secondary_grp = strdup("sudo,docker"); ++ user->shell = strdup("/bin/bash"); ++} ++ ++static int parse_config(const char *file) ++{ ++ FILE *fp; ++ char buf[512] = {0}; ++ ++ init_useradd_info(); ++ fp = fopen(file, "r"); ++ if(!fp) { ++ syslog(LOG_ERR, "%s: %s fopen failed", nssname, file); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ debug = false; ++ tac_srv_no = 0; ++ while(fgets(buf, sizeof buf, fp)) { ++ if('#' == *buf || isspace(*buf)) ++ continue; ++ ++ if(!strncmp(buf, "debug=on", 8)) { ++ debug = true; ++ } ++ else if(!strncmp(buf, "many_to_one=y", 13)) { ++ many_to_one = true; ++ } ++ else if(!strncmp(buf, "user_priv=", 10)) { ++ parse_user_priv(buf); ++ } ++ else if(!strncmp(buf, "server=", 7)) { ++ if(TAC_PLUS_MAXSERVERS <= tac_srv_no) { ++ syslog(LOG_ERR, "%s: tac server num is more than %d", ++ nssname, TAC_PLUS_MAXSERVERS); ++ } ++ else if(0 == parse_tac_server(buf)) ++ ++tac_srv_no; ++ } ++ } ++ fclose(fp); ++ ++ if(debug) { ++ int n; ++ useradd_info_t *user; ++ ++ for(n = 0; n < tac_srv_no; n++) { ++ syslog(LOG_DEBUG, "%s: server[%d] { addr=%s, key=%s, timeout=%d }", ++ nssname, n, tac_ntop(tac_srv[n].addr->ai_addr), ++ tac_srv[n].key, tac_srv[n].timeout); ++ } ++ syslog(LOG_DEBUG, "%s: many_to_one %s", nssname, 1 == many_to_one ++ ? "enable" : "disable"); ++ for(n = MIN_TACACS_USER_PRIV; n <= MAX_TACACS_USER_PRIV; n++) { ++ user = &useradd_grp_list[n]; ++ if(user) { ++ syslog(LOG_DEBUG, "%s: user_priv[%d] { gid=%d, info=%s, group=%s, shell=%s }", ++ nssname, n, user->gid, NULL == user->info ? "NULL" : user->info, ++ NULL == user->secondary_grp ? "NULL" : user->secondary_grp, ++ NULL == user->shell ? "NULL" : user->shell); ++ } ++ } ++ } ++ ++ return 0; + } + + /* +@@ -324,15 +304,13 @@ static void print_servers(void) + */ + static int + pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw, +- const char *usename, uint16_t tachome) ++ const char *usename) + { +- int needlen, cnt, origlen = len; +- char *shell; ++ size_t needlen; ++ int cnt; + +- if(!usename) { ++ if(!usename) + usename = srcpw->pw_name; +- tachome = 0; /* early lookups; no tachome */ +- } + + needlen = usename ? strlen(usename) + 1 : 1 + + srcpw->pw_dir ? strlen(srcpw->pw_dir) + 1 : 1 + +@@ -341,8 +319,8 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw, + srcpw->pw_passwd ? strlen(srcpw->pw_passwd) + 1 : 1; + if(needlen > len) { + if(debug) +- syslog(LOG_DEBUG, "%s provided password buffer too small (%ld<%d)", +- nssname, (long)len, needlen); ++ syslog(LOG_DEBUG, "%s provided password buffer too small (%ld<%ld)", ++ nssname, (long)len, (long)needlen); + return 1; + } + +@@ -354,21 +332,14 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw, + cnt++; /* allow for null byte also */ + buf += cnt; + len -= cnt; +- cnt = snprintf(buf, len, "%s", srcpw->pw_passwd ? srcpw->pw_passwd : ""); ++ /* If many-to-one mapping, set pw_passwd "a" for pam_account success */ ++ cnt = snprintf(buf, len, "%s", 0 == many_to_one ? "x" : "a"); + destpw->pw_passwd = buf; + cnt++; + buf += cnt; + len -= cnt; + cnt = snprintf(buf, len, "%s", srcpw->pw_shell ? srcpw->pw_shell : ""); + destpw->pw_shell = buf; +- shell = strrchr(buf, '/'); +- shell = shell ? shell+1 : buf; +- if (tachome && *shell == 'r') { +- tachome = 0; +- if(debug > 1) +- syslog(LOG_DEBUG, "%s tacacs login %s with user_homedir not allowed; " +- "shell is %s", nssname, srcpw->pw_name, buf); +- } + cnt++; + buf += cnt; + len -= cnt; +@@ -377,148 +348,227 @@ pwcopy(char *buf, size_t len, struct passwd *srcpw, struct passwd *destpw, + cnt++; + buf += cnt; + len -= cnt; +- if (tachome && usename) { +- char *slash, dbuf[strlen(srcpw->pw_dir) + strlen(usename)]; +- snprintf(dbuf, sizeof dbuf, "%s", srcpw->pw_dir ? srcpw->pw_dir : ""); +- slash = strrchr(dbuf, '/'); +- if (slash) { +- slash++; +- snprintf(slash, sizeof dbuf - (slash-dbuf), "%s", usename); +- } +- cnt = snprintf(buf, len, "%s", dbuf); +- } +- else +- cnt = snprintf(buf, len, "%s", srcpw->pw_dir ? srcpw->pw_dir : ""); ++ cnt = snprintf(buf, len, "%s", srcpw->pw_dir ? srcpw->pw_dir : ""); + destpw->pw_dir = buf; + cnt++; + buf += cnt; + len -= cnt; +- if(len < 0) { +- if(debug) +- syslog(LOG_DEBUG, "%s provided password buffer too small (%ld<%d)", +- nssname, (long)origlen, origlen-(int)len); +- return 1; +- } + + return 0; + } + + /* +- * Find the username or the matching tacacs privilege user in /etc/passwd +- * We use fgetpwent() so we can check the local file, always. +- * This could cause problems if somebody is using local users, ldap, and tacacs, +- * but we just require that the mapped user always be a local user. Since the +- * local user password isn't supposed to be used, that should be OK. +- * +- * We shouldn't normally find the username, because tacacs lookup should be +- * configured to follow local in nsswitch.conf, but somebody may configure the +- * other way, so we look for both the given user, and our "matching" user name +- * based on the tacacs authorization level. +- * +- * If not found, then try to map to a localuser tacacsN where N <= to the +- * TACACS+ privilege level, using the APIs in libtacplus_map.so +- * algorithm in update_mapuser() +- * Returns 0 on success, else 1 ++ * If useradd finished, user name should be deleted in conf. + */ +-static int +-find_pw_userpriv(unsigned priv, struct pwbuf *pb) ++static int delete_conf_line(const char *name) + { +- FILE *pwfile; +- struct passwd upw, tpw, *ent; +- int matches, ret, retu, rett; +- unsigned origpriv = priv; +- char ubuf[pb->buflen], tbuf[pb->buflen]; +- char tacuser[9]; /* "tacacs" followed by 1-2 digits */ +- +- tacuser[0] = '\0'; +- +- pwfile = fopen("/etc/passwd", "r"); +- if(!pwfile) { +- syslog(LOG_WARNING, "%s: failed to open /etc/passwd: %m", nssname); +- return 1; ++ FILE *fp, *fp_tmp; ++ char line[128]; ++ char del_line[128]; ++ int len = strlen(name); ++ ++ if(len >= 126) { ++ syslog(LOG_ERR, "%s: user name %s out of range 128", nssname, name); ++ return -1; ++ } ++ else { ++ snprintf(del_line, 128, "%s\n", name); + } + +-recheck: +- snprintf(tacuser, sizeof tacuser, "tacacs%u", priv); +- tpw.pw_name = upw.pw_name = NULL; +- retu = 0, rett = 0; +- for(matches=0; matches < 2 && (ent = fgetpwent(pwfile)); ) { +- if(!ent->pw_name) +- continue; /* shouldn't happen */ +- if(!strcmp(ent->pw_name, pb->name)) { +- retu = pwcopy(ubuf, sizeof(ubuf), ent, &upw, NULL, use_tachome); +- matches++; +- } +- else if(!strcmp(ent->pw_name, tacuser)) { +- rett = pwcopy(tbuf, sizeof(tbuf), ent, &tpw, NULL, use_tachome); +- matches++; ++ fp = fopen(user_conf, "r"); ++ if(!fp) { ++ syslog(LOG_ERR, "%s: %s fopen failed", nssname, user_conf); ++ return NSS_STATUS_UNAVAIL; ++ } ++ fp_tmp = fopen(user_conf_tmp, "w"); ++ if(!fp_tmp) { ++ syslog(LOG_ERR, "%s: %s fopen failed", nssname, user_conf_tmp); ++ fclose(fp); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ while(fgets(line, sizeof line, fp)) { ++ if(strcmp(line, del_line)) { ++ fprintf(fp_tmp, "%s", line); + } + } +- if(!matches && priv > 0) { +- priv--; +- rewind(pwfile); +- goto recheck; +- } +- ret = 1; +- fclose(pwfile); +- if(matches) { +- if(priv != origpriv && debug) +- syslog(LOG_DEBUG, "%s: local user not found at privilege=%u," +- " using %s", nssname, origpriv, tacuser); +- if(upw.pw_name && !retu) +- ret = pwcopy(pb->buf, pb->buflen, &upw, pb->pw, pb->name, +- use_tachome); +- else if(tpw.pw_name && !rett) +- ret = pwcopy(pb->buf, pb->buflen, &tpw, pb->pw, pb->name, +- use_tachome); +- } +- if(ret) +- *pb->errnop = ERANGE; ++ fclose(fp_tmp); ++ fclose(fp); + +- return ret; ++ if(0 != remove(user_conf) || 0 != rename(user_conf_tmp, user_conf)) { ++ syslog(LOG_ERR, "%s: %s rewrite failed", nssname, user_conf); ++ return -1; ++ } ++ ++ return 0; + } + + /* +- * This is similar to find_pw_userpriv(), but passes in a fixed +- * name for UID lookups, where we have the mapped name from the +- * map file, so trying multiple tacacsN users would be wrong. +- * Some commonality, but ugly to factor +- * Only applies to mapped users +- * returns 0 on success ++ * If not found in local, look up in tacacs user conf. If user name is not in ++ * conf, it will be written in conf and created by command 'useradd'. When ++ * useradd command use getpwnam(), it will return when username found in conf. + */ +-static int +-find_pw_user(const char *logname, const char *tacuser, struct pwbuf *pb, +- uint16_t usetachome) ++static int create_local_user(const char *name, int level) + { +- FILE *pwfile; +- struct passwd *ent; +- int ret = 1; ++ FILE *fp; ++ useradd_info_t *user; ++ char buf[512]; ++ int len = 512; ++ int lvl, cnt; ++ bool found = false; ++ ++ fp = fopen(user_conf, "ab+"); ++ if(!fp) { ++ syslog(LOG_ERR, "%s: %s fopen failed", nssname, user_conf); ++ return -1; ++ } + +- if(!tacuser) { ++ while(fgets(buf, sizeof buf, fp)) { ++ if('#' == *buf || isspace(*buf)) ++ continue; ++ // Delete line break ++ cnt = strlen(buf); ++ buf[cnt - 1] = '\0'; ++ if(!strcmp(buf, name)) { ++ found = true; ++ break; ++ } ++ } ++ ++ /* ++ * If user is found in user_conf, it means that getpwnam is called by ++ * useradd in this NSS module. ++ */ ++ if(found) { + if(debug) +- syslog(LOG_DEBUG, "%s: passed null username, failing", nssname); ++ syslog(LOG_DEBUG, "%s: %s found in %s", nssname, name, user_conf); ++ fclose(fp); + return 1; + } + +- pwfile = fopen("/etc/passwd", "r"); +- if(!pwfile) { +- syslog(LOG_WARNING, "%s: failed to open /etc/passwd: %m", +- nssname); +- return 1; ++ snprintf(buf, len, "%s\n", name); ++ if(EOF == fputs(buf, fp)) { ++ syslog(LOG_ERR, "%s: %s write local user failed", nssname, name); ++ fclose(fp); ++ return -1; ++ } ++ fclose(fp); ++ ++ lvl = level; ++ while(lvl >= MIN_TACACS_USER_PRIV) { ++ user = &useradd_grp_list[lvl]; ++ if(user->info && user->secondary_grp && user->shell) { ++ snprintf(buf, len, "useradd -G %s \"%s\" -g %d -c \"%s\" -d /home/%s -m -s %s", ++ user->secondary_grp, name, user->gid, user->info, name, user->shell); ++ fp = popen(buf, "r"); ++ if(!fp || -1 == pclose(fp)) { ++ syslog(LOG_ERR, "%s: useradd popen failed errno=%d %s", ++ nssname, errno, strerror(errno)); ++ delete_conf_line(name); ++ return -1; ++ } ++ if(debug) ++ syslog(LOG_DEBUG, "%s: create local user %s success", nssname, name); ++ delete_conf_line(name); ++ return 0; ++ } ++ lvl--; ++ } ++ ++ return -1; ++} ++ ++/* ++ * Lookup user in /etc/passwd, and fill up passwd info if found. ++ */ ++static int lookup_pw_local(char* username, struct pwbuf *pb, bool *found) ++{ ++ FILE *fp; ++ struct passwd *pw = NULL; ++ int ret = 0; ++ ++ if(!username) { ++ syslog(LOG_ERR, "%s: username invalid in check passwd", nssname); ++ return -1; + } + +- pb->pw->pw_name = NULL; /* be paranoid */ +- for(ret = 1; ret && (ent = fgetpwent(pwfile)); ) { +- if(!ent->pw_name) +- continue; /* shouldn't happen */ +- if(!strcmp(ent->pw_name, tacuser)) { +- ret = pwcopy(pb->buf, pb->buflen, ent, pb->pw, logname, usetachome); ++ fp = fopen("/etc/passwd", "r"); ++ if(!fp) { ++ syslog(LOG_ERR, "%s: /etc/passwd fopen failed", nssname); ++ return -1; ++ } ++ ++ while(0 != (pw = fgetpwent(fp))) { ++ if(!strcmp(pw->pw_name, username)) { ++ *found = true; ++ ret = pwcopy(pb->buf, pb->buflen, pw, pb->pw, username); ++ if(ret) ++ *pb->errnop = ERANGE; + break; + } + } +- fclose(pwfile); +- if(ret) +- *pb->errnop = ERANGE; ++ fclose(fp); ++ return ret; ++} ++ ++/* ++ * Lookup local user passwd info for TACACS+ user. If not found, local user will ++ * be created by user mapping strategy. ++ */ ++static int lookup_user_pw(struct pwbuf *pb, int level) ++{ ++ char *username = NULL; ++ char buf[128]; ++ int len = 128; ++ bool found = false; ++ int ret = 0; ++ ++ if(level < MIN_TACACS_USER_PRIV || level > MAX_TACACS_USER_PRIV) { ++ syslog(LOG_ERR, "%s: TACACS+ user %s privilege %d invalid", nssname, pb->name, level); ++ return -1; ++ } ++ ++ /* ++ * If many-to-one user mapping disable, create local user for each TACACS+ user ++ * The username of local user and TACACS+ user is the same. If many-to-one enable, ++ * look up the mapped local user name and passwd info. ++ */ ++ if(0 == many_to_one) { ++ username = pb->name; ++ } ++ else { ++ int lvl = level; ++ useradd_info_t *user; ++ ++ while(lvl >= MIN_TACACS_USER_PRIV) { ++ user = &useradd_grp_list[lvl]; ++ if(user->info && user->secondary_grp && user->shell) { ++ snprintf(buf, len, "%s", user->info); ++ username = buf; ++ if(debug) ++ syslog(LOG_DEBUG, "%s: %s mapping local user %s", nssname, ++ pb->name, username); ++ break; ++ } ++ lvl--; ++ } ++ } ++ ++ ret = lookup_pw_local(username, pb, &found); ++ if(debug) ++ syslog(LOG_DEBUG, "%s: %s passwd %s found in local", nssname, username, ++ found ? "is" : "isn't"); ++ if(0 != ret || found) ++ return ret; ++ ++ if(0 != create_local_user(username, level)) ++ return -1; ++ ++ ret = lookup_pw_local(username, pb, &found); ++ if(0 == ret && !found) { ++ syslog(LOG_ERR, "%s: %s not found in local after useradd", nssname, pb->name); ++ ret = -1; ++ } + + return ret; + } +@@ -532,6 +582,7 @@ static int + got_tacacs_user(struct tac_attrib *attr, struct pwbuf *pb) + { + unsigned long priv_level = 0; ++ int ret; + + while(attr != NULL) { + /* we are looking for the privilege attribute, can be in several forms, +@@ -550,14 +601,20 @@ got_tacacs_user(struct tac_attrib *attr, struct pwbuf *pb) + /* if this fails, we leave priv_level at 0, which is + * least privileged, so that's OK, but at least report it + */ +- if(ok == val && debug) +- syslog(LOG_WARNING, "%s: non-numeric privilege for %s, (%s)", +- nssname, pb->name, attr->attr); ++ if(debug) ++ syslog(LOG_DEBUG, "%s: privilege for %s, (%lu)", ++ nssname, pb->name, priv_level); + } + attr = attr->next; + } + +- return find_pw_userpriv(priv_level, pb); ++ ret = lookup_user_pw(pb, priv_level); ++ if(!ret && debug) ++ syslog(LOG_DEBUG, "%s: pw_name=%s, pw_passwd=%s, pw_shell=%s, dir=%s", ++ nssname, pb->pw->pw_name, pb->pw->pw_passwd, pb->pw->pw_shell, ++ pb->pw->pw_dir); ++ ++ return ret; + } + + /* +@@ -570,9 +627,13 @@ connect_tacacs(struct tac_attrib **attr, int srvr) + { + int fd; + ++ if(!*tac_service) /* reported at config file processing */ ++ return -1; ++ + fd = tac_connect_single(tac_srv[srvr].addr, tac_srv[srvr].key, NULL, +- vrfname[0]?vrfname:NULL); ++ tac_srv[srvr].timeout); + if(fd >= 0) { ++ *attr = NULL; /* so tac_add_attr() allocates memory */ + tac_add_attrib(attr, "service", tac_service); + if(tac_protocol[0]) + tac_add_attrib(attr, "protocol", tac_protocol); +@@ -598,34 +659,9 @@ lookup_tacacs_user(struct pwbuf *pb) + { + struct areply arep; + int ret = 1, done = 0; +- struct tac_attrib *attr = NULL; ++ struct tac_attrib *attr; + int tac_fd, srvr; + +- if (exclude_users) { +- char *user, *list; +- list = strdup(exclude_users); +- if (list) { +- static const char *delim = ", \t\n"; +- bool islocal = 0; +- user = strtok(list, delim); +- list = NULL; +- while (user) { +- if(!strcmp(user, pb->name)) { +- islocal = 1; +- break; +- } +- user = strtok(NULL, delim); +- } +- free(list); +- if (islocal) +- return 2; +- } +- } +- +- if(!*tac_service) /* reported at config file processing */ +- return ret; +- print_servers(); +- + for(srvr=0; srvr < tac_srv_no && !done; srvr++) { + arep.msg = NULL; + arep.attr = NULL; +@@ -636,14 +672,13 @@ lookup_tacacs_user(struct pwbuf *pb) + syslog(LOG_WARNING, "%s: failed to connect TACACS+ server %s," + " ret=%d: %m", nssname, tac_srv[srvr].addr ? + tac_ntop(tac_srv[srvr].addr->ai_addr) : "unknown", tac_fd); +- tac_free_attrib(&attr); + continue; + } +- ret = tac_author_send(tac_fd, pb->name, "", tac_rhost, attr); ++ ret = tac_author_send(tac_fd, pb->name, "", "", attr); + if(ret < 0) { + if(debug) +- syslog(LOG_WARNING, "%s: TACACS+ server %s authorization failed (%d) " +- " user (%s)", nssname, tac_srv[srvr].addr ? ++ syslog(LOG_WARNING, "%s: TACACS+ server %s send failed (%d) for" ++ " user %s: %m", nssname, tac_srv[srvr].addr ? + tac_ntop(tac_srv[srvr].addr->ai_addr) : "unknown", ret, + pb->name); + } +@@ -668,14 +703,11 @@ lookup_tacacs_user(struct pwbuf *pb) + if(arep.status == AUTHOR_STATUS_PASS_ADD || + arep.status == AUTHOR_STATUS_PASS_REPL) { + ret = got_tacacs_user(arep.attr, pb); +- if(debug>1) ++ if(debug) + syslog(LOG_DEBUG, "%s: TACACS+ server %s successful for user %s." + " local lookup %s", nssname, + tac_ntop(tac_srv[srvr].addr->ai_addr), pb->name, +- ret?"OK":"no match"); +- else if(debug) +- syslog(LOG_DEBUG, "%s: TACACS+ server %s successful for user %s", +- nssname, tac_ntop(tac_srv[srvr].addr->ai_addr), pb->name); ++ ret == 0?"OK":"no match"); + done = 1; /* break out of loop after arep cleanup */ + } + else { +@@ -692,30 +724,12 @@ lookup_tacacs_user(struct pwbuf *pb) + tac_free_attrib(&arep.attr); + } + +- return ret < 0? 1 : ret; +-} +- +-static int +-lookup_mapped_uid(struct pwbuf *pb, uid_t uid, uid_t auid, int session) +-{ +- char *loginname, mappedname[256]; +- uint16_t flag; +- +- mappedname[0] = '\0'; +- loginname = lookup_mapuid(uid, auid, session, +- mappedname, sizeof mappedname, &flag); +- if(loginname) +- return find_pw_user(loginname, mappedname, pb, flag & MAP_USERHOMEDIR); +- return 1; ++ return ret; + } + + /* + * This is an NSS entry point. +- * We implement getpwnam(), because we remap from the tacacs login +- * to the local tacacs0 ... tacacs15 users for all other info, and so +- * the normal order of "passwd tacplus" (possibly with ldap or anything +- * else prior to tacplus) will mean we only get used when there isn't +- * a local user to be found. ++ * We implement getpwnam(), because we remap from the tacacs. + * + * We try the lookup to the tacacs server first. If we can't make a + * connection to the server for some reason, we also try looking up +@@ -730,20 +744,25 @@ enum nss_status _nss_tacplus_getpwnam_r(const char *name, struct passwd *pw, + int result; + struct pwbuf pbuf; + +- result = nss_tacplus_config(errnop, config_file, 1); +- conf_parsed = result == 0 ? 2 : 1; ++ /* ++ * When filename completion is used with the tab key in bash, getpwnam ++ * is invoked. And the parameter "name" is '*'. In order not to connect to ++ * TACACS+ server frequently, check user name whether is valid. ++ */ ++ if(!strcmp(name, "*")) ++ return NSS_STATUS_NOTFOUND; + +- get_remote_addr(); ++ result = parse_config(config_file); + +- if(result) { /* no config file, no servers, etc. */ +- /* this is a debug because privileges may not allow access */ +- if(debug) +- syslog(LOG_DEBUG, "%s: bad config or server line for nss_tacplus", ++ if(result) { ++ syslog(LOG_ERR, "%s: bad config or server line for nss_tacplus", ++ nssname); ++ } ++ else if(0 == tac_srv_no) { ++ syslog(LOG_WARNING, "%s: no tacacs server in config for nss_tacplus", + nssname); + } + else { +- int lookup; +- + /* marshal the args for the lower level functions */ + pbuf.name = (char *)name; + pbuf.pw = pw; +@@ -751,126 +770,13 @@ enum nss_status _nss_tacplus_getpwnam_r(const char *name, struct passwd *pw, + pbuf.buflen = buflen; + pbuf.errnop = errnop; + +- lookup = lookup_tacacs_user(&pbuf); +- if(!lookup) ++ if(0 == lookup_tacacs_user(&pbuf)) { + status = NSS_STATUS_SUCCESS; +- else if(lookup == 1) { /* 2 means exclude_users match */ +- uint16_t flag; +- /* +- * If we can't contact a tacacs server (either not configured, or +- * more likely, we aren't running as root and the config for the +- * server is not readable by our uid for security reasons), see if +- * we can find the user via the mapping database, and if so, use +- * that. This will work for non-root users as long as the requested +- * name is in use (that is, logged in), which will be the most +- * common case of wanting to use the original login name by non-root +- * users. +- */ +- char *mapname = lookup_mapname(name, -1, -1, NULL, &flag); +- if(mapname != name && !find_pw_user(name, mapname, &pbuf, +- flag & MAP_USERHOMEDIR)) +- status = NSS_STATUS_SUCCESS; ++ if(debug) ++ syslog(LOG_DEBUG, "%s: name=%s, pw_name=%s, pw_passwd=%s, pw_shell=%s", ++ nssname, name, pw->pw_name, pw->pw_passwd, pw->pw_shell); + } + } +- return status; +-} + +-/* +- * This is an NSS entry point. +- * We implement getpwuid(), for anything that wants to get the original +- * login name from the uid. +- * If it matches an entry in the map, we use that data to replace +- * the data from the local passwd file (not via NSS). +- * locally from the map. +- * +- * This can be made to work 2 different ways, and we need to choose +- * one, or make it configurable. +- * +- * 1) Given a valid auid and a session id, and a mapped user logged in, +- * we'll match only that user. That is, we can only do the lookup +- * successfully for child processes of the mapped tacacs login, and +- * only while still logged in (map entry is valid). +- * +- * 2) Use auid/session wildcards, and and always match on the first valid +- * tacacs map file entry. This means if two tacacs users are logged in +- * at the same privilege level at the same time, uid lookups for ps, ls, +- * etc. will return the first (in the map file, not necessarily first +- * logged in) mapped name. +- * +- * For now, if auid and session are set, I try them, and if that lookup +- * fails, try the wildcard. +- * +- * Only works while the UID is in use for a mapped user, and only +- * for processes invoked from that session. Other callers will +- * just get the files, ldap, or nis entry for the UID +- * Only works while the UID is in use for a mapped user, and returns +- * the first match from the mapped users. +- */ +-enum nss_status _nss_tacplus_getpwuid_r(uid_t uid, struct passwd *pw, +- char *buffer, size_t buflen, int *errnop) +-{ +- struct pwbuf pb; +- enum nss_status status = NSS_STATUS_NOTFOUND; +- int session, ret; +- uid_t auid; +- +- ret = nss_tacplus_config(errnop, config_file, 1); +- conf_parsed = ret == 0 ? 2 : 1; +- +- if (min_uid != ~0U && uid < min_uid) { +- if(debug > 1) +- syslog(LOG_DEBUG, "%s: uid %u < min_uid %u, don't lookup", +- nssname, uid, min_uid); +- return status; +- } +- +- auid = audit_getloginuid(); /* audit_setloginuid not called */ +- session = map_get_sessionid(); +- +- /* marshal the args for the lower level functions */ +- pb.pw = pw; +- pb.buf = buffer; +- pb.buflen = buflen; +- pb.errnop = errnop; +- pb.name = NULL; +- +- /* +- * the else case will only be called if we don't have an auid or valid +- * sessionid, since otherwise the first call will be using wildcards, +- * since the getloginuid and get_sessionid calls will "fail". +- */ +- if(!lookup_mapped_uid(&pb, uid, auid, session)) +- status = NSS_STATUS_SUCCESS; +- else if((auid != (uid_t)-1 || session != ~0U) && +- !lookup_mapped_uid(&pb, uid, (uid_t)-1, ~0)) +- status = NSS_STATUS_SUCCESS; + return status; + } +- +-static void get_remote_addr(void) +-{ +- struct sockaddr_storage addr; +- socklen_t len = sizeof addr; +- char ipstr[INET6_ADDRSTRLEN]; +- +- /* This is so we can fill in the rhost field when we talk to the +- * TACACS+ server, when it's an ssh connection, so sites that refuse +- * authorization unless from specific IP addresses will get that +- * information. It's pretty much of a hack, but it works. +- */ +- if (getpeername(0, (struct sockaddr*)&addr, &len) == -1) +- return; +- +- *ipstr = 0; +- if (addr.ss_family == AF_INET) { +- struct sockaddr_in *s = (struct sockaddr_in *)&addr; +- inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr); +- } else { +- struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr; +- inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr); +- } +- +- snprintf(tac_rhost, sizeof tac_rhost, "%s", ipstr); +- if(debug > 1 && tac_rhost[0]) +- syslog(LOG_DEBUG, "%s: rhost=%s", nssname, tac_rhost); +-} +diff --git a/tacplus_nss.conf b/tacplus_nss.conf +index bb4eb1e..7cb756f 100644 +--- a/tacplus_nss.conf ++++ b/tacplus_nss.conf +@@ -1,53 +1,50 @@ +-#%NSS_TACPLUS-1.0 +-# Install this file as /etc/tacplus_nss.conf +-# Edit /etc/nsswitch.conf to add tacplus to the passwd lookup, similar to this +-# where tacplus precede compat (or files), and depending on local policy can +-# follow or precede ldap, nis, etc. +-# passwd: tacplus compat +-# +-# Servers are tried in the order listed, and once a server +-# replies, no other servers are attempted in a given process instantiation +-# +-# This configuration is similar to the libpam_tacplus configuration, but +-# is maintained as a configuration file, since nsswitch.conf doesn't +-# support passing parameters. Parameters must start in the first +-# column, and parsing stops at the first whitespace +- +-# if set, errors and other issues are logged with syslog +-# debug=1 ++# Configuration for libnss-tacplus + +-# min_uid is the minimum uid to lookup via tacacs. Setting this to 0 +-# means uid 0 (root) is never looked up, good for robustness and performance +-# Cumulus Linux ships with it set to 1001, so we never lookup our standard +-# local users, including the cumulus uid of 1000. Should not be greater +-# than the local tacacs{0..15} uids +-min_uid=1001 ++# debug - If you want to open debug log, set it on ++# ++# Default: off ++# debug=on + +-# This is a comma separated list of usernames that are never sent to +-# a tacacs server, they cause an early not found return. ++# src_ip - set source address of TACACS+ protocl packets + # +-# "*" is not a wild card. While it's not a legal username, it turns out +-# that during pathname completion, bash can do an NSS lookup on "*" +-# To avoid server round trip delays, or worse, unreachable server delays +-# on filename completion, we include "*" in the exclusion list. +-exclude_users=root,cumulus,quagga,sshd,ntp,* ++# Default: None (it means the ip address of out port) ++# src_ip=2.2.2.2 + +-# The include keyword allows centralizing the tacacs+ server information +-# including the IP address and shared secret +-include=/etc/tacplus_servers ++# server - set ip address, tcp port, secret string and timeout for TACACS+ servers ++# The maximum number of servers is 8. If there is no TACACS+ server, libnss-tacplus ++# will always return pwname not found. ++# ++# Default: None (no TACACS+ server) ++# server=1.1.1.1:49,secret=test,timeout=3 + +-# The server IP address can be optionally followed by a ':' and a port +-# number (server=1.1.1.1:49). It is strongly recommended that you NOT +-# add secret keys to this file, because it is world readable. +-#secret=SECRET1 +-#server=1.1.1.1 ++# user_priv - set the map between TACACS+ user privilege and local user's passwd ++# If TACACS+ user validate ok, it will get passwd info from local user which is ++# specially created for TACACS+ user in libnss-tacplus. This configuration is provided ++# to create local user. There is two user privilege map by default. ++# If the TACACS+ user's privilege value is in [1, 14], the config of user_priv 1 is ++# used to create local user. If user_priv 7 is added, the TACACS+ user which privilege ++# value is in [1, 6] will get the config of user_priv 1, and the value in [7, 14] will ++# get user_priv 7. ++# ++# If the passwd info of mapped local user is modified, like gid and shell, the new TACACS+ ++# user will create local user by the new config. But the old TACACS+ user which has logged ++# will not modify its mapped local user's passwd info. So it's better to keep this ++# configuration unchanged, not to modified at the running time. Or simply delete the old ++# mapped local user after modified. ++# ++# NOTE: If many_to_one enables, 'pw_info' is used for mapped local user name. So note the ++# naming rule for Linux user name when you set 'pw_info', and keep it different from other ++# 'pw_info'. ++# ++# Default: ++# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/bin/bash ++# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/bin/bash + +-# The connection timeout for an NSS library should be short, since it is +-# invoked for many programs and daemons, and a failure is usually not +-# catastrophic. Not set or set to a negative value disables use of poll(). +-# This follows the include of tacplus_servers, so it can override any +-# timeout value set in that file. +-# It's important to have this set in this file, even if the same value +-# as in tacplus_servers, since tacplus_servers should not be readable +-# by users other than root. +-timeout=5 ++# many_to_one - create one local user for many TACACS+ users which has the same privilege ++# The parameter 'pw_info' in 'user_priv' is used for the mapped local user name. ++# The default config is one to one mapping. It will create local user for each TACACS+ user ++# which has different username. The user mapping strategy should be set before enables ++# TACACS+, and keep constant at the running time. ++# ++# Default: many_to_one=n ++# many_to_one=y +-- +2.7.4 + diff --git a/src/tacacs/nss/Makefile b/src/tacacs/nss/Makefile new file mode 100644 index 000000000000..4f1a337b34b4 --- /dev/null +++ b/src/tacacs/nss/Makefile @@ -0,0 +1,22 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = libnss-tacplus_$(NSS_TACPLUS_VERSION)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Obtain libnss-tacplus + rm -rf ./libnss-tacplus + git clone https://github.com/daveolson53/libnss-tacplus.git + pushd ./libnss-tacplus + git checkout -f 19008ab + + # Apply patch + git apply ../0001-Modify-user-map-profile.patch + + dpkg-buildpackage -rfakeroot -b -us -uc + popd + + mv $(DERIVED_TARGETS) $* $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) diff --git a/src/tacacs/pam/0001-Don-t-init-declarations-in-a-for-loop.patch b/src/tacacs/pam/0001-Don-t-init-declarations-in-a-for-loop.patch new file mode 100644 index 000000000000..f9a9c29eb93f --- /dev/null +++ b/src/tacacs/pam/0001-Don-t-init-declarations-in-a-for-loop.patch @@ -0,0 +1,45 @@ +From f293353127c504490f8d892afe39766ec94137bf Mon Sep 17 00:00:00 2001 +From: Liuqu +Date: Sun, 8 Oct 2017 07:32:11 -0700 +Subject: [PATCH 1/2] Don't init declarations in a for loop + +* It comes from the commit "3299028... Don't init declarations in + a for loop", and modified source format to resolve conflict in + v1.4.1 +--- + libtac/lib/author_r.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/libtac/lib/author_r.c b/libtac/lib/author_r.c +index a028144..f3b544e 100644 +--- a/libtac/lib/author_r.c ++++ b/libtac/lib/author_r.c +@@ -47,6 +47,7 @@ int tac_author_read(int fd, struct areply *re) { + char *msg = NULL; + int timeleft; + re->msg = NULL; ++ unsigned int r = 0; + + bzero(re, sizeof(struct areply)); + if (tac_readtimeout_enable && +@@ -132,7 +133,7 @@ int tac_author_read(int fd, struct areply *re) { + pktp = (u_char *) tb + TAC_AUTHOR_REPLY_FIXED_FIELDS_SIZE; + + /* cycle through the arguments supplied in the packet */ +- for (unsigned int r = 0; r < tb->arg_cnt && r < TAC_PLUS_MAX_ARGCOUNT; r++) { ++ for (r = 0; r < tb->arg_cnt && r < TAC_PLUS_MAX_ARGCOUNT; r++) { + if (len_from_body > packet_read || ((void *)pktp - (void *) tb) > packet_read) { + TACSYSLOG((LOG_ERR,\ + "%s: arguments supplied in packet seem to exceed its size",\ +@@ -205,7 +206,7 @@ int tac_author_read(int fd, struct areply *re) { + TACSYSLOG((LOG_DEBUG, "Args cnt %d", tb->arg_cnt)); + /* argp points to current argument string + pktp points to current argument length */ +- for (unsigned int r = 0; r < tb->arg_cnt && r < TAC_PLUS_MAX_ARGCOUNT; ++ for (r = 0; r < tb->arg_cnt && r < TAC_PLUS_MAX_ARGCOUNT; + r++) { + unsigned char buff[256]; + unsigned char *sep; +-- +2.7.4 + diff --git a/src/tacacs/pam/0002-Fix-libtac2-bin-install-directory-error.patch b/src/tacacs/pam/0002-Fix-libtac2-bin-install-directory-error.patch new file mode 100644 index 000000000000..28518b3d2449 --- /dev/null +++ b/src/tacacs/pam/0002-Fix-libtac2-bin-install-directory-error.patch @@ -0,0 +1,19 @@ +From 85bae6b84d93c4b243d29ee08ff7030376bf80cb Mon Sep 17 00:00:00 2001 +From: Liuqu +Date: Sun, 8 Oct 2017 19:39:23 -0700 +Subject: [PATCH 2/2] Fix libtac2-bin install directory error + +--- + debian/libtac2-bin.install | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/debian/libtac2-bin.install b/debian/libtac2-bin.install +index 236670a..1df36c6 100644 +--- a/debian/libtac2-bin.install ++++ b/debian/libtac2-bin.install +@@ -1 +1 @@ +-usr/sbin ++usr/bin/* +-- +2.7.4 + diff --git a/src/tacacs/pam/Makefile b/src/tacacs/pam/Makefile new file mode 100644 index 000000000000..707668791402 --- /dev/null +++ b/src/tacacs/pam/Makefile @@ -0,0 +1,25 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = libpam-tacplus_$(PAM_TACPLUS_VERSION)_amd64.deb +DERIVED_TARGETS = libtac2_$(PAM_TACPLUS_VERSION)_amd64.deb \ + libtac-dev_$(PAM_TACPLUS_VERSION)_amd64.deb + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Obtain pam_tacplus + rm -rf ./pam_tacplus + git clone https://github.com/jeroennijhof/pam_tacplus.git + pushd ./pam_tacplus + git checkout -f v1.4.1 + + # Apply patch + git apply ../0001-Don-t-init-declarations-in-a-for-loop.patch + git apply ../0002-Fix-libtac2-bin-install-directory-error.patch + + dpkg-buildpackage -rfakeroot -b -us -uc + popd + + mv $(DERIVED_TARGETS) $* $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) From d9c0ede2e440764d3113521466d364cd17a23b48 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Thu, 7 Dec 2017 11:32:47 -0800 Subject: [PATCH 0967/1011] [Broadcom]: Update Broadcom SDK/SAI package (#1205) Update Broadcom OpenNSL to 3.2.3.7-1 Update Broadcom SAI to 3.0.3.3 Signed-off-by: Shu0T1an ChenG --- platform/broadcom/sai.mk | 8 ++++---- platform/broadcom/sdk.mk | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 28785d369395..6b1795f87ecc 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.2-15_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.2-15_amd64.deb?sv=2015-04-05&sr=b&sig=U1jDC%2FrbcCn3KgZsP9GoKFa9PtyXhliMd9iJrx8%2B%2F5M%3D&se=2031-08-07T00%3A51%3A44Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.3_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.3_amd64.deb?sv=2015-04-05&sr=b&sig=itlsEt8vqhWfZzuq%2FOSWSGgHN5kokf5a9AYOSJhD3t4%3D&se=2031-08-16T03%3A11%3A13Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.2-15_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.3_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.2-15_amd64.deb?sv=2015-04-05&sr=b&sig=nLvctIrLerXpG0SdQisirbOn1OBNLKl%2BQ7xLHRzgczM%3D&se=2031-08-07T00%3A52%3A02Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.3_amd64.deb?sv=2015-04-05&sr=b&sig=0DXLHgPXuMHERp44qJNNdQyYSv969sQsY7USCL6gCRw%3D&se=2031-08-16T03%3A10%3A49Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) diff --git a/platform/broadcom/sdk.mk b/platform/broadcom/sdk.mk index aff0cf07fe5c..dbabf8aaba15 100644 --- a/platform/broadcom/sdk.mk +++ b/platform/broadcom/sdk.mk @@ -1,4 +1,4 @@ -BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.3.3-2_amd64.deb -$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.3-2_amd64.deb?sv=2015-04-05&sr=b&sig=RADtBDA9oZmwHnTzBY76ewajyJ8Af%2BchVCzNbe%2BPsbc%3D&se=2031-07-06T19%3A18%3A56Z&sp=r" +BRCM_OPENNSL_KERNEL = opennsl-modules-3.16.0-4-amd64_3.2.3.7-1_amd64.deb +$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-3.16.0-4-amd64_3.2.3.7-1_amd64.deb?sv=2015-04-05&sr=b&sig=BJEFXfq2mgvSTIYZF8qF1Jj2ePkJaxBmA0HqhhAFPmQ%3D&se=2031-08-11T03%3A27%3A43Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_OPENNSL_KERNEL) From c4f7cd376e8422a5afb14a1b32181eae058caf3b Mon Sep 17 00:00:00 2001 From: wadelnn Date: Fri, 8 Dec 2017 04:08:49 +0800 Subject: [PATCH 0968/1011] [Ingrasys]: Update QSFP monitor CoPP test and sensors config (#1202) * Increase read socket buffer for CoPP Test * Add QSFP monitor service * Update S8810-32Q sensors.conf Signed-off-by: Wade He --- device/ingrasys/x86_64-ingrasys_s8810_32q-r0/sensors.conf | 4 ++-- platform/broadcom/sonic-platform-modules-ingrasys | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/sensors.conf index 7ab599698225..8332fbdf9086 100644 --- a/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/sensors.conf +++ b/device/ingrasys/x86_64-ingrasys_s8810_32q-r0/sensors.conf @@ -9,8 +9,8 @@ chip "jc42-*" chip "w83795adg-*" label in0 "ROV" - set in0_min 1 * 0.97 - set in0_max 1 * 1.033 + set in0_min 1.025 * 0.98 + set in0_max 1.025 * 1.02 ignore in1 ignore in2 label in3 "1.0V" diff --git a/platform/broadcom/sonic-platform-modules-ingrasys b/platform/broadcom/sonic-platform-modules-ingrasys index e60d63d9b54d..1d9ccb21aaf8 160000 --- a/platform/broadcom/sonic-platform-modules-ingrasys +++ b/platform/broadcom/sonic-platform-modules-ingrasys @@ -1 +1 @@ -Subproject commit e60d63d9b54dc3673433615c555a4fc62bfc488d +Subproject commit 1d9ccb21aaf868a788fd593ff1c03fdaf150eaf0 From 4b2225bca573d7e17a07d21e9bc922ba6283ec8f Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 7 Dec 2017 13:08:23 -0800 Subject: [PATCH 0969/1011] [docker-snmpd]: asyncsnmp depends on sonic-utilities so it is possible to import sonic_psu (#1212) * asyncsnmp depends on sonic-utilities so it is possible to import sonic_psu Signed-off-by: Qi Luo * Ignore sonic_utilities test during build --- dockers/docker-snmp-sv2/Dockerfile.j2 | 1 + rules/asyncsnmp-py3.mk | 3 ++- rules/sonic-utilities.mk | 8 ++++++++ slave.mk | 2 +- src/sonic-utilities | 2 +- 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index 2ab867031874..3c5473951116 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -7,6 +7,7 @@ COPY [ \ "/debs/"] # Install Python SwSSSDK (SNMP subagent dependency) +COPY python-wheels/sonic_utilities-*-py3-*.whl /python-wheels/ COPY python-wheels/swsssdk-*-py3-*.whl /python-wheels/ COPY python-wheels/asyncsnmp-*-py3-*.whl /python-wheels/ diff --git a/rules/asyncsnmp-py3.mk b/rules/asyncsnmp-py3.mk index a5a078e15bc3..f44d7f336534 100644 --- a/rules/asyncsnmp-py3.mk +++ b/rules/asyncsnmp-py3.mk @@ -3,5 +3,6 @@ ASYNCSNMP_PY3 = asyncsnmp-2.1.0-py3-none-any.whl $(ASYNCSNMP_PY3)_SRC_PATH = $(SRC_PATH)/sonic-snmpagent $(ASYNCSNMP_PY3)_PYTHON_VERSION = 3 -$(ASYNCSNMP_PY3)_DEPENDS += $(SWSSSDK_PY3) +# Depends on sonic-utilities so it is possible to import sonic_psu +$(ASYNCSNMP_PY3)_DEPENDS += $(SWSSSDK_PY3) $(SONIC_UTILS_PY3) SONIC_PYTHON_WHEELS += $(ASYNCSNMP_PY3) diff --git a/rules/sonic-utilities.mk b/rules/sonic-utilities.mk index 7a935ba70ede..0dae94d8aa70 100644 --- a/rules/sonic-utilities.mk +++ b/rules/sonic-utilities.mk @@ -4,3 +4,11 @@ SONIC_UTILS = python-sonic-utilities_1.1-1_all.deb $(SONIC_UTILS)_SRC_PATH = $(SRC_PATH)/sonic-utilities $(SONIC_UTILS)_WHEEL_DEPENDS = $(SONIC_CONFIG_ENGINE) SONIC_PYTHON_STDEB_DEBS += $(SONIC_UTILS) + +# Build sonic-utilities into python3 wheel, so we can use PSU code +# Note: _DEPENDS macro is not defined +SONIC_UTILS_PY3 = sonic_utilities-1.1-py3-none-any.whl +$(SONIC_UTILS_PY3)_SRC_PATH = $(SRC_PATH)/sonic-utilities +$(SONIC_UTILS_PY3)_PYTHON_VERSION = 3 +$(SONIC_UTILS_PY3)_TEST = n +SONIC_PYTHON_WHEELS += $(SONIC_UTILS_PY3) diff --git a/slave.mk b/slave.mk index 1f00accb9e30..8ec6832bd687 100644 --- a/slave.mk +++ b/slave.mk @@ -306,7 +306,7 @@ $(addprefix $(PYTHON_WHEELS_PATH)/, $(SONIC_PYTHON_WHEELS)) : $(PYTHON_WHEELS_PA pushd $($*_SRC_PATH) $(LOG) # apply series of patches if exist if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then QUILT_PATCHES=../$(notdir $($*_SRC_PATH)).patch quilt push -a; fi - python$($*_PYTHON_VERSION) setup.py test $(LOG) + [ "$($*_TEST)" = "n" ] || python$($*_PYTHON_VERSION) setup.py test $(LOG) python$($*_PYTHON_VERSION) setup.py bdist_wheel $(LOG) # clean up if [ -f ../$(notdir $($*_SRC_PATH)).patch/series ]; then quilt pop -a -f; fi diff --git a/src/sonic-utilities b/src/sonic-utilities index 0c0a2f02c32a..ea108f3cac77 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 0c0a2f02c32a8cafb3020d8248ea829bbc959d4a +Subproject commit ea108f3cac773ed8e71110c7da577fde28e9219b From 2276333ca8eb003d4cc0aac3413480cb03c87883 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Thu, 7 Dec 2017 21:50:39 -0800 Subject: [PATCH 0970/1011] Added PSU util for Mellanox platforms, updated sonic-utilities submodule (#1218) --- .../x86_64-mlnx_msn2100-r0/plugins/psuutil.py | 64 ++++++++++++++++ .../x86_64-mlnx_msn2410-r0/plugins/psuutil.py | 74 +++++++++++++++++++ .../x86_64-mlnx_msn2700-r0/plugins/psuutil.py | 74 +++++++++++++++++++ .../x86_64-mlnx_msn2740-r0/plugins/psuutil.py | 74 +++++++++++++++++++ src/sonic-utilities | 2 +- 5 files changed, 287 insertions(+), 1 deletion(-) create mode 100644 device/mellanox/x86_64-mlnx_msn2100-r0/plugins/psuutil.py create mode 100644 device/mellanox/x86_64-mlnx_msn2410-r0/plugins/psuutil.py create mode 100644 device/mellanox/x86_64-mlnx_msn2700-r0/plugins/psuutil.py create mode 100644 device/mellanox/x86_64-mlnx_msn2740-r0/plugins/psuutil.py diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/psuutil.py b/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/psuutil.py new file mode 100644 index 000000000000..88bdd51e9b67 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/plugins/psuutil.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/2-0060/" + self.psu_presence = "psu{}_status" + self.psu_oper_status = "psu{}_pg_status" + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + + status = 0 + try: + with open(self.psu_path + self.psu_oper_status.format(index), 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + return isinstance(index, int) and index > 0 and index <= self.get_num_psus() diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/psuutil.py b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/psuutil.py new file mode 100644 index 000000000000..301569c13a94 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/plugins/psuutil.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/2-0060/" + self.psu_presence = "psu{}_status" + self.psu_oper_status = "psu{}_pg_status" + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + + status = 0 + try: + with open(self.psu_path + self.psu_oper_status.format(index), 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + if index is None: + return False + + status = 0 + try: + with open(self.psu_path + self.psu_presence.format(index), 'r') as presence_status: + status = int(presence_status.read()) + except IOError: + return False + + return status == 1 diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/psuutil.py b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/psuutil.py new file mode 100644 index 000000000000..301569c13a94 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/plugins/psuutil.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/2-0060/" + self.psu_presence = "psu{}_status" + self.psu_oper_status = "psu{}_pg_status" + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + + status = 0 + try: + with open(self.psu_path + self.psu_oper_status.format(index), 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + if index is None: + return False + + status = 0 + try: + with open(self.psu_path + self.psu_presence.format(index), 'r') as presence_status: + status = int(presence_status.read()) + except IOError: + return False + + return status == 1 diff --git a/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/psuutil.py b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/psuutil.py new file mode 100644 index 000000000000..301569c13a94 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2740-r0/plugins/psuutil.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/2-0060/" + self.psu_presence = "psu{}_status" + self.psu_oper_status = "psu{}_pg_status" + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + + status = 0 + try: + with open(self.psu_path + self.psu_oper_status.format(index), 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + if index is None: + return False + + status = 0 + try: + with open(self.psu_path + self.psu_presence.format(index), 'r') as presence_status: + status = int(presence_status.read()) + except IOError: + return False + + return status == 1 diff --git a/src/sonic-utilities b/src/sonic-utilities index ea108f3cac77..cc147b9d0f0a 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit ea108f3cac773ed8e71110c7da577fde28e9219b +Subproject commit cc147b9d0f0a2edd1e89019052755a92840dd5f9 From 1859f53206aec3b230d30180d4de34cd88194e68 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 8 Dec 2017 09:06:22 -0800 Subject: [PATCH 0971/1011] [swss]: Fix missing comma in the ports.json.j2 file (#1217) Add J2 test case as well as a sample output Signed-off-by: Shu0T1an ChenG --- dockers/docker-orchagent/ports.json.j2 | 2 +- .../tests/sample_output/ports.json | 30 +++++++++++++++++++ .../tests/simple-sample-graph.xml | 1 + src/sonic-config-engine/tests/test_j2files.py | 7 +++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/sonic-config-engine/tests/sample_output/ports.json diff --git a/dockers/docker-orchagent/ports.json.j2 b/dockers/docker-orchagent/ports.json.j2 index 770440036058..e0438998114d 100644 --- a/dockers/docker-orchagent/ports.json.j2 +++ b/dockers/docker-orchagent/ports.json.j2 @@ -4,7 +4,7 @@ {% if PORT[port].has_key('speed') %} { "PORT_TABLE:{{ port }}": { - "speed": "{{ PORT[port]['speed'] }}" + "speed": "{{ PORT[port]['speed'] }}", "description": "{{ PORT[port]['description'] }}" }, "OP": "SET" diff --git a/src/sonic-config-engine/tests/sample_output/ports.json b/src/sonic-config-engine/tests/sample_output/ports.json new file mode 100644 index 000000000000..216627ef34cd --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/ports.json @@ -0,0 +1,30 @@ +[ + { + "PORT_TABLE:Ethernet8": { + "speed": "40000", + "description": "Interface description" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet0": { + "speed": "10000", + "description": "" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet4": { + "speed": "25000", + "description": "" + }, + "OP": "SET" + }, + { + "PORT_TABLE:Ethernet12": { + "speed": "1000000", + "description": "Interface description" + }, + "OP": "SET" + }, +] diff --git a/src/sonic-config-engine/tests/simple-sample-graph.xml b/src/sonic-config-engine/tests/simple-sample-graph.xml index cce833cc950d..d3bc25272282 100644 --- a/src/sonic-config-engine/tests/simple-sample-graph.xml +++ b/src/sonic-config-engine/tests/simple-sample-graph.xml @@ -257,6 +257,7 @@ 0 0 1000000 + Interface description true diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index d1cc0d2a3296..ce96ab425c82 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -9,6 +9,7 @@ class TestJ2Files(TestCase): def setUp(self): self.test_dir = os.path.dirname(os.path.realpath(__file__)) self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfggen') + self.simple_minigraph = os.path.join(self.test_dir, 'simple-sample-graph.xml') self.t0_minigraph = os.path.join(self.test_dir, 't0-sample-graph.xml') self.pc_minigraph = os.path.join(self.test_dir, 'pc-test-graph.xml') self.t0_port_config = os.path.join(self.test_dir, 't0-sample-port-config.ini') @@ -33,6 +34,12 @@ def test_alias_map(self): data = json.loads(output) self.assertEqual(data["Ethernet4"], "fortyGigE0/4") + def test_ports_json(self): + ports_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ports.json.j2') + argument = '-m ' + self.simple_minigraph + ' -p ' + self.t0_port_config + ' -t ' + ports_template + ' > ' + self.output_file + self.run_script(argument) + self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'ports.json'), self.output_file)) + def test_lldp(self): lldpd_conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-lldp-sv2', 'lldpd.conf.j2') argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + lldpd_conf_template + ' > ' + self.output_file From e5898940a55d08d3b5a58c41364f76e12c7a502d Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 8 Dec 2017 09:06:48 -0800 Subject: [PATCH 0972/1011] [config-engine]: Change minigraph.py permission from 0755 to 0644 (#1219) --- src/sonic-config-engine/minigraph.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/sonic-config-engine/minigraph.py diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py old mode 100755 new mode 100644 From 6feff9519774bfa263e6632b5f5e4ce07feedf74 Mon Sep 17 00:00:00 2001 From: Travis Szucs Date: Fri, 8 Dec 2017 12:00:48 -0800 Subject: [PATCH 0973/1011] [device/arista]: Add MAX6697 sensor for Arista 7060CX-32S (#1210) --- .../x86_64-arista_7060_cx32s/sensors.conf | 25 ++++++++++++++----- src/sonic-linux-kernel | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/device/arista/x86_64-arista_7060_cx32s/sensors.conf b/device/arista/x86_64-arista_7060_cx32s/sensors.conf index 20ebbeb5bbc7..b87cb57a9d5d 100644 --- a/device/arista/x86_64-arista_7060_cx32s/sensors.conf +++ b/device/arista/x86_64-arista_7060_cx32s/sensors.conf @@ -11,12 +11,25 @@ bus "i2c-7" "SCD SMBus master 0 bus 5" chip "k10temp-pci-00c3" label temp1 "Cpu temp sensor" -# missing support for -# chip "max6697-i2c-2-1a" -# board sensor 65 75 -# (1) switch chip left sensor 95 105 -# (5) switch chip right sensor 95 105 -# (6) front panel temp sensor 65 75 +chip "max6697-i2c-2-1a" + label temp1 "Board sensor" + set temp1_max 95 + + label temp2 "Switch chip left sensor" + set temp2_max 95 + set temp2_crit 105 + + ignore temp3 + ignore temp4 + ignore temp5 + + label temp6 "Switch chip right sensor" + set temp6_max 95 + set temp6_crit 105 + + label temp7 "Front panel temp sensor" + set temp7_max 65 + set temp7_crit 75 chip "max6658-i2c-3-4c" label temp1 "Cpu board temp sensor" diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index c9832d5e0835..ff5a3b588cc7 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit c9832d5e08351d2f661374f51cf81e60677d2f42 +Subproject commit ff5a3b588cc7dbd763fb13c1125710134c8cdd12 From 5ca798d9bc770ddf9e4ed56b65fa600a04fbb26b Mon Sep 17 00:00:00 2001 From: Prince Sunny Date: Fri, 8 Dec 2017 12:01:06 -0800 Subject: [PATCH 0974/1011] [arista]: Unify labels for Arista sensors (#1216) --- .../x86_64-arista_7050_qx32/sensors.conf | 18 ++++++++--------- .../x86_64-arista_7060_cx32s/sensors.conf | 4 ++-- .../x86_64-arista_7260cx3_64/sensors.conf | 20 +++++++++---------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/device/arista/x86_64-arista_7050_qx32/sensors.conf b/device/arista/x86_64-arista_7050_qx32/sensors.conf index dde0d35df8cb..469f63eaf1e4 100644 --- a/device/arista/x86_64-arista_7050_qx32/sensors.conf +++ b/device/arista/x86_64-arista_7050_qx32/sensors.conf @@ -12,38 +12,38 @@ chip "k10temp-pci-00c3" label temp1 "Cpu temp sensor" chip "lm73-i2c-3-48" - label temp1 "Rear Temp Sensor" + label temp1 "Back panel temp sensor" set temp1_max 65 #set temp1_max_alarm 75 # read-only chip "max6658-i2c-2-4c" - label temp1 "Board Temp Sensor" + label temp1 "Board temp sensor" set temp1_max 65 set temp1_crit 75 - label temp2 "Front-panel Temp Sensor" + label temp2 "Front panel temp sensor" set temp2_max 65 set temp2_crit 75 # disabled because of some eeprom corruption risks #chip "pmbus-i2c-3-4e" -# label temp1 "Power Controller Sensor 1" +# label temp1 "Power controller sensor 1" # set temp1_max 60 # set temp1_crit 70 -# label temp2 "Power Controller Sensor 2" +# label temp2 "Power controller sensor 2" # set temp2_max 60 # set temp2_crit 70 # ignore curr1 chip "dps460-i2c-5-58" - label temp1 "Power Supply 1 Sensor 1" + label temp1 "Power supply 1 inlet temp sensor" # maximum and critical thresholds are not supported for this psu set temp1_max 60 set temp1_crit 70 - label temp2 "Power Supply 1 Sensor 2" + label temp2 "Power supply 1 internal sensor" set temp2_max 60 set temp2_crit 70 @@ -60,12 +60,12 @@ chip "dps460-i2c-5-58" set curr2_crit 37 chip "dps460-i2c-6-58" - label temp1 "Power Supply 2 Sensor 1" + label temp1 "Power supply 2 inlet temp sensor" # maximum and critical thresholds are not supported for this psu set temp1_max 60 set temp1_crit 70 - label temp2 "Power Supply 2 Sensor 2" + label temp2 "Power supply 2 internal sensor" set temp2_max 60 set temp2_crit 70 diff --git a/device/arista/x86_64-arista_7060_cx32s/sensors.conf b/device/arista/x86_64-arista_7060_cx32s/sensors.conf index b87cb57a9d5d..21b21fcb5d1c 100644 --- a/device/arista/x86_64-arista_7060_cx32s/sensors.conf +++ b/device/arista/x86_64-arista_7060_cx32s/sensors.conf @@ -51,9 +51,9 @@ chip "pmbus-i2c-7-4e" chip "pmbus-i2c-6-58" label temp1 "Power supply 1 hotspot sensor" label temp2 "Power supply 1 inlet temp sensor" - label temp3 "Power supply 1 sensor" + label temp3 "Power supply 1 exhaust temp sensor" chip "pmbus-i2c-5-58" label temp1 "Power supply 2 hotspot sensor" label temp2 "Power supply 2 inlet temp sensor" - label temp3 "Power supply 2 sensor" + label temp3 "Power supply 2 exhaust temp sensor" diff --git a/device/arista/x86_64-arista_7260cx3_64/sensors.conf b/device/arista/x86_64-arista_7260cx3_64/sensors.conf index e0ad4b434972..1dc02fbaef98 100644 --- a/device/arista/x86_64-arista_7260cx3_64/sensors.conf +++ b/device/arista/x86_64-arista_7260cx3_64/sensors.conf @@ -8,7 +8,7 @@ bus "i2c-73" "SCD 0000:ff:0b.3 SMBus master 0 bus 0" bus "i2c-88" "SCD 0000:ff:0b.3 SMBus master 3 bus 3" chip "max6658-i2c-1-4c" - label temp1 "Temp sensor near TH2" + label temp1 "Asic temp sensor" set temp1_max 65 set temp1_crit 75 @@ -16,9 +16,9 @@ chip "max6658-i2c-1-4c" ignore temp2 chip "pmbus-i2c-3-58" - label temp1 "PSU1 primary hotspot temp" - label temp2 "PSU1 inlet temp" - label temp3 "PSU1 exhaust temp" + label temp1 "Power supply 1 hotspot sensor" + label temp2 "Power supply 1 inlet temp sensor" + label temp3 "Power supply 1 exhaust temp sensor" # setting maximum and critical thresholds is not supported for this psu # fault and warning limits defined internally by hardware @@ -27,9 +27,9 @@ chip "pmbus-i2c-3-58" ignore fan3 chip "pmbus-i2c-4-58" - label temp1 "PSU2 primary hotspot temp" - label temp2 "PSU2 inlet temp" - label temp3 "PSU2 exhaust temp" + label temp1 "Power supply 2 hotspot sensor" + label temp2 "Power supply 2 inlet temp sensor" + label temp3 "Power supply 2 exhaust temp sensor" # setting maximum and critical thresholds is not supported for this psu # fault and warning limits defined internally by hardware @@ -38,8 +38,8 @@ chip "pmbus-i2c-4-58" ignore fan3 chip "max6658-i2c-73-4c" - label temp1 "Rear air temp1" - label temp2 "Rear air temp2" + label temp1 "Back panel temp sensor 1" + label temp2 "Back panel temp sensor 2" set temp1_max 65 set temp1_crit 75 @@ -47,7 +47,7 @@ chip "max6658-i2c-73-4c" set temp2_crit 75 chip "lm73-i2c-88-48" - label temp1 "Front air temp" + label temp1 "Front panel temp sensor" set temp1_max 65 set temp1_crit 75 From 5184def0a40541d9803ccafbf88425d95906b3d7 Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 8 Dec 2017 16:31:01 -0800 Subject: [PATCH 0975/1011] [dell]: Added psuutil support for S6100/Z9100 Dell Platforms (#1223) --- .../plugins/psuutil.py | 80 +++++++++++++++++++ .../plugins/psuutil.py | 80 +++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/plugins/psuutil.py create mode 100644 device/dell/x86_64-dell_z9100_c2538-r0/plugins/psuutil.py diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/plugins/psuutil.py b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/psuutil.py new file mode 100644 index 000000000000..5ae96a841908 --- /dev/null +++ b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/psuutil.py @@ -0,0 +1,80 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError, e: + raise ImportError(str(e) + "- required module not found") + + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + # Get a mailbox register + def get_pmc_register(self, reg_name): + mailbox_dir = "/sys/devices/platform/dell_s6100_lpc" + retval = 'ERR' + mb_reg_file = mailbox_dir+'/' + reg_name + if (not os.path.isfile(mb_reg_file)): + print mb_reg_file, 'not found !' + return retval + + try: + with open(mb_reg_file, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open ", mb_reg_file, "file !") + + retval = retval.rstrip('\r\n') + return retval + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + :return: An integer, the number of PSUs available on the device + """ + S6100_MAX_PSUS = 2 + return S6100_MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is\ + faulty + """ + status = 0 + psu_status = self.get_pmc_register('psu_'+str(index)+'_status') + if (psu_status != 'ERR'): + psu_status = int(psu_status, 16) + # Check for PSU statuse + if (~psu_status & 0b1000) or (psu_status & 0b0100): + status = 1 + + return status + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + status = 0 + psu_presence = self.get_pmc_register('psu_'+str(index)+'_status') + if (psu_presence != 'ERR'): + psu_presence = int(psu_presence, 16) + # Check for PSU presence + if (~psu_presence & 0b1): + status = 1 + + return status diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/plugins/psuutil.py b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/psuutil.py new file mode 100644 index 000000000000..d3d4f9d2b34c --- /dev/null +++ b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/psuutil.py @@ -0,0 +1,80 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError, e: + raise ImportError(str(e) + "- required module not found") + + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + # Get a mailbox register + def get_pmc_register(self, reg_name): + mailbox_dir = "/sys/devices/platform/dell_mailbox" + retval = 'ERR' + mb_reg_file = mailbox_dir+'/' + reg_name + if (not os.path.isfile(mb_reg_file)): + print mb_reg_file, 'not found !' + return retval + + try: + with open(mb_reg_file, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open ", mb_reg_file, "file !") + + retval = retval.rstrip('\r\n') + return retval + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + :return: An integer, the number of PSUs available on the device + """ + Z9100_MAX_PSUS = 2 + return Z9100_MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is\ + faulty + """ + status = 0 + psu_status = self.get_pmc_register('psu_'+str(index)+'_status') + if (psu_status != 'ERR'): + psu_status = int(psu_status, 16) + # Check for PSU statuse + if (~psu_status & 0b1000) or (psu_status & 0b0100): + status = 1 + + return status + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + status = 0 + psu_presence = self.get_pmc_register('psu_'+str(index)+'_status') + if (psu_presence != 'ERR'): + psu_presence = int(psu_presence, 16) + # Check for PSU presence + if (~psu_presence & 0b1): + status = 1 + + return status From 9dc85620f37e6c187fd042bd488dde006d6404fe Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 8 Dec 2017 16:32:50 -0800 Subject: [PATCH 0976/1011] [device/arista] Add psuutil plugin for Arista platforms (#1221) * Bump sonic-platform-modules-arista submodule * Add psuutil plugnis for Arista platforms --- .../x86_64-arista_7050_qx32/plugins/psuutil.py | 12 ++++++++++++ .../x86_64-arista_7050_qx32s/plugins/psuutil.py | 12 ++++++++++++ .../x86_64-arista_7060_cx32s/plugins/psuutil.py | 12 ++++++++++++ .../x86_64-arista_7260cx3_64/plugins/psuutil.py | 12 ++++++++++++ platform/broadcom/sonic-platform-modules-arista | 2 +- 5 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 device/arista/x86_64-arista_7050_qx32/plugins/psuutil.py create mode 100644 device/arista/x86_64-arista_7050_qx32s/plugins/psuutil.py create mode 100644 device/arista/x86_64-arista_7060_cx32s/plugins/psuutil.py create mode 100644 device/arista/x86_64-arista_7260cx3_64/plugins/psuutil.py diff --git a/device/arista/x86_64-arista_7050_qx32/plugins/psuutil.py b/device/arista/x86_64-arista_7050_qx32/plugins/psuutil.py new file mode 100644 index 000000000000..1a8682ae3c67 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/plugins/psuutil.py @@ -0,0 +1,12 @@ +# psuutil.py +# +# Platform-specific PSU interface for SONiC +# + +try: + import arista.utils.sonic_psu as arista_psuutil +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +PsuUtil = arista_psuutil.getPsuUtil() diff --git a/device/arista/x86_64-arista_7050_qx32s/plugins/psuutil.py b/device/arista/x86_64-arista_7050_qx32s/plugins/psuutil.py new file mode 100644 index 000000000000..1a8682ae3c67 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/plugins/psuutil.py @@ -0,0 +1,12 @@ +# psuutil.py +# +# Platform-specific PSU interface for SONiC +# + +try: + import arista.utils.sonic_psu as arista_psuutil +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +PsuUtil = arista_psuutil.getPsuUtil() diff --git a/device/arista/x86_64-arista_7060_cx32s/plugins/psuutil.py b/device/arista/x86_64-arista_7060_cx32s/plugins/psuutil.py new file mode 100644 index 000000000000..1a8682ae3c67 --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/plugins/psuutil.py @@ -0,0 +1,12 @@ +# psuutil.py +# +# Platform-specific PSU interface for SONiC +# + +try: + import arista.utils.sonic_psu as arista_psuutil +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +PsuUtil = arista_psuutil.getPsuUtil() diff --git a/device/arista/x86_64-arista_7260cx3_64/plugins/psuutil.py b/device/arista/x86_64-arista_7260cx3_64/plugins/psuutil.py new file mode 100644 index 000000000000..1a8682ae3c67 --- /dev/null +++ b/device/arista/x86_64-arista_7260cx3_64/plugins/psuutil.py @@ -0,0 +1,12 @@ +# psuutil.py +# +# Platform-specific PSU interface for SONiC +# + +try: + import arista.utils.sonic_psu as arista_psuutil +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +PsuUtil = arista_psuutil.getPsuUtil() diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index f985b188326e..8b8411551faa 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit f985b188326e480124ec49541b4fecc51a213889 +Subproject commit 8b8411551faab9e44aa1f66dae507e3d92ecf468 From b9a0ef883c70c2b3363795b097324a7cab1a6a42 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Fri, 8 Dec 2017 17:28:01 -0800 Subject: [PATCH 0977/1011] [utilities]: Update sonic-utilities and sonic-py-swsssdk submodule (#1220) [py-swsssdk]: Adapt to py-swsssdk refactor of mod_entry and mod_config (#165) [intfutil]: Fix python indentation (#166) Change set_config to mod_config Signed-off-by: Shu0T1an ChenG --- src/sonic-config-engine/sonic-cfggen | 2 +- src/sonic-py-swsssdk | 2 +- src/sonic-utilities | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen index bb778ddefbf0..a5727d38b96f 100755 --- a/src/sonic-config-engine/sonic-cfggen +++ b/src/sonic-config-engine/sonic-cfggen @@ -210,7 +210,7 @@ def main(): if args.write_to_db: configdb = ConfigDBConnector(**db_kwargs) configdb.connect(False) - configdb.set_config(FormatConverter.output_to_db(data)) + configdb.mod_config(FormatConverter.output_to_db(data)) if args.print_data: print json.dumps(FormatConverter.to_serialized(data), indent=4, cls=minigraph_encoder) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 674fb107dfb8..1c7a6b449644 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 674fb107dfb8e45b23a55e3e7be34e39d5630942 +Subproject commit 1c7a6b4496440a8a9e7e2ab314564ce8e26aa378 diff --git a/src/sonic-utilities b/src/sonic-utilities index cc147b9d0f0a..cb8538962815 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit cc147b9d0f0a2edd1e89019052755a92840dd5f9 +Subproject commit cb8538962815ea82665a4d4b851d50ea0793811d From aa77f63378952c037a423584efdfd07eb972c2d9 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 9 Dec 2017 02:23:30 -0800 Subject: [PATCH 0978/1011] [submodules]: update sonic-swss and sonic-swss-common (#1215) --- src/sonic-swss | 2 +- src/sonic-swss-common | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-swss b/src/sonic-swss index 226f96c94e76..ff9042962145 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 226f96c94e76713f48ebdb114759584f0e1357e6 +Subproject commit ff904296214509d628ea868570f0b903ace8b146 diff --git a/src/sonic-swss-common b/src/sonic-swss-common index 82ceea09b623..283162b62d1d 160000 --- a/src/sonic-swss-common +++ b/src/sonic-swss-common @@ -1 +1 @@ -Subproject commit 82ceea09b62374cd3110c00b19536ed4d10f3d57 +Subproject commit 283162b62d1dda594a5962e9ad8b4f9b65bf65c3 From 389c3e1fd22f6bc6ea2a8518b9520a90a9e57ac6 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Mon, 11 Dec 2017 19:50:16 +0200 Subject: [PATCH 0979/1011] [mellanox]: Update MLNX SAI pointer (#1226) Signed-off-by: Andriy Moroz --- platform/mellanox/mlnx-sai.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk index 80b6d893da38..1a73cb80a660 100644 --- a/platform/mellanox/mlnx-sai.mk +++ b/platform/mellanox/mlnx-sai.mk @@ -1,7 +1,7 @@ # Mellanox SAI MLNX_SAI_VERSION = SAIRel1.9.2-master -MLNX_SAI_REVISION = 16900748ee3c97bc5836ab3684ee05b8db6ec31b +MLNX_SAI_REVISION = d098a2c89cd700d9c1278e448fd6bb047cbd59e2 export MLNX_SAI_VERSION MLNX_SAI_REVISION From 60e0295b74ea878d27480dd336beff6a012bd50d Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Mon, 11 Dec 2017 18:19:21 -0800 Subject: [PATCH 0980/1011] [Dell]: Change Dell psuutil.py file to work with Python 3.* (#1231) * change except comma to as * remove print line * change CRLF to LF Signed-off-by: Shu0T1an ChenG --- .../plugins/psuutil.py | 159 +++++++++--------- .../plugins/psuutil.py | 3 +- 2 files changed, 80 insertions(+), 82 deletions(-) diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/plugins/psuutil.py b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/psuutil.py index 5ae96a841908..83452f69aaa4 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/psuutil.py @@ -1,80 +1,79 @@ -# -# psuutil.py -# Platform-specific PSU status interface for SONiC -# - - -import os.path - -try: - from sonic_psu.psu_base import PsuBase -except ImportError, e: - raise ImportError(str(e) + "- required module not found") - - -class PsuUtil(PsuBase): - """Platform-specific PSUutil class""" - - def __init__(self): - PsuBase.__init__(self) - - # Get a mailbox register - def get_pmc_register(self, reg_name): - mailbox_dir = "/sys/devices/platform/dell_s6100_lpc" - retval = 'ERR' - mb_reg_file = mailbox_dir+'/' + reg_name - if (not os.path.isfile(mb_reg_file)): - print mb_reg_file, 'not found !' - return retval - - try: - with open(mb_reg_file, 'r') as fd: - retval = fd.read() - except Exception as error: - logging.error("Unable to open ", mb_reg_file, "file !") - - retval = retval.rstrip('\r\n') - return retval - - def get_num_psus(self): - """ - Retrieves the number of PSUs available on the device - :return: An integer, the number of PSUs available on the device - """ - S6100_MAX_PSUS = 2 - return S6100_MAX_PSUS - - def get_psu_status(self, index): - """ - Retrieves the oprational status of power supply unit (PSU) defined - by index - :param index: An integer, index of the PSU of which to query status - :return: Boolean, True if PSU is operating properly, False if PSU is\ - faulty - """ - status = 0 - psu_status = self.get_pmc_register('psu_'+str(index)+'_status') - if (psu_status != 'ERR'): - psu_status = int(psu_status, 16) - # Check for PSU statuse - if (~psu_status & 0b1000) or (psu_status & 0b0100): - status = 1 - - return status - - def get_psu_presence(self, index): - """ - Retrieves the presence status of power supply unit (PSU) defined - by index - :param index: An integer, index of the PSU of which to query status - :return: Boolean, True if PSU is plugged, False if not - """ - status = 0 - psu_presence = self.get_pmc_register('psu_'+str(index)+'_status') - if (psu_presence != 'ERR'): - psu_presence = int(psu_presence, 16) - # Check for PSU presence - if (~psu_presence & 0b1): - status = 1 - - return status +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + # Get a mailbox register + def get_pmc_register(self, reg_name): + mailbox_dir = "/sys/devices/platform/dell_s6100_lpc" + retval = 'ERR' + mb_reg_file = mailbox_dir+'/' + reg_name + if (not os.path.isfile(mb_reg_file)): + return retval + + try: + with open(mb_reg_file, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open ", mb_reg_file, "file !") + + retval = retval.rstrip('\r\n') + return retval + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + :return: An integer, the number of PSUs available on the device + """ + S6100_MAX_PSUS = 2 + return S6100_MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is\ + faulty + """ + status = 0 + psu_status = self.get_pmc_register('psu_'+str(index)+'_status') + if (psu_status != 'ERR'): + psu_status = int(psu_status, 16) + # Check for PSU statuse + if (~psu_status & 0b1000) or (psu_status & 0b0100): + status = 1 + + return status + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + status = 0 + psu_presence = self.get_pmc_register('psu_'+str(index)+'_status') + if (psu_presence != 'ERR'): + psu_presence = int(psu_presence, 16) + # Check for PSU presence + if (~psu_presence & 0b1): + status = 1 + + return status diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/plugins/psuutil.py b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/psuutil.py index d3d4f9d2b34c..2ad6ae7d1491 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/plugins/psuutil.py +++ b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/psuutil.py @@ -8,7 +8,7 @@ try: from sonic_psu.psu_base import PsuBase -except ImportError, e: +except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -24,7 +24,6 @@ def get_pmc_register(self, reg_name): retval = 'ERR' mb_reg_file = mailbox_dir+'/' + reg_name if (not os.path.isfile(mb_reg_file)): - print mb_reg_file, 'not found !' return retval try: From 69d6ad56c674d21cd0e005e2e10a7e56d3d123f9 Mon Sep 17 00:00:00 2001 From: Shuotian Cheng Date: Tue, 12 Dec 2017 00:16:25 -0800 Subject: [PATCH 0981/1011] [snmpagent]: Update sonic-snmpagent submodule (#1232) Signed-off-by: Shu0T1an ChenG --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 39f1e23cb834..5580935de8f8 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 39f1e23cb834255955f5270234c8a72b14c11d6f +Subproject commit 5580935de8f82caae071ef62cf9dc647b8f78ca0 From e0af519da2e9cca67d7fc040850e17934c8c6c57 Mon Sep 17 00:00:00 2001 From: YonatanPitz Date: Tue, 12 Dec 2017 10:38:36 +0200 Subject: [PATCH 0982/1011] [p4]: Updated p4 bm (#1228) * merged new p4 platform from 1.0.3 * reverted SAI-P4-BM to SAI1.0 * changed port_config.ini from alias to name. changed tenjin makefile to https * updated SAI-P4-BM commit * [platform/p4]: Updated P4 docker to be up to date with vs. * Merged swss, swss-common and sai-redis with master, now supports new ConfigDB. * Changed startup script to work with supervisor for managing processes. Signed-off-by: Yonatan Piasetzky yonatanp@mellanox.com * Updated SAI-BM submodule to sai v1.0.4 tag. now supports hostif vlan tag for port netdev * Updated SAI-P4-BM submodule. --- platform/p4/SAI-P4-BM | 2 +- platform/p4/docker-sonic-p4.mk | 17 ++- platform/p4/docker-sonic-p4/Dockerfile.j2 | 64 ++++++-- platform/p4/docker-sonic-p4/config_bm.sh | 4 + platform/p4/docker-sonic-p4/orchagent.sh | 15 ++ platform/p4/docker-sonic-p4/rsyslog.conf | 4 +- platform/p4/docker-sonic-p4/run_bm.sh | 23 --- platform/p4/docker-sonic-p4/sonic-dev.gpg.key | 30 ++++ platform/p4/docker-sonic-p4/start.sh | 97 ++++++++++++ platform/p4/docker-sonic-p4/startup.sh | 43 ------ platform/p4/docker-sonic-p4/supervisord.conf | 141 ++++++++++++++++++ 11 files changed, 358 insertions(+), 82 deletions(-) create mode 100755 platform/p4/docker-sonic-p4/config_bm.sh create mode 100755 platform/p4/docker-sonic-p4/orchagent.sh delete mode 100755 platform/p4/docker-sonic-p4/run_bm.sh create mode 100644 platform/p4/docker-sonic-p4/sonic-dev.gpg.key create mode 100755 platform/p4/docker-sonic-p4/start.sh delete mode 100755 platform/p4/docker-sonic-p4/startup.sh create mode 100644 platform/p4/docker-sonic-p4/supervisord.conf diff --git a/platform/p4/SAI-P4-BM b/platform/p4/SAI-P4-BM index c25b5aecabbb..c763924affd4 160000 --- a/platform/p4/SAI-P4-BM +++ b/platform/p4/SAI-P4-BM @@ -1 +1 @@ -Subproject commit c25b5aecabbb09270dc805459434ee396792ccb3 +Subproject commit c763924affd416df9c4d3e40d4f8ac1cb2be5fff diff --git a/platform/p4/docker-sonic-p4.mk b/platform/p4/docker-sonic-p4.mk index b5a63773fbbe..ebe7ceb080a2 100644 --- a/platform/p4/docker-sonic-p4.mk +++ b/platform/p4/docker-sonic-p4.mk @@ -2,7 +2,17 @@ DOCKER_SONIC_P4 = docker-sonic-p4.gz $(DOCKER_SONIC_P4)_PATH = $(PLATFORM_PATH)/docker-sonic-p4 -$(DOCKER_SONIC_P4)_DEPENDS += $(SWSS) $(SYNCD) $(P4_SWITCH) $(REDIS_SERVER) $(REDIS_TOOLS) $(LIBTEAMDCT) $(LIBTEAM_UTILS) +$(DOCKER_SONIC_P4)_DEPENDS += $(SWSS) \ + $(SYNCD) \ + $(P4_SWITCH) \ + $(REDIS_SERVER) \ + $(REDIS_TOOLS) \ + $(PYTHON_SWSSCOMMON) \ + $(LIBTEAMDCT) \ + $(LIBTEAM_UTILS) \ + $(SONIC_DEVICE_DATA) \ + $(SONIC_UTILS) \ + $(IPROUTE2) # ifeq ($(ROUTING_STACK), quagga) $(DOCKER_SONIC_P4)_DEPENDS += $(QUAGGA) @@ -12,5 +22,8 @@ $(DOCKER_SONIC_P4)_DEPENDS += $(QUAGGA) # $(DOCKER_SONIC_P4)_DEPENDS += $(GOBGP) # endif -$(DOCKER_SONIC_P4)_LOAD_DOCKERS += $(DOCKER_BASE) +$(DOCKER_SONIC_P4)_FILES += $(CONFIGDB_LOAD_SCRIPT) \ + $(ARP_UPDATE_SCRIPT) + +$(DOCKER_SONIC_P4)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_SONIC_P4) diff --git a/platform/p4/docker-sonic-p4/Dockerfile.j2 b/platform/p4/docker-sonic-p4/Dockerfile.j2 index debb89de9c14..95ac5cc1646d 100644 --- a/platform/p4/docker-sonic-p4/Dockerfile.j2 +++ b/platform/p4/docker-sonic-p4/Dockerfile.j2 @@ -1,11 +1,47 @@ -FROM docker-base +FROM docker-config-engine ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive +COPY ["sonic-dev.gpg.key", "/etc/apt/"] +RUN apt-key add /etc/apt/sonic-dev.gpg.key +RUN echo "deb http://packages.microsoft.com/repos/sonic-dev/ jessie main" >> /etc/apt/sources.list RUN apt-get update -RUN apt-get install -y net-tools ethtool tcpdump ifupdown bridge-utils python-ply libqt5core5a libqt5network5 libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0 libgmp10 libjudydebian1 libnanomsg0 libdaemon0 libjansson4 libjemalloc1 openssh-client openssh-server libc-ares2 iproute +RUN apt-get install -y net-tools \ + arping \ + ethtool \ + tcpdump \ + ifupdown \ + bridge-utils \ + python-ply \ + libqt5core5a \ + libqt5network5 \ + libboost-program-options1.55.0 \ + libboost-system1.55.0 \ + libboost-thread1.55.0 \ + libgmp10 \ + libjudydebian1 \ + libnanomsg0 \ + libdaemon0 \ + libjansson4 \ + libjemalloc1 \ + openssh-client \ + openssh-server \ + libc-ares2 \ + iproute \ + libpython2.7 \ + grub2-common \ + python-click-default-group \ + python-click \ + python-natsort \ + python-tabulate \ + bash-completion \ + libelf1 \ + libmnl0 + +RUN pip install setuptools +RUN pip install py2_ipaddress COPY \ {% for deb in docker_sonic_p4_debs.split(' ') -%} @@ -18,20 +54,26 @@ RUN dpkg -i \ debs/{{ deb }}{{' '}} {%- endfor %} -ADD port_config.ini /port_config.ini -ADD startup.sh /scripts/startup.sh -ADD run_bm.sh /scripts/run_bm.sh - -ADD rsyslog.conf /etc/rsyslog.conf - ## Clean up RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y RUN rm -rf /debs -RUN sed -ri 's/^daemonize yes$/daemonize no/; \ +RUN sed -ri 's/^(save .*$)/# \1/g; \ + s/^daemonize yes$/daemonize no/; \ s/^logfile .*$/logfile ""/; \ s/^# syslog-enabled no$/syslog-enabled no/; \ - s/^# unixsocket/unixsocket/ \ + s/^# unixsocket/unixsocket/; \ + s/notify-keyspace-events ""/notify-keyspace-events AKE/; \ + s/^client-output-buffer-limit pubsub [0-9]+mb [0-9]+mb [0-9]+/client-output-buffer-limit pubsub 0 0 0/ \ ' /etc/redis/redis.conf -ENTRYPOINT /bin/bash +ADD port_config.ini /port_config.ini +ADD rsyslog.conf /etc/rsyslog.conf +COPY ["start.sh", "orchagent.sh", "config_bm.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["files/configdb-load.sh", "/usr/bin/"] +COPY ["files/arp_update", "/usr/bin"] +RUN echo "docker-sonic-p4" > /etc/hostname +RUN touch /etc/quagga/zebra.conf + +ENTRYPOINT ["/bin/bash"] \ No newline at end of file diff --git a/platform/p4/docker-sonic-p4/config_bm.sh b/platform/p4/docker-sonic-p4/config_bm.sh new file mode 100755 index 000000000000..25de26b4da74 --- /dev/null +++ b/platform/p4/docker-sonic-p4/config_bm.sh @@ -0,0 +1,4 @@ +simple_switch_CLI --pre SimplePreLAG < /usr/share/p4-sai-bm/bridge_default_config.txt +simple_switch_CLI < /usr/share/p4-sai-bm/bridge_default_config_mirror.txt +simple_switch_CLI --pre SimplePreLAG --thrift-port 9091 < /usr/share/p4-sai-bm/router_default_config.txt +simple_switch_CLI --thrift-port 9091 < /usr/share/p4-sai-bm/router_default_config_mirror.txt \ No newline at end of file diff --git a/platform/p4/docker-sonic-p4/orchagent.sh b/platform/p4/docker-sonic-p4/orchagent.sh new file mode 100755 index 000000000000..7e250dfa20e9 --- /dev/null +++ b/platform/p4/docker-sonic-p4/orchagent.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +MAC_ADDRESS=`ip link show eth0 | grep ether | awk '{print $2}'` + +# Create a folder for SsWW record files +mkdir -p /var/log/swss +ORCHAGENT_ARGS="-d /var/log/swss " + +# Set orchagent pop batch size to 8192 +ORCHAGENT_ARGS+="-b 8192 " + +# Set mac address +ORCHAGENT_ARGS+="-m $MAC_ADDRESS" + +exec /usr/bin/orchagent ${ORCHAGENT_ARGS} diff --git a/platform/p4/docker-sonic-p4/rsyslog.conf b/platform/p4/docker-sonic-p4/rsyslog.conf index 9afd889f500b..79926a8b30c7 100644 --- a/platform/p4/docker-sonic-p4/rsyslog.conf +++ b/platform/p4/docker-sonic-p4/rsyslog.conf @@ -30,9 +30,9 @@ $ModLoad imuxsock # provides support for local system logging #### GLOBAL DIRECTIVES #### ########################### #Set remote syslog server -*.* @172.17.0.1:514 +#*.* @172.17.0.1:514 #Set local syslog -#*.* /var/log/messages +*.* /var/log/messages # # Use traditional timestamp format. diff --git a/platform/p4/docker-sonic-p4/run_bm.sh b/platform/p4/docker-sonic-p4/run_bm.sh deleted file mode 100755 index 66cea4f5d5cf..000000000000 --- a/platform/p4/docker-sonic-p4/run_bm.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -# handler() -# { - # kill -s INT $ROUTER_PID - # kill -s INT $BRIDGE_PID -# } - -set -m -ip netns exec sw_net simple_switch -i 0@router_port1 -i 250@router_cpu_port --thrift-port 9091 --log-file /tmp/router_log --log-flush --notifications-addr ipc:///tmp/bmv2-router-notifications.ipc /usr/share/p4-sai-bm/sai_router.json & -export ROUTER_PID=$! -ip netns exec sw_net simple_switch -i 0@sw_port0 -i 1@sw_port1 -i 2@sw_port2 -i 3@sw_port3 -i 4@sw_port4 -i 5@sw_port5 -i 6@sw_port6 -i 7@sw_port7 -i 7@sw_port7 -i 8@sw_port8 -i 9@sw_port9 -i 10@sw_port10 -i 11@sw_port11 -i 12@sw_port12 -i 13@sw_port13 -i 14@sw_port14 -i 15@sw_port15 -i 16@sw_port16 -i 17@sw_port17 -i 18@sw_port18 -i 19@sw_port19 -i 20@sw_port20 -i 21@sw_port21 -i 22@sw_port22 -i 23@sw_port23 -i 24@sw_port24 -i 25@sw_port25 -i 26@sw_port26 -i 27@sw_port27 -i 28@sw_port28 -i 29@sw_port29 -i 30@sw_port30 -i 31@sw_port31 -i 250@cpu_port -i 251@router_port0 --log-file /tmp/bridge_log --log-flush /usr/share/p4-sai-bm/sai_bridge.json & -export BRIDGE_PID=$! -sleep 10 -simple_switch_CLI --pre SimplePreLAG < /usr/share/p4-sai-bm/bridge_default_config.txt -simple_switch_CLI < /usr/share/p4-sai-bm/bridge_default_config_mirror.txt -simple_switch_CLI --pre SimplePreLAG --thrift-port 9091 < /usr/share/p4-sai-bm/router_default_config.txt -simple_switch_CLI --thrift-port 9091 < /usr/share/p4-sai-bm/router_default_config_mirror.txt - -# echo "router and bridge are running send SIGINT to close" - -# trap handler INT -# sleep inf -# sudo kill -s SIGINT 3319 diff --git a/platform/p4/docker-sonic-p4/sonic-dev.gpg.key b/platform/p4/docker-sonic-p4/sonic-dev.gpg.key new file mode 100644 index 000000000000..fb9a37901bc7 --- /dev/null +++ b/platform/p4/docker-sonic-p4/sonic-dev.gpg.key @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQENBFQ1bTIBCAC7oGfkv/ck0XsLuG8cdcSB2ISqxFAcBvH9BitEtxmpW2uhykKk +xY4rVD/4Uys1s3PF1/64QfPR+hYcewueOwz0ZAcLyFXXk4McICXaPq3NrLiWYKKX +UZLnrPzcrGZoW/kHDDp4OmBiDmT1PGvZlpuimwkMCusUzIr7Cbbp2dIy8MERL5tA +LcgLu3KL6clJ+aTW2jgepI1D7sTepOeGd7eRSb5njKg2M7k/93v/7MipZxiVtyXH +B74YiK6jSbst5JpuYsLa/Dqryvx7Xq3n53oif892pv3euTduo1fYw8Hgh/OOYdeT +c9WCj03KA1jCSFURjdrug0kR8BPlfjqtRLXFABEBAAG0JE1TIE9wZW4gVGVjaCA8 +aW50ZXJvcEBtaWNyb3NvZnQuY29tPokBOAQTAQIAIgUCVDVtMgIbAwYLCQgHAwIG +FQgCCQoLBBYCAwECHgECF4AACgkQsCxG30F6CJO1uAf/cmL68bM8YgF/61hkaY56 +LqrppUTJH/w4fKq47Pf6KfgSLvxfNU6soi2KHYRjIvTRx3tV4vUM5n2plaQg2s8V +/Epg4FeIRTk75YwiHAzLhLnp5cdUaTvC4j4mwxoB6j9Ty+fXJwQ0MvpDhIZb9vM4 +GXw/fEQHCT4f3gx4nReeqE+FB2wVHleX9+Lpodu98JyJTKJRBRHYLqy6S+/lyp2W +aBlsI1LOqBcx1uRK24U7duIpbYwIyrx0cafSruqR2GjVdu+imkhHyUn52VbzYhq1 +af0rqYiZ1VOamVOG0By8+hVyNa1MLc1K2uWGs0o5fDe9F5/swbvLHVXI+M50Vs+m +J7kBDQRUNW0yAQgAu7DkTVj0ZQC4F7bFivAwrdby8gCakTXOl1kcK622hjRJ8nam +aZeW+eADfLRsTmdUmXgZu1YWS5Gn2ZVngC8SGPUBT071+oRETCz4uNB7IimB9QfP +++orI6o2vmnVVsq5wWCbEdNU+TCVv1zjrYev5lwckkKpjHt6o8MNoX2DFuQymSyR +eZKaqhdKmcji4Ke7OIYqwgPjch3wxzE1b5gNOR/iwxWyjjOffZPLr/VhIfIJRs86 +dSXrwjHtEh810SKDLghHM0VAdY34nyC5ZZ61yhts5HtQDFK+9mNpH1mkc4gDBlgG +266pVvknumK6lPNm/osF/cpjWmEw24ypcQIvOQARAQABiQEfBBgBAgAJBQJUNW0y +AhsMAAoJELAsRt9BegiTMBUH/0sZ6gZy7mCTSAYT+NSXLFtGC2zNUVL80SWvfgYm +k9XPVI22MrefZfQ6M01RylyxtWXjRM8UoN8SDKWPpXumzJf831f/7om5zwutaG7b +tjDPYqRKJSbAIFZu2mN+uLrNQ2SV6XK7FoV0dtcrEX9S7RICb6i19D+70+Oh/qgU +R04H1jqS29XBzqAlIzdBoA+sYAwbOIJsSL3YyNQcUv3B5+5yR/bo/L8pnUJt6iuL +nWW+mi7r8gWPHDSrcdYq1TmmlOM7CwZPgWRZzkQPSeZz52Tt7IP47eyGJ09U4PIf +FtMH1ElL2UgHoA/F9Q88e7LkztaTqE59uXWbIYyuSMJVvRU= +=sb3d +-----END PGP PUBLIC KEY BLOCK----- diff --git a/platform/p4/docker-sonic-p4/start.sh b/platform/p4/docker-sonic-p4/start.sh new file mode 100755 index 000000000000..ae7bf4e5cf6f --- /dev/null +++ b/platform/p4/docker-sonic-p4/start.sh @@ -0,0 +1,97 @@ +#!/bin/bash -e + +# generate configuration +[ -d /etc/sonic ] || mkdir -p /etc/sonic + +if ! ip link show eth0 &> /dev/null; then + ip link add eth0 type dummy +fi + +SYSTEM_MAC_ADDRESS=$(ip link show eth0 | grep ether | awk '{print $2}') +sonic-cfggen -a '{"DEVICE_METADATA":{"localhost": {"mac": "'$SYSTEM_MAC_ADDRESS'"}}}' --print-data > /etc/sonic/init_cfg.json + +if [ -f /etc/sonic/config_db.json ]; then + sonic-cfggen -j /etc/sonic/config_db.json -j /etc/sonic/init_cfg.json --print-data > /tmp/config_db.json + mv /tmp/config_db.json /etc/sonic/config_db.json +else + sonic-cfggen -j /etc/sonic/init_cfg.json --print-data > /etc/sonic/config_db.json +fi + +mkdir -p /etc/swss/config.d/ + +# sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ipinip.json.j2 > /etc/swss/config.d/ipinip.json +# sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/mirror.json.j2 > /etc/swss/config.d/mirror.json +# sonic-cfggen -m /etc/sonic/minigraph.xml -d -t /usr/share/sonic/templates/ports.json.j2 > /etc/swss/config.d/ports.json + +# export platform=`sonic-cfggen -v platform` + +rm -f /var/run/rsyslogd.pid + +echo "Start rsyslogd" +supervisorctl start rsyslogd + +mkdir -p /var/run/redis + +echo "Start redis" +supervisorctl start redis-server + +echo "Veth Setup" +veth_setup.sh > /tmp/veth_setup.log + +echo "Start BM" +rm -rf bm_logs/bridge_log.* +rm -rf bm_logs/router_log.* +rm -rf log.txt +mkdir -p bm_logs +supervisorctl start bm_bridge +supervisorctl start bm_router + +sleep 10 +echo "BM Default config" +config_bm.sh > /tmp/config_bm.log + +/usr/bin/configdb-load.sh + +echo "Start syncd" +supervisorctl start syncd + +echo "Start orchagent" +supervisorctl start orchagent + +echo "Start portsyncd" +supervisorctl start portsyncd + +echo "Start intfsyncd" +supervisorctl start intfsyncd + +echo "Start neighsyncd" +supervisorctl start neighsyncd + +echo "Start teamsyncd" +supervisorctl start teamsyncd + +echo "Start fpmsyncd" +supervisorctl start fpmsyncd + +echo "Start intfmgrd" +supervisorctl start intfmgrd + +echo "Start vlanmgrd" +supervisorctl start vlanmgrd + +echo "Start zebra" +supervisorctl start zebra + +echo "Start bgpd" +supervisorctl start bgpd + +if [ -f /etc/swss/config.d/default_config.json ]; then + swssconfig /etc/swss/config.d/default_config.json +fi + +# Start arp_update when VLAN exists +VLAN=`sonic-cfggen -d -v 'VLAN.keys() | join(" ") if VLAN'` +if [ "$VLAN" != "" ]; then + echo "Start arp_update" + supervisorctl start arp_update +fi \ No newline at end of file diff --git a/platform/p4/docker-sonic-p4/startup.sh b/platform/p4/docker-sonic-p4/startup.sh deleted file mode 100755 index 5880d431674c..000000000000 --- a/platform/p4/docker-sonic-p4/startup.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -echo "Set onie_platform to x86_64-barefoot_p4-r0" -export onie_platform=x86_64-barefoot_p4-r0 - -echo "Start rsyslog" -rm -f /var/run/rsyslogd.pid -service rsyslog start - -echo "Start redis server" -service redis-server start & -sleep 3 - -redis-cli flushall - -echo "Veth setup" -veth_setup.sh > /tmp/veth_setup.log 2>&1 - -echo "Start BMV2" -/scripts/run_bm.sh > /tmp/run_bm.log 2>&1 & -sleep 15 - -redis-cli -n 1 set LOGLEVEL DEBUG - -echo "Start Syncd" -syncd -N > /tmp/syncd.log 2>&1 & -sleep 10 - -echo "Start Orchagent" -orchagent $* > /tmp/orchagent.log 2>&1 & -sleep 10 - -echo "Start Portsyncd" -portsyncd -p /port_config.ini > /tmp/portsyncd.log 2>&1 & - -echo "Start Intfsync" -intfsyncd > /tmp/intfsyncd.log 2>&1 & - -echo "Start Neighsyncd" -neighsyncd > /tmp/neighsyncd.log 2>&1 & - -echo "Start Fpmsyncd" -fpmsyncd > /tmp/fpmsyncd.log 2>&1 & diff --git a/platform/p4/docker-sonic-p4/supervisord.conf b/platform/p4/docker-sonic-p4/supervisord.conf new file mode 100644 index 000000000000..f4b80ceb4eb7 --- /dev/null +++ b/platform/p4/docker-sonic-p4/supervisord.conf @@ -0,0 +1,141 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=false + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:bm_router] +command=ip netns exec sw_net simple_switch -i 0@router_port1 -i 250@router_cpu_port --thrift-port 9091 --log-file bm_logs/router_log --log-flush --notifications-addr ipc:///tmp/bmv2-router-notifications.ipc /usr/share/p4-sai-bm/sai_router.json +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:bm_bridge] +command=ip netns exec sw_net simple_switch -i 0@sw_port0 -i 1@sw_port1 -i 2@sw_port2 -i 3@sw_port3 -i 4@sw_port4 -i 5@sw_port5 -i 6@sw_port6 -i 7@sw_port7 -i 7@sw_port7 -i 8@sw_port8 -i 9@sw_port9 -i 10@sw_port10 -i 11@sw_port11 -i 12@sw_port12 -i 13@sw_port13 -i 14@sw_port14 -i 15@sw_port15 -i 16@sw_port16 -i 17@sw_port17 -i 18@sw_port18 -i 19@sw_port19 -i 20@sw_port20 -i 21@sw_port21 -i 22@sw_port22 -i 23@sw_port23 -i 24@sw_port24 -i 25@sw_port25 -i 26@sw_port26 -i 27@sw_port27 -i 28@sw_port28 -i 29@sw_port29 -i 30@sw_port30 -i 31@sw_port31 -i 250@cpu_port -i 251@router_port0 --log-file bm_logs/bridge_log --log-flush /usr/share/p4-sai-bm/sai_bridge.json & +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:redis-server] +command=/usr/bin/redis-server /etc/redis/redis.conf +priority=4 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:syncd] +command=/usr/bin/syncd -uN +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:orchagent] +command=/usr/bin/orchagent.sh +priority=5 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:portsyncd] +command=/usr/bin/portsyncd -p /port_config.ini +priority=6 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:intfsyncd] +command=/usr/bin/intfsyncd +priority=7 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:neighsyncd] +command=/usr/bin/neighsyncd +priority=8 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:teamsyncd] +command=/usr/bin/teamsyncd +priority=9 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:vlanmgrd] +command=/usr/bin/vlanmgrd +priority=10 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:intfmgrd] +command=/usr/bin/intfmgrd +priority=11 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:zebra] +command=/usr/lib/quagga/zebra -A 127.0.0.1 +priority=12 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:bgpd] +command=/usr/lib/quagga/bgpd -A 127.0.0.1 -F +priority=13 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:fpmsyncd] +command=/usr/bin/fpmsyncd +priority=14 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:arp_update] +command=bash -c "/usr/bin/arp_update; sleep 300" +priority=15 +autostart=false +autorestart=true +stdout_logfile=syslog +stderr_logfile=syslog \ No newline at end of file From dce6d3536bfda3c5377ef0fdbdc1592e30c7982f Mon Sep 17 00:00:00 2001 From: Liuqu Date: Tue, 12 Dec 2017 19:45:44 +0800 Subject: [PATCH 0983/1011] [TACACS+]: Add configDB enforcer for TACACS+ (#1214) * [TACACS+]: Add configDB enforcer for TACACS+ * hostcfgd - configDB enforcer for TACACS+, listen configDB to modify the pam configuration for Authentication in host * Add a service script for hostcfgd Signed-off-by: Chenchen Qi * [TACACS+]: Generate conf file by template file * Generate common-auth-sonic and tacplus_nss.conf by jinja2 template Signed-off-by: Chenchen Qi --- .../build_templates/sonic_debian_extension.j2 | 6 + .../hostcfgd/common-auth-sonic.j2 | 43 +++++ files/image_config/hostcfgd/hostcfgd | 172 ++++++++++++++++++ files/image_config/hostcfgd/hostcfgd.service | 11 ++ .../image_config/hostcfgd/tacplus_nss.conf.j2 | 25 +++ 5 files changed, 257 insertions(+) create mode 100644 files/image_config/hostcfgd/common-auth-sonic.j2 create mode 100755 files/image_config/hostcfgd/hostcfgd create mode 100644 files/image_config/hostcfgd/hostcfgd.service create mode 100644 files/image_config/hostcfgd/tacplus_nss.conf.j2 diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index fd67444fb475..7de8f8597917 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -128,6 +128,12 @@ sudo cp $IMAGE_CONFIGS/interfaces/*.j2 $FILESYSTEM_ROOT/usr/share/sonic/template # Copy initial interfaces configuration file, will be overwritten on first boot sudo cp $IMAGE_CONFIGS/interfaces/init_interfaces $FILESYSTEM_ROOT/etc/network +# Copy hostcfgd files +sudo cp $IMAGE_CONFIGS/hostcfgd/hostcfgd.service $FILESYSTEM_ROOT/etc/systemd/system/ +sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable hostcfgd.service +sudo cp $IMAGE_CONFIGS/hostcfgd/hostcfgd $FILESYSTEM_ROOT/usr/bin/ +sudo cp $IMAGE_CONFIGS/hostcfgd/*.j2 $FILESYSTEM_ROOT/usr/share/sonic/templates/ + # Copy hostname configuration scripts sudo cp $IMAGE_CONFIGS/hostname/hostname-config.service $FILESYSTEM_ROOT/etc/systemd/system/ sudo LANG=C chroot $FILESYSTEM_ROOT systemctl enable hostname-config.service diff --git a/files/image_config/hostcfgd/common-auth-sonic.j2 b/files/image_config/hostcfgd/common-auth-sonic.j2 new file mode 100644 index 000000000000..d91a02120f82 --- /dev/null +++ b/files/image_config/hostcfgd/common-auth-sonic.j2 @@ -0,0 +1,43 @@ +# THIS IS AN AUTO-GENERATED FILE +# +# /etc/pam.d/common-auth- authentication settings common to all services +# This file is included from other service-specific PAM config files, +# and should contain a list of the authentication modules that define +# the central authentication scheme for use on the system +# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the +# traditional Unix authentication mechanisms. +# +# here are the per-package modules (the "Primary" block) + +{% if auth['login'] == 'local' %} +auth [success=1 default=ignore] pam_unix.so nullok try_first_pass + +{% elif auth['login'] == 'local,tacacs+' %} +auth [success=done new_authtok_reqd=done default=ignore{{ ' auth_err=die' if not auth['failthrough'] }}] pam_unix.so nullok try_first_pass +{% for server in servers | sub(0, -1) %} +auth [success=done new_authtok_reqd=done default=ignore{{ ' auth_err=die' if not auth['failthrough'] }}] pam_tacplus.so server={{ server.ip }}:{{ server.tcp_port }} secret={{ server.passkey }} login={{ server.auth_type }} timeout={{ server.timeout }} try_first_pass +{% endfor %} +{% if servers | count %} +{% set last_server = servers | last %} +auth [success=1 default=ignore] pam_tacplus.so server={{ last_server.ip }}:{{ last_server.tcp_port }} secret={{ last_server.passkey }} login={{ last_server.auth_type }} timeout={{ last_server.timeout }} try_first_pass + +{% endif %} +{% elif auth['login'] == 'tacacs+' or auth['login'] == 'tacacs+,local' %} +{% for server in servers %} +auth [success=done new_authtok_reqd=done default=ignore{{ ' auth_err=die' if not auth['failthrough'] }}] pam_tacplus.so server={{ server.ip }}:{{ server.tcp_port }} secret={{ server.passkey }} login={{ server.auth_type }} timeout={{ server.timeout }} try_first_pass +{% endfor %} +auth [success=1 default=ignore] pam_unix.so nullok try_first_pass + +{% else %} +auth [success=1 default=ignore] pam_unix.so nullok try_first_pass + +{% endif %} +# +# here's the fallback if no module succeeds +auth requisite pam_deny.so +# prime the stack with a positive return value if there isn't one already; +# this avoids us returning an error just because nothing sets a success code +# since the modules above will each just jump around +auth required pam_permit.so +# and here are more per-package modules (the "Additional" block) + diff --git a/files/image_config/hostcfgd/hostcfgd b/files/image_config/hostcfgd/hostcfgd new file mode 100755 index 000000000000..837c5351e0eb --- /dev/null +++ b/files/image_config/hostcfgd/hostcfgd @@ -0,0 +1,172 @@ +#!/usr/bin/python -u +# -*- coding: utf-8 -*- + +import os +import sys +import subprocess +import syslog +import jinja2 +from swsssdk import ConfigDBConnector + +# FILE +PAM_AUTH_CONF = "/etc/pam.d/common-auth-sonic" +PAM_AUTH_CONF_TEMPLATE = "/usr/share/sonic/templates/common-auth-sonic.j2" +NSS_TACPLUS_CONF = "/etc/tacplus_nss.conf" +NSS_TACPLUS_CONF_TEMPLATE = "/usr/share/sonic/templates/tacplus_nss.conf.j2" +NSS_CONF = "/etc/nsswitch.conf" + +# TACACS+ +TACPLUS_SERVER_PASSKEY_DEFAULT = "" +TACPLUS_SERVER_TIMEOUT_DEFAULT = "5" +TACPLUS_SERVER_AUTH_TYPE_DEFAULT = "pap" + + +def is_true(val): + if val == 'True' or val == 'true': + return True + else: + return False + + +def sub(l, start, end): + return l[start:end] + + +class AaaCfg(object): + def __init__(self): + self.auth_default = { + 'login': 'local', + 'failthrough': True, + 'fallback': True + } + self.tacplus_global_default = { + 'auth_type': TACPLUS_SERVER_AUTH_TYPE_DEFAULT, + 'timeout': TACPLUS_SERVER_TIMEOUT_DEFAULT, + 'passkey': TACPLUS_SERVER_PASSKEY_DEFAULT + } + self.auth = {} + self.tacplus_global = {} + self.tacplus_servers = {} + self.debug = False + + # Load conf from ConfigDb + def load(self, aaa_conf, tac_global_conf, tacplus_conf): + for row in aaa_conf: + self.aaa_update(row, aaa_conf[row], modify_conf=False) + for row in tac_global_conf: + self.tacacs_global_update(row, tac_global_conf[row], modify_conf=False) + for row in tacplus_conf: + self.tacacs_server_update(row, tacplus_conf[row], modify_conf=False) + self.modify_conf_file() + + def aaa_update(self, key, data, modify_conf=True): + if key == 'authentication': + self.auth = data + if 'failthrough' in data: + self.auth['failthrough'] = is_true(data['failthrough']) + if 'debug' in data: + self.debug = is_true(data['debug']) + if modify_conf: + self.modify_conf_file() + + def tacacs_global_update(self, key, data, modify_conf=True): + if key == 'global': + self.tacplus_global = data + if modify_conf: + self.modify_conf_file() + + def tacacs_server_update(self, key, data, modify_conf=True): + if data == {}: + if key in self.tacplus_servers: + del self.tacplus_servers[key] + else: + self.tacplus_servers[key] = data + + if modify_conf: + self.modify_conf_file() + + def modify_conf_file(self): + auth = self.auth_default.copy() + auth.update(self.auth) + tacplus_global = self.tacplus_global_default.copy() + tacplus_global.update(self.tacplus_global) + + servers_conf = [] + if self.tacplus_servers: + for addr in self.tacplus_servers: + server = tacplus_global.copy() + server['ip'] = addr + server.update(self.tacplus_servers[addr]) + servers_conf.append(server) + sorted(servers_conf, key=lambda t: t['priority'], reverse=True) + + template_file = os.path.abspath(PAM_AUTH_CONF_TEMPLATE) + env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'), trim_blocks=True) + env.filters['sub'] = sub + template = env.get_template(template_file) + pam_conf = template.render(auth=auth, servers=servers_conf) + with open(PAM_AUTH_CONF, 'w') as f: + f.write(pam_conf) + + # Modify common-auth include file in /etc/pam.d/login and sshd + if os.path.isfile(PAM_AUTH_CONF): + os.system("sed -i -e '/^@include/s/common-auth$/common-auth-sonic/' /etc/pam.d/sshd") + os.system("sed -i -e '/^@include/s/common-auth$/common-auth-sonic/' /etc/pam.d/login") + else: + os.system("sed -i -e '/^@include/s/common-auth-sonic$/common-auth/' /etc/pam.d/sshd") + os.system("sed -i -e '/^@include/s/common-auth-sonic$/common-auth/' /etc/pam.d/login") + + # Add tacplus in nsswitch.conf if TACACS+ enable + if 'tacacs+' in auth['login']: + if os.path.isfile(NSS_CONF): + os.system("sed -i -e '/tacplus/b' -e '/^passwd/s/compat/& tacplus/' /etc/nsswitch.conf") + else: + if os.path.isfile(NSS_CONF): + os.system("sed -i -e '/^passwd/s/ tacplus//' /etc/nsswitch.conf") + + # Set tacacs+ server in nss-tacplus conf + template_file = os.path.abspath(NSS_TACPLUS_CONF_TEMPLATE) + template = env.get_template(template_file) + nss_tacplus_conf = template.render(debug=self.debug, servers=servers_conf) + with open(NSS_TACPLUS_CONF, 'w') as f: + f.write(nss_tacplus_conf) + + +class HostConfigDaemon: + def __init__(self): + self.config_db = ConfigDBConnector() + self.config_db.connect(wait_for_init=True, retry_on=True) + syslog.syslog(syslog.LOG_INFO, 'ConfigDB connect success') + aaa = self.config_db.get_table('AAA') + tacacs_global = self.config_db.get_table('TACPLUS') + tacacs_server = self.config_db.get_table('TACPLUS_SERVER') + self.aaacfg = AaaCfg() + self.aaacfg.load(aaa, tacacs_global, tacacs_server) + + def aaa_handler(self, key, data): + syslog.syslog(syslog.LOG_DEBUG, 'value for {} changed to {}'.format(key, data)) + self.aaacfg.aaa_update(key, data) + + def tacacs_server_handler(self, key, data): + syslog.syslog(syslog.LOG_DEBUG, 'value for {} changed to {}'.format(key, data)) + self.aaacfg.tacacs_server_update(key, data) + + def tacacs_global_handler(self, key, data): + syslog.syslog(syslog.LOG_DEBUG, 'value for {} changed to {}'.format(key, data)) + self.aaacfg.tacacs_global_update(key, data) + + def start(self): + self.config_db.subscribe('AAA', lambda table, key, data: self.aaa_handler(key, data)) + self.config_db.subscribe('TACPLUS_SERVER', lambda table, key, data: self.tacacs_server_handler(key, data)) + self.config_db.subscribe('TACPLUS', lambda table, key, data: self.tacacs_global_handler(key, data)) + self.config_db.listen() + + +def main(): + daemon = HostConfigDaemon() + daemon.start() + + +if __name__ == "__main__": + main() + diff --git a/files/image_config/hostcfgd/hostcfgd.service b/files/image_config/hostcfgd/hostcfgd.service new file mode 100644 index 000000000000..4f6151a471fe --- /dev/null +++ b/files/image_config/hostcfgd/hostcfgd.service @@ -0,0 +1,11 @@ +[Unit] +Description=Host config enforcer daemon +Requires=database.service +After=database.service + +[Service] +Type=simple +ExecStart=/usr/bin/hostcfgd + +[Install] +WantedBy=multi-user.target diff --git a/files/image_config/hostcfgd/tacplus_nss.conf.j2 b/files/image_config/hostcfgd/tacplus_nss.conf.j2 new file mode 100644 index 000000000000..61ab905ecb84 --- /dev/null +++ b/files/image_config/hostcfgd/tacplus_nss.conf.j2 @@ -0,0 +1,25 @@ +onfiguration for libnss-tacplus + +# debug - If you want to open debug log, set it on +# Default: off +# debug=on +{% if debug %} +debug=on +{% endif %} + +# server - set ip address, tcp port, secret string and timeout for TACACS+ servers +# Default: None (no TACACS+ server) +# server=1.1.1.1:49,secret=test,timeout=3 +{% for server in servers %} +server={{ server.ip }}:{{ server.tcp_port }},secret={{ server.passkey }},timeout={{ server.timeout }} +{% endfor %} + +# user_priv - set the map between TACACS+ user privilege and local user's passwd +# Default: +# user_priv=15;pw_info=remote_user_su;gid=1000;group=sudo,docker;shell=/bin/bash +# user_priv=1;pw_info=remote_user;gid=999;group=docker;shell=/bin/bash + +# many_to_one - create one local user for many TACACS+ users which has the same privilege +# Default: many_to_one=n +# many_to_one=y + From a47b93476b01dbf329ae05c0eb62d522ce8da67b Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Tue, 12 Dec 2017 17:18:57 +0200 Subject: [PATCH 0984/1011] Update sonic-utilities reference (ecnconfig) (#1225) Signed-off-by: Andriy Moroz --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index cb8538962815..be91f161b290 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit cb8538962815ea82665a4d4b851d50ea0793811d +Subproject commit be91f161b290328773b98f1e21f7feee797ce91c From 79f790409fa34bf62f9a34aeaafdaa0685216ed5 Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Tue, 12 Dec 2017 16:29:32 -0800 Subject: [PATCH 0985/1011] [snmpagent]: Update sonic-snmpagent submodule (#1234) Signed-off-by: Qi Luo --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 5580935de8f8..bedc2ec1d018 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 5580935de8f82caae071ef62cf9dc647b8f78ca0 +Subproject commit bedc2ec1d018333fefe67390fba5b5f65c62ba6f From 2571cb59b6fc9da38d4f7c00dc39ae5b04ab2cf3 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 12 Dec 2017 23:56:59 -0800 Subject: [PATCH 0986/1011] [DHCP relay]: Fix bug which could cause incorrect interface name association (#1233) * [DHCP relay]: Fix bug which could cause incorrect interface name association * Add patches to series file and apply using stgit * Update .gitignore in order to ignore downloaded and generated files * Reorganize src/ subdirectories alphabetically in .gitignore --- .gitignore | 23 +- src/isc-dhcp/Makefile | 13 +- ...d-remote_id-and-bridge-iface-support.patch | 442 ------------------ ...ion-82-circuit-ID-and-remote-ID-fiel.patch | 266 +++++++++++ ...ining-name-of-physical-interface-tha.patch | 114 +++++ ...ing-port-alias-map-file-to-replace-p.patch | 177 +++++++ src/isc-dhcp/patch/series | 4 + 7 files changed, 582 insertions(+), 457 deletions(-) delete mode 100644 src/isc-dhcp/isc-dhcp-4.3.3-6_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch create mode 100644 src/isc-dhcp/patch/0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch create mode 100644 src/isc-dhcp/patch/0002-Support-for-obtaining-name-of-physical-interface-tha.patch create mode 100644 src/isc-dhcp/patch/0003-Support-for-loading-port-alias-map-file-to-replace-p.patch create mode 100644 src/isc-dhcp/patch/series diff --git a/.gitignore b/.gitignore index 463994a75e8e..069e663c1966 100644 --- a/.gitignore +++ b/.gitignore @@ -12,28 +12,31 @@ target/ # Subdirectories in src src/hiredis/* !src/hiredis/Makefile +src/igb/* +!src/igb/Makefile src/initramfs-tools/* !src/initramfs-tools/Makefile -src/redis/* -!src/redis/Makefile +src/isc-dhcp/* +!src/isc-dhcp/Makefile +!src/isc-dhcp/patch/ src/libnl3/* !src/libnl3/Makefile src/libteam/* !src/libteam/Makefile -src/snmpd/* -!src/snmpd/Makefile -src/thrift/* -!src/thrift/Makefile -src/sonic-device-data/src/device/ -src/sonic-device-data/src/debian/ -src/igb/* -!src/igb/Makefile src/mpdecimal/* !src/mpdecimal/Makefile src/python3/* !src/python3/Makefile +src/redis/* +!src/redis/Makefile +src/snmpd/* +!src/snmpd/Makefile +src/sonic-device-data/src/device/ +src/sonic-device-data/src/debian/ src/supervisor/* !src/supervisor/Makefile +src/thrift/* +!src/thrift/Makefile # Autogenerated Dockerfiles dockers/docker-base/Dockerfile diff --git a/src/isc-dhcp/Makefile b/src/isc-dhcp/Makefile index ec4c185b79f9..5b1cb8407005 100644 --- a/src/isc-dhcp/Makefile +++ b/src/isc-dhcp/Makefile @@ -12,14 +12,17 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : # Clone isc-dhcp repo git clone https://anonscm.debian.org/cgit/pkg-dhcp/isc-dhcp.git pushd ./isc-dhcp - git checkout -f debian/$(ISC_DHCP_VERSION) - popd - # Apply patch - patch -p1 < isc-dhcp-$(ISC_DHCP_VERSION)_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch + # Reset HEAD to the commit of the proper tag + # NOTE: Using "git checkout " here detaches our HEAD, + # which stg doesn't like, so we use this method instead + git reset --hard debian/$(ISC_DHCP_VERSION) + + # Apply patches + stg init + stg import -s ../patch/series # Build source and Debian packages - pushd ./isc-dhcp dpkg-buildpackage -rfakeroot -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) popd diff --git a/src/isc-dhcp/isc-dhcp-4.3.3-6_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch b/src/isc-dhcp/isc-dhcp-4.3.3-6_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch deleted file mode 100644 index 6d2a850379cd..000000000000 --- a/src/isc-dhcp/isc-dhcp-4.3.3-6_dhcrelay-custom-circuit_id-remote_id-and-bridge-iface-support.patch +++ /dev/null @@ -1,442 +0,0 @@ -This patch adds the following functionality to dhcrelay in isc-dhcp v4.3.3-6: -* Add customizable Circuit ID and Remote ID fields -* Support for obtaining name of physical interfaces that are part of a bridge interface - -diff -ruN a/isc-dhcp/relay/dhcrelay.c b/isc-dhcp/relay/dhcrelay.c ---- a/isc-dhcp/relay/dhcrelay.c 2017-11-17 00:36:51.575121900 +0000 -+++ b/isc-dhcp/relay/dhcrelay.c 2017-11-17 00:52:51.024607833 +0000 -@@ -73,6 +73,8 @@ - did not match any known circuit ID. */ - int missing_circuit_id = 0; /* Circuit ID option in matching RAI option - was missing. */ -+const char *agent_circuit_id_fmt = NULL; /* Circuit ID custom format string. */ -+const char *agent_remote_id_fmt = NULL; /* Remote ID custom format string. */ - int max_hop_count = 10; /* Maximum hop count */ - - #ifdef DHCPv6 -@@ -120,6 +122,14 @@ - char *dhcrelay_sub_id = NULL; - #endif - -+struct interface_name_alias_tuple { -+ char if_name[IFNAMSIZ + 1]; -+ char if_alias[IFNAMSIZ + 1]; -+}; -+ -+static struct interface_name_alias_tuple *g_interface_name_alias_map = NULL; -+static size_t g_interface_name_alias_map_size = 0; -+ - static void do_relay4(struct interface_info *, struct dhcp_packet *, - unsigned int, unsigned int, struct iaddr, - struct hardware *); -@@ -132,6 +142,10 @@ - struct interface_info **, - struct dhcp_packet *, unsigned); - -+static int load_interface_alias_map(const char *port_alias_map_file_path); -+static int get_interface_alias_by_name(const char *if_name, char *if_alias_out); -+static void free_interface_alias_map(void); -+ - static const char copyright[] = - "Copyright 2004-2015 Internet Systems Consortium."; - static const char arr[] = "All rights reserved."; -@@ -140,28 +154,41 @@ - static const char url[] = - "For info, please visit https://www.isc.org/software/dhcp/"; - -+#define DHCRELAY_OPTION82_USAGE \ -+"circuit_id/remote_id interpreted sequences are:\n" \ -+"\n" \ -+" %%%% A single %%\n" \ -+" %%h Hostname of device\n" \ -+" %%p Alias of interface that generated the request\n" \ -+" %%P Hardware address of interface that generated the request\n" \ -+" %%C Client hardware address\n" \ -+" %%I DHCP relay agent IP Address\n" \ -+ - #ifdef DHCPv6 - #define DHCRELAY_USAGE \ --"Usage: dhcrelay [-4] [-d] [-q] [-a] [-D]\n"\ -+"Usage: dhcrelay [-4] [-d] [-q] [-a ] [-D]\n"\ - " [-A ] [-c ] [-p ]\n" \ - " [-pf ] [--no-pid]\n"\ - " [-m append|replace|forward|discard]\n" \ -+" [--name-alias-map-file ]\n" \ - " [-i interface0 [ ... -i interfaceN]\n" \ - " server0 [ ... serverN]\n\n" \ - " dhcrelay -6 [-d] [-q] [-I] [-c ] [-p ]\n" \ - " [-pf ] [--no-pid]\n" \ -+" [--name-alias-map-file ]\n" \ - " [-s ]\n" \ - " -l lower0 [ ... -l lowerN]\n" \ - " -u upper0 [ ... -u upperN]\n" \ - " lower (client link): [address%%]interface[#index]\n" \ --" upper (server link): [address%%]interface" -+" upper (server link): [address%%]interface\n\n" DHCRELAY_OPTION82_USAGE - #else - #define DHCRELAY_USAGE \ --"Usage: dhcrelay [-d] [-q] [-a] [-D] [-A ] [-c ] [-p ]\n" \ --" [-pf ] [--no-pid]\n" \ -+"Usage: dhcrelay [-d] [-q] [-a ] [-D]\n" \ -+" [-A ] [-c ] [-p ]\n" \ -+" [-pf ] [--no-pid]\n"\ - " [-m append|replace|forward|discard]\n" \ - " [-i interface0 [ ... -i interfaceN]\n" \ --" server0 [ ... serverN]\n\n" -+" server0 [ ... serverN]\n\n" DHCRELAY_OPTION82_USAGE - #endif - - static void usage() { -@@ -287,6 +314,15 @@ - local_family_set = 1; - local_family = AF_INET; - #endif -+ if (++i == argc) -+ usage(); -+ -+ if (argv[i] != NULL && argv[i][0] != '-') -+ agent_circuit_id_fmt = argv[i++]; -+ -+ if (argv[i] != NULL && argv[i][0] != '-') -+ agent_remote_id_fmt = argv[i]; -+ - add_agent_options = 1; - } else if (!strcmp(argv[i], "-A")) { - #ifdef DHCPv6 -@@ -383,6 +419,13 @@ - no_dhcrelay_pid = ISC_TRUE; - } else if (!strcmp(argv[i], "--no-pid")) { - no_pid_file = ISC_TRUE; -+ } else if (!strcmp(argv[i], "--name-alias-map-file")) { -+ if (++i == argc) -+ usage(); -+ if (load_interface_alias_map(argv[i]) != 0) -+ log_fatal("Failed to load interface name-alias map."); -+ path_dhcrelay_pid = argv[i]; -+ no_dhcrelay_pid = ISC_TRUE; - } else if (!strcmp(argv[i], "--version")) { - log_info("isc-dhcrelay-%s", PACKAGE_VERSION); - exit(0); -@@ -602,6 +645,8 @@ - dispatch(); - - /* In fact dispatch() never returns. */ -+ free_interface_alias_map(); -+ - return (0); - } - -@@ -690,10 +735,10 @@ - &to, htop) < 0) { - ++server_packet_errors; - } else { -- log_debug("Forwarded BOOTREPLY for %s to %s", -- print_hw_addr(packet->htype, packet->hlen, -- packet->chaddr), -- inet_ntoa(to.sin_addr)); -+ //log_debug("Forwarded BOOTREPLY for %s to %s", -+ // print_hw_addr(packet->htype, packet->hlen, -+ // packet->chaddr), -+ // inet_ntoa(to.sin_addr)); - - ++server_packets_relayed; - } -@@ -732,10 +777,11 @@ - &sp->to, NULL) < 0) { - ++client_packet_errors; - } else { -- log_debug("Forwarded BOOTREQUEST for %s to %s", -- print_hw_addr(packet->htype, packet->hlen, -- packet->chaddr), -- inet_ntoa(sp->to.sin_addr)); -+ //log_debug("Forwarded BOOTREQUEST for %s to %s", -+ // print_hw_addr(packet->htype, packet->hlen, -+ // packet->chaddr), -+ // inet_ntoa(sp->to.sin_addr)); -+ - ++client_packets_relayed; - } - } -@@ -937,6 +983,151 @@ - return (-1); - } - -+static int -+_bridgefdbquery(const char *hwAddr, char *interface, int *vlanid) { -+ -+#define xstr(s) str(s) -+#define str(s) #s -+#define FDB_STRING_LEN 100 -+#define FDB_BUFFER_LEN (FDB_STRING_LEN + 1) -+ -+/* -+ * Format for sscanf() to read the 1st, 3th, and 5th -+ * space-delimited fields -+ * -+ * bridge fdb show output -+ * 6c:64:1a:00:06:13 dev swp35 vlan 0 master bridge permanent -+ */ -+#define FDB_LINE_FORMAT "%" xstr(FDB_STRING_LEN) "s %*s " \ -+ "%" xstr(FDB_STRING_LEN) "s %*s %d %*s" -+ -+ char cmdstr[FDB_BUFFER_LEN]; -+ char buf[FDB_BUFFER_LEN]; -+ char macAddr[FDB_BUFFER_LEN]; -+ -+ if ((interface == NULL) || (vlanid == NULL)) { -+ return 0; -+ } -+ sprintf(cmdstr, "bridge fdb show | grep -m 1 %s", hwAddr); -+ FILE *cmd = popen(cmdstr, "r"); -+ -+ if (cmd != NULL) { -+ while (fgets(buf, sizeof(buf), cmd)) { -+ sscanf(buf, FDB_LINE_FORMAT, macAddr, interface, vlanid); -+ //log_debug("bridgefdbquery: macAddr:%s interface: %s vlanid %d", -+ // macAddr, interface, *vlanid); -+ } -+ pclose(cmd); -+ return 0; -+ } -+ -+ return -1; -+} -+ -+/* -+ * Format the message that will be used by circuit_id and remote_id -+ */ -+static int -+format_relay_agent_rfc3046_msg(struct interface_info *ip, struct dhcp_packet *packet, -+ const char *format, char *msg, size_t msgn) { -+ size_t len = 0; -+ char hostname[HOST_NAME_MAX + 1] = { 0 }; -+ char ifname[IFNAMSIZ + 1] = { 0 }; -+ char *buf = msg; -+ -+ for ( ; format && *format && len < msgn; ++format) { -+ size_t strn = 0; -+ const char *str = NULL; -+ -+ if (*format == '%') { -+ switch (*++format) { -+ case '\0': -+ --format; -+ break; -+ -+ case '%': /* A literal '%' */ -+ str = "%"; -+ break; -+ -+ case 'h': /* Hostname */ -+ gethostname(hostname, HOST_NAME_MAX); -+ str = hostname; -+ break; -+ -+ case 'p': /* Name of interface that we received the request from */ -+ /* -+ * Query FDB to identify the exact physical interface only when source MAC address -+ * is present and '20: DHCP relay agent IP address' (giaddr) is not present -+ */ -+ if (packet->htype && !packet->giaddr.s_addr) { -+ int ret = 0, vlanid = 0; -+ -+ ret = _bridgefdbquery(print_hw_addr(packet->htype, packet->hlen, packet->chaddr), -+ ip->name, -+ &vlanid); -+ -+ if (ret < 0) { -+ //log_debug("MAC Address: %s (interface:%s vlan:%d) not found in bridge fdb show", -+ // print_hw_addr (packet->htype, packet->hlen, packet->chaddr), -+ // ip->name, -+ // vlanid); -+ -+ strncpy(ifname, ip->name, IFNAMSIZ); -+ } -+ else if (strlen(ip->name) > 0) { -+ // Translate SONiC interface name to vendor alias -+ if (get_interface_alias_by_name(ip->name, ifname) < 0) { -+ log_error("Failed to retrieve alias for interface name '%s'. Defaulting to interface name.", ip->name); -+ strncpy(ifname, ip->name, IFNAMSIZ); -+ } -+ -+ //log_debug("Mapped interface name '%s' to alias '%s'", ip->name, ifname); -+ -+ //log_debug("Adding option 82 interface alias for MAC Address %s as '%s'", -+ // print_hw_addr (packet->htype, packet->hlen, packet->chaddr), -+ // ifname); -+ } -+ -+ str = ifname; -+ } -+ break; -+ -+ case 'P': /* Physical address of interface that we received the request from */ -+ str = print_hw_addr(ip->hw_address.hbuf[0], ip->hw_address.hlen - 1, &ip->hw_address.hbuf[1]); -+ break; -+ -+ case 'C': /* 24: Client hardware address */ -+ str = print_hw_addr(packet->htype, packet->hlen, packet->chaddr); -+ break; -+ -+ case 'I': /* 20: DHCP relay agent IP address */ -+ str = inet_ntoa(packet->giaddr); -+ break; -+ -+ default: -+ log_error("Option %%%c is unrecognized and will not be formatted!", *format); -+ continue; -+ } -+ -+ if (str) -+ strn = strlen(str); -+ } else { -+ str = format; -+ strn += 1; -+ } -+ -+ // Do we have room? -+ if ((strn+len) > msgn) { -+ return 0; -+ } -+ -+ memcpy(buf+len, str, strn); -+ len += strn; -+ } -+ -+ return len; -+} -+ - /* - * Examine a packet to see if it's a candidate to have a Relay - * Agent Information option tacked onto its tail. If it is, tack -@@ -948,6 +1139,8 @@ - int is_dhcp = 0, mms; - unsigned optlen; - u_int8_t *op, *nextop, *sp, *max, *end_pad = NULL; -+ char circuit_id_buf[255] = { '\0', }; -+ char remote_id_buf[255] = { '\0', }; - - /* If we're not adding agent options to packets, we can skip - this. */ -@@ -1077,6 +1270,38 @@ - op = sp; - #endif - -+ /* option82: custom string for circuit_id */ -+ if (agent_circuit_id_fmt) { -+ size_t len = 0; -+ -+ len = format_relay_agent_rfc3046_msg(ip, packet, agent_circuit_id_fmt, -+ circuit_id_buf, sizeof(circuit_id_buf)); -+ -+ if (len > 0) { -+ ip->circuit_id = (uint8_t *)circuit_id_buf; -+ ip->circuit_id_len = len; -+ -+ //log_debug("Sending on %s option82:circuit_id='%s' (%d)", -+ // ip->name, (char *)ip->circuit_id, ip->circuit_id_len); -+ } -+ } -+ -+ /* option82: custom string for remote_id */ -+ if (agent_remote_id_fmt) { -+ size_t len = 0; -+ -+ len = format_relay_agent_rfc3046_msg(ip, packet, agent_remote_id_fmt, -+ remote_id_buf, sizeof(remote_id_buf)); -+ -+ if (len > 0) { -+ ip->remote_id = (uint8_t *)remote_id_buf; -+ ip->remote_id_len = len; -+ -+ //log_debug("Sending on %s option82:remote_id='%s' (%d)", -+ // ip->name, (char *)ip->remote_id, ip->remote_id_len); -+ } -+ } -+ - /* Sanity check. Had better not ever happen. */ - if ((ip->circuit_id_len > 255) ||(ip->circuit_id_len < 1)) - log_fatal("Circuit ID length %d out of range [1-255] on " -@@ -1102,7 +1327,7 @@ - * If not, forward without adding the option. - */ - if (max - sp >= optlen + 3) { -- log_debug("Adding %d-byte relay agent option", optlen + 3); -+ //log_debug("Adding %d-byte relay agent option", optlen + 3); - - /* Okay, cons up *our* Relay Agent Information option. */ - *sp++ = DHO_DHCP_AGENT_OPTIONS; -@@ -1735,3 +1960,73 @@ - - exit(0); - } -+ -+#define MAX_PORT_CONFIG_LINE_LEN 1024 -+ -+// Allocates and loads global map g_interface_name_alias_map -+// Also sets global g_interface_name_alias_map_size -+static int -+load_interface_alias_map(const char *port_alias_map_file_path) { -+ int i = 0; -+ FILE *fp = NULL; -+ char line[MAX_PORT_CONFIG_LINE_LEN] = { 0 }; -+ -+ fp = fopen(port_alias_map_file_path,"r"); -+ if (fp == NULL) { -+ log_error("Unable to open %s", port_alias_map_file_path); -+ return -1; -+ } -+ -+ g_interface_name_alias_map_size = 0; -+ -+ // Count the number of interfaces listed in the file -+ while (fgets(line, sizeof(line), fp)) { -+ g_interface_name_alias_map_size++; -+ } -+ -+ // Allocate our map accordingly -+ g_interface_name_alias_map = ((struct interface_name_alias_tuple *) -+ dmalloc((sizeof(struct interface_name_alias_tuple) * g_interface_name_alias_map_size), -+ MDL)); -+ -+ // Reset file position indicator to beginning of file -+ fseek(fp, 0, SEEK_SET); -+ -+ // Every line should contain exactly one name-alias pair -+ while (fgets(line, sizeof(line), fp)) { -+ // Each line should read as "" -+ sscanf(line, "%s %s", g_interface_name_alias_map[i].if_name, g_interface_name_alias_map[i].if_alias); -+ i++; -+ } -+ -+ fclose(fp); -+ -+ log_info("Loaded %d interface name-alias mappings", i); -+ -+ return 0; -+} -+ -+// Locates alias for port named if_name, copies alias into if_alias_out, up to a -+// max of IFNAMSIZ bytes. -+// Returns 0 on success, -1 on failure -+static int -+get_interface_alias_by_name(const char *if_name, char *if_alias_out) { -+ int i = 0; -+ -+ for (i = 0; i < g_interface_name_alias_map_size; i++) { -+ if (strncmp(if_name, g_interface_name_alias_map[i].if_name, IFNAMSIZ) == 0) { -+ strncpy(if_alias_out, g_interface_name_alias_map[i].if_alias, IFNAMSIZ); -+ return 0; -+ } -+ } -+ -+ return -1; -+} -+ -+// Frees global map g_interface_name_alias_map -+// Sets g_interface_name_alias_map_size to 0 -+static void -+free_interface_alias_map(void) { -+ free(g_interface_name_alias_map); -+ g_interface_name_alias_map_size = 0; -+} diff --git a/src/isc-dhcp/patch/0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch b/src/isc-dhcp/patch/0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch new file mode 100644 index 000000000000..4d47c8185ece --- /dev/null +++ b/src/isc-dhcp/patch/0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch @@ -0,0 +1,266 @@ +From 42319f1b56ba6362c874cd64383a055ba6498bee Mon Sep 17 00:00:00 2001 +From: Joe LeVeque +Date: Mon, 11 Dec 2017 23:21:08 +0000 +Subject: [PATCH 1/3] Customizable Option 82 circuit ID and remote ID fields + +--- + relay/dhcrelay.c | 172 +++++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 147 insertions(+), 25 deletions(-) + +diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c +index 15b4997..a26efca 100644 +--- a/relay/dhcrelay.c ++++ b/relay/dhcrelay.c +@@ -73,6 +73,8 @@ int bad_circuit_id = 0; /* Circuit ID option in matching RAI option + did not match any known circuit ID. */ + int missing_circuit_id = 0; /* Circuit ID option in matching RAI option + was missing. */ ++const char *agent_circuit_id_fmt = NULL; /* Circuit ID custom format string. */ ++const char *agent_remote_id_fmt = NULL; /* Remote ID custom format string. */ + int max_hop_count = 10; /* Maximum hop count */ + + #ifdef DHCPv6 +@@ -140,9 +142,19 @@ static const char message[] = + static const char url[] = + "For info, please visit https://www.isc.org/software/dhcp/"; + ++#define DHCRELAY_OPTION82_USAGE \ ++"circuit_id/remote_id interpreted sequences are:\n" \ ++"\n" \ ++" %%%% A single %%\n" \ ++" %%h Hostname of device\n" \ ++" %%p Name of interface that generated the request\n" \ ++" %%P Hardware address of interface that generated the request\n" \ ++" %%C Client hardware address\n" \ ++" %%I DHCP relay agent IP Address\n" \ ++ + #ifdef DHCPv6 + #define DHCRELAY_USAGE \ +-"Usage: dhcrelay [-4] [-d] [-q] [-a] [-D]\n"\ ++"Usage: dhcrelay [-4] [-d] [-q] [-a ] [-D]\n"\ + " [-A ] [-c ] [-p ]\n" \ + " [-pf ] [--no-pid]\n"\ + " [-m append|replace|forward|discard]\n" \ +@@ -154,14 +166,15 @@ static const char url[] = + " -l lower0 [ ... -l lowerN]\n" \ + " -u upper0 [ ... -u upperN]\n" \ + " lower (client link): [address%%]interface[#index]\n" \ +-" upper (server link): [address%%]interface" ++" upper (server link): [address%%]interface\n\n" DHCRELAY_OPTION82_USAGE + #else + #define DHCRELAY_USAGE \ +-"Usage: dhcrelay [-d] [-q] [-a] [-D] [-A ] [-c ] [-p ]\n" \ +-" [-pf ] [--no-pid]\n" \ ++"Usage: dhcrelay [-d] [-q] [-a ] [-D]\n" \ ++" [-A ] [-c ] [-p ]\n" \ ++" [-pf ] [--no-pid]\n"\ + " [-m append|replace|forward|discard]\n" \ + " [-i interface0 [ ... -i interfaceN]\n" \ +-" server0 [ ... serverN]\n\n" ++" server0 [ ... serverN]\n\n" DHCRELAY_OPTION82_USAGE + #endif + + static void usage() { +@@ -287,6 +300,15 @@ main(int argc, char **argv) { + local_family_set = 1; + local_family = AF_INET; + #endif ++ if (++i == argc) ++ usage(); ++ ++ if (argv[i] != NULL && argv[i][0] != '-') ++ agent_circuit_id_fmt = argv[i++]; ++ ++ if (argv[i] != NULL && argv[i][0] != '-') ++ agent_remote_id_fmt = argv[i]; ++ + add_agent_options = 1; + } else if (!strcmp(argv[i], "-A")) { + #ifdef DHCPv6 +@@ -938,6 +960,80 @@ find_interface_by_agent_option(struct dhcp_packet *packet, + } + + /* ++ * Format the message that will be used by circuit_id and remote_id ++ */ ++static int ++format_relay_agent_rfc3046_msg(const struct interface_info *ip, struct dhcp_packet *packet, ++ const char *format, char *msg, size_t msgn) { ++ size_t len = 0; ++ char hostname[HOST_NAME_MAX] = { 0 }; ++ char ifname[IFNAMSIZ] = { 0 }; ++ char *buf = msg; ++ ++ for ( ; format && *format && len < msgn; ++format) { ++ size_t strn = 0; ++ const char *str = NULL; ++ ++ if (*format == '%') { ++ switch (*++format) { ++ case '\0': ++ --format; ++ break; ++ ++ case '%': /* A literal '%' */ ++ str = "%"; ++ break; ++ ++ case 'h': /* Hostname */ ++ gethostname(hostname, HOST_NAME_MAX); ++ hostname[HOST_NAME_MAX - 1] = '\0'; ++ str = hostname; ++ break; ++ ++ case 'p': /* Name of interface that we received the request from */ ++ strncpy(ifname, ip->name, IFNAMSIZ); ++ str = ifname; ++ break; ++ ++ case 'P': /* Physical address of interface that we received the request from */ ++ str = print_hw_addr(ip->hw_address.hbuf[0], ip->hw_address.hlen - 1, &ip->hw_address.hbuf[1]); ++ break; ++ ++ case 'C': /* 24: Client hardware address */ ++ str = print_hw_addr(packet->htype, packet->hlen, packet->chaddr); ++ break; ++ ++ case 'I': /* 20: DHCP relay agent IP address */ ++ str = inet_ntoa(packet->giaddr); ++ break; ++ ++ default: ++ log_error("Option %%%c is unrecognized and will not be formatted!", *format); ++ continue; ++ } ++ ++ if (str) ++ strn = strlen(str); ++ } else { ++ str = format; ++ strn = 1; ++ } ++ ++ // Do we have room? ++ if ((strn+len) >= msgn) { ++ return 0; ++ } ++ ++ if (str && strn > 0) { ++ memcpy(buf+len, str, strn); ++ len += strn; ++ } ++ } ++ ++ return len; ++} ++ ++/* + * Examine a packet to see if it's a candidate to have a Relay + * Agent Information option tacked onto its tail. If it is, tack + * the option on. +@@ -948,6 +1044,9 @@ add_relay_agent_options(struct interface_info *ip, struct dhcp_packet *packet, + int is_dhcp = 0, mms; + unsigned optlen; + u_int8_t *op, *nextop, *sp, *max, *end_pad = NULL; ++ char circuit_id_buf[256] = { '\0' }; ++ char remote_id_buf[256] = { '\0' }; ++ size_t circuit_id_len = 0, remote_id_len = 0; + + /* If we're not adding agent options to packets, we can skip + this. */ +@@ -1077,24 +1176,47 @@ add_relay_agent_options(struct interface_info *ip, struct dhcp_packet *packet, + op = sp; + #endif + +- /* Sanity check. Had better not ever happen. */ +- if ((ip->circuit_id_len > 255) ||(ip->circuit_id_len < 1)) +- log_fatal("Circuit ID length %d out of range [1-255] on " +- "%s\n", ip->circuit_id_len, ip->name); +- optlen = ip->circuit_id_len + 2; /* RAI_CIRCUIT_ID + len */ ++ /* option82: custom string for circuit_id */ ++ if (agent_circuit_id_fmt) { ++ circuit_id_len = format_relay_agent_rfc3046_msg(ip, packet, agent_circuit_id_fmt, ++ circuit_id_buf, sizeof(circuit_id_buf)); ++ ++ if (circuit_id_len == 0) ++ strncpy(circuit_id_buf, ip->name, sizeof(ip->name)); ++ ++ //log_debug("Sending on %s option82:circuit_id='%s' (%d)", ++ // ip->name, circuit_id_buf, circuit_id_len); ++ } ++ ++ /* option82: custom string for remote_id */ ++ if (agent_remote_id_fmt) { ++ remote_id_len = format_relay_agent_rfc3046_msg(ip, packet, agent_remote_id_fmt, ++ remote_id_buf, sizeof(remote_id_buf)); ++ ++ //log_debug("Sending on %s option82:remote_id='%s' (%d)", ++ // ip->name, remote_id_buf, remote_id_len); ++ } ++ ++ /* Sanity check. Had better not ever happen. */ ++ if (circuit_id_len > 255 || circuit_id_len < 1) ++ log_fatal("Circuit ID length %d out of range [1-255] on %s\n", ++ circuit_id_len, ip->name); ++ ++ optlen = circuit_id_len + 2; // RAI_CIRCUIT_ID + len + + if (ip->remote_id) { +- if (ip->remote_id_len > 255 || ip->remote_id_len < 1) +- log_fatal("Remote ID length %d out of range [1-255] " +- "on %s\n", ip->circuit_id_len, ip->name); +- optlen += ip->remote_id_len + 2; /* RAI_REMOTE_ID + len */ ++ if (remote_id_len > 255 || remote_id_len < 1) ++ log_fatal("Remote ID length %d out of range [1-255] on %s\n", ++ remote_id_len, ip->name); ++ ++ optlen += remote_id_len + 2; // RAI_REMOTE_ID + len + } + +- /* We do not support relay option fragmenting(multiple options to +- * support an option data exceeding 255 bytes). ++ /* We do not support relay option fragmenting (multiple options to ++ * support an option data exceeding 255 bytes) + */ +- if ((optlen < 3) ||(optlen > 255)) +- log_fatal("Total agent option length(%u) out of range " ++ if (optlen < 3 || optlen > 255) ++ log_fatal("Total agent option length (%u) out of range " + "[3 - 255] on %s\n", optlen, ip->name); + + /* +@@ -1102,7 +1224,7 @@ add_relay_agent_options(struct interface_info *ip, struct dhcp_packet *packet, + * If not, forward without adding the option. + */ + if (max - sp >= optlen + 3) { +- log_debug("Adding %d-byte relay agent option", optlen + 3); ++ //log_debug("Adding %d-byte relay agent option", optlen + 3); + + /* Okay, cons up *our* Relay Agent Information option. */ + *sp++ = DHO_DHCP_AGENT_OPTIONS; +@@ -1110,16 +1232,16 @@ add_relay_agent_options(struct interface_info *ip, struct dhcp_packet *packet, + + /* Copy in the circuit id... */ + *sp++ = RAI_CIRCUIT_ID; +- *sp++ = ip->circuit_id_len; +- memcpy(sp, ip->circuit_id, ip->circuit_id_len); +- sp += ip->circuit_id_len; ++ *sp++ = circuit_id_len; ++ memcpy(sp, circuit_id_buf, circuit_id_len); ++ sp += circuit_id_len; + + /* Copy in remote ID... */ + if (ip->remote_id) { + *sp++ = RAI_REMOTE_ID; +- *sp++ = ip->remote_id_len; +- memcpy(sp, ip->remote_id, ip->remote_id_len); +- sp += ip->remote_id_len; ++ *sp++ = remote_id_len; ++ memcpy(sp, remote_id_buf, remote_id_len); ++ sp += remote_id_len; + } + } else { + ++agent_option_errors; +-- +2.1.4 + diff --git a/src/isc-dhcp/patch/0002-Support-for-obtaining-name-of-physical-interface-tha.patch b/src/isc-dhcp/patch/0002-Support-for-obtaining-name-of-physical-interface-tha.patch new file mode 100644 index 000000000000..87c9ba266cb1 --- /dev/null +++ b/src/isc-dhcp/patch/0002-Support-for-obtaining-name-of-physical-interface-tha.patch @@ -0,0 +1,114 @@ +From 18ca48b7c307e1644f653df4c8503f4ce2677f62 Mon Sep 17 00:00:00 2001 +From: Joe LeVeque +Date: Mon, 11 Dec 2017 23:39:10 +0000 +Subject: [PATCH 2/3] Support for obtaining name of physical interface that is + a member of a bridge interface + +--- + relay/dhcrelay.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 67 insertions(+), 2 deletions(-) + +diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c +index a26efca..84ec79d 100644 +--- a/relay/dhcrelay.c ++++ b/relay/dhcrelay.c +@@ -758,6 +758,7 @@ do_relay4(struct interface_info *ip, struct dhcp_packet *packet, + print_hw_addr(packet->htype, packet->hlen, + packet->chaddr), + inet_ntoa(sp->to.sin_addr)); ++ + ++client_packets_relayed; + } + } +@@ -917,6 +918,7 @@ find_interface_by_agent_option(struct dhcp_packet *packet, + ++corrupt_agent_options; + return (-1); + } ++ + switch(buf[i]) { + /* Remember where the circuit ID is... */ + case RAI_CIRCUIT_ID: +@@ -959,6 +961,47 @@ find_interface_by_agent_option(struct dhcp_packet *packet, + return (-1); + } + ++static int ++_bridgefdbquery(const char *hwAddr, char *interface, int *vlanid) { ++ ++#define xstr(s) str(s) ++#define str(s) #s ++#define FDB_STRING_LEN 100 ++#define FDB_BUFFER_LEN (FDB_STRING_LEN + 1) ++ ++/* ++ * Format for sscanf() to read the 1st, 3th, and 5th ++ * space-delimited fields ++ * ++ * bridge fdb show output ++ * 6c:64:1a:00:06:13 dev swp35 vlan 0 master bridge permanent ++ */ ++#define FDB_LINE_FORMAT "%" xstr(FDB_STRING_LEN) "s %*s " \ ++ "%" xstr(FDB_STRING_LEN) "s %*s %d %*s" ++ ++ char cmdstr[FDB_BUFFER_LEN]; ++ char buf[FDB_BUFFER_LEN]; ++ char macAddr[FDB_BUFFER_LEN]; ++ ++ if ((interface == NULL) || (vlanid == NULL)) { ++ return 0; ++ } ++ sprintf(cmdstr, "bridge fdb show | grep -m 1 %s", hwAddr); ++ FILE *cmd = popen(cmdstr, "r"); ++ ++ if (cmd != NULL) { ++ while (fgets(buf, sizeof(buf), cmd)) { ++ sscanf(buf, FDB_LINE_FORMAT, macAddr, interface, vlanid); ++ //log_debug("bridgefdbquery: macAddr:%s interface: %s vlanid %d", ++ // macAddr, interface, *vlanid); ++ } ++ pclose(cmd); ++ return 0; ++ } ++ ++ return -1; ++} ++ + /* + * Format the message that will be used by circuit_id and remote_id + */ +@@ -991,8 +1034,30 @@ format_relay_agent_rfc3046_msg(const struct interface_info *ip, struct dhcp_pack + break; + + case 'p': /* Name of interface that we received the request from */ +- strncpy(ifname, ip->name, IFNAMSIZ); +- str = ifname; ++ /* ++ * Query FDB to identify the exact physical interface only when source MAC address ++ * is present and '20: DHCP relay agent IP address' (giaddr) is not present ++ */ ++ if (packet->htype && !packet->giaddr.s_addr) { ++ int ret = 0, vlanid = 0; ++ ++ ret = _bridgefdbquery(print_hw_addr(packet->htype, packet->hlen, packet->chaddr), ++ ifname, ++ &vlanid); ++ ++ // If we failed to find a physical interface using the source mac, default ++ // to the interface name we received it on. ++ if (ret < 0) { ++ //log_debug("MAC Address: %s (interface:%s vlan:%d) not found in bridge fdb show", ++ // print_hw_addr (packet->htype, packet->hlen, packet->chaddr), ++ // ip->name, ++ // vlanid); ++ ++ strncpy(ifname, ip->name, IFNAMSIZ); ++ } ++ ++ str = ifname; ++ } + break; + + case 'P': /* Physical address of interface that we received the request from */ +-- +2.1.4 + diff --git a/src/isc-dhcp/patch/0003-Support-for-loading-port-alias-map-file-to-replace-p.patch b/src/isc-dhcp/patch/0003-Support-for-loading-port-alias-map-file-to-replace-p.patch new file mode 100644 index 000000000000..216abf5ba7b7 --- /dev/null +++ b/src/isc-dhcp/patch/0003-Support-for-loading-port-alias-map-file-to-replace-p.patch @@ -0,0 +1,177 @@ +From 3be065305283b90ddfef92a8736221cbf7cf06e0 Mon Sep 17 00:00:00 2001 +From: Joe LeVeque +Date: Tue, 12 Dec 2017 00:49:09 +0000 +Subject: [PATCH 3/3] Support for loading port alias map file to replace + port name with alias in circuit id + +--- + relay/dhcrelay.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 102 insertions(+), 1 deletion(-) + +diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c +index 84ec79d..0b56e2d 100644 +--- a/relay/dhcrelay.c ++++ b/relay/dhcrelay.c +@@ -122,6 +122,14 @@ static void setup_streams(void); + char *dhcrelay_sub_id = NULL; + #endif + ++struct interface_name_alias_tuple { ++ char if_name[IFNAMSIZ]; ++ char if_alias[IFNAMSIZ]; ++}; ++ ++static struct interface_name_alias_tuple *g_interface_name_alias_map = NULL; ++static size_t g_interface_name_alias_map_size = 0; ++ + static void do_relay4(struct interface_info *, struct dhcp_packet *, + unsigned int, unsigned int, struct iaddr, + struct hardware *); +@@ -134,6 +142,10 @@ static int strip_relay_agent_options(struct interface_info *, + struct interface_info **, + struct dhcp_packet *, unsigned); + ++static int load_interface_alias_map(const char *port_alias_map_file_path); ++static int get_interface_alias_by_name(const char *if_name, char *if_alias_out); ++static void free_interface_alias_map(void); ++ + static const char copyright[] = + "Copyright 2004-2015 Internet Systems Consortium."; + static const char arr[] = "All rights reserved."; +@@ -147,7 +159,7 @@ static const char url[] = + "\n" \ + " %%%% A single %%\n" \ + " %%h Hostname of device\n" \ +-" %%p Name of interface that generated the request\n" \ ++" %%p Alias of interface that generated the request\n" \ + " %%P Hardware address of interface that generated the request\n" \ + " %%C Client hardware address\n" \ + " %%I DHCP relay agent IP Address\n" \ +@@ -158,10 +170,12 @@ static const char url[] = + " [-A ] [-c ] [-p ]\n" \ + " [-pf ] [--no-pid]\n"\ + " [-m append|replace|forward|discard]\n" \ ++" [--name-alias-map-file ]\n" \ + " [-i interface0 [ ... -i interfaceN]\n" \ + " server0 [ ... serverN]\n\n" \ + " dhcrelay -6 [-d] [-q] [-I] [-c ] [-p ]\n" \ + " [-pf ] [--no-pid]\n" \ ++" [--name-alias-map-file ]\n" \ + " [-s ]\n" \ + " -l lower0 [ ... -l lowerN]\n" \ + " -u upper0 [ ... -u upperN]\n" \ +@@ -405,6 +419,11 @@ main(int argc, char **argv) { + no_dhcrelay_pid = ISC_TRUE; + } else if (!strcmp(argv[i], "--no-pid")) { + no_pid_file = ISC_TRUE; ++ } else if (!strcmp(argv[i], "--name-alias-map-file")) { ++ if (++i == argc) ++ usage(); ++ if (load_interface_alias_map(argv[i]) != 0) ++ log_fatal("Failed to load interface name-alias map."); + } else if (!strcmp(argv[i], "--version")) { + log_info("isc-dhcrelay-%s", PACKAGE_VERSION); + exit(0); +@@ -624,6 +643,8 @@ main(int argc, char **argv) { + dispatch(); + + /* In fact dispatch() never returns. */ ++ free_interface_alias_map(); ++ + return (0); + } + +@@ -1056,6 +1077,16 @@ format_relay_agent_rfc3046_msg(const struct interface_info *ip, struct dhcp_pack + strncpy(ifname, ip->name, IFNAMSIZ); + } + ++ // Attempt to translate SONiC interface name to vendor alias ++ if (get_interface_alias_by_name(ip->name, ifname) < 0) { ++ //log_debug("Failed to retrieve alias for interface name '%s'. Defaulting to interface name.", ip->name); ++ strncpy(ifname, ip->name, IFNAMSIZ); ++ } ++ else { ++ //log_debug("Mapped interface name '%s' to alias '%s'. Adding as option 82 interface alias for MAC Address %s", ++ // ip->name, ifname, print_hw_addr (packet->htype, packet->hlen, packet->chaddr), ++ } ++ + str = ifname; + } + break; +@@ -1922,3 +1953,73 @@ dhcp_set_control_state(control_object_state_t oldstate, + + exit(0); + } ++ ++#define MAX_PORT_CONFIG_LINE_LEN 1024 ++ ++// Allocates and loads global map g_interface_name_alias_map ++// Also sets global g_interface_name_alias_map_size ++static int ++load_interface_alias_map(const char *port_alias_map_file_path) { ++ int i = 0; ++ FILE *fp = NULL; ++ char line[MAX_PORT_CONFIG_LINE_LEN] = { 0 }; ++ ++ fp = fopen(port_alias_map_file_path,"r"); ++ if (fp == NULL) { ++ log_error("Unable to open %s", port_alias_map_file_path); ++ return -1; ++ } ++ ++ g_interface_name_alias_map_size = 0; ++ ++ // Count the number of interfaces listed in the file ++ while (fgets(line, sizeof(line), fp)) { ++ g_interface_name_alias_map_size++; ++ } ++ ++ // Allocate our map accordingly ++ g_interface_name_alias_map = ((struct interface_name_alias_tuple *) ++ dmalloc((sizeof(struct interface_name_alias_tuple) * g_interface_name_alias_map_size), ++ MDL)); ++ ++ // Reset file position indicator to beginning of file ++ fseek(fp, 0, SEEK_SET); ++ ++ // Every line should contain exactly one name-alias pair ++ while (fgets(line, sizeof(line), fp)) { ++ // Each line should read as "" ++ sscanf(line, "%s %s", g_interface_name_alias_map[i].if_name, g_interface_name_alias_map[i].if_alias); ++ i++; ++ } ++ ++ fclose(fp); ++ ++ log_info("Loaded %d interface name-alias mappings", i); ++ ++ return 0; ++} ++ ++// Locates alias for port named if_name, copies alias into if_alias_out, up to a ++// max of IFNAMSIZ bytes. ++// Returns 0 on success, -1 on failure ++static int ++get_interface_alias_by_name(const char *if_name, char *if_alias_out) { ++ int i = 0; ++ ++ for (i = 0; i < g_interface_name_alias_map_size; i++) { ++ if (strncmp(if_name, g_interface_name_alias_map[i].if_name, IFNAMSIZ) == 0) { ++ strncpy(if_alias_out, g_interface_name_alias_map[i].if_alias, IFNAMSIZ); ++ return 0; ++ } ++ } ++ ++ return -1; ++} ++ ++// Frees global map g_interface_name_alias_map ++// Sets g_interface_name_alias_map_size to 0 ++static void ++free_interface_alias_map(void) { ++ free(g_interface_name_alias_map); ++ g_interface_name_alias_map_size = 0; ++} +-- +2.1.4 + diff --git a/src/isc-dhcp/patch/series b/src/isc-dhcp/patch/series new file mode 100644 index 000000000000..a896563077c2 --- /dev/null +++ b/src/isc-dhcp/patch/series @@ -0,0 +1,4 @@ +# This series applies on GIT commit ee3dffdda38a8cfc6ad2005d8d64a165d2a709ba +0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch +0002-Support-for-obtaining-name-of-physical-interface-tha.patch +0003-Support-for-loading-port-alias-map-file-to-replace-p.patch From a2af29aa785dfa8a8ae1503af0c2f4fd3370926c Mon Sep 17 00:00:00 2001 From: loshihyu <31527295+loshihyu@users.noreply.github.com> Date: Wed, 13 Dec 2017 22:57:06 -0800 Subject: [PATCH 0987/1011] Fixed D7054 missing front-panel port Interfaces (#1236) --- .../INVENTEC-D7054Q28B-S48-Q6/port_config.ini | 109 +++++++++--------- 1 file changed, 54 insertions(+), 55 deletions(-) diff --git a/device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/port_config.ini b/device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/port_config.ini index a8eaeb1f0665..8b0addcada13 100644 --- a/device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/port_config.ini +++ b/device/inventec/x86_64-inventec_d7054q28b-r0/INVENTEC-D7054Q28B-S48-Q6/port_config.ini @@ -1,56 +1,55 @@ -# 48x25G + 6x100G # name lanes alias -Ethernet0 2 Ethernet0 -Ethernet4 1 Ethernet4 -Ethernet8 4 Ethernet8 -Ethernet12 3 Ethernet12 -Ethernet16 6 Ethernet16 -Ethernet20 5 Ethernet20 -Ethernet24 8 Ethernet24 -Ethernet28 7 Ethernet28 -Ethernet32 10 Ethernet32 -Ethernet36 9 Ethernet36 -Ethernet40 12 Ethernet40 -Ethernet44 11 Ethernet44 -Ethernet48 22 Ethernet48 -Ethernet52 21 Ethernet52 -Ethernet56 24 Ethernet56 -Ethernet60 23 Ethernet60 -Ethernet64 34 Ethernet64 -Ethernet68 33 Ethernet68 -Ethernet72 36 Ethernet72 -Ethernet76 35 Ethernet76 -Ethernet80 38 Ethernet80 -Ethernet84 37 Ethernet84 -Ethernet88 40 Ethernet88 -Ethernet92 39 Ethernet92 -Ethernet96 42 Ethernet96 -Ethernet100 41 Ethernet100 -Ethernet104 44 Ethernet104 -Ethernet108 43 Ethernet108 -Ethernet112 50 Ethernet112 -Ethernet116 49 Ethernet116 -Ethernet120 52 Ethernet120 -Ethernet124 51 Ethernet124 -Ethernet128 54 Ethernet128 -Ethernet132 53 Ethernet132 -Ethernet136 56 Ethernet136 -Ethernet140 55 Ethernet140 -Ethernet144 66 Ethernet144 -Ethernet148 65 Ethernet148 -Ethernet152 68 Ethernet152 -Ethernet156 67 Ethernet156 -Ethernet160 70 Ethernet160 -Ethernet164 69 Ethernet164 -Ethernet168 72 Ethernet168 -Ethernet172 71 Ethernet172 -Ethernet176 82 Ethernet176 -Ethernet180 81 Ethernet180 -Ethernet184 84 Ethernet184 -Ethernet188 83 Ethernet188 -Ethernet192 85,86,87,88 Ethernet192 -Ethernet196 97,98,99,100 Ethernet196 -Ethernet200 105,106,107,108 Ethernet200 -Ethernet204 101,102,103,104 Ethernet204 -Ethernet208 117,118,119,120 Ethernet208 -Ethernet212 109,110,111,112 Ethernet212 +Ethernet0 2 Ethernet0 +Ethernet4 1 Ethernet4 +Ethernet8 4 Ethernet8 +Ethernet12 3 Ethernet12 +Ethernet16 6 Ethernet16 +Ethernet20 5 Ethernet20 +Ethernet24 8 Ethernet24 +Ethernet28 7 Ethernet28 +Ethernet32 10 Ethernet32 +Ethernet36 9 Ethernet36 +Ethernet40 12 Ethernet40 +Ethernet44 11 Ethernet44 +Ethernet48 22 Ethernet48 +Ethernet52 21 Ethernet52 +Ethernet56 24 Ethernet56 +Ethernet60 23 Ethernet60 +Ethernet64 34 Ethernet64 +Ethernet68 33 Ethernet68 +Ethernet72 36 Ethernet72 +Ethernet76 35 Ethernet76 +Ethernet80 38 Ethernet80 +Ethernet84 37 Ethernet84 +Ethernet88 40 Ethernet88 +Ethernet92 39 Ethernet92 +Ethernet96 42 Ethernet96 +Ethernet100 41 Ethernet100 +Ethernet104 44 Ethernet104 +Ethernet108 43 Ethernet108 +Ethernet112 50 Ethernet112 +Ethernet116 49 Ethernet116 +Ethernet120 52 Ethernet120 +Ethernet124 51 Ethernet124 +Ethernet128 54 Ethernet128 +Ethernet132 53 Ethernet132 +Ethernet136 56 Ethernet136 +Ethernet140 55 Ethernet140 +Ethernet144 66 Ethernet144 +Ethernet148 65 Ethernet148 +Ethernet152 68 Ethernet152 +Ethernet156 67 Ethernet156 +Ethernet160 70 Ethernet160 +Ethernet164 69 Ethernet164 +Ethernet168 72 Ethernet168 +Ethernet172 71 Ethernet172 +Ethernet176 82 Ethernet176 +Ethernet180 81 Ethernet180 +Ethernet184 84 Ethernet184 +Ethernet188 83 Ethernet188 +Ethernet192 85,86,87,88 Ethernet192 +Ethernet196 97,98,99,100 Ethernet196 +Ethernet200 105,106,107,108 Ethernet200 +Ethernet204 101,102,103,104 Ethernet204 +Ethernet208 117,118,119,120 Ethernet208 +Ethernet212 109,110,111,112 Ethernet212 From 9f54aed9cf328ecbb65556fd40a9cbd9d16da11e Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 14 Dec 2017 00:40:33 -0800 Subject: [PATCH 0988/1011] [sonic-utilities]: update sonic-utilities submodule (#1237) --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index be91f161b290..8677d5f457c9 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit be91f161b290328773b98f1e21f7feee797ce91c +Subproject commit 8677d5f457c9a20f0fac2a4fdde569a8338c77e3 From 1c0c3ff7a9ae0d17ebb3cabed9df8952e4f408c3 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 14 Dec 2017 17:34:58 -0800 Subject: [PATCH 0989/1011] [Dell S6100]: EEPROM plugin overrides serial_number_str() to return service tag instead of serial number (#1239) * [Dell S6100]: EEPROM plugin overrides serial_number_str() to return service tag instead of serial number * Refactor to simplify --- .../dell/x86_64-dell_s6100_c2538-r0/plugins/eeprom.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/plugins/eeprom.py b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/eeprom.py index 6af56578c682..7265b90efb1f 100644 --- a/device/dell/x86_64-dell_s6100_c2538-r0/plugins/eeprom.py +++ b/device/dell/x86_64-dell_s6100_c2538-r0/plugins/eeprom.py @@ -21,3 +21,13 @@ def __init__(self, name, path, cpld_root, ro): self.eeprom_path = "/sys/class/i2c-adapter/i2c-2/2-0050/eeprom" super(board, self).__init__(self.eeprom_path, 0, '', True) + def serial_number_str(self, e): + """Return service tag instead of serial number""" + + (is_valid, results) = self.get_tlv_field(e, self._TLV_CODE_SERVICE_TAG) + if is_valid == False: + return "Bad service tag" + + # 'results' is a list containing 3 elements, type (int), length (int), + # and value (string) of the requested TLV + return results[2] From db7f173f23469f500187cf087fbbf656c1a7db2d Mon Sep 17 00:00:00 2001 From: Roy Lee Date: Fri, 15 Dec 2017 16:59:41 +0800 Subject: [PATCH 0990/1011] [Accton AS7712] Add sfp reset in driver and sfputil.py. (#1241) Signed-off-by: roylee123 --- .../plugins/sfputil.py | 32 +++++++++++++++---- .../broadcom/sonic-platform-modules-accton | 2 +- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py index c13eecfd1759..1f2a66d64ccd 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py @@ -1,6 +1,7 @@ #!/usr/bin/env python try: + import time from sonic_sfp.sfputilbase import SfpUtilBase except ImportError, e: raise ImportError (str(e) + "- required module not found") @@ -59,14 +60,33 @@ def __init__(self): SfpUtilBase.__init__(self) def reset(self, port_num): - return True + # Check for invalid port_num + if port_num < self._port_start or port_num > self._port_end: + return False + + path = "/sys/bus/i2c/devices/{0}-0050/sfp_port_reset" + port_ps = path.format(self.port_to_i2c_mapping[port_num+1]) + + try: + reg_file = open(port_ps, 'w') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + #toggle reset + reg_file.seek(0) + reg_file.write('1') + time.sleep(1) + reg_file.seek(0) + reg_file.write('0') + reg_file.close() + return True + def set_low_power_mode(self, port_nuM, lpmode): - return True - def get_low_power_mode(self, port_num): - return True + raise NotImplementedErro -# def get_presence(self, port_num): -# return True + def get_low_power_mode(self, port_num): + raise NotImplementedErro def get_presence(self, port_num): # Check for invalid port_num diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton index edfb5b2c1285..7ba26ec403c7 160000 --- a/platform/broadcom/sonic-platform-modules-accton +++ b/platform/broadcom/sonic-platform-modules-accton @@ -1 +1 @@ -Subproject commit edfb5b2c1285cbfd30d8a662ab738aee53a80439 +Subproject commit 7ba26ec403c7f0d0acb958f794311ac3fd1af9a1 From 46a653485c034b0b78869463aab14517eeefb4db Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 15 Dec 2017 16:39:15 -0800 Subject: [PATCH 0991/1011] [device/Arista] Add fancontrol config for all Arista platforms (#1242) * Rename i2c busses for a7060cx-32 platform * Update fancontrol for a7260cx3-64 * Add fancontrol for a7050qx-32 * Add fancontrol for a7050qx-32s * Add fancontrol for a7060cx-32s --- device/arista/x86_64-arista_7050_qx32/fancontrol | 10 ++++++++++ device/arista/x86_64-arista_7050_qx32s/fancontrol | 10 ++++++++++ device/arista/x86_64-arista_7060_cx32s/fancontrol | 10 ++++++++++ device/arista/x86_64-arista_7060_cx32s/sensors.conf | 10 +++++----- device/arista/x86_64-arista_7260cx3_64/fancontrol | 6 +++--- 5 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 device/arista/x86_64-arista_7050_qx32/fancontrol create mode 100644 device/arista/x86_64-arista_7050_qx32s/fancontrol create mode 100644 device/arista/x86_64-arista_7060_cx32s/fancontrol diff --git a/device/arista/x86_64-arista_7050_qx32/fancontrol b/device/arista/x86_64-arista_7050_qx32/fancontrol new file mode 100644 index 000000000000..02bf4d76dbec --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32/fancontrol @@ -0,0 +1,10 @@ +INTERVAL=5 +DEVPATH=hwmon1=devices/platform/sb800-fans hwmon2=devices/pci0000:00/0000:00:09.0/0000:04:00.0/i2c-2/2-004c +DEVNAME=hwmon1=fans hwmon2=max6658 +FCTEMPS=hwmon1/pwm4=hwmon2/temp1_input hwmon1/pwm3=hwmon2/temp1_input hwmon1/pwm2=hwmon2/temp1_input hwmon1/pwm1=hwmon2/temp1_input +FCFANS=hwmon1/pwm4=hwmon1/fan4_input hwmon1/pwm3=hwmon1/fan3_input hwmon1/pwm2=hwmon1/fan2_input hwmon1/pwm1=hwmon1/fan1_input +MINTEMP=hwmon1/pwm4=30 hwmon1/pwm3=30 hwmon1/pwm2=30 hwmon1/pwm1=30 +MINPWM=hwmon1/pwm4=179 hwmon1/pwm3=179 hwmon1/pwm2=179 hwmon1/pwm1=179 +MAXTEMP=hwmon1/pwm4=40 hwmon1/pwm3=40 hwmon1/pwm2=40 hwmon1/pwm1=40 +MINSTART=hwmon1/pwm4=179 hwmon1/pwm3=179 hwmon1/pwm2=179 hwmon1/pwm1=179 +MINSTOP=hwmon1/pwm4=179 hwmon1/pwm3=179 hwmon1/pwm2=179 hwmon1/pwm1=179 diff --git a/device/arista/x86_64-arista_7050_qx32s/fancontrol b/device/arista/x86_64-arista_7050_qx32s/fancontrol new file mode 100644 index 000000000000..9c329897c9e4 --- /dev/null +++ b/device/arista/x86_64-arista_7050_qx32s/fancontrol @@ -0,0 +1,10 @@ +INTERVAL=5 +DEVPATH=hwmon2=devices/pci0000:00/0000:00:02.2/0000:02:00.0/i2c-2/2-004c hwmon4=devices/pci0000:00/0000:00:02.2/0000:02:00.0/i2c-3/3-0060 +DEVNAME=hwmon2=max6658 hwmon4=crow_cpld +FCTEMPS=hwmon4/pwm4=hwmon2/temp1_input hwmon4/pwm3=hwmon2/temp1_input hwmon4/pwm2=hwmon2/temp1_input hwmon4/pwm1=hwmon2/temp1_input +FCFANS=hwmon4/pwm4=hwmon4/fan4_input hwmon4/pwm3=hwmon4/fan3_input hwmon4/pwm2=hwmon4/fan2_input hwmon4/pwm1=hwmon4/fan1_input +MINTEMP=hwmon4/pwm4=35 hwmon4/pwm3=35 hwmon4/pwm2=35 hwmon4/pwm1=35 +MINPWM=hwmon4/pwm4=179 hwmon4/pwm3=179 hwmon4/pwm2=179 hwmon4/pwm1=179 +MAXTEMP=hwmon4/pwm4=45 hwmon4/pwm3=45 hwmon4/pwm2=45 hwmon4/pwm1=45 +MINSTART=hwmon4/pwm4=179 hwmon4/pwm3=179 hwmon4/pwm2=179 hwmon4/pwm1=179 +MINSTOP=hwmon4/pwm4=179 hwmon4/pwm3=179 hwmon4/pwm2=179 hwmon4/pwm1=179 diff --git a/device/arista/x86_64-arista_7060_cx32s/fancontrol b/device/arista/x86_64-arista_7060_cx32s/fancontrol new file mode 100644 index 000000000000..e69f9d75acda --- /dev/null +++ b/device/arista/x86_64-arista_7060_cx32s/fancontrol @@ -0,0 +1,10 @@ +INTERVAL=5 +DEVPATH=hwmon1=devices/pci0000:00/0000:00:02.2/0000:02:00.0/i2c-2/2-001a hwmon3=devices/pci0000:00/0000:00:02.2/0000:02:00.0/i2c-3/3-0060 +DEVNAME=hwmon1=max6697 hwmon3=crow_cpld +FCTEMPS=hwmon3/pwm4=hwmon1/temp1_input hwmon3/pwm3=hwmon1/temp1_input hwmon3/pwm2=hwmon1/temp1_input hwmon3/pwm1=hwmon1/temp1_input +FCFANS=hwmon3/pwm4=hwmon3/fan4_input hwmon3/pwm3=hwmon3/fan3_input hwmon3/pwm2=hwmon3/fan2_input hwmon3/pwm1=hwmon3/fan1_input +MINTEMP=hwmon3/pwm4=40 hwmon3/pwm3=40 hwmon3/pwm2=40 hwmon3/pwm1=40 +MINPWM=hwmon3/pwm4=179 hwmon3/pwm3=179 hwmon3/pwm2=179 hwmon3/pwm1=179 +MAXTEMP=hwmon3/pwm4=50 hwmon3/pwm3=50 hwmon3/pwm2=50 hwmon3/pwm1=50 +MINSTART=hwmon3/pwm4=179 hwmon3/pwm3=179 hwmon3/pwm2=179 hwmon3/pwm1=179 +MINSTOP=hwmon3/pwm4=179 hwmon3/pwm3=179 hwmon3/pwm2=179 hwmon3/pwm1=179 diff --git a/device/arista/x86_64-arista_7060_cx32s/sensors.conf b/device/arista/x86_64-arista_7060_cx32s/sensors.conf index 21b21fcb5d1c..7b548f8493e0 100644 --- a/device/arista/x86_64-arista_7060_cx32s/sensors.conf +++ b/device/arista/x86_64-arista_7060_cx32s/sensors.conf @@ -2,11 +2,11 @@ # ------------------------------------------------ # -bus "i2c-2" "SCD SMBus master 0 bus 0" -bus "i2c-3" "SCD SMBus master 0 bus 1" -bus "i2c-5" "SCD SMBus master 0 bus 3" -bus "i2c-6" "SCD SMBus master 0 bus 4" -bus "i2c-7" "SCD SMBus master 0 bus 5" +bus "i2c-2" "SCD 0000:02:00.0 SMBus master 0 bus 0" +bus "i2c-3" "SCD 0000:02:00.0 SMBus master 0 bus 1" +bus "i2c-5" "SCD 0000:02:00.0 SMBus master 0 bus 3" +bus "i2c-6" "SCD 0000:02:00.0 SMBus master 0 bus 4" +bus "i2c-7" "SCD 0000:02:00.0 SMBus master 0 bus 5" chip "k10temp-pci-00c3" label temp1 "Cpu temp sensor" diff --git a/device/arista/x86_64-arista_7260cx3_64/fancontrol b/device/arista/x86_64-arista_7260cx3_64/fancontrol index a9f3f97c051d..c78f598ff111 100644 --- a/device/arista/x86_64-arista_7260cx3_64/fancontrol +++ b/device/arista/x86_64-arista_7260cx3_64/fancontrol @@ -4,7 +4,7 @@ DEVNAME=hwmon1=max6658 hwmon3=rook_cpld FCTEMPS=hwmon3/pwm4=hwmon1/temp1_input hwmon3/pwm3=hwmon1/temp1_input hwmon3/pwm2=hwmon1/temp1_input hwmon3/pwm1=hwmon1/temp1_input FCFANS=hwmon3/pwm4=hwmon3/fan4_input hwmon3/pwm3=hwmon3/fan3_input hwmon3/pwm2=hwmon3/fan2_input hwmon3/pwm1=hwmon3/fan1_input MINTEMP=hwmon3/pwm4=50 hwmon3/pwm3=50 hwmon3/pwm2=50 hwmon3/pwm1=50 -MINPWM=hwmon3/pwm4=102 hwmon3/pwm3=102 hwmon3/pwm2=102 hwmon3/pwm1=102 +MINPWM=hwmon3/pwm4=128 hwmon3/pwm3=128 hwmon3/pwm2=128 hwmon3/pwm1=128 MAXTEMP=hwmon3/pwm4=60 hwmon3/pwm3=60 hwmon3/pwm2=60 hwmon3/pwm1=60 -MINSTART=hwmon3/pwm4=102 hwmon3/pwm3=102 hwmon3/pwm2=102 hwmon3/pwm1=102 -MINSTOP=hwmon3/pwm4=102 hwmon3/pwm3=102 hwmon3/pwm2=102 hwmon3/pwm1=102 +MINSTART=hwmon3/pwm4=128 hwmon3/pwm3=128 hwmon3/pwm2=128 hwmon3/pwm1=128 +MINSTOP=hwmon3/pwm4=128 hwmon3/pwm3=128 hwmon3/pwm2=128 hwmon3/pwm1=128 From 2abdf8dc582ea03e4c19b8873d4d86493a01d22e Mon Sep 17 00:00:00 2001 From: Haiyang Zheng Date: Sat, 16 Dec 2017 11:28:18 -0800 Subject: [PATCH 0992/1011] [libteam] Add fallback support for single-member-port LAG (#1118) * [libteam] Add fallback support for single-member-port LAG * Allow the port to be selected if the LAG is configured with fallback and port is in defaulted state due to missing LACP PDUs from remote end * Only enable port if LAG is admin up and the member port is link up * [team] Add lacp fallback config to teamd.j2 template * [teamd] Resolve config conflict between fallback and minlink * Remove min_link config if fallback is configured * Add support for fallback config in minigraph * [teamd] Only enable fallback if it is single-member-port LAG Signed-off-by: Haiyang Zheng * [teamd] Removing the admin status check in lacp_port_link_update Will submit another pull request to fix this issue. Signed-off-by: Haiyang Zheng --- dockers/docker-teamd/teamd.j2 | 4 + ...-fallback-support-for-single-member-.patch | 104 ++++++++++++++++++ src/libteam/Makefile | 1 + src/sonic-config-engine/minigraph.py | 5 +- 4 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/libteam/0004-libteam-Add-lacp-fallback-support-for-single-member-.patch diff --git a/dockers/docker-teamd/teamd.j2 b/dockers/docker-teamd/teamd.j2 index d9ea1b790f89..9f53534a808b 100644 --- a/dockers/docker-teamd/teamd.j2 +++ b/dockers/docker-teamd/teamd.j2 @@ -4,8 +4,12 @@ "runner": { "name": "lacp", "active": true, +{% if PORTCHANNEL[pc]['fallback'] and ((PORTCHANNEL[pc]['members'] | length) == 1) %} + "fallback": {{ PORTCHANNEL[pc]['fallback'] }}, +{% else %} {# Use 75% links upperbound as min-links #} "min_ports": {{ (PORTCHANNEL[pc]['members'] | length * 0.75) | round(0, 'ceil') | int }}, +{% endif %} "tx_hash": ["eth", "ipv4", "ipv6"] }, "link_watch": { diff --git a/src/libteam/0004-libteam-Add-lacp-fallback-support-for-single-member-.patch b/src/libteam/0004-libteam-Add-lacp-fallback-support-for-single-member-.patch new file mode 100644 index 000000000000..3139f83f33a4 --- /dev/null +++ b/src/libteam/0004-libteam-Add-lacp-fallback-support-for-single-member-.patch @@ -0,0 +1,104 @@ +From ec966f9a0229bd7226e3abe15b56659b36af9d66 Mon Sep 17 00:00:00 2001 +From: Haiyang Zheng +Date: Fri, 15 Dec 2017 21:07:53 -0800 +Subject: [patch libteam] [libteam] Add fallback support for single-member-port + LAG + +Signed-off-by: Haiyang Zheng +--- + teamd/teamd_runner_lacp.c | 42 ++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 40 insertions(+), 2 deletions(-) + +diff --git a/teamd/teamd_runner_lacp.c b/teamd/teamd_runner_lacp.c +index 9c77fae..a3646a6 100644 +--- a/teamd/teamd_runner_lacp.c ++++ b/teamd/teamd_runner_lacp.c +@@ -138,6 +138,8 @@ struct lacp { + #define LACP_CFG_DFLT_SYS_PRIO 0xffff + bool fast_rate; + #define LACP_CFG_DFLT_FAST_RATE false ++ bool fallback; ++#define LACP_CFG_DFLT_FALLBACK false + int min_ports; + #define LACP_CFG_DFLT_MIN_PORTS 1 + enum lacp_agg_select_policy agg_select_policy; +@@ -272,6 +274,11 @@ static int lacp_load_config(struct teamd_context *ctx, struct lacp *lacp) + lacp->cfg.fast_rate = LACP_CFG_DFLT_FAST_RATE; + teamd_log_dbg("Using fast_rate \"%d\".", lacp->cfg.fast_rate); + ++ err = teamd_config_bool_get(ctx, &lacp->cfg.fallback, "$.runner.fallback"); ++ if (err) ++ lacp->cfg.fallback = LACP_CFG_DFLT_FALLBACK; ++ teamd_log_dbg("Using fallback \"%d\".", lacp->cfg.fallback); ++ + err = teamd_config_int_get(ctx, &tmp, "$.runner.min_ports"); + if (err) { + lacp->cfg.min_ports = LACP_CFG_DFLT_MIN_PORTS; +@@ -308,9 +315,24 @@ static bool lacp_port_loopback_free(struct lacp_port *lacp_port) + return true; + } + ++/* ++ * is_lacp_fallback_eligible - is lacp_port eligible to go into lacp fallback mode ++ * ++ * Return true if it is, false otherwise ++ */ ++static bool is_lacp_fallback_eligible(struct lacp_port *lacp_port) ++{ ++ teamd_log_dbg("%s fallback eligible state \"%d \" cfg \"%d\".", ++ lacp_port->tdport->ifname, lacp_port->state, ++ lacp_port->lacp->cfg.fallback); ++ return lacp_port->state == PORT_STATE_DEFAULTED && ++ lacp_port->lacp->cfg.fallback; ++} ++ + static bool lacp_port_selectable_state(struct lacp_port *lacp_port) + { +- if (lacp_port->state == PORT_STATE_CURRENT) ++ if (lacp_port->state == PORT_STATE_CURRENT || ++ is_lacp_fallback_eligible(lacp_port)) + return true; + return false; + } +@@ -318,7 +340,8 @@ static bool lacp_port_selectable_state(struct lacp_port *lacp_port) + static bool lacp_port_unselectable_state(struct lacp_port *lacp_port) + { + if (lacp_port->state == PORT_STATE_CURRENT || +- lacp_port->state == PORT_STATE_EXPIRED) ++ lacp_port->state == PORT_STATE_EXPIRED || ++ is_lacp_fallback_eligible(lacp_port)) + return false; + return true; + } +@@ -1452,6 +1475,16 @@ static int lacp_state_fast_rate_get(struct teamd_context *ctx, + return 0; + } + ++static int lacp_state_fallback_get(struct teamd_context *ctx, ++ struct team_state_gsc *gsc, ++ void *priv) ++{ ++ struct lacp *lacp = priv; ++ ++ gsc->data.bool_val = lacp->cfg.fallback; ++ return 0; ++} ++ + static int lacp_state_select_policy_get(struct teamd_context *ctx, + struct team_state_gsc *gsc, + void *priv) +@@ -1479,6 +1512,11 @@ static const struct teamd_state_val lacp_state_vals[] = { + .getter = lacp_state_fast_rate_get, + }, + { ++ .subpath = "fallback", ++ .type = TEAMD_STATE_ITEM_TYPE_BOOL, ++ .getter = lacp_state_fallback_get, ++ }, ++ { + .subpath = "select_policy", + .type = TEAMD_STATE_ITEM_TYPE_STRING, + .getter = lacp_state_select_policy_get, +-- +2.7.4 + diff --git a/src/libteam/Makefile b/src/libteam/Makefile index c84250749477..c96266a5c7fd 100644 --- a/src/libteam/Makefile +++ b/src/libteam/Makefile @@ -18,6 +18,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : git apply ../0001-libteam-Add-team_get_port_enabled-function.patch git apply ../0002-libteam-Temporarily-remove-redundant-debug-mes.patch git apply ../0003-teamd-lacp-runner-will-send-lacp-update-right-after-.patch + git apply ../0004-libteam-Add-lacp-fallback-support-for-single-member-.patch popd # Obtain debian packaging diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index f33bd11f0b93..a7297913eb44 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -148,7 +148,10 @@ def parse_dpg(dpg, hname): pcmbr_list = pcintfmbr.split(';') for i, member in enumerate(pcmbr_list): pcmbr_list[i] = port_alias_map.get(member, member) - pcs[pcintfname] = {'members': pcmbr_list} + if pcintf.find(str(QName(ns, "Fallback"))) != None: + pcs[pcintfname] = {'members': pcmbr_list, 'fallback': pcintf.find(str(QName(ns, "Fallback"))).text} + else: + pcs[pcintfname] = {'members': pcmbr_list} vlanintfs = child.find(str(QName(ns, "VlanInterfaces"))) vlan_intfs = [] From 52e07979e22cc57586c97b4445f1af7887fd6368 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 17 Dec 2017 02:03:39 -0800 Subject: [PATCH 0993/1011] [broadcom]: update sai to 3.0.3.3-1 (#1243) add SAI_ROUTER_INTERFACE_ATTR_MTU support in broadcom SAI --- platform/broadcom/sai.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk index 6b1795f87ecc..4f806ebd97f1 100644 --- a/platform/broadcom/sai.mk +++ b/platform/broadcom/sai.mk @@ -1,9 +1,9 @@ -BRCM_SAI = libsaibcm_3.0.3.3_amd64.deb -$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.3_amd64.deb?sv=2015-04-05&sr=b&sig=itlsEt8vqhWfZzuq%2FOSWSGgHN5kokf5a9AYOSJhD3t4%3D&se=2031-08-16T03%3A11%3A13Z&sp=r" +BRCM_SAI = libsaibcm_3.0.3.3-1_amd64.deb +$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.0.3.3-1_amd64.deb?sv=2015-04-05&sr=b&sig=hoUotiQsgVMo6%2BzH87aaIeTsqPsRYWQT5oRdSc1uEm8%3D&se=2154-11-09T08%3A09%3A33Z&sp=r" -BRCM_SAI_DEV = libsaibcm-dev_3.0.3.3_amd64.deb +BRCM_SAI_DEV = libsaibcm-dev_3.0.3.3-1_amd64.deb $(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV))) -$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.3_amd64.deb?sv=2015-04-05&sr=b&sig=0DXLHgPXuMHERp44qJNNdQyYSv969sQsY7USCL6gCRw%3D&se=2031-08-16T03%3A10%3A49Z&sp=r" +$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.0.3.3-1_amd64.deb?sv=2015-04-05&sr=b&sig=LfvM2LkGj3dPnSCyVEgPA35jvjKOgq%2FNSvj2UiPeGm4%3D&se=2154-11-09T08%3A11%3A03Z&sp=r" SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV) $(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI) From c90e9be9688eeeacd96a58b2f58dedece6d72580 Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 17 Dec 2017 02:04:32 -0800 Subject: [PATCH 0994/1011] [swss]: update swss submodule (#1244) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index ff9042962145..fab3cea5b075 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit ff904296214509d628ea868570f0b903ace8b146 +Subproject commit fab3cea5b075ccdd26eb6d56cc68d6325bfb8b16 From 0a4c8884efc96cce98404ec96ffd684bebeb69f0 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Tue, 19 Dec 2017 20:26:45 +0200 Subject: [PATCH 0995/1011] [sonic-py-swsssdk]: Update submodule pointer (#1253) Include commit that makes sdk compatible with python3.6 Signed-off-by: marian-pritsak --- src/sonic-py-swsssdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-py-swsssdk b/src/sonic-py-swsssdk index 1c7a6b449644..a0418a15a46e 160000 --- a/src/sonic-py-swsssdk +++ b/src/sonic-py-swsssdk @@ -1 +1 @@ -Subproject commit 1c7a6b4496440a8a9e7e2ab314564ce8e26aa378 +Subproject commit a0418a15a46e20c3d8fcd7c8cf2bb6ab0a4aafaf From f0d59cb00299401e66015edb90744235a474b46b Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 19 Dec 2017 10:28:45 -0800 Subject: [PATCH 0996/1011] [DHCP relay]: Fix circuit ID and remote ID bugs (#1248) * [DHCP relay]: Fix circuit ID and remote ID bugs * Set circuit_id_len after setting circuit_id_len to ip->name --- ...ion-82-circuit-ID-and-remote-ID-fiel.patch | 65 ++++++++++--------- ...ining-name-of-physical-interface-tha.patch | 6 +- ...ing-port-alias-map-file-to-replace-p.patch | 34 ++++++---- 3 files changed, 61 insertions(+), 44 deletions(-) diff --git a/src/isc-dhcp/patch/0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch b/src/isc-dhcp/patch/0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch index 4d47c8185ece..22a8f7faedd1 100644 --- a/src/isc-dhcp/patch/0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch +++ b/src/isc-dhcp/patch/0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch @@ -1,14 +1,14 @@ -From 42319f1b56ba6362c874cd64383a055ba6498bee Mon Sep 17 00:00:00 2001 +From 284c87ff4b3873d0215904273fe3c86b07b4ba94 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 11 Dec 2017 23:21:08 +0000 Subject: [PATCH 1/3] Customizable Option 82 circuit ID and remote ID fields --- - relay/dhcrelay.c | 172 +++++++++++++++++++++++++++++++++++++++++++++++-------- - 1 file changed, 147 insertions(+), 25 deletions(-) + relay/dhcrelay.c | 182 ++++++++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 152 insertions(+), 30 deletions(-) diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c -index 15b4997..a26efca 100644 +index 15b4997..b9f8326 100644 --- a/relay/dhcrelay.c +++ b/relay/dhcrelay.c @@ -73,6 +73,8 @@ int bad_circuit_id = 0; /* Circuit ID option in matching RAI option @@ -158,9 +158,12 @@ index 15b4997..a26efca 100644 * Examine a packet to see if it's a candidate to have a Relay * Agent Information option tacked onto its tail. If it is, tack * the option on. -@@ -948,6 +1044,9 @@ add_relay_agent_options(struct interface_info *ip, struct dhcp_packet *packet, +@@ -946,8 +1042,11 @@ static int + add_relay_agent_options(struct interface_info *ip, struct dhcp_packet *packet, + unsigned length, struct in_addr giaddr) { int is_dhcp = 0, mms; - unsigned optlen; +- unsigned optlen; ++ unsigned optlen = 0; u_int8_t *op, *nextop, *sp, *max, *end_pad = NULL; + char circuit_id_buf[256] = { '\0' }; + char remote_id_buf[256] = { '\0' }; @@ -177,16 +180,32 @@ index 15b4997..a26efca 100644 - log_fatal("Circuit ID length %d out of range [1-255] on " - "%s\n", ip->circuit_id_len, ip->name); - optlen = ip->circuit_id_len + 2; /* RAI_CIRCUIT_ID + len */ +- +- if (ip->remote_id) { +- if (ip->remote_id_len > 255 || ip->remote_id_len < 1) +- log_fatal("Remote ID length %d out of range [1-255] " +- "on %s\n", ip->circuit_id_len, ip->name); +- optlen += ip->remote_id_len + 2; /* RAI_REMOTE_ID + len */ +- } + /* option82: custom string for circuit_id */ + if (agent_circuit_id_fmt) { + circuit_id_len = format_relay_agent_rfc3046_msg(ip, packet, agent_circuit_id_fmt, + circuit_id_buf, sizeof(circuit_id_buf)); + -+ if (circuit_id_len == 0) ++ if (circuit_id_len == 0) { + strncpy(circuit_id_buf, ip->name, sizeof(ip->name)); ++ circuit_id_len = strlen(circuit_id_buf); ++ } ++ ++ /* Sanity check. Had better not ever happen. */ ++ if (circuit_id_len > 255 || circuit_id_len < 1) ++ log_fatal("Circuit ID length %d out of range [1-255] on %s\n", ++ (int)circuit_id_len, ip->name); ++ ++ optlen = circuit_id_len + 2; // RAI_CIRCUIT_ID + len + + //log_debug("Sending on %s option82:circuit_id='%s' (%d)", -+ // ip->name, circuit_id_buf, circuit_id_len); ++ // ip->name, circuit_id_buf, (int)circuit_id_len); + } + + /* option82: custom string for remote_id */ @@ -194,28 +213,15 @@ index 15b4997..a26efca 100644 + remote_id_len = format_relay_agent_rfc3046_msg(ip, packet, agent_remote_id_fmt, + remote_id_buf, sizeof(remote_id_buf)); + -+ //log_debug("Sending on %s option82:remote_id='%s' (%d)", -+ // ip->name, remote_id_buf, remote_id_len); -+ } ++ if (remote_id_len > 255 || remote_id_len < 1) ++ log_fatal("Remote ID length %d out of range [1-255] on %s\n", ++ (int)remote_id_len, ip->name); + -+ /* Sanity check. Had better not ever happen. */ -+ if (circuit_id_len > 255 || circuit_id_len < 1) -+ log_fatal("Circuit ID length %d out of range [1-255] on %s\n", -+ circuit_id_len, ip->name); ++ optlen += remote_id_len + 2; // RAI_REMOTE_ID + len + -+ optlen = circuit_id_len + 2; // RAI_CIRCUIT_ID + len - - if (ip->remote_id) { -- if (ip->remote_id_len > 255 || ip->remote_id_len < 1) -- log_fatal("Remote ID length %d out of range [1-255] " -- "on %s\n", ip->circuit_id_len, ip->name); -- optlen += ip->remote_id_len + 2; /* RAI_REMOTE_ID + len */ -+ if (remote_id_len > 255 || remote_id_len < 1) -+ log_fatal("Remote ID length %d out of range [1-255] on %s\n", -+ remote_id_len, ip->name); -+ -+ optlen += remote_id_len + 2; // RAI_REMOTE_ID + len - } ++ //log_debug("Sending on %s option82:remote_id='%s' (%d)", ++ // ip->name, remote_id_buf, (int)remote_id_len); ++ } - /* We do not support relay option fragmenting(multiple options to - * support an option data exceeding 255 bytes). @@ -250,7 +256,8 @@ index 15b4997..a26efca 100644 + sp += circuit_id_len; /* Copy in remote ID... */ - if (ip->remote_id) { +- if (ip->remote_id) { ++ if (remote_id_len > 0) { *sp++ = RAI_REMOTE_ID; - *sp++ = ip->remote_id_len; - memcpy(sp, ip->remote_id, ip->remote_id_len); diff --git a/src/isc-dhcp/patch/0002-Support-for-obtaining-name-of-physical-interface-tha.patch b/src/isc-dhcp/patch/0002-Support-for-obtaining-name-of-physical-interface-tha.patch index 87c9ba266cb1..ee85a7736287 100644 --- a/src/isc-dhcp/patch/0002-Support-for-obtaining-name-of-physical-interface-tha.patch +++ b/src/isc-dhcp/patch/0002-Support-for-obtaining-name-of-physical-interface-tha.patch @@ -1,4 +1,4 @@ -From 18ca48b7c307e1644f653df4c8503f4ce2677f62 Mon Sep 17 00:00:00 2001 +From caad3e05c31c9fad8cda378ce95a1969def771a2 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 11 Dec 2017 23:39:10 +0000 Subject: [PATCH 2/3] Support for obtaining name of physical interface that is @@ -9,7 +9,7 @@ Subject: [PATCH 2/3] Support for obtaining name of physical interface that is 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c -index a26efca..84ec79d 100644 +index b9f8326..8458ea9 100644 --- a/relay/dhcrelay.c +++ b/relay/dhcrelay.c @@ -758,6 +758,7 @@ do_relay4(struct interface_info *ip, struct dhcp_packet *packet, @@ -63,7 +63,7 @@ index a26efca..84ec79d 100644 + if (cmd != NULL) { + while (fgets(buf, sizeof(buf), cmd)) { + sscanf(buf, FDB_LINE_FORMAT, macAddr, interface, vlanid); -+ //log_debug("bridgefdbquery: macAddr:%s interface: %s vlanid %d", ++ //log_debug("bridgefdbquery: macAddr: %s interface: %s vlanid: %d", + // macAddr, interface, *vlanid); + } + pclose(cmd); diff --git a/src/isc-dhcp/patch/0003-Support-for-loading-port-alias-map-file-to-replace-p.patch b/src/isc-dhcp/patch/0003-Support-for-loading-port-alias-map-file-to-replace-p.patch index 216abf5ba7b7..7411e1c4ff3e 100644 --- a/src/isc-dhcp/patch/0003-Support-for-loading-port-alias-map-file-to-replace-p.patch +++ b/src/isc-dhcp/patch/0003-Support-for-loading-port-alias-map-file-to-replace-p.patch @@ -1,15 +1,15 @@ -From 3be065305283b90ddfef92a8736221cbf7cf06e0 Mon Sep 17 00:00:00 2001 +From 3a42b497716375c9347b51c3a28c5e91e7cd4cf4 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 12 Dec 2017 00:49:09 +0000 -Subject: [PATCH 3/3] Support for loading port alias map file to replace - port name with alias in circuit id +Subject: [PATCH 3/3] Support for loading port alias map file to replace port + name with alias in circuit id --- - relay/dhcrelay.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- - 1 file changed, 102 insertions(+), 1 deletion(-) + relay/dhcrelay.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c -index 84ec79d..0b56e2d 100644 +index 8458ea9..15f0acf 100644 --- a/relay/dhcrelay.c +++ b/relay/dhcrelay.c @@ -122,6 +122,14 @@ static void setup_streams(void); @@ -81,24 +81,34 @@ index 84ec79d..0b56e2d 100644 return (0); } -@@ -1056,6 +1077,16 @@ format_relay_agent_rfc3046_msg(const struct interface_info *ip, struct dhcp_pack +@@ -1040,6 +1061,7 @@ format_relay_agent_rfc3046_msg(const struct interface_info *ip, struct dhcp_pack + */ + if (packet->htype && !packet->giaddr.s_addr) { + int ret = 0, vlanid = 0; ++ char ifalias[IFNAMSIZ] = { 0 }; + + ret = _bridgefdbquery(print_hw_addr(packet->htype, packet->hlen, packet->chaddr), + ifname, +@@ -1056,6 +1078,18 @@ format_relay_agent_rfc3046_msg(const struct interface_info *ip, struct dhcp_pack strncpy(ifname, ip->name, IFNAMSIZ); } + // Attempt to translate SONiC interface name to vendor alias -+ if (get_interface_alias_by_name(ip->name, ifname) < 0) { -+ //log_debug("Failed to retrieve alias for interface name '%s'. Defaulting to interface name.", ip->name); -+ strncpy(ifname, ip->name, IFNAMSIZ); ++ ret = get_interface_alias_by_name(ifname, ifalias); ++ if (ret < 0) { ++ //log_debug("Failed to retrieve alias for interface name '%s'. Defaulting to interface name.", ifname); + } + else { + //log_debug("Mapped interface name '%s' to alias '%s'. Adding as option 82 interface alias for MAC Address %s", -+ // ip->name, ifname, print_hw_addr (packet->htype, packet->hlen, packet->chaddr), ++ // ifname, ifalias, print_hw_addr (packet->htype, packet->hlen, packet->chaddr)); ++ ++ strncpy(ifname, ifalias, IFNAMSIZ); + } + str = ifname; } break; -@@ -1922,3 +1953,73 @@ dhcp_set_control_state(control_object_state_t oldstate, +@@ -1922,3 +1956,73 @@ dhcp_set_control_state(control_object_state_t oldstate, exit(0); } From 6e05b670700d8afd8c33f7df03cd5041f297db81 Mon Sep 17 00:00:00 2001 From: Phil Huang Date: Wed, 20 Dec 2017 07:41:48 +0800 Subject: [PATCH 0997/1011] [device/accton] Correct exception function name (#1249) NotImplementedErro(r) Signed-off-by: Phil Huang --- device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py index 1f2a66d64ccd..2e636292bfa9 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py @@ -83,10 +83,10 @@ def reset(self, port_num): return True def set_low_power_mode(self, port_nuM, lpmode): - raise NotImplementedErro + raise NotImplementedError def get_low_power_mode(self, port_num): - raise NotImplementedErro + raise NotImplementedError def get_presence(self, port_num): # Check for invalid port_num From ab2d066a4ddf4456b7946a504f29fde9889273a9 Mon Sep 17 00:00:00 2001 From: Marian Pritsak Date: Wed, 20 Dec 2017 02:02:26 +0200 Subject: [PATCH 0998/1011] [snmp]: Save S/N in state DB prior to starting service (#1246) snmp.service needs to read chassis serial number for one of its mibs. We save this value in state DB so that it is accessible from container. Signed-off-by: marian-pritsak --- files/build_templates/docker_image_ctl.j2 | 3 +++ files/build_templates/snmp.service.j2 | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index a7aee83c70e6..628964ec7b61 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -17,6 +17,9 @@ function postStartAction() sleep 1 done {%- endif %} +{%- if docker_container_name == "snmp" %} + docker exec -i database redis-cli -n 6 HSET 'DEVICE_METADATA|localhost' chassis_serial_number $(decode-syseeprom -s) +{%- endif %} } # Obtain our platform as we will mount directories with these names in each docker diff --git a/files/build_templates/snmp.service.j2 b/files/build_templates/snmp.service.j2 index 08c41a52a5f7..0c1558ad64aa 100644 --- a/files/build_templates/snmp.service.j2 +++ b/files/build_templates/snmp.service.j2 @@ -4,7 +4,6 @@ Requires=database.service swss.service After=database.service swss.service [Service] -User={{ sonicadmin_user }} ExecStartPre=/usr/bin/{{docker_container_name}}.sh start ExecStart=/usr/bin/{{docker_container_name}}.sh attach ExecStop=/usr/bin/{{docker_container_name}}.sh stop From 64602ad5b2294f2e1de6b0f1f1761fb7697b21a7 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Wed, 20 Dec 2017 11:22:08 -0800 Subject: [PATCH 0999/1011] [DHCP relay]: Add patch to always undef VLAN_TCI_PRESENT so as not to treat VLAN-tagged packets differently (#1254) --- ...N_TCI_PRESENT-so-as-not-to-treat-VLA.patch | 30 +++++++++++++++++++ ...on-82-circuit-ID-and-remote-ID-fiel.patch} | 4 +-- ...ning-name-of-physical-interface-tha.patch} | 4 +-- ...ng-port-alias-map-file-to-replace-p.patch} | 4 +-- src/isc-dhcp/patch/series | 7 +++-- 5 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 src/isc-dhcp/patch/0001-Always-undef-VLAN_TCI_PRESENT-so-as-not-to-treat-VLA.patch rename src/isc-dhcp/patch/{0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch => 0002-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch} (98%) rename src/isc-dhcp/patch/{0002-Support-for-obtaining-name-of-physical-interface-tha.patch => 0003-Support-for-obtaining-name-of-physical-interface-tha.patch} (96%) rename src/isc-dhcp/patch/{0003-Support-for-loading-port-alias-map-file-to-replace-p.patch => 0004-Support-for-loading-port-alias-map-file-to-replace-p.patch} (98%) diff --git a/src/isc-dhcp/patch/0001-Always-undef-VLAN_TCI_PRESENT-so-as-not-to-treat-VLA.patch b/src/isc-dhcp/patch/0001-Always-undef-VLAN_TCI_PRESENT-so-as-not-to-treat-VLA.patch new file mode 100644 index 000000000000..f5afc5692a5d --- /dev/null +++ b/src/isc-dhcp/patch/0001-Always-undef-VLAN_TCI_PRESENT-so-as-not-to-treat-VLA.patch @@ -0,0 +1,30 @@ +From 7fe46584c3d9cb6b1ecdee47ff5ac2b777f96ec6 Mon Sep 17 00:00:00 2001 +From: Joe LeVeque +Date: Wed, 20 Dec 2017 02:18:10 +0000 +Subject: [PATCH 1/4] Always undef VLAN_TCI_PRESENT so as not to treat + VLAN-tagged packets differently + +--- + configure.ac | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 3f1415b..fcfeba0 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -600,9 +600,9 @@ AC_CHECK_MEMBER(struct msghdr.msg_control,, + #include + ]) + +-AC_CHECK_MEMBER(struct tpacket_auxdata.tp_vlan_tci, +- [AC_DEFINE([VLAN_TCI_PRESENT], [1], [tpacket_auxdata.tp_vlan_tci present])] +- ,, [#include ]) ++#AC_CHECK_MEMBER(struct tpacket_auxdata.tp_vlan_tci, ++# [AC_DEFINE([VLAN_TCI_PRESENT], [1], [tpacket_auxdata.tp_vlan_tci present])] ++# ,, [#include ]) + + libbind= + AC_ARG_WITH(libbind, +-- +2.1.4 + diff --git a/src/isc-dhcp/patch/0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch b/src/isc-dhcp/patch/0002-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch similarity index 98% rename from src/isc-dhcp/patch/0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch rename to src/isc-dhcp/patch/0002-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch index 22a8f7faedd1..33197a80b0e0 100644 --- a/src/isc-dhcp/patch/0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch +++ b/src/isc-dhcp/patch/0002-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch @@ -1,7 +1,7 @@ -From 284c87ff4b3873d0215904273fe3c86b07b4ba94 Mon Sep 17 00:00:00 2001 +From c2361e2bf24408cc21a4691c3897cc64c95372f1 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 11 Dec 2017 23:21:08 +0000 -Subject: [PATCH 1/3] Customizable Option 82 circuit ID and remote ID fields +Subject: [PATCH 2/4] Customizable Option 82 circuit ID and remote ID fields --- relay/dhcrelay.c | 182 ++++++++++++++++++++++++++++++++++++++++++++++--------- diff --git a/src/isc-dhcp/patch/0002-Support-for-obtaining-name-of-physical-interface-tha.patch b/src/isc-dhcp/patch/0003-Support-for-obtaining-name-of-physical-interface-tha.patch similarity index 96% rename from src/isc-dhcp/patch/0002-Support-for-obtaining-name-of-physical-interface-tha.patch rename to src/isc-dhcp/patch/0003-Support-for-obtaining-name-of-physical-interface-tha.patch index ee85a7736287..7d9169dc67af 100644 --- a/src/isc-dhcp/patch/0002-Support-for-obtaining-name-of-physical-interface-tha.patch +++ b/src/isc-dhcp/patch/0003-Support-for-obtaining-name-of-physical-interface-tha.patch @@ -1,7 +1,7 @@ -From caad3e05c31c9fad8cda378ce95a1969def771a2 Mon Sep 17 00:00:00 2001 +From 236d4f1cb0afa2bee22f47a48b725427bfcb5a9c Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 11 Dec 2017 23:39:10 +0000 -Subject: [PATCH 2/3] Support for obtaining name of physical interface that is +Subject: [PATCH 3/4] Support for obtaining name of physical interface that is a member of a bridge interface --- diff --git a/src/isc-dhcp/patch/0003-Support-for-loading-port-alias-map-file-to-replace-p.patch b/src/isc-dhcp/patch/0004-Support-for-loading-port-alias-map-file-to-replace-p.patch similarity index 98% rename from src/isc-dhcp/patch/0003-Support-for-loading-port-alias-map-file-to-replace-p.patch rename to src/isc-dhcp/patch/0004-Support-for-loading-port-alias-map-file-to-replace-p.patch index 7411e1c4ff3e..1d42e9838f96 100644 --- a/src/isc-dhcp/patch/0003-Support-for-loading-port-alias-map-file-to-replace-p.patch +++ b/src/isc-dhcp/patch/0004-Support-for-loading-port-alias-map-file-to-replace-p.patch @@ -1,7 +1,7 @@ -From 3a42b497716375c9347b51c3a28c5e91e7cd4cf4 Mon Sep 17 00:00:00 2001 +From 1092578a8415b9d49182c2b9825753e96481246a Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Tue, 12 Dec 2017 00:49:09 +0000 -Subject: [PATCH 3/3] Support for loading port alias map file to replace port +Subject: [PATCH 4/4] Support for loading port alias map file to replace port name with alias in circuit id --- diff --git a/src/isc-dhcp/patch/series b/src/isc-dhcp/patch/series index a896563077c2..980b9b97e34b 100644 --- a/src/isc-dhcp/patch/series +++ b/src/isc-dhcp/patch/series @@ -1,4 +1,5 @@ # This series applies on GIT commit ee3dffdda38a8cfc6ad2005d8d64a165d2a709ba -0001-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch -0002-Support-for-obtaining-name-of-physical-interface-tha.patch -0003-Support-for-loading-port-alias-map-file-to-replace-p.patch +0001-Always-undef-VLAN_TCI_PRESENT-so-as-not-to-treat-VLA.patch +0002-Customizable-Option-82-circuit-ID-and-remote-ID-fiel.patch +0003-Support-for-obtaining-name-of-physical-interface-tha.patch +0004-Support-for-loading-port-alias-map-file-to-replace-p.patch From b57cfd72957ade0056406b083e7a2a64c78d1038 Mon Sep 17 00:00:00 2001 From: yurypm Date: Wed, 20 Dec 2017 22:05:23 +0000 Subject: [PATCH 1000/1011] [arista] Delete sysfs entries for all Arista Digital Power Monitor/Management devices (#1256) * Bump sonic-platform-modules-arista submodule * [arista] Remove DPM entries from Arista sensors.conf files --- device/arista/x86_64-arista_7050_qx32s/sensors.conf | 8 -------- device/arista/x86_64-arista_7060_cx32s/sensors.conf | 8 -------- platform/broadcom/sonic-platform-modules-arista | 2 +- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/device/arista/x86_64-arista_7050_qx32s/sensors.conf b/device/arista/x86_64-arista_7050_qx32s/sensors.conf index cf4977f1cc12..9c2dd38597a3 100644 --- a/device/arista/x86_64-arista_7050_qx32s/sensors.conf +++ b/device/arista/x86_64-arista_7050_qx32s/sensors.conf @@ -29,14 +29,6 @@ chip "max6658-i2c-3-4c" set temp2_max 75 set temp2_crit 80 -chip "pmbus-i2c-3-4e" - label temp1 "Power controller 1 sensor 1" - label temp2 "Power controller 1 sensor 2" - -chip "pmbus-i2c-7-4e" - label temp1 "Power controller 2 sensor 1" - label temp2 "Power controller 2 sensor 2" - chip "pmbus-i2c-6-58" label temp1 "Power supply 1 hotspot sensor" label temp2 "Power supply 1 inlet temp sensor" diff --git a/device/arista/x86_64-arista_7060_cx32s/sensors.conf b/device/arista/x86_64-arista_7060_cx32s/sensors.conf index 7b548f8493e0..57e785881912 100644 --- a/device/arista/x86_64-arista_7060_cx32s/sensors.conf +++ b/device/arista/x86_64-arista_7060_cx32s/sensors.conf @@ -40,14 +40,6 @@ chip "max6658-i2c-3-4c" set temp2_max 75 set temp2_crit 80 -chip "pmbus-i2c-3-4e" - label temp1 "Power controller 1 sensor 1" - label temp2 "Power controller 1 sensor 2" - -chip "pmbus-i2c-7-4e" - label temp1 "Power controller 2 sensor 1" - label temp2 "Power controller 2 sensor 2" - chip "pmbus-i2c-6-58" label temp1 "Power supply 1 hotspot sensor" label temp2 "Power supply 1 inlet temp sensor" diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 8b8411551faa..62b5b7da50f2 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 8b8411551faab9e44aa1f66dae507e3d92ecf468 +Subproject commit 62b5b7da50f29d4299aaca69bdb40bf9172bb4e6 From ee58ee2067cf48f8993e90c64fc45d5f3884eea3 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 20 Dec 2017 15:25:04 -0800 Subject: [PATCH 1001/1011] [build] make second Accton Debian package extra package of the first one (#1257) Both packages are built with a single build command. We only have to take the second one after the first one is built. --- platform/broadcom/platform-modules-accton.mk | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/platform/broadcom/platform-modules-accton.mk b/platform/broadcom/platform-modules-accton.mk index 6a2bf8c04b6f..7030ecb441f7 100755 --- a/platform/broadcom/platform-modules-accton.mk +++ b/platform/broadcom/platform-modules-accton.mk @@ -13,7 +13,6 @@ $(ACCTON_AS7712_32X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as7712_32x-r0 SONIC_DPKG_DEBS += $(ACCTON_AS7712_32X_PLATFORM_MODULE) ACCTON_AS5712_54X_PLATFORM_MODULE = sonic-platform-accton-as5712-54x_$(ACCTON_AS5712_54X_PLATFORM_MODULE_VERSION)_amd64.deb -$(ACCTON_AS5712_54X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-accton -$(ACCTON_AS5712_54X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) $(ACCTON_AS5712_54X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as5712_54x-r0 +$(eval $(call add_extra_package,$(ACCTON_AS7712_32X_PLATFORM_MODULE),$(ACCTON_AS5712_54X_PLATFORM_MODULE))) SONIC_DPKG_DEBS += $(ACCTON_AS5712_54X_PLATFORM_MODULE) From eadd74fb8416b1e3dd00c0fd967ff52182282ada Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 20 Dec 2017 15:25:30 -0800 Subject: [PATCH 1002/1011] [build] allow user to override the default number of build jobs (#1255) User could issue SONIC_BUILD_JOBS= to set number of concurrent build job(s) to run. With this commit, the default setting is still left at 1. --- Makefile | 4 +++- slave.mk | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index d1a28f031748..0adcbb99fa66 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,7 @@ # * PASSWORD: Desired password -- default at rules/config # * KEEP_SLAVE_ON: Keeps slave container up after building-process concludes. # * SOURCE_FOLDER: host path to be mount as /var/src, only effective when KEEP_SLAVE_ON=yes +# * SONIC_BUILD_JOB: Specifying number of concurrent build job(s) to run # ############################################################################### @@ -59,7 +60,8 @@ SONIC_BUILD_INSTRUCTION := make \ SHUTDOWN_BGP_ON_START=$(SHUTDOWN_BGP_ON_START) \ ENABLE_SYNCD_RPC=$(ENABLE_SYNCD_RPC) \ PASSWORD=$(PASSWORD) \ - USERNAME=$(USERNAME) + USERNAME=$(USERNAME) \ + SONIC_BUILD_JOBS=$(SONIC_BUILD_JOBS) .PHONY: sonic-slave-build sonic-slave-bash init diff --git a/slave.mk b/slave.mk index 8ec6832bd687..4843faee5066 100644 --- a/slave.mk +++ b/slave.mk @@ -74,7 +74,11 @@ ifeq ($(PASSWORD),) override PASSWORD := $(DEFAULT_PASSWORD) endif -MAKEFLAGS += -j $(SONIC_CONFIG_BUILD_JOBS) +ifeq ($(SONIC_BUILD_JOBS),) +override SONIC_BUILD_JOBS := $(SONIC_CONFIG_BUILD_JOBS) +endif + +MAKEFLAGS += -j $(SONIC_BUILD_JOBS) export SONIC_CONFIG_MAKE_JOBS ############################################################################### @@ -86,7 +90,7 @@ $(info ) $(info Build Configuration) $(info "CONFIGURED_PLATFORM" : "$(if $(PLATFORM),$(PLATFORM),$(CONFIGURED_PLATFORM))") $(info "SONIC_CONFIG_PRINT_DEPENDENCIES" : "$(SONIC_CONFIG_PRINT_DEPENDENCIES)") -$(info "SONIC_CONFIG_BUILD_JOBS" : "$(SONIC_CONFIG_BUILD_JOBS)") +$(info "SONIC_BUILD_JOBS" : "$(SONIC_BUILD_JOBS)") $(info "SONIC_CONFIG_MAKE_JOBS" : "$(SONIC_CONFIG_MAKE_JOBS)") $(info "DEFAULT_USERNAME" : "$(DEFAULT_USERNAME)") $(info "DEFAULT_PASSWORD" : "$(DEFAULT_PASSWORD)") From db49660b868b81cdc16e8d80f60e8ee3a8871466 Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Thu, 21 Dec 2017 17:54:32 +0800 Subject: [PATCH 1003/1011] Add set/get lpmode and mode_rst feature for qsfp (#1261) * Add lpmode set/get . mode_reset feature for qsfp * Add lp mode, set/get and mode_rst feature for sfp --- .../plugins/sfputil.py | 76 +++++++++++++++++-- .../broadcom/sonic-platform-modules-accton | 2 +- 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py index c9862957bf31..d554910ac5cd 100755 --- a/device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as5712_54x-r0/plugins/sfputil.py @@ -16,12 +16,13 @@ class SfpUtil(SfpUtilBase): PORT_START = 0 PORT_END = 71 PORTS_IN_BLOCK = 72 - QSFP_PORT_START = 72 + QSFP_PORT_START = 48 QSFP_PORT_END = 72 BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/" _port_to_is_present = {} + _port_to_lp_mode = {} _port_to_eeprom_mapping = {} _port_to_i2c_mapping = { @@ -107,6 +108,14 @@ def port_start(self): def port_end(self): return self.PORT_END + @property + def qsfp_port_start(self): + return self.QSFP_PORT_START + + @property + def qsfp_port_end(self): + return self.QSFP_PORT_END + @property def qsfp_ports(self): return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) @@ -148,11 +157,66 @@ def get_presence(self, port_num): return False - def get_low_power_mode(self, port_num): - raise NotImplementedError + def get_low_power_mode(self, port_num): + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + lp_mode_path = self.BASE_VAL_PATH + "sfp_lp_mode" + self.__port_to_lp_mode = lp_mode_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][1]) + + try: + val_file = open(self.__port_to_lp_mode) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + val_file.close() + + # content is a string, either "0" or "1" + if content == "1": + return True - def set_low_power_mode(self, port_num, lpmode): - raise NotImplementedError + return False + + def set_low_power_mode(self, port_num, lpmode): + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + lp_mode_path = self.BASE_VAL_PATH + "sfp_lp_mode" + self.__port_to_lp_mode = lp_mode_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][1]) + + try: + reg_file = open(self.__port_to_lp_mode, 'r+') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + if lpmode is True: + reg_value = '1' + else: + reg_value = '0' + + reg_file.write(reg_value) + reg_file.close() + + return True def reset(self, port_num): - raise NotImplementedError + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + mod_rst_path = self.BASE_VAL_PATH + "sfp_mod_rst" + self.__port_to_mod_rst = mod_rst_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][1]) + try: + reg_file = open(self.__port_to_mod_rst, 'r+') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = '1' + + reg_file.write(reg_value) + reg_file.close() + + return True \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton index 7ba26ec403c7..7c39d916d2b5 160000 --- a/platform/broadcom/sonic-platform-modules-accton +++ b/platform/broadcom/sonic-platform-modules-accton @@ -1 +1 @@ -Subproject commit 7ba26ec403c7f0d0acb958f794311ac3fd1af9a1 +Subproject commit 7c39d916d2b5d248c8067669e72b75ed7240b348 From c898a04b28f58f7ba6ea0b6268cbf038fb7f12cd Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 21 Dec 2017 11:03:08 -0800 Subject: [PATCH 1004/1011] [sudoers] Add 'docker ps' to READ_ONLY_CMDS (#1259) --- files/image_config/sudoers/sudoers | 1 + 1 file changed, 1 insertion(+) diff --git a/files/image_config/sudoers/sudoers b/files/image_config/sudoers/sudoers index 715a1979f1ab..317ace3bf99f 100644 --- a/files/image_config/sudoers/sudoers +++ b/files/image_config/sudoers/sudoers @@ -21,6 +21,7 @@ Cmnd_Alias READ_ONLY_CMDS = /usr/bin/decode-syseeprom, \ /usr/bin/docker images *, \ /usr/bin/docker exec -it snmp cat /etc/snmp/snmpd.conf, \ /usr/bin/docker exec -it bgp cat /etc/quagga/bgpd.conf, \ + /usr/bin/docker ps, \ /usr/bin/generate_dump, \ /usr/bin/lldpctl, \ /usr/bin/lldpshow, \ From ee73cdec26afae23ba2a712a5c5815b1c958d827 Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Thu, 21 Dec 2017 11:15:06 -0800 Subject: [PATCH 1005/1011] Add 'make reset' target with warning prompt to reset git repo and submodules (#1258) --- Makefile | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 0adcbb99fa66..8d864e914aa2 100644 --- a/Makefile +++ b/Makefile @@ -63,7 +63,7 @@ SONIC_BUILD_INSTRUCTION := make \ USERNAME=$(USERNAME) \ SONIC_BUILD_JOBS=$(SONIC_BUILD_JOBS) -.PHONY: sonic-slave-build sonic-slave-bash init +.PHONY: sonic-slave-build sonic-slave-bash init reset .DEFAULT_GOAL := all @@ -98,5 +98,18 @@ sonic-slave-bash : @$(DOCKER_RUN) -t $(SLAVE_IMAGE):$(SLAVE_TAG) bash init : - git submodule update --init --recursive - git submodule foreach --recursive '[ -f .git ] && echo "gitdir: $$(realpath --relative-to=. $$(cut -d" " -f2 .git))" > .git' + @git submodule update --init --recursive + @git submodule foreach --recursive '[ -f .git ] && echo "gitdir: $$(realpath --relative-to=. $$(cut -d" " -f2 .git))" > .git' + +reset : + @echo && echo -n "Warning! All local changes will be lost. Proceed? [y/N]: " + @read ans && \ + if [ $$ans == y ]; then \ + git clean -xfdf; \ + git reset --hard; \ + git submodule foreach --recursive git clean -xfdf; \ + git submodule foreach --recursive git reset --hard; \ + git submodule update --init --recursive;\ + else \ + echo "Reset aborted"; \ + fi From 63de341dd605585a126d233b66858a4194600ff2 Mon Sep 17 00:00:00 2001 From: kaiyu22 Date: Sat, 23 Dec 2017 02:04:29 +0800 Subject: [PATCH 1006/1011] [Platform] Add Ingrasys S9130-32X and S9230-64X with Nephos Switch ASIC (#1245) * Add switch ASIC vendor and platforms for Nephos - What I did Add switch ASIC vendor: Nephos Add Nephos platforms: Ingrasys S9130-32X, Ingrasys S9230-64X - How I did it Add platform/nephos files Add platform/nephos/sonic-platform-modules-ingrasys submodule Add device/ingrasys/x86_64-ingrasys_s9130_32x-r0 files Add device/ingrasys/x86_64-ingrasys_s9230_64x-r0 files Add SONiC to support Nephos platform - How to verify it To build SONiC installer image and docker images, run the following commands: make configure PLATFORM=nephos make target/sonic-nephos.bin Check system and network feature is worked as well - Description for the changelog Add switch ASIC vendor and platforms for Nephos - A picture of a cute animal (not mandatory but encouraged) Signed-off-by: Sam Yang * Advance sonic-sairedis submodule to include #271 (Add Nephos ASIC) --- .gitmodules | 3 + README.md | 3 + build_debian.sh | 3 + .../INGRASYS-S9130-32X/port_config.ini | 33 ++ .../INGRASYS-S9130-32X/port_config.nps | 0 .../INGRASYS-S9130-32X/sai.profile | 2 + .../x86_64-ingrasys_s9130_32x-r0/fancontrol | 12 + .../installer.conf | 3 + .../led_proc_init.nps | 20 ++ .../minigraph.xml | 151 +++++++++ .../plugins/eeprom.py | 22 ++ .../plugins/sfputil.py | 187 +++++++++++ .../x86_64-ingrasys_s9130_32x-r0/sensors.conf | 69 +++++ .../INGRASYS-S9230-64X/port_config.ini | 65 ++++ .../INGRASYS-S9230-64X/port_config.nps | 0 .../INGRASYS-S9230-64X/sai.profile | 2 + .../x86_64-ingrasys_s9230_64x-r0/fancontrol | 9 + .../installer.conf | 3 + .../led_proc_init.nps | 20 ++ .../minigraph.xml | 151 +++++++++ .../plugins/eeprom.py | 22 ++ .../plugins/psuutil.py | 92 ++++++ .../plugins/sfputil.py | 293 ++++++++++++++++++ .../x86_64-ingrasys_s9230_64x-r0/sensors.conf | 90 ++++++ dockers/docker-orchagent-nephos | 1 + dockers/docker-orchagent/orchagent.sh | 2 + files/build_templates/swss.service.j2 | 4 + platform/nephos/docker-orchagent-nephos.mk | 19 ++ platform/nephos/docker-ptf-nephos.mk | 7 + platform/nephos/docker-syncd-nephos-rpc.mk | 17 + .../docker-syncd-nephos-rpc/Dockerfile.j2 | 51 +++ .../docker-syncd-nephos-rpc/ptf_nn_agent.conf | 10 + platform/nephos/docker-syncd-nephos.mk | 19 ++ .../nephos/docker-syncd-nephos/Dockerfile.j2 | 31 ++ .../base_image_files/npx_diag | 3 + platform/nephos/docker-syncd-nephos/start.sh | 7 + .../docker-syncd-nephos/supervisord.conf | 28 ++ platform/nephos/libsaithrift-dev.mk | 7 + platform/nephos/one-image.mk | 10 + platform/nephos/platform-modules-ingrasys.mk | 18 ++ platform/nephos/platform.conf | 0 platform/nephos/python-saithrift.mk | 6 + platform/nephos/rules.mk | 26 ++ platform/nephos/sai.mk | 9 + platform/nephos/sdk.mk | 4 + .../nephos/sonic-platform-modules-ingrasys | 1 + rules/ixgbe.mk | 8 + slave.mk | 1 + src/ixgbe/Makefile | 22 ++ src/sonic-sairedis | 2 +- 50 files changed, 1567 insertions(+), 1 deletion(-) create mode 100644 device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.ini create mode 100644 device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.nps create mode 100644 device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/sai.profile create mode 100644 device/ingrasys/x86_64-ingrasys_s9130_32x-r0/fancontrol create mode 100644 device/ingrasys/x86_64-ingrasys_s9130_32x-r0/installer.conf create mode 100644 device/ingrasys/x86_64-ingrasys_s9130_32x-r0/led_proc_init.nps create mode 100644 device/ingrasys/x86_64-ingrasys_s9130_32x-r0/minigraph.xml create mode 100644 device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/eeprom.py create mode 100644 device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/sfputil.py create mode 100644 device/ingrasys/x86_64-ingrasys_s9130_32x-r0/sensors.conf create mode 100644 device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.ini create mode 100644 device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.nps create mode 100644 device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/sai.profile create mode 100644 device/ingrasys/x86_64-ingrasys_s9230_64x-r0/fancontrol create mode 100644 device/ingrasys/x86_64-ingrasys_s9230_64x-r0/installer.conf create mode 100644 device/ingrasys/x86_64-ingrasys_s9230_64x-r0/led_proc_init.nps create mode 100644 device/ingrasys/x86_64-ingrasys_s9230_64x-r0/minigraph.xml create mode 100644 device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/eeprom.py create mode 100644 device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/psuutil.py create mode 100644 device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/sfputil.py create mode 100644 device/ingrasys/x86_64-ingrasys_s9230_64x-r0/sensors.conf create mode 120000 dockers/docker-orchagent-nephos create mode 100644 platform/nephos/docker-orchagent-nephos.mk create mode 100644 platform/nephos/docker-ptf-nephos.mk create mode 100644 platform/nephos/docker-syncd-nephos-rpc.mk create mode 100644 platform/nephos/docker-syncd-nephos-rpc/Dockerfile.j2 create mode 100644 platform/nephos/docker-syncd-nephos-rpc/ptf_nn_agent.conf create mode 100644 platform/nephos/docker-syncd-nephos.mk create mode 100755 platform/nephos/docker-syncd-nephos/Dockerfile.j2 create mode 100755 platform/nephos/docker-syncd-nephos/base_image_files/npx_diag create mode 100755 platform/nephos/docker-syncd-nephos/start.sh create mode 100644 platform/nephos/docker-syncd-nephos/supervisord.conf create mode 100644 platform/nephos/libsaithrift-dev.mk create mode 100644 platform/nephos/one-image.mk create mode 100644 platform/nephos/platform-modules-ingrasys.mk create mode 100644 platform/nephos/platform.conf create mode 100644 platform/nephos/python-saithrift.mk create mode 100644 platform/nephos/rules.mk create mode 100644 platform/nephos/sai.mk create mode 100644 platform/nephos/sdk.mk create mode 160000 platform/nephos/sonic-platform-modules-ingrasys create mode 100644 rules/ixgbe.mk create mode 100644 src/ixgbe/Makefile diff --git a/.gitmodules b/.gitmodules index 26763fb16012..1c7a6da0281d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -68,3 +68,6 @@ [submodule "platform/p4/SAI-P4-BM"] path = platform/p4/SAI-P4-BM url = https://github.com/Mellanox/SAI-P4-BM.git +[submodule "platform/nephos/sonic-platform-modules-ingrasys"] + path = platform/nephos/sonic-platform-modules-ingrasys + url = https://github.com/Ingrasys-sonic/sonic-platform-modules-ingrasys-nephos.git diff --git a/README.md b/README.md index 5ba616c027e0..0a361e38abec 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ The SONiC installer contains all docker images needed. SONiC uses one image for - PLATFORM=mellanox - PLATFORM=cavium - PLATFORM=centec +- PLATFORM=nephos - PLATFORM=p4 - PLATFORM=vs @@ -96,9 +97,11 @@ This may take a while, but it is a one-time action, so please be patient. - docker-orchagent-brcm.gz: docker image for SWitch State Service (SWSS) on Broadcom platform (gzip tar archive) - docker-orchagent-cavm.gz: docker image for SWitch State Service (SWSS) on Cavium platform (gzip tar archive) - docker-orchagent-mlnx.gz: docker image for SWitch State Service (SWSS) on Mellanox platform (gzip tar archive) + - docker-orchagent-nephos.gz: docker image for SWitch State Service (SWSS) on Nephos platform (gzip tar archive) - docker-syncd-brcm.gz: docker image for the daemon to sync database and Broadcom switch ASIC (gzip tar archive) - docker-syncd-cavm.gz: docker image for the daemon to sync database and Cavium switch ASIC (gzip tar archive) - docker-syncd-mlnx.gz: docker image for the daemon to sync database and Mellanox switch ASIC (gzip tar archive) + - docker-syncd-nephos.gz: docker image for the daemon to sync database and Nephos switch ASIC (gzip tar archive) - docker-sonic-p4.gz: docker image for all-in-one for p4 software switch (gzip tar archive) - docker-sonic-vs.gz: docker image for all-in-one for software virtual switch (gzip tar archive) diff --git a/build_debian.sh b/build_debian.sh index 0c765fdb6424..15bde44c112e 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -144,6 +144,9 @@ sudo chroot $FILESYSTEM_ROOT update-initramfs -u ## Install latest intel igb driver sudo cp target/debs/igb.ko $FILESYSTEM_ROOT/lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/intel/igb/igb.ko +## Install latest intel ixgbe driver +sudo cp target/debs/ixgbe.ko $FILESYSTEM_ROOT/lib/modules/3.16.0-4-amd64/kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko + ## Install docker echo '[INFO] Install docker' ## Install apparmor utils since they're missing and apparmor is enabled in the kernel diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.ini b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.ini new file mode 100644 index 000000000000..bb26684cb7da --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias index +Ethernet0 0,1,2,3 Ethernet1/1 0 +Ethernet4 4,5,6,7 Ethernet2/1 1 +Ethernet8 8,9,10,11 Ethernet3/1 2 +Ethernet12 12,13,14,15 Ethernet4/1 3 +Ethernet16 16,17,18,19 Ethernet5/1 4 +Ethernet20 20,21,22,23 Ethernet6/1 5 +Ethernet24 24,25,26,27 Ethernet7/1 6 +Ethernet28 28,29,30,31 Ethernet8/1 7 +Ethernet32 32,33,34,35 Ethernet9/1 8 +Ethernet36 36,37,38,39 Ethernet10/1 9 +Ethernet40 40,41,42,43 Ethernet11/1 10 +Ethernet44 44,45,46,47 Ethernet12/1 11 +Ethernet48 48,49,50,51 Ethernet13/1 12 +Ethernet52 52,53,54,55 Ethernet14/1 13 +Ethernet56 56,57,58,59 Ethernet15/1 14 +Ethernet60 60,61,62,63 Ethernet16/1 15 +Ethernet64 64,65,66,67 Ethernet17/1 16 +Ethernet68 68,69,70,71 Ethernet18/1 17 +Ethernet72 72,73,74,75 Ethernet19/1 18 +Ethernet76 76,77,78,79 Ethernet20/1 19 +Ethernet80 80,81,82,83 Ethernet21/1 20 +Ethernet84 84,85,86,87 Ethernet22/1 21 +Ethernet88 88,89,90,91 Ethernet23/1 22 +Ethernet92 92,93,94,95 Ethernet24/1 23 +Ethernet96 96,97,98,99 Ethernet25/1 24 +Ethernet100 100,101,102,103 Ethernet26/1 25 +Ethernet104 104,105,106,107 Ethernet27/1 26 +Ethernet108 108,109,110,111 Ethernet28/1 27 +Ethernet112 112,113,114,115 Ethernet29/1 28 +Ethernet116 116,117,118,119 Ethernet30/1 29 +Ethernet120 120,121,122,123 Ethernet31/1 30 +Ethernet124 124,125,126,127 Ethernet32/1 31 diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.nps b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/port_config.nps new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/sai.profile b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/sai.profile new file mode 100644 index 000000000000..880f47910ac1 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/platform/led_proc_init.nps +SAI_DSH_CONFIG_FILE=/usr/share/sonic/hwsku/port_config.nps diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/fancontrol new file mode 100644 index 000000000000..5ed165966b93 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/fancontrol @@ -0,0 +1,12 @@ +# Configuration file generated by pwmconfig, changes will be lost +INTERVAL=10 +DEVPATH=hwmon5=devices/pci0000:00/0000:00:1f.3/i2c-0/i2c-8/8-002f +DEVNAME=hwmon5=w83795adg +FCTEMPS=hwmon5/device/pwm2=hwmon1/temp1_input hwmon5/device/pwm1=hwmon1/temp1_input +FCFANS=hwmon5/device/pwm2=hwmon5/device/fan8_input hwmon5/device/pwm2=hwmon5/device/fan7_input hwmon5/device/pwm2=hwmon5/device/fan6_input hwmon5/device/pwm2=hwmon5/device/fan5_input hwmon5/device/pwm1=hwmon5/device/fan4_input hwmon5/device/pwm1=hwmon5/device/fan3_input hwmon5/device/pwm1=hwmon5/device/fan2_input hwmon5/device/pwm1=hwmon5/device/fan1_input +# TODO: check the temp value with HW after board ready +MINTEMP=hwmon5/device/pwm2=20 hwmon5/device/pwm1=20 +MAXTEMP=hwmon5/device/pwm2=60 hwmon5/device/pwm1=60 +MINSTART=hwmon5/device/pwm2=75 hwmon5/device/pwm1=75 +MINSTOP=hwmon5/device/pwm2=22 hwmon5/device/pwm1=22 + diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/installer.conf b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/installer.conf new file mode 100644 index 000000000000..925a32fc0c3a --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/led_proc_init.nps b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/led_proc_init.nps new file mode 100644 index 000000000000..b482a7a0b977 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/led_proc_init.nps @@ -0,0 +1,20 @@ +#This configuration file is for customer init value feature. Please refer to mtk_cfg.h/mtk_cfg.c for detail. +#1. The lines beginning with # are comment lines. The lines beginning with number are the setting lines. +#2. There are five parameters which can be set. +# 1) the first is unit. +# 2) the second is NPS_CFG_TYPE_XXX. Refer to NPS_CFG_TYPE_T. +# 3) the 3-5 are {param0, param1, value} pairs. Refer to NPS_CFG_VALUE_T. Support HEX format. +# 4) the (unit, NPS_CFG_TYPE_XXX, param0, param1) group is the key to get the correspingding value. +# There should be no same (unit, NPS_CFG_TYPE_XXX, param0, param1) group. +#3. User must follow correct format to apply the setting. Please refer to below commentted example(#0 NPS_CFG_TYPE_L2_ADDR_MODE 0 0 1); +#4. Usage under the linux shell: +# 1) ./image-path/image-name -c cfg-path/NPS_Ari_EVB_24.cfg : mamually specify directory path if they are not in current work dirctory. +# 2) ./image-name -c NPS_Ari_EVB_24.cfg : the image and the NPS_Ari_EVB_24.cfg are in the current work directory. + +#unit NPS_CFG_TYPE_XXX param0 param1 value +#---- ---------------- ------ ------ ----- +0 NPS_CFG_TYPE_USE_UNIT_PORT 0 0 1 +0 NPS_CFG_TYPE_LED_CFG 0 0 1 +0 NPS_CFG_TYPE_CPI_PORT_MODE 129 0 0 +0 NPS_CFG_TYPE_CPI_PORT_MODE 130 0 0 +0 NPS_CFG_TYPE_USER_BUF_CTRL 0 0 1 diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/minigraph.xml new file mode 100644 index 000000000000..6b29a7eb83b8 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/minigraph.xml @@ -0,0 +1,151 @@ + + + + + + OCPSCH0104001MS + 10.10.1.26 + OCPSCH01040GGLF + 10.10.1.25 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.26 + OCPSCH01040GGLF + 10.10.2.25 + 1 + 10 + 3 + + + + + 64536 + OCPSCH01040GGLF + + +
10.10.1.26
+ + +
+ +
10.10.2.26
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.9/32 + + 100.0.0.9/32 + + + + + + + + OCPSCH01040GGLF + + + + + + Ethernet0 + 10.10.1.25/30 + + + + Ethernet4 + 10.10.2.25/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet24 + OCPSCH01040GGLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104002MS + Ethernet24 + OCPSCH01040GGLF + Ethernet4 + + + + + OCPSCH01040GGLF + INGRASYS-S9130-32X + + + + + + + OCPSCH01040GGLF + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + OCPSCH01040GGLF + INGRASYS-S9130-32X +
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/eeprom.py b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/eeprom.py new file mode 100644 index 000000000000..0f47704ed2cb --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/eeprom.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +############################################################################# +# Ingrasys S9130-32X +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-0/0-0055/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/sfputil.py new file mode 100644 index 000000000000..387c8155eef2 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/plugins/sfputil.py @@ -0,0 +1,187 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 + EEPROM_OFFSET = 21 + ABS_GPIO_BASE_0_15 = 240 + ABS_GPIO_BASE_16_31 = 224 + LP_MODE_GPIO_BASE_0_15 = 176 + LP_MODE_GPIO_BASE_16_31 = 160 + RST_GPIO_BASE_0_15 = 144 + RST_GPIO_BASE_16_31 = 128 + + GPIO_VAL_PATH = "/sys/class/gpio/gpio{0}/value" + + _port_to_eeprom_mapping = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + + def __init__(self): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' + for x in range(self.port_start, self.port_end + 1): + port_eeprom_path = eeprom_path.format(x + self.EEPROM_OFFSET) + self.port_to_eeprom_mapping[x] = port_eeprom_path + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # open corrsponding gpio file + try: + if port_num <= 15: + gpio_base = self.ABS_GPIO_BASE_0_15 + else : + gpio_base = self.ABS_GPIO_BASE_16_31 + gpio_index = gpio_base + (port_num % 16) + gpio_file_path = self.GPIO_VAL_PATH.format(gpio_index) + gpio_file = open(gpio_file_path) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # content is a string containing the gpio value + gpio_val = int(gpio_file.readline().rstrip()) + gpio_file.close() + + # the gpio pin is ACTIVE_LOW but reversed + if gpio_val == 0: + return False + + return True + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # open corrsponding gpio file + try: + if port_num <= 15: + gpio_base = self.LP_MODE_GPIO_BASE_0_15 + else : + gpio_base = self.LP_MODE_GPIO_BASE_16_31 + gpio_index = gpio_base + (port_num % 16) + gpio_file_path = self.GPIO_VAL_PATH.format(gpio_index) + gpio_file = open(gpio_file_path) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # content is a string containing the gpio value + gpio_val = int(gpio_file.readline().rstrip()) + gpio_file.close() + + if gpio_val == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # open corrsponding gpio file + try: + if port_num <= 15: + gpio_base = self.LP_MODE_GPIO_BASE_0_15 + else : + gpio_base = self.LP_MODE_GPIO_BASE_16_31 + gpio_index = gpio_base + (port_num % 16) + gpio_file_path = self.GPIO_VAL_PATH.format(gpio_index) + gpio_file = open(gpio_file_path, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # the gpio pin is ACTIVE_HIGH + if lpmode is True: + gpio_val = "1" + else: + gpio_val = "0" + + # write value to gpio + gpio_file.seek(0) + gpio_file.write(gpio_val) + gpio_file.close() + + return True + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # open corrsponding gpio file + try: + if port_num <= 15: + gpio_base = self.RST_GPIO_BASE_0_15 + else : + gpio_base = self.RST_GPIO_BASE_16_31 + gpio_index = gpio_base + (port_num % 16) + gpio_file_path = self.GPIO_VAL_PATH.format(gpio_index) + gpio_file = open(gpio_file_path, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # set the gpio to take port into reset + # the gpio pin is ACTIVE_LOW but reversed + gpio_val = "1" + # write value to gpio + gpio_file.seek(0) + gpio_file.write(gpio_val) + gpio_file.close() + + # Sleep 1 second to let it settle + time.sleep(1) + + # open corrsponding gpio file + try: + gpio_file = open(gpio_file_path, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # set gpio back low to take port out of reset + # the gpio pin is ACTIVE_LOW but reversed + gpio_val = "0" + # write value to gpio + gpio_file.seek(0) + gpio_file.write(gpio_val) + gpio_file.close() + + return True diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/sensors.conf new file mode 100644 index 000000000000..9b55f73af2af --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/sensors.conf @@ -0,0 +1,69 @@ +# libsensors configuration file +chip "i350bb-*" + ignore loc1 + +chip "jc42-*" + +bus "i2c-8" "i2c-mux-0 (chan_id 7)" +chip "w83795adg-*" + label in0 "0.9V" + set in0_max 0.945 + set in0_min 0.855 + label in1 "VDD_CORE" + set in1_max 0.945 + set in1_min 0.855 + label in2 "1.2V" + set in2_max 1.26 + set in2_min 1.14 + label in3 "1.8V" + set in3_max 1.89 + set in3_min 1.71 + label in4 "1.01V" + set in4_max 1.0605 + set in4_min 0.9595 + ignore in5 + ignore in6 + ignore in7 + ignore in11 + label in12 "3.3VDD" + set in12_max 3.465 + set in12_min 3.135 + # in12 and in13 are the same source + ignore in13 + label fan1 "FANTRAY 1-A" + label fan2 "FANTRAY 1-B" + label fan3 "FANTRAY 2-A" + label fan4 "FANTRAY 2-B" + label fan5 "FANTRAY 3-A" + label fan6 "FANTRAY 3-B" + label fan7 "FANTRAY 4-A" + label fan8 "FANTRAY 4-B" + ignore temp1 + ignore temp2 + ignore temp3 + ignore temp4 + ignore temp5 + ignore temp6 + ignore intrusion0 + +chip "tmp75-i2c-*-4A" + label temp1 "BMC board Temp" + set temp1_max 50 + set temp1_max_hyst 45 + +bus "i2c-0" "i2c-main" +chip "tmp75-i2c-*-4F" + label temp1 "x86 CPU board Temp" + set temp1_max 50 + set temp1_max_hyst 45 + +bus "i2c-12" "i2c-mux-1 (chan_id 3)" +chip "tmp75-i2c-*-4C" + label temp1 "rear MAC Temp" + set temp1_max 50 + set temp1_max_hyst 45 + +chip "tmp75-i2c-*-49" + label temp1 "front MAC Temp" + set temp1_max 50 + set temp1_max_hyst 45 diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.ini b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.ini new file mode 100644 index 000000000000..ddd76b51167f --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.ini @@ -0,0 +1,65 @@ +# name lanes alias index +Ethernet0 7,6,5,4 Ethernet1/1 0 +Ethernet4 3,2,1,0 Ethernet2/1 1 +Ethernet8 15,14,13,12 Ethernet3/1 2 +Ethernet12 11,10,9,8 Ethernet4/1 3 +Ethernet16 23,22,21,20 Ethernet5/1 4 +Ethernet20 19,18,17,16 Ethernet6/1 5 +Ethernet24 31,30,29,28 Ethernet7/1 6 +Ethernet28 27,26,25,24 Ethernet8/1 7 +Ethernet32 39,38,37,36 Ethernet9/1 8 +Ethernet36 35,34,33,32 Ethernet10/1 9 +Ethernet40 47,46,45,44 Ethernet11/1 10 +Ethernet44 43,42,41,40 Ethernet12/1 11 +Ethernet48 55,54,53,52 Ethernet13/1 12 +Ethernet52 51,50,49,48 Ethernet14/1 13 +Ethernet56 63,62,61,60 Ethernet15/1 14 +Ethernet60 59,58,57,56 Ethernet16/1 15 +Ethernet64 71,70,69,68 Ethernet17/1 16 +Ethernet68 67,66,65,64 Ethernet18/1 17 +Ethernet72 79,78,77,76 Ethernet19/1 18 +Ethernet76 75,74,73,72 Ethernet20/1 19 +Ethernet80 87,86,85,84 Ethernet21/1 20 +Ethernet84 83,82,81,80 Ethernet22/1 21 +Ethernet88 95,94,93,92 Ethernet23/1 22 +Ethernet92 91,90,89,88 Ethernet24/1 23 +Ethernet96 97,98,99,100 Ethernet25/1 24 +Ethernet100 101,102,103,104 Ethernet26/1 25 +Ethernet104 105,106,107,108 Ethernet27/1 26 +Ethernet108 109,110,111,112 Ethernet28/1 27 +Ethernet112 119,118,117,116 Ethernet29/1 28 +Ethernet116 115,114,113,112 Ethernet30/1 29 +Ethernet120 127,126,125,124 Ethernet31/1 30 +Ethernet124 123,122,121,120 Ethernet32/1 31 +Ethernet128 135,134,133,132 Ethernet33/1 32 +Ethernet132 131,130,129,128 Ethernet34/1 33 +Ethernet136 143,142,141,140 Ethernet35/1 34 +Ethernet140 139,138,137,136 Ethernet36/1 35 +Ethernet144 151,150,149,148 Ethernet37/1 36 +Ethernet148 147,146,145,144 Ethernet38/1 37 +Ethernet152 159,158,157,156 Ethernet39/1 38 +Ethernet156 155,154,153,152 Ethernet40/1 39 +Ethernet160 167,166,165,164 Ethernet41/1 40 +Ethernet164 163,162,161,160 Ethernet42/1 41 +Ethernet168 175,174,173,172 Ethernet43/1 42 +Ethernet172 171,170,169,168 Ethernet44/1 43 +Ethernet176 183,182,181,180 Ethernet45/1 44 +Ethernet180 179,178,177,176 Ethernet46/1 45 +Ethernet184 191,190,189,188 Ethernet47/1 46 +Ethernet188 187,186,185,184 Ethernet48/1 47 +Ethernet192 199,198,197,196 Ethernet49/1 48 +Ethernet196 195,194,193,192 Ethernet50/1 49 +Ethernet200 207,206,205,204 Ethernet51/1 50 +Ethernet204 203,202,201,200 Ethernet52/1 51 +Ethernet208 215,214,213,212 Ethernet53/1 52 +Ethernet212 211,210,209,208 Ethernet54/1 53 +Ethernet216 223,222,221,220 Ethernet55/1 54 +Ethernet220 219,218,217,216 Ethernet56/1 55 +Ethernet224 231,230,229,228 Ethernet57/1 56 +Ethernet228 227,226,225,224 Ethernet58/1 57 +Ethernet232 239,238,237,236 Ethernet59/1 58 +Ethernet236 235,234,233,232 Ethernet60/1 59 +Ethernet240 247,246,245,244 Ethernet61/1 60 +Ethernet244 243,242,241,240 Ethernet62/1 61 +Ethernet248 255,254,253,252 Ethernet63/1 62 +Ethernet252 251,250,249,248 Ethernet64/1 63 diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.nps b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/port_config.nps new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/sai.profile b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/sai.profile new file mode 100644 index 000000000000..880f47910ac1 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/platform/led_proc_init.nps +SAI_DSH_CONFIG_FILE=/usr/share/sonic/hwsku/port_config.nps diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/fancontrol b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/fancontrol new file mode 100644 index 000000000000..86b4e636375f --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/fancontrol @@ -0,0 +1,9 @@ +INTERVAL=10 +DEVPATH=hwmon7=devices/pci0000:00/0000:00:1f.3/i2c-0/i2c-16/16-002f hwmon4=devices/pci0000:00/0000:00:1f.3/i2c-0/i2c-7/7-004e +DEVNAME=hwmon7=w83795adg +FCTEMPS=hwmon7/device/pwm2=hwmon4/temp1_input +FCFANS=hwmon7/device/pwm2=hwmon7/device/fan7_input hwmon7/device/pwm2=hwmon7/device/fan5_input hwmon7/device/pwm2=hwmon7/device/fan3_input hwmon7/device/pwm2=hwmon7/device/fan1_input +MINTEMP=hwmon7/device/pwm2=20 +MAXTEMP=hwmon7/device/pwm2=60 +MINSTART=hwmon7/device/pwm2=75 +MINSTOP=hwmon7/device/pwm2=22 diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/installer.conf b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/installer.conf new file mode 100644 index 000000000000..925a32fc0c3a --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/led_proc_init.nps b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/led_proc_init.nps new file mode 100644 index 000000000000..e6fe6721350e --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/led_proc_init.nps @@ -0,0 +1,20 @@ +#This configuration file is for customer init value feature. Please refer to nps_cfg.h/nps_cfg.c for detail. +#1. The lines beginning with # are comment lines. The lines beginning with number are the setting lines. +#2. There are five parameters which can be set. +# 1) the first is unit. +# 2) the second is NPS_CFG_TYPE_XXX. Refer to NPS_CFG_TYPE_T. +# 3) the 3-5 are {param0, param1, value} pairs. Refer to NPS_CFG_VALUE_T. Support HEX format. +# 4) the (unit, NPS_CFG_TYPE_XXX, param0, param1) group is the key to get the correspingding value. +# There should be no same (unit, NPS_CFG_TYPE_XXX, param0, param1) group. +#3. User must follow correct format to apply the setting. Please refer to below commentted example(#0 NPS_CFG_TYPE_L2_ADDR_MODE 0 0 1); +#4. Usage under the linux shell: +# 1) ./image-path/image-name -c cfg-path/NPS_TAU_EVB_6T4_64.cfg : mamually specify directory path if they are not in current work dirctory. +# 2) ./image-name -c NPS_TAU_EVB_6T4_64.cfg : the image and the NPS_TAU_EVB_3T2_32.cfg are in the current work directory. + +#unit NPS_CFG_TYPE_XXX param0 param1 value +#---- ---------------- ------ ------ ----- +0 NPS_CFG_TYPE_USE_UNIT_PORT 0 0 1 +0 NPS_CFG_TYPE_LED_CFG 0 0 2 +0 NPS_CFG_TYPE_CPI_PORT_MODE 129 0 0 +0 NPS_CFG_TYPE_CPI_PORT_MODE 130 0 0 +0 NPS_CFG_TYPE_USER_BUF_CTRL 0 0 1 diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/minigraph.xml b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/minigraph.xml new file mode 100644 index 000000000000..9ac02997e44d --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/minigraph.xml @@ -0,0 +1,151 @@ + + + + + + OCPSCH0104001MS + 10.10.1.26 + OCPSCH01040GGLF + 10.10.1.25 + 1 + 10 + 3 + + + OCPSCH0104002MS + 10.10.2.26 + OCPSCH01040GGLF + 10.10.2.25 + 1 + 10 + 3 + + + + + 64536 + OCPSCH01040GGLF + + +
10.10.1.26
+ + +
+ +
10.10.2.26
+ + +
+
+ +
+ + 64542 + OCPSCH0104001MS + + + + 64543 + OCPSCH0104002MS + + +
+
+ + + + + + HostIP + Loopback0 + + 100.0.0.9/32 + + 100.0.0.9/32 + + + + + + + + OCPSCH01040GGLF + + + + + + Ethernet0 + 10.10.1.25/30 + + + + Ethernet4 + 10.10.2.25/30 + + + + + + + + + + + + 40000 + DeviceInterfaceLink + OCPSCH0104001MS + Ethernet24 + OCPSCH01040GGLF + Ethernet0 + + + 40000 + DeviceInterfaceLink + OCPSCH0104002MS + Ethernet24 + OCPSCH01040GGLF + Ethernet4 + + + + + OCPSCH01040GGLF + INGRASYS-S9230-64X + + + + + + + OCPSCH01040GGLF + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + ErspanDestinationIpv4 + + 2.2.2.2 + + + + + + + OCPSCH01040GGLF + INGRASYS-S9230-64X +
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/eeprom.py b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/eeprom.py new file mode 100644 index 000000000000..ab398102c9b5 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/eeprom.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +############################################################################# +# Ingrasys S9230-64X +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-0/0-0055/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/psuutil.py b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/psuutil.py new file mode 100644 index 000000000000..91d7de05dc84 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/psuutil.py @@ -0,0 +1,92 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + SYSFS_PSU_DIR = ["/sys/bus/i2c/devices/i2c-17/17-0050", + "/sys/bus/i2c/devices/i2c-18/18-0050"] + + def __init__(self): + PsuBase.__init__(self) + + + # Get sysfs attribute + def get_attr_value(self, attr_path): + + retval = 'ERR' + if (not os.path.isfile(attr_path)): + return retval + + try: + with open(attr_path, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open ", attr_path, " file !") + + retval = retval.rstrip('\r\n') + return retval + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + :return: An integer, the number of PSUs available on the device + """ + MAX_PSUS = 2 + return MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is\ + faulty + """ + status = 0 + attr_file = 'psu_pg' + attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file + + attr_value = self.get_attr_value(attr_path) + + if (attr_value != 'ERR'): + attr_value = int(attr_value, 16) + # Check for PSU status + if (attr_value == 1): + status = 1 + + return status + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + status = 0 + psu_absent = 0 + attr_file ='psu_abs' + attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file + + attr_value = self.get_attr_value(attr_path) + + if (attr_value != 'ERR'): + attr_value = int(attr_value, 16) + # Check for PSU presence + if (attr_value == 0): + status = 1 + + return status + diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/sfputil.py b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/sfputil.py new file mode 100644 index 000000000000..70e5ebff403d --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/plugins/sfputil.py @@ -0,0 +1,293 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 63 + PORTS_IN_BLOCK = 64 + #TODO: modify according to port map + EEPROM_OFFSET = 33 + CPLD1_PORTS = 12 + CPLDx_PORTS = 13 + CPLD_OFFSET = 1 + CPLD_PRES_BIT = 1 + CPLD_RESET_BIT = 0 + CPLD_LPMOD_BIT = 2 + CPLDx_I2C_ADDR = "33" + CPLD_PORT_STATUS_KEY = "cpld_qsfp_port_status" + CPLD_PORT_CONFIG_KEY = "cpld_qsfp_port_config" + CPLD_REG_PATH = "/sys/bus/i2c/devices/{0}-00{1}/{2}_{3}" + + _port_to_eeprom_mapping = {} + + _logic_to_phy_port_mapping = { + 0: 0, + 1: 1, + 2: 4, + 3: 5, + 4: 8, + 5: 9, + 6: 12, + 7: 13, + 8: 16, + 9: 17, + 10: 20, + 11: 21, + 12: 24, + 13: 25, + 14: 28, + 15: 29, + 16: 32, + 17: 33, + 18: 36, + 19: 37, + 20: 40, + 21: 41, + 22: 44, + 23: 45, + 24: 48, + 25: 49, + 26: 52, + 27: 53, + 28: 56, + 29: 57, + 30: 60, + 31: 61, + 32: 2, + 33: 3, + 34: 6, + 35: 7, + 36: 10, + 37: 11, + 38: 14, + 39: 15, + 40: 18, + 41: 19, + 42: 22, + 43: 23, + 44: 26, + 45: 27, + 46: 30, + 47: 31, + 48: 34, + 49: 35, + 50: 38, + 51: 39, + 52: 42, + 53: 43, + 54: 46, + 55: 47, + 56: 50, + 57: 51, + 58: 54, + 59: 55, + 60: 58, + 61: 59, + 62: 62, + 63: 63 + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + + def __init__(self): + # Override port_to_eeprom_mapping for class initialization + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + for x in range(self.port_start, self.port_end + 1): + phy_port = self._logic_to_phy_port_mapping[x] + port_eeprom_path = eeprom_path.format(phy_port + self.EEPROM_OFFSET) + self.port_to_eeprom_mapping[x] = port_eeprom_path + + SfpUtilBase.__init__(self) + + def qsfp_to_cpld_index(self, port_num): + if port_num < self.CPLD1_PORTS: + cpld_id = 0 + cpld_port_index = port_num + 1 + else: + cpld_id = 1 + (port_num - self.CPLD1_PORTS) / self.CPLDx_PORTS + cpld_port_index = ((port_num - self.CPLD1_PORTS) % self.CPLDx_PORTS) + 1 + return cpld_id, cpld_port_index + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # logic port to physical port mapping + port_num = self._logic_to_phy_port_mapping[port_num] + + cpld_id, cpld_port_index = self.qsfp_to_cpld_index(port_num) + i2c_id = self.CPLD_OFFSET + cpld_id + reg_path = self.CPLD_REG_PATH.format(i2c_id, self.CPLDx_I2C_ADDR, \ + self.CPLD_PORT_STATUS_KEY, cpld_port_index) + + try: + reg_file = open(reg_path) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # content is a string containing the status register value + content = reg_file.readline().rstrip() + reg_file.close() + + reg_value = int(content, 16) + # mask for presence bit (bit 1) + mask = (1 << self.CPLD_PRES_BIT) + + # 0 - presence, 1 - absence + if reg_value & mask == 0: + return True + + return False + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # logic port to physical port mapping + port_num = self._logic_to_phy_port_mapping[port_num] + + cpld_id, cpld_port_index = self.qsfp_to_cpld_index(port_num) + i2c_id = self.CPLD_OFFSET + cpld_id + reg_path = self.CPLD_REG_PATH.format(i2c_id, self.CPLDx_I2C_ADDR, \ + self.CPLD_PORT_CONFIG_KEY, cpld_port_index) + + try: + reg_file = open(reg_path) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # content is a string containing the status register value + content = reg_file.readline().rstrip() + reg_file.close() + + reg_value = int(content, 16) + # mask for lp_mod bit (bit 2) + mask = (1 << self.CPLD_LPMOD_BIT) + + # 0 - disable, 1 - low power mode + if reg_value & mask == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # logic port to physical port mapping + port_num = self._logic_to_phy_port_mapping[port_num] + + cpld_id, cpld_port_index = self.qsfp_to_cpld_index(port_num) + i2c_id = self.CPLD_OFFSET + cpld_id + reg_path = self.CPLD_REG_PATH.format(i2c_id, self.CPLDx_I2C_ADDR, \ + self.CPLD_PORT_CONFIG_KEY, cpld_port_index) + + try: + reg_file = open(reg_path, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # content is a string containing the status register value + content = reg_file.readline().rstrip() + reg_value = int(content, 16) + # mask for lp_mod bit (bit 2) + mask = (1 << self.CPLD_LPMOD_BIT) + + # 1 - low power mode, 0 - high power mode + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # convert value to hex string + content = hex(reg_value) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + # logic port to physical port mapping + port_num = self._logic_to_phy_port_mapping[port_num] + + cpld_id, cpld_port_index = self.qsfp_to_cpld_index(port_num) + i2c_id = self.CPLD_OFFSET + cpld_id + reg_path = self.CPLD_REG_PATH.format(i2c_id, self.CPLDx_I2C_ADDR, \ + self.CPLD_PORT_CONFIG_KEY, cpld_port_index) + + # reset the port + try: + reg_file = open(reg_path, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + # content is a string containing the status register value + content = reg_file.readline().rstrip() + reg_value = int(content, 16) + # mask for reset bit (bit 0) + mask = (1 << self.CPLD_RESET_BIT) + + # 1 - out of reset, 0 - reset + reg_value = reg_value & ~mask + + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 1 second to reset done + time.sleep(1) + + # take the port out of reset + try: + reg_file = open(reg_path, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_value | mask + + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + return True + diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/sensors.conf b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/sensors.conf new file mode 100644 index 000000000000..b5daa9af42b7 --- /dev/null +++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/sensors.conf @@ -0,0 +1,90 @@ +# libsensors configuration file +chip "i350bb-*" + ignore loc1 + +chip "jc42-*" + +bus "i2c-16" "i2c-mux-1 (chan_id 7)" +chip "w83795adg-*" + ignore in0 + label in1 "VDD_CORE" + set in1_min 0.90 * 0.98 + set in1_max 0.90 * 1.02 + ignore in2 + label in3 "1.8V" + set in3_min 1.8 * 0.97 + set in3_max 1.8 * 1.03 + label in4 "3.3V" + compute in4 @/(0.3052), (0.3052)*@ + set in4_min 3.3 * 0.95 + set in4_max 3.3 * 1.05 + label in5 "0.9V" + set in5_min 0.90 * 0.98 + set in5_max 0.90 * 1.02 + ignore in6 + ignore in7 + ignore in8 + ignore in9 + ignore in10 + ignore in11 + ignore in12 + ignore in13 + ignore in14 + ignore in15 + ignore in16 + ignore in17 + ignore in18 + ignore in19 + label fan1 "FANTRAY 1" + #label fan2 "FANTRAY 1-B" + ignore fan2 + label fan3 "FANTRAY 2" + #label fan4 "FANTRAY 2-B" + ignore fan4 + label fan5 "FANTRAY 3" + #label fan6 "FANTRAY 3-B" + ignore fan6 + label fan7 "FANTRAY 4" + #label fan8 "FANTRAY 4-B" + ignore fan8 + ignore temp1 + ignore temp2 + ignore temp3 + ignore temp4 + ignore temp5 + ignore temp6 + ignore intrusion0 + +# TODO: need to confirm the critial temp value with HW after board ready +chip "tmp75-i2c-*-4A" + label temp1 "BMC board Temp" + set temp1_max 50 + set temp1_max_hyst 45 + +bus "i2c-0" "SMBus I801 adapter at f000" +chip "tmp75-i2c-*-4F" + label temp1 "x86 CPU board Temp" + set temp1_max 50 + set temp1_max_hyst 45 + +bus "i2c-6" "i2c-0-mux (chan_id 5)" +chip "lm75-i2c-6-4D" + label temp1 "Rear Panel Temp" + set temp1_max 50 + set temp1_max_hyst 45 +chip "lm75-i2c-6-4E" + label temp1 "Rear MAC Temp" + set temp1_max 50 + set temp1_max_hyst 45 + +bus "i2c-7" "i2c-0-mux (chan_id 6)" +chip "lm75-i2c-7-4D" + label temp1 "Front Panel Temp" + set temp1_max 50 + set temp1_max_hyst 45 +chip "lm75-i2c-7-4E" + label temp1 "Front MAC Temp" + set temp1_max 50 + set temp1_max_hyst 45 + + diff --git a/dockers/docker-orchagent-nephos b/dockers/docker-orchagent-nephos new file mode 120000 index 000000000000..8d52609c56e5 --- /dev/null +++ b/dockers/docker-orchagent-nephos @@ -0,0 +1 @@ +docker-orchagent \ No newline at end of file diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index f92dfe5fd543..027c6d52a2fe 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -18,6 +18,8 @@ if [ "$platform" == "broadcom" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$platform" == "cavium" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" +elif [ "$platform" == "nephos" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" fi exec /usr/bin/orchagent ${ORCHAGENT_ARGS} diff --git a/files/build_templates/swss.service.j2 b/files/build_templates/swss.service.j2 index ad52f395d0cf..b18321676b78 100644 --- a/files/build_templates/swss.service.j2 +++ b/files/build_templates/swss.service.j2 @@ -3,11 +3,15 @@ Description=switch state service Requires=database.service {% if sonic_asic_platform == 'broadcom' %} Requires=opennsl-modules-3.16.0-4-amd64.service +{% elif sonic_asic_platform == 'nephos' %} +Requires=nps-modules-3.16.0-4-amd64.service {% endif %} After=database.service After=interfaces-config.service {% if sonic_asic_platform == 'broadcom' %} After=opennsl-modules-3.16.0-4-amd64.service +{% elif sonic_asic_platform == 'nephos' %} +After=nps-modules-3.16.0-4-amd64.service {% endif %} [Service] diff --git a/platform/nephos/docker-orchagent-nephos.mk b/platform/nephos/docker-orchagent-nephos.mk new file mode 100644 index 000000000000..b21e69d6cf87 --- /dev/null +++ b/platform/nephos/docker-orchagent-nephos.mk @@ -0,0 +1,19 @@ +# docker image for orchagent + +DOCKER_ORCHAGENT_NEPHOS = docker-orchagent-nephos.gz +$(DOCKER_ORCHAGENT_NEPHOS)_PATH = $(DOCKERS_PATH)/docker-orchagent +$(DOCKER_ORCHAGENT_NEPHOS)_DEPENDS += $(SWSS) $(REDIS_TOOLS) +$(DOCKER_ORCHAGENT_NEPHOS)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) +SONIC_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_NEPHOS) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_ORCHAGENT_NEPHOS) + +$(DOCKER_ORCHAGENT_NEPHOS)_CONTAINER_NAME = swss +$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += --net=host --privileged -t +$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += -v /etc/network/interfaces:/etc/network/interfaces:ro +$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += -v /etc/network/interfaces.d/:/etc/network/interfaces.d/:ro +$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += -v /host/machine.conf:/host/machine.conf:ro +$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_ORCHAGENT_NEPHOS)_RUN_OPT += -v /var/log/swss:/var/log/swss:rw + +$(DOCKER_ORCHAGENT_NEPHOS)_BASE_IMAGE_FILES += swssloglevel:/usr/bin/swssloglevel +$(DOCKER_ORCHAGENT_NEPHOS)_FILES += $(ARP_UPDATE_SCRIPT) diff --git a/platform/nephos/docker-ptf-nephos.mk b/platform/nephos/docker-ptf-nephos.mk new file mode 100644 index 000000000000..6d7950f7516d --- /dev/null +++ b/platform/nephos/docker-ptf-nephos.mk @@ -0,0 +1,7 @@ +# docker image for docker-ptf-nephos + +DOCKER_PTF_NEPHOS = docker-ptf-nephos.gz +$(DOCKER_PTF_NEPHOS)_PATH = $(DOCKERS_PATH)/docker-ptf-saithrift +$(DOCKER_PTF_NEPHOS)_DEPENDS += $(PYTHON_SAITHRIFT_NEPHOS) +$(DOCKER_PTF_NEPHOS)_LOAD_DOCKERS += $(DOCKER_PTF) +#SONIC_DOCKER_IMAGES += $(DOCKER_PTF_NEPHOS) diff --git a/platform/nephos/docker-syncd-nephos-rpc.mk b/platform/nephos/docker-syncd-nephos-rpc.mk new file mode 100644 index 000000000000..e891d0b1a68d --- /dev/null +++ b/platform/nephos/docker-syncd-nephos-rpc.mk @@ -0,0 +1,17 @@ +# docker image for nephos syncd with rpc + +DOCKER_SYNCD_NEPHOS_RPC = docker-syncd-nephos-rpc.gz +$(DOCKER_SYNCD_NEPHOS_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-nephos-rpc +$(DOCKER_SYNCD_NEPHOS_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) +$(DOCKER_SYNCD_NEPHOS_RPC)_FILES += $(DSSERVE) $(NPX_DIAG) +$(DOCKER_SYNCD_NEPHOS_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_NEPHOS) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_NEPHOS_RPC) +ifeq ($(ENABLE_SYNCD_RPC),y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_NEPHOS_RPC) +endif + +$(DOCKER_SYNCD_NEPHOS_RPC)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_NEPHOS_RPC)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_NEPHOS_RPC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_NEPHOS_RPC)_RUN_OPT += -v /var/run/docker-syncd:/var/run/sswsyncd +$(DOCKER_SYNCD_NEPHOS_RPC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro diff --git a/platform/nephos/docker-syncd-nephos-rpc/Dockerfile.j2 b/platform/nephos/docker-syncd-nephos-rpc/Dockerfile.j2 new file mode 100644 index 000000000000..9a01d4e1e001 --- /dev/null +++ b/platform/nephos/docker-syncd-nephos-rpc/Dockerfile.j2 @@ -0,0 +1,51 @@ +FROM docker-syncd-nephos + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +COPY \ +{% for deb in docker_syncd_nephos_rpc_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -P syncd + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ +{% for deb in docker_syncd_nephos_rpc_debs.split(' ') -%} +dpkg_apt debs/{{ deb }}{{'; '}} +{%- endfor %} + +## Pre-install the fundamental packages +RUN apt-get update \ + && apt-get -y install \ + net-tools \ + python-pip \ + build-essential \ + libssl-dev \ + libffi-dev \ + python-dev \ + wget \ + cmake \ + && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ + && tar xvfz 1.0.0.tar.gz \ + && cd nanomsg-1.0.0 \ + && mkdir -p build \ + && cmake . \ + && make install \ + && ldconfig \ + && cd .. \ + && rm -fr nanomsg-1.0.0 \ + && rm -f 1.0.0.tar.gz \ + && pip install cffi==1.7.0 \ + && pip install --upgrade cffi==1.7.0 \ + && pip install nnpy \ + && mkdir -p /opt \ + && cd /opt \ + && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ + && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ + && rm -rf /root/deps + +COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] + +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/nephos/docker-syncd-nephos-rpc/ptf_nn_agent.conf b/platform/nephos/docker-syncd-nephos-rpc/ptf_nn_agent.conf new file mode 100644 index 000000000000..fa1ed0eb1622 --- /dev/null +++ b/platform/nephos/docker-syncd-nephos-rpc/ptf_nn_agent.conf @@ -0,0 +1,10 @@ +[program:ptf_nn_agent] +command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-iface-rcv-buffer=109430400 +process_name=ptf_nn_agent +stdout_logfile=/tmp/ptf_nn_agent.out.log +stderr_logfile=/tmp/ptf_nn_agent.err.log +redirect_stderr=false +autostart=true +autorestart=true +startsecs=1 +numprocs=1 diff --git a/platform/nephos/docker-syncd-nephos.mk b/platform/nephos/docker-syncd-nephos.mk new file mode 100644 index 000000000000..a79c8524b890 --- /dev/null +++ b/platform/nephos/docker-syncd-nephos.mk @@ -0,0 +1,19 @@ +# docker image for nephos syncd + +DOCKER_SYNCD_NEPHOS = docker-syncd-nephos.gz +$(DOCKER_SYNCD_NEPHOS)_PATH = $(PLATFORM_PATH)/docker-syncd-nephos +$(DOCKER_SYNCD_NEPHOS)_DEPENDS += $(SYNCD) +$(DOCKER_SYNCD_NEPHOS)_FILES += $(DSSERVE) $(NPX_DIAG) +$(DOCKER_SYNCD_NEPHOS)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_NEPHOS) +ifneq ($(ENABLE_SYNCD_RPC),y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_NEPHOS) +endif + +$(DOCKER_SYNCD_NEPHOS)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_NEPHOS)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_NEPHOS)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_NEPHOS)_RUN_OPT += -v /var/run/docker-syncd:/var/run/sswsyncd +$(DOCKER_SYNCD_NEPHOS)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro + +$(DOCKER_SYNCD_NEPHOS)_BASE_IMAGE_FILES += npx_diag:/usr/bin/npx_diag diff --git a/platform/nephos/docker-syncd-nephos/Dockerfile.j2 b/platform/nephos/docker-syncd-nephos/Dockerfile.j2 new file mode 100755 index 000000000000..e0248d460a12 --- /dev/null +++ b/platform/nephos/docker-syncd-nephos/Dockerfile.j2 @@ -0,0 +1,31 @@ +FROM docker-config-engine + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update + +COPY \ +{% for deb in docker_syncd_nephos_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -i \ +{% for deb in docker_syncd_nephos_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +## TODO: add kmod into Depends +RUN apt-get install -f kmod + +COPY ["files/dsserve", "files/npx_diag", "start.sh", "/usr/bin/"] +RUN chmod +x /usr/bin/dsserve /usr/bin/npx_diag + +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/nephos/docker-syncd-nephos/base_image_files/npx_diag b/platform/nephos/docker-syncd-nephos/base_image_files/npx_diag new file mode 100755 index 000000000000..876bc1816ecc --- /dev/null +++ b/platform/nephos/docker-syncd-nephos/base_image_files/npx_diag @@ -0,0 +1,3 @@ +#!/bin/bash + +docker exec -i syncd npx_diag "$@" diff --git a/platform/nephos/docker-syncd-nephos/start.sh b/platform/nephos/docker-syncd-nephos/start.sh new file mode 100755 index 000000000000..623316050475 --- /dev/null +++ b/platform/nephos/docker-syncd-nephos/start.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd + +supervisorctl start syncd diff --git a/platform/nephos/docker-syncd-nephos/supervisord.conf b/platform/nephos/docker-syncd-nephos/supervisord.conf new file mode 100644 index 000000000000..1af5d70a1d0c --- /dev/null +++ b/platform/nephos/docker-syncd-nephos/supervisord.conf @@ -0,0 +1,28 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:syncd] +command=/usr/bin/syncd_start.sh +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog diff --git a/platform/nephos/libsaithrift-dev.mk b/platform/nephos/libsaithrift-dev.mk new file mode 100644 index 000000000000..4103d5c0c7b0 --- /dev/null +++ b/platform/nephos/libsaithrift-dev.mk @@ -0,0 +1,7 @@ +# libsaithrift-dev package + +LIBSAITHRIFT_DEV_NEPHOS = libsaithrift-dev_0.9.4_amd64.deb +$(LIBSAITHRIFT_DEV_NEPHOS)_SRC_PATH = $(SRC_PATH)/SAI +$(LIBSAITHRIFT_DEV_NEPHOS)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(NEPHOS_SAI) $(NEPHOS_SAI_DEV) +$(LIBSAITHRIFT_DEV_NEPHOS)_RDEPENDS += $(LIBTHRIFT) $(NEPHOS_SAI) +#SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_NEPHOS) diff --git a/platform/nephos/one-image.mk b/platform/nephos/one-image.mk new file mode 100644 index 000000000000..8e9406dca89c --- /dev/null +++ b/platform/nephos/one-image.mk @@ -0,0 +1,10 @@ +# sonic nephos one image installer + +SONIC_ONE_IMAGE = sonic-nephos.bin +$(SONIC_ONE_IMAGE)_MACHINE = nephos +$(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie +$(SONIC_ONE_IMAGE)_INSTALLS += $(NEPHOS_NPS_KERNEL) +$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(INGRASYS_S9130_32X_PLATFORM_MODULE) \ + $(INGRASYS_S9230_64X_PLATFORM_MODULE) +$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/nephos/platform-modules-ingrasys.mk b/platform/nephos/platform-modules-ingrasys.mk new file mode 100644 index 000000000000..dde33e0b8745 --- /dev/null +++ b/platform/nephos/platform-modules-ingrasys.mk @@ -0,0 +1,18 @@ +# Ingrasys S9130-32X and S9230-64X Platform modules + +INGRASYS_S9130_32X_PLATFORM_MODULE_VERSION = 1.0.0 +INGRASYS_S9230_64X_PLATFORM_MODULE_VERSION = 1.0.0 + +export INGRASYS_S9130_32X_PLATFORM_MODULE_VERSION +export INGRASYS_S9230_64X_PLATFORM_MODULE_VERSION + +INGRASYS_S9130_32X_PLATFORM_MODULE = sonic-platform-ingrasys-s9130-32x_$(INGRASYS_S9130_32X_PLATFORM_MODULE_VERSION)_amd64.deb +$(INGRASYS_S9130_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-ingrasys +$(INGRASYS_S9130_32X_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(INGRASYS_S9130_32X_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s9130_32x-r0 +SONIC_DPKG_DEBS += $(INGRASYS_S9130_32X_PLATFORM_MODULE) + +INGRASYS_S9230_64X_PLATFORM_MODULE = sonic-platform-ingrasys-s9230-64x_$(INGRASYS_S9230_64X_PLATFORM_MODULE_VERSION)_amd64.deb +$(INGRASYS_S9230_64X_PLATFORM_MODULE)_PLATFORM = x86_64-ingrasys_s9230_64x-r0 + +$(eval $(call add_extra_package,$(INGRASYS_S9130_32X_PLATFORM_MODULE),$(INGRASYS_S9230_64X_PLATFORM_MODULE))) diff --git a/platform/nephos/platform.conf b/platform/nephos/platform.conf new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/nephos/python-saithrift.mk b/platform/nephos/python-saithrift.mk new file mode 100644 index 000000000000..bc4a57b64cd3 --- /dev/null +++ b/platform/nephos/python-saithrift.mk @@ -0,0 +1,6 @@ +# python-saithrift package + +PYTHON_SAITHRIFT_NEPHOS = python-saithrift_0.9.4_amd64.deb +$(PYTHON_SAITHRIFT_NEPHOS)_SRC_PATH = $(SRC_PATH)/SAI +$(PYTHON_SAITHRIFT_NEPHOS)_DEPENDS += $(NEPHOS_SAI_DEV) $(THRIFT_COMPILER) $(PYTHON_THRIFT) $(LIBTHRIFT_DEV) +#SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_NEPHOS) diff --git a/platform/nephos/rules.mk b/platform/nephos/rules.mk new file mode 100644 index 000000000000..fc6200005db5 --- /dev/null +++ b/platform/nephos/rules.mk @@ -0,0 +1,26 @@ +include $(PLATFORM_PATH)/sdk.mk +include $(PLATFORM_PATH)/sai.mk +include $(PLATFORM_PATH)/platform-modules-ingrasys.mk +include $(PLATFORM_PATH)/docker-orchagent-nephos.mk +include $(PLATFORM_PATH)/docker-syncd-nephos.mk +include $(PLATFORM_PATH)/docker-syncd-nephos-rpc.mk +include $(PLATFORM_PATH)/one-image.mk +include $(PLATFORM_PATH)/libsaithrift-dev.mk +include $(PLATFORM_PATH)/python-saithrift.mk +#include $(PLATFORM_PATH)/docker-ptf-nephos.mk + +NPX_DIAG = npx_diag +$(NPX_DIAG)_URL = "https://github.com/NephosInc/SONiC/raw/master/sdk/npx_diag_2.0.1-20171020" + +DSSERVE = dsserve +$(DSSERVE)_URL = "https://sonicstorage.blob.core.windows.net/packages/20170518/dsserve?sv=2015-04-05&sr=b&sig=gyNbgSL%2FvpMXDdpboVkIJcTKMRdGgEaOR9OukHhEsu8%3D&se=2030-03-31T23%3A06%3A35Z&sp=r" + +SONIC_ONLINE_FILES += $(NPX_DIAG) $(DSSERVE) + +SONIC_ALL += $(SONIC_ONE_IMAGE) $(DOCKER_FPM) + +# Inject nephos sai into sairedis +$(LIBSAIREDIS)_DEPENDS += $(NEPHOS_SAI) $(NEPHOS_SAI_DEV) #$(LIBSAITHRIFT_DEV_NEPHOS) + +# Runtime dependency on nephos sai is set only for syncd +$(SYNCD)_RDEPENDS += $(NEPHOS_SAI) diff --git a/platform/nephos/sai.mk b/platform/nephos/sai.mk new file mode 100644 index 000000000000..90ee027518e8 --- /dev/null +++ b/platform/nephos/sai.mk @@ -0,0 +1,9 @@ +NEPHOS_SAI = libsainps_2.0.2-20171204_amd64.deb +$(NEPHOS_SAI)_URL = "https://github.com/NephosInc/SONiC/raw/master/sai/libsainps_2.0.2-20171204_amd64.deb" + +NEPHOS_SAI_DEV = libsainps-dev_2.0.2-20171124_amd64.deb +$(eval $(call add_derived_package,$(NEPHOS_SAI),$(NEPHOS_SAI_DEV))) +$(NEPHOS_SAI_DEV)_URL = "https://github.com/NephosInc/SONiC/raw/master/sai/libsainps-dev_2.0.2-20171124_amd64.deb" + +SONIC_ONLINE_DEBS += $(NEPHOS_SAI) $(NEPHOS_SAI_DEV) +$(NEPHOS_SAI_DEV)_DEPENDS += $(NEPHOS_SAI) diff --git a/platform/nephos/sdk.mk b/platform/nephos/sdk.mk new file mode 100644 index 000000000000..392ae459cc57 --- /dev/null +++ b/platform/nephos/sdk.mk @@ -0,0 +1,4 @@ +NEPHOS_NPS_KERNEL = nps-modules-3.16.0-4-amd64_2.0.2-20171204_amd64.deb +$(NEPHOS_NPS_KERNEL)_URL = "https://github.com/NephosInc/SONiC/raw/master/sdk/nps-modules-3.16.0-4-amd64_2.0.2-20171204_amd64.deb" + +SONIC_ONLINE_DEBS += $(NEPHOS_NPS_KERNEL) diff --git a/platform/nephos/sonic-platform-modules-ingrasys b/platform/nephos/sonic-platform-modules-ingrasys new file mode 160000 index 000000000000..e8fd460120b7 --- /dev/null +++ b/platform/nephos/sonic-platform-modules-ingrasys @@ -0,0 +1 @@ +Subproject commit e8fd460120b73cc175b509a344345f30a70e3126 diff --git a/rules/ixgbe.mk b/rules/ixgbe.mk new file mode 100644 index 000000000000..bdd175eac869 --- /dev/null +++ b/rules/ixgbe.mk @@ -0,0 +1,8 @@ +# initramfs-tools package + +IXGBE_DRIVER_VERSION = 5.2.4 +export IXGBE_DRIVER_VERSION + +IXGBE_DRIVER = ixgbe.ko +$(IXGBE_DRIVER)_SRC_PATH = $(SRC_PATH)/ixgbe +SONIC_MAKE_DEBS += $(IXGBE_DRIVER) diff --git a/slave.mk b/slave.mk index 4843faee5066..18d870d50560 100644 --- a/slave.mk +++ b/slave.mk @@ -394,6 +394,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(addprefix $(DEBS_PATH)/,$(INITRAMFS_TOOLS) \ $(LINUX_KERNEL) \ $(IGB_DRIVER) \ + $(IXGBE_DRIVER) \ $(SONIC_DEVICE_DATA) \ $(SONIC_UTILS) \ $(LIBPAM_TACPLUS) \ diff --git a/src/ixgbe/Makefile b/src/ixgbe/Makefile new file mode 100644 index 000000000000..133fc7db0570 --- /dev/null +++ b/src/ixgbe/Makefile @@ -0,0 +1,22 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = ixgbe.ko + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + rm -rf ./ixgbe-$(IXGBE_DRIVER_VERSION) + wget -O ixgbe-$(IXGBE_DRIVER_VERSION).tar.gz "https://sonicstorage.blob.core.windows.net/packages/ixgbe-5.2.4.tar.gz?sv=2015-04-05&sr=b&sig=AaqJHHaPiJRp8R3HKobi0GNDgHAVnqijk6hpahwJ0Mg%3D&se=2154-10-05T22%3A19%3A29Z&sp=r" + tar xzf ixgbe-$(IXGBE_DRIVER_VERSION).tar.gz + + # Patch + pushd ./ixgbe-$(IXGBE_DRIVER_VERSION) + + # Build the package + pushd src + export BUILD_KERNEL=3.16.0-4-amd64 + make + popd + + popd + mv ./ixgbe-$(IXGBE_DRIVER_VERSION)/src/$* $(DEST)/ diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 345f179482db..3b817bbe14f1 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 345f179482dbf5258cad088414bc9eb230decd97 +Subproject commit 3b817bbe14f1e5177e6200c7a80ab74db4768eaa From 683562cf2fff879a6133fc5a720a5687d41b9424 Mon Sep 17 00:00:00 2001 From: Roy Lee Date: Sat, 23 Dec 2017 02:06:21 +0800 Subject: [PATCH 1007/1011] [Accton AS7816-64X] Add new platform and device for AS7816-64X. (#1260) Signed-off-by: roylee123 --- .../Accton-AS7816-64X/port_config.ini | 1 + .../Accton-AS7816-64X/sai.profile | 0 .../installer.conf | 1 + .../led_proc_init.soc | 0 .../x86_64-accton_as7816_64x-r0/minigraph.xml | 1074 +++++++++++++++++ .../plugins/eeprom.py | 21 + .../plugins/sfputil.py | 159 +++ platform/broadcom/one-image.mk | 1 + platform/broadcom/platform-modules-accton.mk | 7 + .../broadcom/sonic-platform-modules-accton | 2 +- 10 files changed, 1265 insertions(+), 1 deletion(-) create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/port_config.ini create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/sai.profile create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/installer.conf create mode 100755 device/accton/x86_64-accton_as7816_64x-r0/led_proc_init.soc create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/minigraph.xml create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/plugins/eeprom.py create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/plugins/sfputil.py diff --git a/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/port_config.ini b/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/port_config.ini new file mode 100644 index 000000000000..f6c7b0c4a876 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/port_config.ini @@ -0,0 +1 @@ +# name lanes alias diff --git a/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/sai.profile b/device/accton/x86_64-accton_as7816_64x-r0/Accton-AS7816-64X/sai.profile new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/device/accton/x86_64-accton_as7816_64x-r0/installer.conf b/device/accton/x86_64-accton_as7816_64x-r0/installer.conf new file mode 100644 index 000000000000..5e62742c11bf --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/installer.conf @@ -0,0 +1 @@ +CONSOLE_SPEED=115200 diff --git a/device/accton/x86_64-accton_as7816_64x-r0/led_proc_init.soc b/device/accton/x86_64-accton_as7816_64x-r0/led_proc_init.soc new file mode 100755 index 000000000000..e69de29bb2d1 diff --git a/device/accton/x86_64-accton_as7816_64x-r0/minigraph.xml b/device/accton/x86_64-accton_as7816_64x-r0/minigraph.xml new file mode 100644 index 000000000000..025985c83675 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/minigraph.xml @@ -0,0 +1,1074 @@ + + + + + + ARISTA01T0 + 10.0.0.33 + switch1 + 10.0.0.32 + 1 + 180 + 60 + + + switch1 + 10.0.0.0 + ARISTA01T2 + 10.0.0.1 + 1 + 180 + 60 + + + ARISTA02T0 + 10.0.0.35 + switch1 + 10.0.0.34 + 1 + 180 + 60 + + + switch1 + 10.0.0.2 + ARISTA02T2 + 10.0.0.3 + 1 + 180 + 60 + + + ARISTA03T0 + 10.0.0.37 + switch1 + 10.0.0.36 + 1 + 180 + 60 + + + switch1 + 10.0.0.4 + ARISTA03T2 + 10.0.0.5 + 1 + 180 + 60 + + + ARISTA04T0 + 10.0.0.39 + switch1 + 10.0.0.38 + 1 + 180 + 60 + + + switch1 + 10.0.0.6 + ARISTA04T2 + 10.0.0.7 + 1 + 180 + 60 + + + ARISTA05T0 + 10.0.0.41 + switch1 + 10.0.0.40 + 1 + 180 + 60 + + + switch1 + 10.0.0.8 + ARISTA05T2 + 10.0.0.9 + 1 + 180 + 60 + + + ARISTA06T0 + 10.0.0.43 + switch1 + 10.0.0.42 + 1 + 180 + 60 + + + switch1 + 10.0.0.10 + ARISTA06T2 + 10.0.0.11 + 1 + 180 + 60 + + + ARISTA07T0 + 10.0.0.45 + switch1 + 10.0.0.44 + 1 + 180 + 60 + + + switch1 + 10.0.0.12 + ARISTA07T2 + 10.0.0.13 + 1 + 180 + 60 + + + ARISTA08T0 + 10.0.0.47 + switch1 + 10.0.0.46 + 1 + 180 + 60 + + + switch1 + 10.0.0.14 + ARISTA08T2 + 10.0.0.15 + 1 + 180 + 60 + + + ARISTA09T0 + 10.0.0.49 + switch1 + 10.0.0.48 + 1 + 180 + 60 + + + switch1 + 10.0.0.16 + ARISTA09T2 + 10.0.0.17 + 1 + 180 + 60 + + + ARISTA10T0 + 10.0.0.51 + switch1 + 10.0.0.50 + 1 + 180 + 60 + + + switch1 + 10.0.0.18 + ARISTA10T2 + 10.0.0.19 + 1 + 180 + 60 + + + ARISTA11T0 + 10.0.0.53 + switch1 + 10.0.0.52 + 1 + 180 + 60 + + + switch1 + 10.0.0.20 + ARISTA11T2 + 10.0.0.21 + 1 + 180 + 60 + + + ARISTA12T0 + 10.0.0.55 + switch1 + 10.0.0.54 + 1 + 180 + 60 + + + switch1 + 10.0.0.22 + ARISTA12T2 + 10.0.0.23 + 1 + 180 + 60 + + + ARISTA13T0 + 10.0.0.57 + switch1 + 10.0.0.56 + 1 + 180 + 60 + + + switch1 + 10.0.0.24 + ARISTA13T2 + 10.0.0.25 + 1 + 180 + 60 + + + ARISTA14T0 + 10.0.0.59 + switch1 + 10.0.0.58 + 1 + 180 + 60 + + + switch1 + 10.0.0.26 + ARISTA14T2 + 10.0.0.27 + 1 + 180 + 60 + + + ARISTA15T0 + 10.0.0.61 + switch1 + 10.0.0.60 + 1 + 180 + 60 + + + switch1 + 10.0.0.28 + ARISTA15T2 + 10.0.0.29 + 1 + 180 + 60 + + + ARISTA16T0 + 10.0.0.63 + switch1 + 10.0.0.62 + 1 + 180 + 60 + + + switch1 + 10.0.0.30 + ARISTA16T2 + 10.0.0.31 + 1 + 180 + 60 + + + + + 65100 + switch1 + + +
10.0.0.33
+ + +
+ +
10.0.0.1
+ + +
+ +
10.0.0.35
+ + +
+ +
10.0.0.3
+ + +
+ +
10.0.0.37
+ + +
+ +
10.0.0.5
+ + +
+ +
10.0.0.39
+ + +
+ +
10.0.0.7
+ + +
+ +
10.0.0.41
+ + +
+ +
10.0.0.9
+ + +
+ +
10.0.0.43
+ + +
+ +
10.0.0.11
+ + +
+ +
10.0.0.45
+ + +
+ +
10.0.0.13
+ + +
+ +
10.0.0.47
+ + +
+ +
10.0.0.15
+ + +
+ +
10.0.0.49
+ + +
+ +
10.0.0.17
+ + +
+ +
10.0.0.51
+ + +
+ +
10.0.0.19
+ + +
+ +
10.0.0.53
+ + +
+ +
10.0.0.21
+ + +
+ +
10.0.0.55
+ + +
+ +
10.0.0.23
+ + +
+ +
10.0.0.57
+ + +
+ +
10.0.0.25
+ + +
+ +
10.0.0.59
+ + +
+ +
10.0.0.27
+ + +
+ +
10.0.0.61
+ + +
+ +
10.0.0.29
+ + +
+ +
10.0.0.63
+ + +
+ +
10.0.0.31
+ + +
+
+ +
+ + 64001 + ARISTA01T0 + + + + 65200 + ARISTA01T2 + + + + 64002 + ARISTA02T0 + + + + 65200 + ARISTA02T2 + + + + 64003 + ARISTA03T0 + + + + 65200 + ARISTA03T2 + + + + 64004 + ARISTA04T0 + + + + 65200 + ARISTA04T2 + + + + 64005 + ARISTA05T0 + + + + 65200 + ARISTA05T2 + + + + 64006 + ARISTA06T0 + + + + 65200 + ARISTA06T2 + + + + 64007 + ARISTA07T0 + + + + 65200 + ARISTA07T2 + + + + 64008 + ARISTA08T0 + + + + 65200 + ARISTA08T2 + + + + 64009 + ARISTA09T0 + + + + 65200 + ARISTA09T2 + + + + 64010 + ARISTA10T0 + + + + 65200 + ARISTA10T2 + + + + 64011 + ARISTA11T0 + + + + 65200 + ARISTA11T2 + + + + 64012 + ARISTA12T0 + + + + 65200 + ARISTA12T2 + + + + 64013 + ARISTA13T0 + + + + 65200 + ARISTA13T2 + + + + 64014 + ARISTA14T0 + + + + 65200 + ARISTA14T2 + + + + 64015 + ARISTA15T0 + + + + 65200 + ARISTA15T2 + + + + 64016 + ARISTA16T0 + + + + 65200 + ARISTA16T2 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.32/32 + + 10.1.0.32/32 + + + + + + + + switch1 + + + + + + Ethernet0 + 10.0.0.0/31 + + + + Ethernet4 + 10.0.0.2/31 + + + + Ethernet8 + 10.0.0.4/31 + + + + Ethernet12 + 10.0.0.6/31 + + + + Ethernet16 + 10.0.0.8/31 + + + + Ethernet20 + 10.0.0.10/31 + + + + Ethernet24 + 10.0.0.12/31 + + + + Ethernet28 + 10.0.0.14/31 + + + + Ethernet32 + 10.0.0.16/31 + + + + Ethernet36 + 10.0.0.18/31 + + + + Ethernet40 + 10.0.0.20/31 + + + + Ethernet44 + 10.0.0.22/31 + + + + Ethernet48 + 10.0.0.24/31 + + + + Ethernet52 + 10.0.0.26/31 + + + + Ethernet56 + 10.0.0.28/31 + + + + Ethernet60 + 10.0.0.30/31 + + + + Ethernet64 + 10.0.0.32/31 + + + + Ethernet68 + 10.0.0.34/31 + + + + Ethernet72 + 10.0.0.36/31 + + + + Ethernet76 + 10.0.0.38/31 + + + + Ethernet80 + 10.0.0.40/31 + + + + Ethernet84 + 10.0.0.42/31 + + + + Ethernet88 + 10.0.0.44/31 + + + + Ethernet92 + 10.0.0.46/31 + + + + Ethernet96 + 10.0.0.48/31 + + + + Ethernet100 + 10.0.0.50/31 + + + + Ethernet104 + 10.0.0.52/31 + + + + Ethernet108 + 10.0.0.54/31 + + + + Ethernet112 + 10.0.0.56/31 + + + + Ethernet116 + 10.0.0.58/31 + + + + Ethernet120 + 10.0.0.60/31 + + + + Ethernet124 + 10.0.0.62/31 + + + + + + + + + + + + DeviceInterfaceLink + switch1 + Ethernet0 + ARISTA01T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet4 + ARISTA02T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet8 + ARISTA03T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet12 + ARISTA04T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet16 + ARISTA05T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet20 + ARISTA06T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet24 + ARISTA07T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet28 + ARISTA08T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet32 + ARISTA09T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet36 + ARISTA10T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet40 + ARISTA11T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet44 + ARISTA12T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet48 + ARISTA13T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet52 + ARISTA14T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet56 + ARISTA15T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet60 + ARISTA16T2 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet64 + ARISTA01T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet68 + ARISTA02T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet72 + ARISTA03T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet76 + ARISTA04T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet80 + ARISTA05T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet84 + ARISTA06T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet88 + ARISTA07T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet92 + ARISTA08T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet96 + ARISTA09T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet100 + ARISTA10T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet104 + ARISTA11T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet108 + ARISTA12T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet112 + ARISTA13T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet116 + ARISTA14T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet120 + ARISTA15T0 + Ethernet1 + + + DeviceInterfaceLink + switch1 + Ethernet124 + ARISTA16T0 + Ethernet1 + + + + + switch1 + Accton-AS7712-32X + + + + + + + switch1 + + + DhcpResources + + + + + NtpResources + + 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org + + + SyslogResources + + + + + + + + + switch1 + Accton-AS7712-32X +
diff --git a/device/accton/x86_64-accton_as7816_64x-r0/plugins/eeprom.py b/device/accton/x86_64-accton_as7816_64x-r0/plugins/eeprom.py new file mode 100644 index 000000000000..1e7d1046d93d --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/plugins/eeprom.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/accton/x86_64-accton_as7816_64x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7816_64x-r0/plugins/sfputil.py new file mode 100644 index 000000000000..7c82583c26bb --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/plugins/sfputil.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class SfpUtil(SfpUtilBase): + """Platform specific SfpUtill class""" + + _port_start = 0 + _port_end = 63 + ports_in_block = 64 + + _port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 61 : 25, + 62 : 26, + 63 : 27, + 64 : 28, + 55 : 29, + 56 : 30, + 53 : 31, + 54 : 32, + 9 : 33, + 10 : 34, + 11 : 35, + 12 : 36, + 1 : 37, + 2 : 38, + 3 : 39, + 4 : 40, + 6 : 41, + 5 : 42, + 8 : 43, + 7 : 44, + 13 : 45, + 14 : 46, + 15 : 47, + 16 : 48, + 17 : 49, + 18 : 50, + 19 : 51, + 20 : 52, + 25 : 53, + 26 : 54, + 27 : 55, + 28 : 56, + 29 : 57, + 30 : 58, + 31 : 59, + 32 : 60, + 21 : 61, + 22 : 62, + 23 : 63, + 24 : 64, + 41 : 65, + 42 : 66, + 43 : 67, + 44 : 68, + 33 : 69, + 34 : 70, + 35 : 71, + 36 : 72, + 45 : 73, + 46 : 74, + 47 : 75, + 48 : 76, + 37 : 77, + 38 : 78, + 39 : 79, + 40 : 80, + 57 : 81, + 58 : 82, + 59 : 83, + 60 : 84, + 49 : 85, + 50 : 86, + 51 : 87, + 52 : 88,} + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self): + eeprom_path = '/sys/bus/i2c/devices/{0}-0050/sfp_eeprom' + for x in range(0, self._port_end + 1): + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x+1]) + self._port_to_eeprom_mapping[x] = port_eeprom_path + SfpUtilBase.__init__(self) + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self._port_start or port_num > self._port_end: + return False + + path = "/sys/bus/i2c/devices/{0}-0050/sfp_port_reset" + port_ps = path.format(self.port_to_i2c_mapping[port_num+1]) + + try: + reg_file = open(port_ps, 'w') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + #toggle reset + reg_file.seek(0) + reg_file.write('1') + time.sleep(1) + reg_file.seek(0) + reg_file.write('0') + reg_file.close() + return True + + def set_low_power_mode(self, port_nuM, lpmode): + raise NotImplementedErro + + def get_low_power_mode(self, port_num): + raise NotImplementedErro + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self._port_start or port_num > self._port_end: + return False + + path = "/sys/bus/i2c/devices/{0}-0050/sfp_is_present" + port_ps = path.format(self.port_to_i2c_mapping[port_num+1]) + + + try: + reg_file = open(port_ps) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_file.readline().rstrip() + if reg_value == '1': + return True + + return False + + @property + def port_start(self): + return self._port_start + + @property + def port_end(self): + return self._port_end + + @property + def qsfp_ports(self): + return range(0, self.ports_in_block + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 5b2afedee7d7..a29d32abd1c2 100755 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -14,6 +14,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(INGRASYS_S9200_64X_PLATFORM_MODULE) \ $(ACCTON_AS7712_32X_PLATFORM_MODULE) \ $(ACCTON_AS5712_54X_PLATFORM_MODULE) \ + $(ACCTON_AS7816_64X_PLATFORM_MODULE) \ $(INVENTEC_D7032Q28B_PLATFORM_MODULE) \ $(INVENTEC_D7054Q28B_PLATFORM_MODULE) \ $(CEL_DX010_PLATFORM_MODULE) \ diff --git a/platform/broadcom/platform-modules-accton.mk b/platform/broadcom/platform-modules-accton.mk index 7030ecb441f7..c03ca5944246 100755 --- a/platform/broadcom/platform-modules-accton.mk +++ b/platform/broadcom/platform-modules-accton.mk @@ -2,9 +2,11 @@ ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION = 1.1 ACCTON_AS5712_54X_PLATFORM_MODULE_VERSION = 1.1 +ACCTON_AS7816_64X_PLATFORM_MODULE_VERSION = 1.1 export ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION export ACCTON_AS5712_54X_PLATFORM_MODULE_VERSION +export ACCTON_AS7816_64X_PLATFORM_MODULE_VERSION ACCTON_AS7712_32X_PLATFORM_MODULE = sonic-platform-accton-as7712-32x_$(ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION)_amd64.deb $(ACCTON_AS7712_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-accton @@ -16,3 +18,8 @@ ACCTON_AS5712_54X_PLATFORM_MODULE = sonic-platform-accton-as5712-54x_$(ACCTON_AS $(ACCTON_AS5712_54X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as5712_54x-r0 $(eval $(call add_extra_package,$(ACCTON_AS7712_32X_PLATFORM_MODULE),$(ACCTON_AS5712_54X_PLATFORM_MODULE))) SONIC_DPKG_DEBS += $(ACCTON_AS5712_54X_PLATFORM_MODULE) + +ACCTON_AS7816_64X_PLATFORM_MODULE = sonic-platform-accton-as7816-64x_$(ACCTON_AS7816_64X_PLATFORM_MODULE_VERSION)_amd64.deb +$(ACCTON_AS7816_64X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as7816_64x-r0 + +$(eval $(call add_extra_package,$(ACCTON_AS7712_32X_PLATFORM_MODULE),$(ACCTON_AS7816_64X_PLATFORM_MODULE))) diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton index 7c39d916d2b5..e66b74fcf7a9 160000 --- a/platform/broadcom/sonic-platform-modules-accton +++ b/platform/broadcom/sonic-platform-modules-accton @@ -1 +1 @@ -Subproject commit 7c39d916d2b5d248c8067669e72b75ed7240b348 +Subproject commit e66b74fcf7a943d8c7c8f241a8221eca65171ced From 15d433d975d403bbb490c12b71aec5e6f5b810ab Mon Sep 17 00:00:00 2001 From: lguohan Date: Sat, 23 Dec 2017 23:34:15 -0800 Subject: [PATCH 1008/1011] [build]: allow to use http(s) proxy in the build (#1265) * allow to use http(s) proxy in the build To enable this, use following command http_proxy=[your_proxy] https_proxy=[your_proxy] make --- Makefile | 8 ++++++- README.md | 7 ++++-- build_debian.sh | 12 +++++++--- .../build_templates/sonic_debian_extension.j2 | 8 +++---- slave.mk | 22 ++++++++++++++++--- 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 8d864e914aa2..aa3492561cb2 100644 --- a/Makefile +++ b/Makefile @@ -35,10 +35,14 @@ SLAVE_IMAGE = sonic-slave-$(USER) DOCKER_RUN := docker run --rm=true --privileged \ -v $(PWD):/sonic \ -w /sonic \ + -e "http_proxy=$(http_proxy)" \ + -e "https_proxy=$(https_proxy)" \ -i$(if $(TERM),t,) DOCKER_BASE_BUILD = docker build --no-cache \ -t $(SLAVE_BASE_IMAGE) \ + --build-arg http_proxy=$(http_proxy) \ + --build-arg https_proxy=$(https_proxy) \ sonic-slave && \ docker tag $(SLAVE_BASE_IMAGE):latest $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) @@ -61,7 +65,9 @@ SONIC_BUILD_INSTRUCTION := make \ ENABLE_SYNCD_RPC=$(ENABLE_SYNCD_RPC) \ PASSWORD=$(PASSWORD) \ USERNAME=$(USERNAME) \ - SONIC_BUILD_JOBS=$(SONIC_BUILD_JOBS) + SONIC_BUILD_JOBS=$(SONIC_BUILD_JOBS) \ + HTTP_PROXY=$(http_proxy) \ + HTTPS_PROXY=$(https_proxy) .PHONY: sonic-slave-build sonic-slave-bash init reset diff --git a/README.md b/README.md index 0a361e38abec..ea721a48e9ec 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,11 @@ To build SONiC installer image and docker images, run the following commands: make - **NOTE**: We recommend reserving 50G free space to build one platform. - + **NOTE**: + +- We recommend reserving 50G free space to build one platform. +- Use ```http_proxy=[your_proxy] https_proxy=[your_proxy] make``` to enable http(s) proxy in the build process. + The SONiC installer contains all docker images needed. SONiC uses one image for all devices of a same ASIC vendor. The supported ASIC vendors are: - PLATFORM=broadcom diff --git a/build_debian.sh b/build_debian.sh index 15bde44c112e..1aaa660eefda 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -68,7 +68,7 @@ touch $FILESYSTEM_ROOT/$PLATFORM_DIR/firsttime ## Build a basic Debian system by debootstrap echo '[INFO] Debootstrap...' -sudo debootstrap --variant=minbase --arch amd64 jessie $FILESYSTEM_ROOT http://ftp.us.debian.org/debian +sudo http_proxy=$http_proxy debootstrap --variant=minbase --arch amd64 jessie $FILESYSTEM_ROOT http://ftp.us.debian.org/debian ## Config hostname and hosts, otherwise 'sudo ...' will complain 'sudo: unable to resolve host ...' sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo '$HOSTNAME' > /etc/hostname" @@ -79,6 +79,9 @@ sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo '127.0.0.1 localhos sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c 'echo "proc /proc proc defaults 0 0" >> /etc/fstab' sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c 'echo "sysfs /sys sysfs defaults 0 0" >> /etc/fstab' +## Setup proxy +[ -n "$http_proxy" ] && sudo /bin/bash -c "echo 'Acquire::http::Proxy \"$http_proxy\";' > $FILESYSTEM_ROOT/etc/apt/apt.conf.d/01proxy" + ## Note: mounting is necessary to makedev and install linux image echo '[INFO] Mount all' ## Output all the mounted device for troubleshooting @@ -290,8 +293,8 @@ set /files/etc/sysctl.conf/net.core.rmem_max 2097152 " -r $FILESYSTEM_ROOT ## docker-py is needed by Ansible docker module -sudo LANG=C chroot $FILESYSTEM_ROOT easy_install pip -sudo LANG=C chroot $FILESYSTEM_ROOT pip install 'docker-py==1.6.0' +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT easy_install pip +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip install 'docker-py==1.6.0' ## Note: keep pip installed for maintainance purpose ## Create /var/run/redis folder for docker-database to mount @@ -342,6 +345,9 @@ sudo LANG=C chroot $FILESYSTEM_ROOT apt-get autoclean sudo LANG=C chroot $FILESYSTEM_ROOT apt-get clean sudo LANG=C chroot $FILESYSTEM_ROOT bash -c 'rm -rf /usr/share/doc/* /usr/share/locale/* /var/lib/apt/lists/* /tmp/*' +## Clean up proxy +[ -n "$http_proxy" ] && sudo rm -f $FILESYSTEM_ROOT/etc/apt/apt.conf.d/01proxy + ## Umount all echo '[INFO] Umount all' ## Display all process details access /proc diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 7de8f8597917..bf603d249d95 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -64,17 +64,17 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in # Install SONiC config engine Python package CONFIG_ENGINE_WHEEL_NAME=$(basename {{config_engine_wheel_path}}) sudo cp {{config_engine_wheel_path}} $FILESYSTEM_ROOT/$CONFIG_ENGINE_WHEEL_NAME -sudo LANG=C chroot $FILESYSTEM_ROOT pip install $CONFIG_ENGINE_WHEEL_NAME +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip install $CONFIG_ENGINE_WHEEL_NAME sudo rm -rf $FILESYSTEM_ROOT/$CONFIG_ENGINE_WHEEL_NAME # Install Python client for Redis -sudo LANG=C chroot $FILESYSTEM_ROOT pip install redis -sudo LANG=C chroot $FILESYSTEM_ROOT pip install redis-dump-load +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip install redis +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip install redis-dump-load # Install SwSS SDK Python 2 package SWSSSDK_PY2_WHEEL_NAME=$(basename {{swsssdk_py2_wheel_path}}) sudo cp {{swsssdk_py2_wheel_path}} $FILESYSTEM_ROOT/$SWSSSDK_PY2_WHEEL_NAME -sudo LANG=C chroot $FILESYSTEM_ROOT pip install $SWSSSDK_PY2_WHEEL_NAME +sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip install $SWSSSDK_PY2_WHEEL_NAME sudo rm -rf $FILESYSTEM_ROOT/$SWSSSDK_PY2_WHEEL_NAME # Install SONiC Utilities (and its dependencies via 'apt-get -y install -f') diff --git a/slave.mk b/slave.mk index 18d870d50560..425ba4c41d82 100644 --- a/slave.mk +++ b/slave.mk @@ -100,6 +100,8 @@ $(info "SONIC_CONFIG_DEBUG" : "$(SONIC_CONFIG_DEBUG)") $(info "ROUTING_STACK" : "$(SONIC_ROUTING_STACK)") $(info "ENABLE_SYNCD_RPC" : "$(ENABLE_SYNCD_RPC)") $(info "ENABLE_ORGANIZATION_EXTENSIONS" : "$(ENABLE_ORGANIZATION_EXTENSIONS)") +$(info "HTTP_PROXY" : "$(HTTP_PROXY)") +$(info "HTTPS_PROXY" : "$(HTTPS_PROXY)") $(info ) ############################################################################### @@ -329,7 +331,7 @@ $(SONIC_INSTALL_WHEELS) : $(PYTHON_WHEELS_PATH)/%-install : .platform $$(addsuff # put a lock here to avoid race conditions while true; do if mkdir $(PYTHON_WHEELS_PATH)/pip_lock &> /dev/null; then - { sudo pip$($*_PYTHON_VERSION) install $(PYTHON_WHEELS_PATH)/$* $(LOG) && rm -d $(PYTHON_WHEELS_PATH)/pip_lock && break; } || { rm -d $(PYTHON_WHEELS_PATH)/pip_lock && exit 1 ; } + { sudo -E pip$($*_PYTHON_VERSION) install $(PYTHON_WHEELS_PATH)/$* $(LOG) && rm -d $(PYTHON_WHEELS_PATH)/pip_lock && break; } || { rm -d $(PYTHON_WHEELS_PATH)/pip_lock && exit 1 ; } fi done $(FOOTER) @@ -340,12 +342,20 @@ $(SONIC_INSTALL_WHEELS) : $(PYTHON_WHEELS_PATH)/%-install : .platform $$(addsuff # start docker daemon docker-start : + @sudo sed -i '/http_proxy/d' /etc/default/docker + @sudo bash -c "echo \"export http_proxy=$$http_proxy\" >> /etc/default/docker" @sudo service docker status &> /dev/null || ( sudo service docker start &> /dev/null && sleep 1 ) # targets for building simple docker images that do not depend on any debian packages $(addprefix $(TARGET_PATH)/, $(SONIC_SIMPLE_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .platform docker-start $$(addsuffix -load,$$(addprefix $(TARGET_PATH)/,$$($$*.gz_LOAD_DOCKERS))) $(HEADER) - docker build --squash --no-cache --build-arg user=$(USER) --build-arg uid=$(UID) --build-arg guid=$(GUID) -t $* $($*.gz_PATH) $(LOG) + docker build --squash --no-cache \ + --build-arg http_proxy=$(HTTP_PROXY) \ + --build-arg https_proxy=$(HTTPS_PROXY) \ + --build-arg user=$(USER) \ + --build-arg uid=$(UID) \ + --build-arg guid=$(GUID) \ + -t $* $($*.gz_PATH) $(LOG) docker save $* | gzip -c > $@ $(FOOTER) @@ -365,7 +375,13 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .pl $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_whls=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_PYTHON_WHEELS)))\n" | awk '!a[$$0]++')) $(eval export $(subst -,_,$(notdir $($*.gz_PATH)))_dbgs=$(shell printf "$(subst $(SPACE),\n,$(call expand,$($*.gz_DBG_PACKAGES)))\n" | awk '!a[$$0]++')) j2 $($*.gz_PATH)/Dockerfile.j2 > $($*.gz_PATH)/Dockerfile - docker build --squash --no-cache --build-arg user=$(USER) --build-arg uid=$(UID) --build-arg guid=$(GUID) -t $* $($*.gz_PATH) $(LOG) + docker build --squash --no-cache \ + --build-arg http_proxy=$(HTTP_PROXY) \ + --build-arg https_proxy=$(HTTPS_PROXY) \ + --build-arg user=$(USER) \ + --build-arg uid=$(UID) \ + --build-arg guid=$(GUID) \ + -t $* $($*.gz_PATH) $(LOG) docker save $* | gzip -c > $@ $(FOOTER) From 5c40aa52ac60517b4da37b6eac10d82059c35efd Mon Sep 17 00:00:00 2001 From: lguohan Date: Mon, 25 Dec 2017 18:42:51 -0800 Subject: [PATCH 1009/1011] [build]: add build badge for nephos platform (#1267) --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ea721a48e9ec..db4ac55d5fec 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ *master*: Broadcom: [![Broadcom](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-all) Mellanox: [![Mellanox](https://sonic-jenkins.westus2.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-all) +Nephos: [![Nephos](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all) P4: [![P4](https://sonic-jenkins.westus2.cloudapp.azure.com/job/p4/job/buildimage-p4-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/p4/job/buildimage-p4-all) VS: [![VS](https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-all) @@ -7,7 +8,7 @@ VS: [![VS](https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimag Broadcom: [![Broadcom](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-201709/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/broadcom/job/buildimage-brcm-201709/) Cavium: [![Cavium](https://sonic-jenkins.westus2.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/cavium/job/buildimage-cavm-all/) Centec: [![Centec](https://sonic-jenkins.westus2.cloudapp.azure.com/job/centec/job/buildimage-centec-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/centec/job/buildimage-centec-all/) -Nephos: [![Nephos](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-all/) +Nephos: [![Nephos](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-201709/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/nephos/job/buildimage-nephos-201709/) Marvell: [![Marvell](https://sonic-jenkins.westus2.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-all/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/marvell/job/buildimage-mrvl-all/) Mellanox: [![Mellanox](https://sonic-jenkins.westus2.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-201709/badge/icon)](https://sonic-jenkins.westus2.cloudapp.azure.com/job/mellanox/job/buildimage-mlnx-201709/) From 5eb5e2162ba9697384c82712d2bba3f05d012a42 Mon Sep 17 00:00:00 2001 From: chenyuqiang Date: Thu, 28 Dec 2017 03:25:53 +0800 Subject: [PATCH 1010/1011] [centec]: support sai1.0 (#1268) --- platform/centec/sai.mk | 2 +- platform/centec/sdk.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/centec/sai.mk b/platform/centec/sai.mk index de8615ac132c..299b36a69ebf 100644 --- a/platform/centec/sai.mk +++ b/platform/centec/sai.mk @@ -1,5 +1,5 @@ # Centec SAI CENTEC_SAI = libsai_1.0.0_amd64.deb -$(CENTEC_SAI)_URL = https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/SONiC_0.9.4/libsai_1.0.0_amd64.deb +$(CENTEC_SAI)_URL = https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/SONiC_1.0/libsai_1.0.0_amd64.deb SONIC_ONLINE_DEBS += $(CENTEC_SAI) diff --git a/platform/centec/sdk.mk b/platform/centec/sdk.mk index ac1939122f47..e3ce05f6b742 100644 --- a/platform/centec/sdk.mk +++ b/platform/centec/sdk.mk @@ -1,4 +1,4 @@ CENTEC_SDK_KERNEL = centec-gg-sdk3.5-modules-3.16.0-4-amd64.deb -$(CENTEC_SDK_KERNEL)_URL = "https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/centec-gg-sdk3.5-modules-3.16.0-4-amd64.deb" +$(CENTEC_SDK_KERNEL)_URL = "https://github.com/CentecNetworks/goldengate-sai/raw/master/lib/SONiC_1.0/centec-gg-sdk3.5-modules-3.16.0-4-amd64.deb" SONIC_ONLINE_DEBS += $(CENTEC_SDK_KERNEL) From f2ccb24b4b5eb49b14458e235b086683b040ced9 Mon Sep 17 00:00:00 2001 From: andrii savka Date: Thu, 28 Dec 2017 14:31:07 +0200 Subject: [PATCH 1011/1011] Enable SAI thrift for Mellanox platform --- platform/mellanox/docker-ptf-mlnx.mk | 2 +- platform/mellanox/libsaithrift-dev.mk | 2 +- platform/mellanox/python-saithrift.mk | 2 +- platform/mellanox/rules.mk | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/mellanox/docker-ptf-mlnx.mk b/platform/mellanox/docker-ptf-mlnx.mk index 9f994f62de64..7f23dc715e32 100644 --- a/platform/mellanox/docker-ptf-mlnx.mk +++ b/platform/mellanox/docker-ptf-mlnx.mk @@ -4,4 +4,4 @@ DOCKER_PTF_MLNX = docker-ptf-mlnx.gz $(DOCKER_PTF_MLNX)_PATH = $(DOCKERS_PATH)/docker-ptf-saithrift $(DOCKER_PTF_MLNX)_DEPENDS += $(PYTHON_SAITHRIFT_MLNX) $(DOCKER_PTF_MLNX)_LOAD_DOCKERS += $(DOCKER_PTF) -#SONIC_DOCKER_IMAGES += $(DOCKER_PTF_MLNX) +SONIC_DOCKER_IMAGES += $(DOCKER_PTF_MLNX) diff --git a/platform/mellanox/libsaithrift-dev.mk b/platform/mellanox/libsaithrift-dev.mk index 39222be39cab..0fc6d3f4eb84 100644 --- a/platform/mellanox/libsaithrift-dev.mk +++ b/platform/mellanox/libsaithrift-dev.mk @@ -4,4 +4,4 @@ LIBSAITHRIFT_DEV_MLNX = libsaithrift-dev_0.9.4_amd64.deb $(LIBSAITHRIFT_DEV_MLNX)_SRC_PATH = $(SRC_PATH)/SAI $(LIBSAITHRIFT_DEV_MLNX)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(MLNX_SAI) $(MLNX_SAI_DEV) $(LIBSAITHRIFT_DEV_MLNX)_RDEPENDS += $(LIBTHRIFT) $(MLNX_SAI) -#SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_MLNX) +SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_MLNX) diff --git a/platform/mellanox/python-saithrift.mk b/platform/mellanox/python-saithrift.mk index 59685121e02c..cbe5af29b3e2 100644 --- a/platform/mellanox/python-saithrift.mk +++ b/platform/mellanox/python-saithrift.mk @@ -3,4 +3,4 @@ PYTHON_SAITHRIFT_MLNX = python-saithrift_0.9.4_amd64.deb $(PYTHON_SAITHRIFT_MLNX)_SRC_PATH = $(SRC_PATH)/SAI $(PYTHON_SAITHRIFT_MLNX)_DEPENDS += $(MLNX_SAI_DEV) $(MLNX_SAI) $(THRIFT_COMPILER) $(PYTHON_THRIFT) $(LIBTHRIFT_DEV) -#SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_MLNX) +SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_MLNX) diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index d67401df245d..1651f4a66806 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -15,7 +15,7 @@ SONIC_ALL += $(SONIC_ONE_IMAGE) \ $(DOCKER_FPM) # Inject mlnx sai into sairedis -$(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) #$(LIBSAITHRIFT_DEV_MLNX) +$(LIBSAIREDIS)_DEPENDS += $(MLNX_SAI) $(LIBSAITHRIFT_DEV_MLNX) # Runtime dependency on mlnx sai is set only for syncd $(SYNCD)_RDEPENDS += $(MLNX_SAI)

UCM}yocoz1wzq-Y3g~I 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