diff --git a/README.md b/README.md
index 75c72b6c..eeecc24e 100644
--- a/README.md
+++ b/README.md
@@ -120,8 +120,8 @@ For further details, see [the tests documentation](tests/README.md).
## Platform-Distro Compatibility Matrix
-| | Alpine | CentOS | ClearLinux | EulerOS | Fedora |
- |--|--|--|--|--|--|
- | **ARM64** | :heavy_check_mark: | :heavy_check_mark: | | :heavy_check_mark: | :heavy_check_mark: |
- | **PPC64le** | :heavy_check_mark: | :heavy_check_mark: | | | :heavy_check_mark: |
- | **x86_64** | :heavy_check_mark: |:heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |
+| |Alpine |CentOS |ClearLinux |Debian/Ubuntu |EulerOS |Fedora |openSUSE |
+|-- |-- |-- |-- |-- |-- |-- |-- |
+|**ARM64** |:heavy_check_mark:|:heavy_check_mark:| | |:heavy_check_mark:|:heavy_check_mark:| |
+|**PPC64le**|:heavy_check_mark:|:heavy_check_mark:| |:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
+|**x86_64** |:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
diff --git a/rootfs-builder/rootfs.sh b/rootfs-builder/rootfs.sh
index 05e22a96..228cfe1c 100755
--- a/rootfs-builder/rootfs.sh
+++ b/rootfs-builder/rootfs.sh
@@ -84,17 +84,29 @@ check_function_exist()
[ "$(type -t ${function_name})" == "function" ] || die "${function_name} function was not defined"
}
-distro_needs_admin_caps()
+docker_extra_args()
{
- if [ "$1" = "ubuntu" ]
- then
- echo "true"
- elif [ "$1" = "debian" ]
- then
- echo "true"
- else
- echo "false"
- fi
+ local args=""
+
+ case "$1" in
+ ubuntu | debian)
+ # Requred to chroot
+ args+=" --cap-add SYS_CHROOT"
+ # debootstrap needs to create device nodes to properly function
+ args+=" --cap-add MKNOD"
+ ;&
+ suse)
+ # Required to mount inside a container
+ args+=" --cap-add SYS_ADMIN"
+ # When AppArmor is enabled, mounting inside a container is blocked with docker-default profile.
+ # See https://github.com/moby/moby/issues/16429
+ args+=" --security-opt apparmor:unconfined"
+ ;;
+ *)
+ ;;
+ esac
+
+ echo "$args"
}
generate_dockerfile()
@@ -239,17 +251,7 @@ if [ -n "${USE_DOCKER}" ] ; then
docker_run_args+=" --rm"
docker_run_args+=" --runtime runc"
- admin_caps=$(distro_needs_admin_caps "$distro")
- if [ "$admin_caps" = "true" ]; then
- # Required by debootstrap to mount inside a container
- docker_run_args+=" --cap-add SYS_ADMIN"
- # Requred to chroot
- docker_run_args+=" --cap-add SYS_CHROOT"
- # debootstrap needs to create device nodes to properly function
- docker_run_args+=" --cap-add MKNOD"
- # See https://github.com/moby/moby/issues/16429
- docker_run_args+=" --security-opt apparmor:unconfined"
- fi
+ docker_run_args+=" $(docker_extra_args $distro)"
#Make sure we use a compatible runtime to build rootfs
# In case Clear Containers Runtime is installed we dont want to hit issue:
diff --git a/rootfs-builder/suse/Dockerfile.in b/rootfs-builder/suse/Dockerfile.in
new file mode 100644
index 00000000..7aaed2a8
--- /dev/null
+++ b/rootfs-builder/suse/Dockerfile.in
@@ -0,0 +1,18 @@
+#
+# Copyright (c) 2018 SUSE LLC
+#
+# SPDX-License-Identifier: Apache-2.0
+
+#suse: docker image to be used to create a rootfs
+#@OS_VERSION@: Docker image version to build this dockerfile
+from opensuse/leap
+
+# This dockerfile needs to provide all the componets need to build a rootfs
+# Install any package need to create a rootfs (package manager, extra tools)
+
+COPY install-packages.sh config.sh /
+# RUN commands
+RUN chmod +x /install-packages.sh; /install-packages.sh
+
+# This will install the proper golang to build Kata components
+@INSTALL_GO@
diff --git a/rootfs-builder/suse/config.sh b/rootfs-builder/suse/config.sh
new file mode 100644
index 00000000..594fc4d4
--- /dev/null
+++ b/rootfs-builder/suse/config.sh
@@ -0,0 +1,47 @@
+#
+# Copyright (c) 2018 SUSE LLC
+#
+# SPDX-License-Identifier: Apache-2.0
+
+# May also be "Tumbleweed"
+OS_DISTRO="Leap"
+
+# Leave this empty for distro "Tumbleweed"
+OS_VERSION=${OS_VERSION:-15.0}
+
+OS_IDENTIFIER="$OS_DISTRO${OS_VERSION:+:$OS_VERSION}"
+
+# Extra packages to install in the rootfs
+PACKAGES="systemd iptables libudev1"
+
+# http or https
+REPO_TRANSPORT="https"
+
+# Can specify an alternative domain
+REPO_DOMAIN="download.opensuse.org"
+
+# NOTE: you probably dont need to edit things below this
+#
+###############################################################################
+
+SUSE_URL_BASE="${REPO_TRANSPORT}://${REPO_DOMAIN}"
+SUSE_PATH_OSS="/distribution/${OS_DISTRO,,}/$OS_VERSION/repo/oss"
+SUSE_PATH_UPDATE="/update/${OS_DISTRO,,}/$OS_VERSION/oss"
+
+case "$(uname -m)" in
+ x86_64)
+ REPO_URL_PORT=""
+ ;;
+ ppc|ppc64le)
+ REPO_URL_PORT="/ports/ppc"
+ ;;
+ *)
+ REPO_URL_PORT="/ports/$arch"
+ ;;
+esac
+SUSE_FULLURL_OSS="${SUSE_URL_BASE}${REPO_URL_PORT}${SUSE_PATH_OSS}"
+SUSE_FULLURL_UPDATE="${SUSE_URL_BASE}${SUSE_PATH_UPDATE}"
+
+if [ -z "${REPO_URL:-}" ]; then
+ REPO_URL="$SUSE_FULLURL_OSS"
+fi
diff --git a/rootfs-builder/suse/config.xml b/rootfs-builder/suse/config.xml
new file mode 100644
index 00000000..a9214752
--- /dev/null
+++ b/rootfs-builder/suse/config.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ SUSE
+ mvedovati@suse.com
+ openSUSE rootfs for Kata Containers guest vm
+
+
+ 1.0.0
+ zypper
+ en_US
+ us
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/rootfs-builder/suse/install-packages.sh b/rootfs-builder/suse/install-packages.sh
new file mode 100644
index 00000000..8bfa9c05
--- /dev/null
+++ b/rootfs-builder/suse/install-packages.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+#
+# Copyright (c) 2018 SUSE LLC
+#
+# SPDX-License-Identifier: Apache-2.0
+
+set -euo pipefail
+
+source config.sh
+
+removeRepos=(repo-non-oss repo-update-non-oss repo-oss repo-update)
+
+for r in ${removeRepos[@]}; do
+ zypper --non-interactive removerepo $r
+done
+
+zypper --non-interactive addrepo ${SUSE_FULLURL_OSS} osbuilder-oss
+zypper --non-interactive addrepo ${SUSE_FULLURL_UPDATE} osbuilder-update
+
+
+# Workaround for zypper slowdowns observed when running inside
+# a container: see https://github.com/openSUSE/zypper/pull/209
+# The fix is upstream but it will take a while before landing
+# in Leap
+ulimit -n 1024
+zypper --non-interactive refresh
+zypper --non-interactive install --no-recommends --force-resolution curl git gcc make python3-kiwi tar
+zypper --non-interactive clean --all
+
diff --git a/rootfs-builder/suse/rootfs_lib.sh b/rootfs-builder/suse/rootfs_lib.sh
new file mode 100644
index 00000000..216f90a2
--- /dev/null
+++ b/rootfs-builder/suse/rootfs_lib.sh
@@ -0,0 +1,76 @@
+#
+# Copyright (c) 2018 SUSE LLC
+#
+# SPDX-License-Identifier: Apache-2.0
+
+# - Arguments
+# rootfs_dir=$1
+#
+# - Optional environment variables
+#
+# EXTRA_PKGS: Variable to add extra PKGS provided by the user
+#
+# BIN_AGENT: Name of the Kata-Agent binary
+#
+# REPO_URL: URL to distribution repository ( should be configured in
+# config.sh file)
+#
+# Any other configuration variable for a specific distro must be added
+# and documented on its own config.sh
+#
+# - Expected result
+#
+# rootfs_dir populated with rootfs pkgs
+# It must provide a binary in /sbin/init
+#
+# Note: For some distros, the build_rootfs() function provided in scripts/lib.sh
+# will suffice. If a new distro is introduced with a special requirement,
+# then, a rootfs_builder//rootfs_lib.sh file should be created
+# using this template.
+
+build_rootfs() {
+ # Mandatory
+ local ROOTFS_DIR=$1
+
+ #Name of the Kata-Agent binary
+ local BIN_AGENT=${BIN_AGENT}
+
+ # In case of support EXTRA packages, use it to allow
+ # users add more packages to the base rootfs
+ local EXTRA_PKGS=${EXTRA_PKGS:-}
+
+ #PATH where files this script is placed
+ #Use it to refer to files in the same directory
+ #Exmaple: ${CONFIG_DIR}/foo
+ local CONFIG_DIR=${CONFIG_DIR}
+
+ # Populate ROOTFS_DIR
+ # Must provide /sbin/init and /bin/${BIN_AGENT}
+ if [ -e "$ROOTFS_DIR" ] && ! [ -z "$(ls -A $ROOTFS_DIR)" ]; then
+ echo "ERROR: $ROOTFS_DIR is not empty"
+ exit 1
+ fi
+
+ local addPackages=""
+ for p in $PACKAGES $EXTRA_PKGS; do
+ addPackages+=" --add-package=$p"
+ done
+
+ # set-repo format: