Add simple script that allows user to run tests and builds
using container. At the same time add example Dockerfile for
Fedora 37.

Basic usage is:
./utilities/containers/ci.sh

This will compile the project with GCC, it expects podman
as container platform with default image being "ovn-org/ovn-tests".

The test parameters can be specified as environment variables.

Signed-off-by: Ales Musil <amu...@redhat.com>
---
v3: Rebase on top of main.
    Address comments from Mark:
    - Fix "ARH" typo.
    - Add python dependencies to a file.
---
 .ci/linux-prepare.sh                     |   2 +-
 utilities/automake.mk                    |   4 +
 utilities/containers/Makefile            |   7 ++
 utilities/containers/ci.sh               | 137 +++++++++++++++++++++++
 utilities/containers/fedora/Dockerfile   |  62 ++++++++++
 utilities/containers/py-requirements.txt |   6 +
 6 files changed, 217 insertions(+), 1 deletion(-)
 create mode 100644 utilities/containers/Makefile
 create mode 100755 utilities/containers/ci.sh
 create mode 100755 utilities/containers/fedora/Dockerfile
 create mode 100644 utilities/containers/py-requirements.txt

diff --git a/.ci/linux-prepare.sh b/.ci/linux-prepare.sh
index e0c528479..6617d0c42 100755
--- a/.ci/linux-prepare.sh
+++ b/.ci/linux-prepare.sh
@@ -18,4 +18,4 @@ cd sparse && make -j4 HAVE_LLVM= HAVE_SQLITE= install && cd ..
 #     https://github.com/pypa/pip/issues/10655
 pip3 install --disable-pip-version-check --user wheel
 pip3 install --disable-pip-version-check --user \
-    flake8 'hacking>=3.0' sphinx setuptools pyelftools pyOpenSSL
+-r utilities/containers/py-requirements.txt
diff --git a/utilities/automake.mk b/utilities/automake.mk
index 67b04cbff..142fe6810 100644
--- a/utilities/automake.mk
+++ b/utilities/automake.mk
@@ -37,6 +37,10 @@ EXTRA_DIST += \
     utilities/ovn_detrace.py.in \
     utilities/ovndb-servers.ocf \
     utilities/checkpatch.py \
+    utilities/containers/ci.sh \
+    utilities/containers/Makefile \
+    utilities/containers/py-requirements.txt \
+    utilities/containers/fedora/Dockerfile \
     utilities/docker/Makefile \
     utilities/docker/start-ovn \
     utilities/docker/ovn_default_nb_port \
diff --git a/utilities/containers/Makefile b/utilities/containers/Makefile
new file mode 100644
index 000000000..8b39e3493
--- /dev/null
+++ b/utilities/containers/Makefile
@@ -0,0 +1,7 @@
+CONTAINER_CMD ?= podman
+DISTRO ?= fedora
+IMAGE_NAME ?= "ovn-org/ovn-tests"
+
+.PHONY: build
+
+build: ;$(CONTAINER_CMD) build --no-cache --rm -t $(IMAGE_NAME) -f 
$(DISTRO)/Dockerfile .
diff --git a/utilities/containers/ci.sh b/utilities/containers/ci.sh
new file mode 100755
index 000000000..e00971e0c
--- /dev/null
+++ b/utilities/containers/ci.sh
@@ -0,0 +1,137 @@
+#!/bin/bash -xe
+# Copyright (c) 2022, Red Hat, 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.
+#
+
+OVN_PATH=${OVN_PATH:-$PWD}
+OVS_PATH=${OVS_PATH:-$OVN_PATH/ovs}
+CONTAINER_CMD=${CONTAINER_CMD:-podman}
+CONTAINER_WORKSPACE="/workspace"
+CONTAINER_WORKDIR="/workspace/ovn-tmp"
+IMAGE_NAME=${IMAGE_NAME:-"ovn-org/ovn-tests"}
+
+# Test variables
+ARCH=${ARCH:-$(uname -i)}
+CC=${CC:-gcc}
+
+
+test -t 1 && USE_TTY="t"
+
+function container_exec() {
+    ${CONTAINER_CMD} exec "-i$USE_TTY" "$CONTAINER_ID" /bin/bash -c "$1"
+}
+
+function container_shell() {
+    ${CONTAINER_CMD} exec "-i$USE_TTY" "$CONTAINER_ID" /bin/bash
+}
+
+function remove_container() {
+    res=$?
+    [ "$res" -ne 0 ] && echo "*** ERROR: $res ***"
+    ${CONTAINER_CMD} rm -f "$CONTAINER_ID"
+}
+
+function copy_sources_to_workdir() {
+    container_exec "
+        mkdir -p $CONTAINER_WORKDIR \
+        && \
+        cp -a $CONTAINER_WORKSPACE/ovn/. $CONTAINER_WORKDIR \
+        && \
+        rm -rf $CONTAINER_WORKDIR/ovs \
+        &&
+        cp -a $CONTAINER_WORKSPACE/ovs/. $CONTAINER_WORKDIR/ovs
+    "
+}
+
+function overwrite_jobs() {
+    container_exec "
+        sed -i s/-j[0-9]/-j$jobs/ $CONTAINER_WORKDIR/.ci/linux-build.sh
+    "
+}
+
+function run_tests() {
+    container_exec "
+        cd $CONTAINER_WORKDIR \
+        && \
+        ARCH=$ARCH CC=$CC LIBS=$LIBS OPTS=$OPTS TESTSUITE=$TESTSUITE \
+        TEST_RANGE=$TEST_RANGE SANITIZERS=$SANITIZERS \
+        ./.ci/linux-build.sh
+    "
+}
+
+options=$(getopt --options "" \
+    --long help,shell,jobs:,ovn-path:,ovs-path:,image-name:\
+    -- "${@}")
+eval set -- "$options"
+while true; do
+    case "$1" in
+    --shell)
+        shell="1"
+        ;;
+    --jobs)
+        shift
+        jobs="$1"
+        ;;
+    --ovn-path)
+        shift
+        OVN_PATH="$1"
+        ;;
+    --ovs-path)
+        shift
+        OVS_PATH="$1"
+        ;;
+    --image-name)
+        shift
+        IMAGE_NAME="$1"
+        ;;
+    --help)
+        set +x
+        printf "$0 [--shell] [--help] [--jobs=<JOBS>] [--ovn-path=<OVN_PATH>]"
+        printf "[--ovs-path=<OVS_PATH>] [--image-name=<IMAGE_NAME>]\n"
+        exit
+        ;;
+    --)
+        shift
+        break
+        ;;
+    esac
+    shift
+done
+
+# Workaround for https://bugzilla.redhat.com/2153359
+if [ "$ARCH" = "aarch64" ]; then
+    ASAN_OPTIONS="detect_leaks=0"
+fi
+
+CONTAINER_ID="$($CONTAINER_CMD run --privileged -d \
+    --pids-limit=-1 \
+    --env ASAN_OPTIONS=$ASAN_OPTIONS \
+    -v /lib/modules/$(uname -r):/lib/modules/$(uname -r):ro \
+    -v $OVN_PATH:$CONTAINER_WORKSPACE/ovn:Z \
+    -v $OVS_PATH:$CONTAINER_WORKSPACE/ovs:Z \
+    $IMAGE_NAME)"
+trap remove_container EXIT
+
+copy_sources_to_workdir
+
+if [ -n "$jobs" ]; then
+    overwrite_jobs
+fi
+
+if [ -n "$shell" ];then
+    container_shell
+    exit 0
+fi
+
+run_tests
diff --git a/utilities/containers/fedora/Dockerfile 
b/utilities/containers/fedora/Dockerfile
new file mode 100755
index 000000000..be8cd6ff2
--- /dev/null
+++ b/utilities/containers/fedora/Dockerfile
@@ -0,0 +1,62 @@
+FROM quay.io/fedora/fedora:37
+
+# Update distro, install packages and clean any possible leftovers
+RUN dnf -y update \
+    && \
+    dnf -y install \
+        autoconf \
+        automake \
+        checkpolicy \
+        clang \
+        curl \
+        dhcp-server \
+        ethtool \
+        gcc \
+        gcc-c++ \
+        git \
+        glibc-langpack-en \
+        groff \
+        iproute \
+        iproute-tc \
+        iputils \
+        kernel-devel \
+        libcap-ng-devel \
+        libtool \
+        net-tools \
+        nmap-ncat \
+        openssl \
+        openssl-devel \
+        procps-ng \
+        python3-devel \
+        python3-pip \
+        rpmdevtools \
+        rsync \
+        selinux-policy-devel \
+        tcpdump \
+        unbound \
+        unbound-devel \
+        wget \
+        which \
+    && \
+    dnf clean all
+
+# Compile sparse from source
+WORKDIR /workspace/sparse
+
+RUN git clone git://git.kernel.org/pub/scm/devel/sparse/sparse.git \
+    /workspace/sparse \
+    && \
+    make -j4 PREFIX=/usr HAVE_LLVM= HAVE_SQLITE= install
+
+WORKDIR /workspace
+
+COPY py-requirements.txt /tmp/py-requirements.txt
+
+# Update and install pip dependencies
+RUN python3 -m pip install --upgrade pip \
+    && \
+    python3 -m pip install wheel \
+    && \
+    python3 -m pip install -r /tmp/py-requirements.txt
+
+CMD ["/usr/sbin/init"]
diff --git a/utilities/containers/py-requirements.txt 
b/utilities/containers/py-requirements.txt
new file mode 100644
index 000000000..d7bd21e0d
--- /dev/null
+++ b/utilities/containers/py-requirements.txt
@@ -0,0 +1,6 @@
+flake8
+hacking>=3.0
+sphinx
+setuptools
+pyelftools
+pyOpenSSL
-- 
2.39.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to