From 7c66cb5e8469f6fd12dc24832c2df2991acd06b4 Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Tue, 30 Apr 2024 09:52:49 +0200 Subject: [PATCH 01/14] Fix conditional statement in use deployment.yaml Signed-off-by: Steffen Exler --- charts/exivity/templates/use/deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/exivity/templates/use/deployment.yaml b/charts/exivity/templates/use/deployment.yaml index 56f1351..7e52eb5 100644 --- a/charts/exivity/templates/use/deployment.yaml +++ b/charts/exivity/templates/use/deployment.yaml @@ -87,7 +87,7 @@ spec: mountPath: /exivity/home/log/use - name: log mountPath: /exivity/home/log/merlin - {{- if gt (len .Values.service.use.caCertificates) 0 }} + {{- if gt (len (default "" .Values.service.use.caCertificates)) 0 }} - name: cert-volume mountPath: /etc/ssl/certs {{- end }} From 678e6880083016a0cde61976dc918071194aa161 Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Tue, 30 Apr 2024 09:19:20 +0000 Subject: [PATCH 02/14] Add .github/dependabot.yml and Makefile, remove .devcontainer/copy-kube-config.sh and .devcontainer/Dockerfile Signed-off-by: Steffen Exler --- .devcontainer/Dockerfile | 39 -- .devcontainer/copy-kube-config.sh | 31 -- .devcontainer/devcontainer.json | 76 ++- .../library-scripts/common-debian.sh | 454 ------------------ .../library-scripts/docker-debian.sh | 309 ------------ .../library-scripts/kubectl-helm-debian.sh | 249 ---------- .github/dependabot.yml | 12 + Makefile | 42 ++ 8 files changed, 88 insertions(+), 1124 deletions(-) delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/copy-kube-config.sh delete mode 100644 .devcontainer/library-scripts/common-debian.sh delete mode 100644 .devcontainer/library-scripts/docker-debian.sh delete mode 100644 .devcontainer/library-scripts/kubectl-helm-debian.sh create mode 100644 .github/dependabot.yml create mode 100644 Makefile diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index ddba490..0000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -# Note: You can use any Debian/Ubuntu based image you want. -FROM mcr.microsoft.com/vscode/devcontainers/base:0-bullseye - -# Enable new "BUILDKIT" mode for Docker CLI -ENV DOCKER_BUILDKIT=1 - -# Options -ARG INSTALL_ZSH="true" -ARG UPGRADE_PACKAGES="false" -ARG USE_MOBY="true" -ARG USERNAME=vscode -ARG USER_UID=1000 -ARG USER_GID=$USER_UID - -# Install needed packages and setup non-root user. Use a separate RUN statement to add your own dependencies. -COPY library-scripts/*.sh /tmp/library-scripts/ -RUN apt-get update && /bin/bash /tmp/library-scripts/common-debian.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" "true" "true" \ - && /bin/bash /tmp/library-scripts/docker-debian.sh "true" "/var/run/docker-host.sock" "/var/run/docker.sock" "${USERNAME}" "${USE_MOBY}" \ - && /bin/bash /tmp/library-scripts/kubectl-helm-debian.sh "latest" "latest" "none" \ - && apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts/ - -# Script copies localhost's ~/.kube/config file into the container and swaps out -# localhost for host.docker.internal on bash/zsh start to keep them in sync. -COPY copy-kube-config.sh /usr/local/share/ -RUN chown ${USERNAME}:root /usr/local/share/copy-kube-config.sh \ - && echo "source /usr/local/share/copy-kube-config.sh" | tee -a /root/.bashrc /root/.zshrc /home/${USERNAME}/.bashrc >> /home/${USERNAME}/.zshrc - -# Setting the ENTRYPOINT to docker-init.sh will configure non-root access to -# the Docker socket if "overrideCommand": false is set in devcontainer.json. -# The script will also execute CMD if you need to alter startup behaviors. -ENTRYPOINT [ "/usr/local/share/docker-init.sh" ] -CMD [ "sleep", "infinity" ] - -# Install additional OS packages. -RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends vim - -# Install k9s -RUN su -c "curl -sS https://webinstall.dev/k9s | bash" vscode \ No newline at end of file diff --git a/.devcontainer/copy-kube-config.sh b/.devcontainer/copy-kube-config.sh deleted file mode 100644 index 2d77a33..0000000 --- a/.devcontainer/copy-kube-config.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -i - -# Copies localhost's ~/.kube/config file into the container and swap out localhost -# for host.docker.internal whenever a new shell starts to keep them in sync. -if [ "$SYNC_LOCALHOST_KUBECONFIG" = "true" ] && [ -d "/usr/local/share/kube-localhost" ]; then - mkdir -p $HOME/.kube - sudo cp -r /usr/local/share/kube-localhost/* $HOME/.kube - sudo chown -R $(id -u) $HOME/.kube - sed -i -e "s/localhost/host.docker.internal/g" $HOME/.kube/config - sed -i -e "s/127.0.0.1/host.docker.internal/g" $HOME/.kube/config - - # If .minikube was mounted, set up client cert/key - if [ -d "/usr/local/share/minikube-localhost" ]; then - mkdir -p $HOME/.minikube - sudo cp -r /usr/local/share/minikube-localhost/ca.crt $HOME/.minikube - # Location varies between versions of minikube - if [ -f "/usr/local/share/minikube-localhost/client.crt" ]; then - sudo cp -r /usr/local/share/minikube-localhost/client.crt $HOME/.minikube - sudo cp -r /usr/local/share/minikube-localhost/client.key $HOME/.minikube - elif [ -f "/usr/local/share/minikube-localhost/profiles/minikube/client.crt" ]; then - sudo cp -r /usr/local/share/minikube-localhost/profiles/minikube/client.crt $HOME/.minikube - sudo cp -r /usr/local/share/minikube-localhost/profiles/minikube/client.key $HOME/.minikube - fi - sudo chown -R $(id -u) $HOME/.minikube - - # Point .kube/config to the correct locaiton of the certs - sed -i -r "s|(\s*certificate-authority:\s).*|\\1$HOME\/.minikube\/ca.crt|g" $HOME/.kube/config - sed -i -r "s|(\s*client-certificate:\s).*|\\1$HOME\/.minikube\/client.crt|g" $HOME/.kube/config - sed -i -r "s|(\s*client-key:\s).*|\\1$HOME\/.minikube\/client.key|g" $HOME/.kube/config - fi -fi \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 6bba2e6..16bfc4a 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,44 +1,36 @@ -// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: -// https://github.com/microsoft/vscode-dev-containers/tree/v0.231.4/containers/kubernetes-helm +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/kubernetes-helm-minikube { - "name": "Kubernetes - Local Configuration", - "dockerFile": "Dockerfile", - "overrideCommand": false, - - "remoteEnv": { - "SYNC_LOCALHOST_KUBECONFIG": "true" - }, - - "mounts": [ - "source=/var/run/docker.sock,target=/var/run/docker-host.sock,type=bind", - "source=${env:HOME}${env:USERPROFILE}/.kube,target=/usr/local/share/kube-localhost,type=bind" - // Uncomment the next line to also sync certs in your .minikube folder - // "source=${env:HOME}${env:USERPROFILE}/.minikube,target=/usr/local/share/minikube-localhost,type=bind" - ], - - // Set *default* container specific settings.json values on container create. - "settings": {}, - - // Add the IDs of extensions you want installed when the container is created. - "extensions": [ - "ms-azuretools.vscode-docker", - "ms-kubernetes-tools.vscode-kubernetes-tools", - "esbenp.prettier-vscode" - ], - - // Use 'forwardPorts' to make a list of ports inside the container available locally. - "forwardPorts": [], - - // Use 'postCreateCommand' to run commands after the container is created. - // "postCreateCommand": "kubectl version", - - // Uncomment when using a ptrace-based debugger like C++, Go, and Rust. - // "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], - - // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. - "remoteUser": "vscode", - - "features": { - "node": "lts" - } + "name": "Kubernetes - Minikube-in-Docker", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/base:bullseye", + + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {}, + "ghcr.io/devcontainers/features/kubectl-helm-minikube:1": {}, + "ghcr.io/rio/features/k9s:1": {} + }, + "customizations": { + "vscode": { + "extensions": [ + "ms-vscode.makefile-tools", + "ms-kubernetes-tools.vscode-kubernetes-tools" + ] + } + } + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "kubectl version", + + // Use 'postStartCommand' to run commands after the container is created like starting minikube. + // "postStartCommand": "nohup bash -c 'minikube start &' > minikube.log 2>&1", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" } diff --git a/.devcontainer/library-scripts/common-debian.sh b/.devcontainer/library-scripts/common-debian.sh deleted file mode 100644 index af4facc..0000000 --- a/.devcontainer/library-scripts/common-debian.sh +++ /dev/null @@ -1,454 +0,0 @@ -#!/usr/bin/env bash -#------------------------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. -#------------------------------------------------------------------------------------------------------------- -# -# Docs: https://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/common.md -# Maintainer: The VS Code and Codespaces Teams -# -# Syntax: ./common-debian.sh [install zsh flag] [username] [user UID] [user GID] [upgrade packages flag] [install Oh My Zsh! flag] [Add non-free packages] - -set -e - -INSTALL_ZSH=${1:-"true"} -USERNAME=${2:-"automatic"} -USER_UID=${3:-"automatic"} -USER_GID=${4:-"automatic"} -UPGRADE_PACKAGES=${5:-"true"} -INSTALL_OH_MYS=${6:-"true"} -ADD_NON_FREE_PACKAGES=${7:-"false"} -SCRIPT_DIR="$(cd $(dirname "${BASH_SOURCE[0]}") && pwd)" -MARKER_FILE="/usr/local/etc/vscode-dev-containers/common" - -if [ "$(id -u)" -ne 0 ]; then - echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.' - exit 1 -fi - -# Ensure that login shells get the correct path if the user updated the PATH using ENV. -rm -f /etc/profile.d/00-restore-env.sh -echo "export PATH=${PATH//$(sh -lc 'echo $PATH')/\$PATH}" > /etc/profile.d/00-restore-env.sh -chmod +x /etc/profile.d/00-restore-env.sh - -# If in automatic mode, determine if a user already exists, if not use vscode -if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then - USERNAME="" - POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)") - for CURRENT_USER in ${POSSIBLE_USERS[@]}; do - if id -u ${CURRENT_USER} > /dev/null 2>&1; then - USERNAME=${CURRENT_USER} - break - fi - done - if [ "${USERNAME}" = "" ]; then - USERNAME=vscode - fi -elif [ "${USERNAME}" = "none" ]; then - USERNAME=root - USER_UID=0 - USER_GID=0 -fi - -# Load markers to see which steps have already run -if [ -f "${MARKER_FILE}" ]; then - echo "Marker file found:" - cat "${MARKER_FILE}" - source "${MARKER_FILE}" -fi - -# Ensure apt is in non-interactive to avoid prompts -export DEBIAN_FRONTEND=noninteractive - -# Function to call apt-get if needed -apt_get_update_if_needed() -{ - if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then - echo "Running apt-get update..." - apt-get update - else - echo "Skipping apt-get update." - fi -} - -# Run install apt-utils to avoid debconf warning then verify presence of other common developer tools and dependencies -if [ "${PACKAGES_ALREADY_INSTALLED}" != "true" ]; then - - package_list="apt-utils \ - openssh-client \ - gnupg2 \ - dirmngr \ - iproute2 \ - procps \ - lsof \ - htop \ - net-tools \ - psmisc \ - curl \ - wget \ - rsync \ - ca-certificates \ - unzip \ - zip \ - nano \ - vim-tiny \ - less \ - jq \ - lsb-release \ - apt-transport-https \ - dialog \ - libc6 \ - libgcc1 \ - libkrb5-3 \ - libgssapi-krb5-2 \ - libicu[0-9][0-9] \ - liblttng-ust0 \ - libstdc++6 \ - zlib1g \ - locales \ - sudo \ - ncdu \ - man-db \ - strace \ - manpages \ - manpages-dev \ - init-system-helpers" - - # Needed for adding manpages-posix and manpages-posix-dev which are non-free packages in Debian - if [ "${ADD_NON_FREE_PACKAGES}" = "true" ]; then - # Bring in variables from /etc/os-release like VERSION_CODENAME - . /etc/os-release - sed -i -E "s/deb http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME} main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME} main contrib non-free/" /etc/apt/sources.list - sed -i -E "s/deb-src http:\/\/(deb|httredir)\.debian\.org\/debian ${VERSION_CODENAME} main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME} main contrib non-free/" /etc/apt/sources.list - sed -i -E "s/deb http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME}-updates main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME}-updates main contrib non-free/" /etc/apt/sources.list - sed -i -E "s/deb-src http:\/\/(deb|httpredir)\.debian\.org\/debian ${VERSION_CODENAME}-updates main/deb http:\/\/\1\.debian\.org\/debian ${VERSION_CODENAME}-updates main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb-src http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}\/updates main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb-src http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main/deb http:\/\/deb\.debian\.org\/debian ${VERSION_CODENAME}-backports main contrib non-free/" /etc/apt/sources.list - # Handle bullseye location for security https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information.en.html - sed -i "s/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main contrib non-free/" /etc/apt/sources.list - sed -i "s/deb-src http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main/deb http:\/\/security\.debian\.org\/debian-security ${VERSION_CODENAME}-security main contrib non-free/" /etc/apt/sources.list - echo "Running apt-get update..." - apt-get update - package_list="${package_list} manpages-posix manpages-posix-dev" - else - apt_get_update_if_needed - fi - - # Install libssl1.1 if available - if [[ ! -z $(apt-cache --names-only search ^libssl1.1$) ]]; then - package_list="${package_list} libssl1.1" - fi - - # Install appropriate version of libssl1.0.x if available - libssl_package=$(dpkg-query -f '${db:Status-Abbrev}\t${binary:Package}\n' -W 'libssl1\.0\.?' 2>&1 || echo '') - if [ "$(echo "$LIlibssl_packageBSSL" | grep -o 'libssl1\.0\.[0-9]:' | uniq | sort | wc -l)" -eq 0 ]; then - if [[ ! -z $(apt-cache --names-only search ^libssl1.0.2$) ]]; then - # Debian 9 - package_list="${package_list} libssl1.0.2" - elif [[ ! -z $(apt-cache --names-only search ^libssl1.0.0$) ]]; then - # Ubuntu 18.04, 16.04, earlier - package_list="${package_list} libssl1.0.0" - fi - fi - - echo "Packages to verify are installed: ${package_list}" - apt-get -y install --no-install-recommends ${package_list} 2> >( grep -v 'debconf: delaying package configuration, since apt-utils is not installed' >&2 ) - - # Install git if not already installed (may be more recent than distro version) - if ! type git > /dev/null 2>&1; then - apt-get -y install --no-install-recommends git - fi - - PACKAGES_ALREADY_INSTALLED="true" -fi - -# Get to latest versions of all packages -if [ "${UPGRADE_PACKAGES}" = "true" ]; then - apt_get_update_if_needed - apt-get -y upgrade --no-install-recommends - apt-get autoremove -y -fi - -# Ensure at least the en_US.UTF-8 UTF-8 locale is available. -# Common need for both applications and things like the agnoster ZSH theme. -if [ "${LOCALE_ALREADY_SET}" != "true" ] && ! grep -o -E '^\s*en_US.UTF-8\s+UTF-8' /etc/locale.gen > /dev/null; then - echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen - locale-gen - LOCALE_ALREADY_SET="true" -fi - -# Create or update a non-root user to match UID/GID. -group_name="${USERNAME}" -if id -u ${USERNAME} > /dev/null 2>&1; then - # User exists, update if needed - if [ "${USER_GID}" != "automatic" ] && [ "$USER_GID" != "$(id -g $USERNAME)" ]; then - group_name="$(id -gn $USERNAME)" - groupmod --gid $USER_GID ${group_name} - usermod --gid $USER_GID $USERNAME - fi - if [ "${USER_UID}" != "automatic" ] && [ "$USER_UID" != "$(id -u $USERNAME)" ]; then - usermod --uid $USER_UID $USERNAME - fi -else - # Create user - if [ "${USER_GID}" = "automatic" ]; then - groupadd $USERNAME - else - groupadd --gid $USER_GID $USERNAME - fi - if [ "${USER_UID}" = "automatic" ]; then - useradd -s /bin/bash --gid $USERNAME -m $USERNAME - else - useradd -s /bin/bash --uid $USER_UID --gid $USERNAME -m $USERNAME - fi -fi - -# Add add sudo support for non-root user -if [ "${USERNAME}" != "root" ] && [ "${EXISTING_NON_ROOT_USER}" != "${USERNAME}" ]; then - echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME - chmod 0440 /etc/sudoers.d/$USERNAME - EXISTING_NON_ROOT_USER="${USERNAME}" -fi - -# ** Shell customization section ** -if [ "${USERNAME}" = "root" ]; then - user_rc_path="/root" -else - user_rc_path="/home/${USERNAME}" -fi - -# Restore user .bashrc defaults from skeleton file if it doesn't exist or is empty -if [ ! -f "${user_rc_path}/.bashrc" ] || [ ! -s "${user_rc_path}/.bashrc" ] ; then - cp /etc/skel/.bashrc "${user_rc_path}/.bashrc" -fi - -# Restore user .profile defaults from skeleton file if it doesn't exist or is empty -if [ ! -f "${user_rc_path}/.profile" ] || [ ! -s "${user_rc_path}/.profile" ] ; then - cp /etc/skel/.profile "${user_rc_path}/.profile" -fi - -# .bashrc/.zshrc snippet -rc_snippet="$(cat << 'EOF' - -if [ -z "${USER}" ]; then export USER=$(whoami); fi -if [[ "${PATH}" != *"$HOME/.local/bin"* ]]; then export PATH="${PATH}:$HOME/.local/bin"; fi - -# Display optional first run image specific notice if configured and terminal is interactive -if [ -t 1 ] && [[ "${TERM_PROGRAM}" = "vscode" || "${TERM_PROGRAM}" = "codespaces" ]] && [ ! -f "$HOME/.config/vscode-dev-containers/first-run-notice-already-displayed" ]; then - if [ -f "/usr/local/etc/vscode-dev-containers/first-run-notice.txt" ]; then - cat "/usr/local/etc/vscode-dev-containers/first-run-notice.txt" - elif [ -f "/workspaces/.codespaces/shared/first-run-notice.txt" ]; then - cat "/workspaces/.codespaces/shared/first-run-notice.txt" - fi - mkdir -p "$HOME/.config/vscode-dev-containers" - # Mark first run notice as displayed after 10s to avoid problems with fast terminal refreshes hiding it - ((sleep 10s; touch "$HOME/.config/vscode-dev-containers/first-run-notice-already-displayed") &) -fi - -# Set the default git editor if not already set -if [ -z "$(git config --get core.editor)" ] && [ -z "${GIT_EDITOR}" ]; then - if [ "${TERM_PROGRAM}" = "vscode" ]; then - if [[ -n $(command -v code-insiders) && -z $(command -v code) ]]; then - export GIT_EDITOR="code-insiders --wait" - else - export GIT_EDITOR="code --wait" - fi - fi -fi - -EOF -)" - -# code shim, it fallbacks to code-insiders if code is not available -cat << 'EOF' > /usr/local/bin/code -#!/bin/sh - -get_in_path_except_current() { - which -a "$1" | grep -A1 "$0" | grep -v "$0" -} - -code="$(get_in_path_except_current code)" - -if [ -n "$code" ]; then - exec "$code" "$@" -elif [ "$(command -v code-insiders)" ]; then - exec code-insiders "$@" -else - echo "code or code-insiders is not installed" >&2 - exit 127 -fi -EOF -chmod +x /usr/local/bin/code - -# systemctl shim - tells people to use 'service' if systemd is not running -cat << 'EOF' > /usr/local/bin/systemctl -#!/bin/sh -set -e -if [ -d "/run/systemd/system" ]; then - exec /bin/systemctl/systemctl "$@" -else - echo '\n"systemd" is not running in this container due to its overhead.\nUse the "service" command to start services instead. e.g.: \n\nservice --status-all' -fi -EOF -chmod +x /usr/local/bin/systemctl - -# Codespaces bash and OMZ themes - partly inspired by https://github.com/ohmyzsh/ohmyzsh/blob/master/themes/robbyrussell.zsh-theme -codespaces_bash="$(cat \ -<<'EOF' - -# Codespaces bash prompt theme -__bash_prompt() { - local userpart='`export XIT=$? \ - && [ ! -z "${GITHUB_USER}" ] && echo -n "\[\033[0;32m\]@${GITHUB_USER} " || echo -n "\[\033[0;32m\]\u " \ - && [ "$XIT" -ne "0" ] && echo -n "\[\033[1;31m\]➜" || echo -n "\[\033[0m\]➜"`' - local gitbranch='`\ - if [ "$(git config --get codespaces-theme.hide-status 2>/dev/null)" != 1 ]; then \ - export BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null); \ - if [ "${BRANCH}" != "" ]; then \ - echo -n "\[\033[0;36m\](\[\033[1;31m\]${BRANCH}" \ - && if git ls-files --error-unmatch -m --directory --no-empty-directory -o --exclude-standard ":/*" > /dev/null 2>&1; then \ - echo -n " \[\033[1;33m\]✗"; \ - fi \ - && echo -n "\[\033[0;36m\]) "; \ - fi; \ - fi`' - local lightblue='\[\033[1;34m\]' - local removecolor='\[\033[0m\]' - PS1="${userpart} ${lightblue}\w ${gitbranch}${removecolor}\$ " - unset -f __bash_prompt -} -__bash_prompt - -EOF -)" - -codespaces_zsh="$(cat \ -<<'EOF' -# Codespaces zsh prompt theme -__zsh_prompt() { - local prompt_username - if [ ! -z "${GITHUB_USER}" ]; then - prompt_username="@${GITHUB_USER}" - else - prompt_username="%n" - fi - PROMPT="%{$fg[green]%}${prompt_username} %(?:%{$reset_color%}➜ :%{$fg_bold[red]%}➜ )" # User/exit code arrow - PROMPT+='%{$fg_bold[blue]%}%(5~|%-1~/…/%3~|%4~)%{$reset_color%} ' # cwd - PROMPT+='$([ "$(git config --get codespaces-theme.hide-status 2>/dev/null)" != 1 ] && git_prompt_info)' # Git status - PROMPT+='%{$fg[white]%}$ %{$reset_color%}' - unset -f __zsh_prompt -} -ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[cyan]%}(%{$fg_bold[red]%}" -ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} " -ZSH_THEME_GIT_PROMPT_DIRTY=" %{$fg_bold[yellow]%}✗%{$fg_bold[cyan]%})" -ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg_bold[cyan]%})" -__zsh_prompt - -EOF -)" - -# Add RC snippet and custom bash prompt -if [ "${RC_SNIPPET_ALREADY_ADDED}" != "true" ]; then - echo "${rc_snippet}" >> /etc/bash.bashrc - echo "${codespaces_bash}" >> "${user_rc_path}/.bashrc" - echo 'export PROMPT_DIRTRIM=4' >> "${user_rc_path}/.bashrc" - if [ "${USERNAME}" != "root" ]; then - echo "${codespaces_bash}" >> "/root/.bashrc" - echo 'export PROMPT_DIRTRIM=4' >> "/root/.bashrc" - fi - chown ${USERNAME}:${group_name} "${user_rc_path}/.bashrc" - RC_SNIPPET_ALREADY_ADDED="true" -fi - -# Optionally install and configure zsh and Oh My Zsh! -if [ "${INSTALL_ZSH}" = "true" ]; then - if ! type zsh > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get install -y zsh - fi - if [ "${ZSH_ALREADY_INSTALLED}" != "true" ]; then - echo "${rc_snippet}" >> /etc/zsh/zshrc - ZSH_ALREADY_INSTALLED="true" - fi - - # Adapted, simplified inline Oh My Zsh! install steps that adds, defaults to a codespaces theme. - # See https://github.com/ohmyzsh/ohmyzsh/blob/master/tools/install.sh for official script. - oh_my_install_dir="${user_rc_path}/.oh-my-zsh" - if [ ! -d "${oh_my_install_dir}" ] && [ "${INSTALL_OH_MYS}" = "true" ]; then - template_path="${oh_my_install_dir}/templates/zshrc.zsh-template" - user_rc_file="${user_rc_path}/.zshrc" - umask g-w,o-w - mkdir -p ${oh_my_install_dir} - git clone --depth=1 \ - -c core.eol=lf \ - -c core.autocrlf=false \ - -c fsck.zeroPaddedFilemode=ignore \ - -c fetch.fsck.zeroPaddedFilemode=ignore \ - -c receive.fsck.zeroPaddedFilemode=ignore \ - "https://github.com/ohmyzsh/ohmyzsh" "${oh_my_install_dir}" 2>&1 - echo -e "$(cat "${template_path}")\nDISABLE_AUTO_UPDATE=true\nDISABLE_UPDATE_PROMPT=true" > ${user_rc_file} - sed -i -e 's/ZSH_THEME=.*/ZSH_THEME="codespaces"/g' ${user_rc_file} - - mkdir -p ${oh_my_install_dir}/custom/themes - echo "${codespaces_zsh}" > "${oh_my_install_dir}/custom/themes/codespaces.zsh-theme" - # Shrink git while still enabling updates - cd "${oh_my_install_dir}" - git repack -a -d -f --depth=1 --window=1 - # Copy to non-root user if one is specified - if [ "${USERNAME}" != "root" ]; then - cp -rf "${user_rc_file}" "${oh_my_install_dir}" /root - chown -R ${USERNAME}:${group_name} "${user_rc_path}" - fi - fi -fi - -# Persist image metadata info, script if meta.env found in same directory -meta_info_script="$(cat << 'EOF' -#!/bin/sh -. /usr/local/etc/vscode-dev-containers/meta.env - -# Minimal output -if [ "$1" = "version" ] || [ "$1" = "image-version" ]; then - echo "${VERSION}" - exit 0 -elif [ "$1" = "release" ]; then - echo "${GIT_REPOSITORY_RELEASE}" - exit 0 -elif [ "$1" = "content" ] || [ "$1" = "content-url" ] || [ "$1" = "contents" ] || [ "$1" = "contents-url" ]; then - echo "${CONTENTS_URL}" - exit 0 -fi - -#Full output -echo -echo "Development container image information" -echo -if [ ! -z "${VERSION}" ]; then echo "- Image version: ${VERSION}"; fi -if [ ! -z "${DEFINITION_ID}" ]; then echo "- Definition ID: ${DEFINITION_ID}"; fi -if [ ! -z "${VARIANT}" ]; then echo "- Variant: ${VARIANT}"; fi -if [ ! -z "${GIT_REPOSITORY}" ]; then echo "- Source code repository: ${GIT_REPOSITORY}"; fi -if [ ! -z "${GIT_REPOSITORY_RELEASE}" ]; then echo "- Source code release/branch: ${GIT_REPOSITORY_RELEASE}"; fi -if [ ! -z "${BUILD_TIMESTAMP}" ]; then echo "- Timestamp: ${BUILD_TIMESTAMP}"; fi -if [ ! -z "${CONTENTS_URL}" ]; then echo && echo "More info: ${CONTENTS_URL}"; fi -echo -EOF -)" -if [ -f "${SCRIPT_DIR}/meta.env" ]; then - mkdir -p /usr/local/etc/vscode-dev-containers/ - cp -f "${SCRIPT_DIR}/meta.env" /usr/local/etc/vscode-dev-containers/meta.env - echo "${meta_info_script}" > /usr/local/bin/devcontainer-info - chmod +x /usr/local/bin/devcontainer-info -fi - -# Write marker file -mkdir -p "$(dirname "${MARKER_FILE}")" -echo -e "\ - PACKAGES_ALREADY_INSTALLED=${PACKAGES_ALREADY_INSTALLED}\n\ - LOCALE_ALREADY_SET=${LOCALE_ALREADY_SET}\n\ - EXISTING_NON_ROOT_USER=${EXISTING_NON_ROOT_USER}\n\ - RC_SNIPPET_ALREADY_ADDED=${RC_SNIPPET_ALREADY_ADDED}\n\ - ZSH_ALREADY_INSTALLED=${ZSH_ALREADY_INSTALLED}" > "${MARKER_FILE}" - -echo "Done!" diff --git a/.devcontainer/library-scripts/docker-debian.sh b/.devcontainer/library-scripts/docker-debian.sh deleted file mode 100644 index 3bce478..0000000 --- a/.devcontainer/library-scripts/docker-debian.sh +++ /dev/null @@ -1,309 +0,0 @@ -#!/usr/bin/env bash -#------------------------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. -#------------------------------------------------------------------------------------------------------------- -# -# Docs: https://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/docker.md -# Maintainer: The VS Code and Codespaces Teams -# -# Syntax: ./docker-debian.sh [enable non-root docker socket access flag] [source socket] [target socket] [non-root user] [use moby] [CLI version] - -ENABLE_NONROOT_DOCKER=${1:-"true"} -SOURCE_SOCKET=${2:-"/var/run/docker-host.sock"} -TARGET_SOCKET=${3:-"/var/run/docker.sock"} -USERNAME=${4:-"automatic"} -USE_MOBY=${5:-"true"} -DOCKER_VERSION=${6:-"latest"} -MICROSOFT_GPG_KEYS_URI="https://packages.microsoft.com/keys/microsoft.asc" -DOCKER_DASH_COMPOSE_VERSION="1" - -set -e - -if [ "$(id -u)" -ne 0 ]; then - echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.' - exit 1 -fi - -# Determine the appropriate non-root user -if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then - USERNAME="" - POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)") - for CURRENT_USER in ${POSSIBLE_USERS[@]}; do - if id -u ${CURRENT_USER} > /dev/null 2>&1; then - USERNAME=${CURRENT_USER} - break - fi - done - if [ "${USERNAME}" = "" ]; then - USERNAME=root - fi -elif [ "${USERNAME}" = "none" ] || ! id -u ${USERNAME} > /dev/null 2>&1; then - USERNAME=root -fi - -# Get central common setting -get_common_setting() { - if [ "${common_settings_file_loaded}" != "true" ]; then - curl -sfL "https://aka.ms/vscode-dev-containers/script-library/settings.env" 2>/dev/null -o /tmp/vsdc-settings.env || echo "Could not download settings file. Skipping." - common_settings_file_loaded=true - fi - if [ -f "/tmp/vsdc-settings.env" ]; then - local multi_line="" - if [ "$2" = "true" ]; then multi_line="-z"; fi - local result="$(grep ${multi_line} -oP "$1=\"?\K[^\"]+" /tmp/vsdc-settings.env | tr -d '\0')" - if [ ! -z "${result}" ]; then declare -g $1="${result}"; fi - fi - echo "$1=${!1}" -} - -# Function to run apt-get if needed -apt_get_update_if_needed() -{ - if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then - echo "Running apt-get update..." - apt-get update - else - echo "Skipping apt-get update." - fi -} - -# Checks if packages are installed and installs them if not -check_packages() { - if ! dpkg -s "$@" > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get -y install --no-install-recommends "$@" - fi -} - -# Figure out correct version of a three part version number is not passed -find_version_from_git_tags() { - local variable_name=$1 - local requested_version=${!variable_name} - if [ "${requested_version}" = "none" ]; then return; fi - local repository=$2 - local prefix=${3:-"tags/v"} - local separator=${4:-"."} - local last_part_optional=${5:-"false"} - if [ "$(echo "${requested_version}" | grep -o "." | wc -l)" != "2" ]; then - local escaped_separator=${separator//./\\.} - local last_part - if [ "${last_part_optional}" = "true" ]; then - last_part="(${escaped_separator}[0-9]+)?" - else - last_part="${escaped_separator}[0-9]+" - fi - local regex="${prefix}\\K[0-9]+${escaped_separator}[0-9]+${last_part}$" - local version_list="$(git ls-remote --tags ${repository} | grep -oP "${regex}" | tr -d ' ' | tr "${separator}" "." | sort -rV)" - if [ "${requested_version}" = "latest" ] || [ "${requested_version}" = "current" ] || [ "${requested_version}" = "lts" ]; then - declare -g ${variable_name}="$(echo "${version_list}" | head -n 1)" - else - set +e - declare -g ${variable_name}="$(echo "${version_list}" | grep -E -m 1 "^${requested_version//./\\.}([\\.\\s]|$)")" - set -e - fi - fi - if [ -z "${!variable_name}" ] || ! echo "${version_list}" | grep "^${!variable_name//./\\.}$" > /dev/null 2>&1; then - echo -e "Invalid ${variable_name} value: ${requested_version}\nValid values:\n${version_list}" >&2 - exit 1 - fi - echo "${variable_name}=${!variable_name}" -} - -# Ensure apt is in non-interactive to avoid prompts -export DEBIAN_FRONTEND=noninteractive - -# Install dependencies -check_packages apt-transport-https curl ca-certificates gnupg2 dirmngr -if ! type git > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get -y install git -fi - -# Source /etc/os-release to get OS info -. /etc/os-release -# Fetch host/container arch. -architecture="$(dpkg --print-architecture)" - -# Set up the necessary apt repos (either Microsoft's or Docker's) -if [ "${USE_MOBY}" = "true" ]; then - - cli_package_name="moby-cli" - - # Import key safely and import Microsoft apt repo - get_common_setting MICROSOFT_GPG_KEYS_URI - curl -sSL ${MICROSOFT_GPG_KEYS_URI} | gpg --dearmor > /usr/share/keyrings/microsoft-archive-keyring.gpg - echo "deb [arch=${architecture} signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/repos/microsoft-${ID}-${VERSION_CODENAME}-prod ${VERSION_CODENAME} main" > /etc/apt/sources.list.d/microsoft.list -else - # Name of proprietary engine package - cli_package_name="docker-ce-cli" - - # Import key safely and import Docker apt repo - curl -fsSL https://download.docker.com/linux/${ID}/gpg | gpg --dearmor > /usr/share/keyrings/docker-archive-keyring.gpg - echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/${ID} ${VERSION_CODENAME} stable" > /etc/apt/sources.list.d/docker.list -fi - -# Refresh apt lists -apt-get update - -# Soft version matching for CLI -if [ "${DOCKER_VERSION}" = "latest" ] || [ "${DOCKER_VERSION}" = "lts" ] || [ "${DOCKER_VERSION}" = "stable" ]; then - # Empty, meaning grab whatever "latest" is in apt repo - cli_version_suffix="" -else - # Fetch a valid version from the apt-cache (eg: the Microsoft repo appends +azure, breakfix, etc...) - docker_version_dot_escaped="${DOCKER_VERSION//./\\.}" - docker_version_dot_plus_escaped="${docker_version_dot_escaped//+/\\+}" - # Regex needs to handle debian package version number format: https://www.systutorials.com/docs/linux/man/5-deb-version/ - docker_version_regex="^(.+:)?${docker_version_dot_plus_escaped}([\\.\\+ ~:-]|$)" - set +e # Don't exit if finding version fails - will handle gracefully - cli_version_suffix="=$(apt-cache madison ${cli_package_name} | awk -F"|" '{print $2}' | sed -e 's/^[ \t]*//' | grep -E -m 1 "${docker_version_regex}")" - set -e - if [ -z "${cli_version_suffix}" ] || [ "${cli_version_suffix}" = "=" ]; then - echo "(!) No full or partial Docker / Moby version match found for \"${DOCKER_VERSION}\" on OS ${ID} ${VERSION_CODENAME} (${architecture}). Available versions:" - apt-cache madison ${cli_package_name} | awk -F"|" '{print $2}' | grep -oP '^(.+:)?\K.+' - exit 1 - fi - echo "cli_version_suffix ${cli_version_suffix}" -fi - -# Install Docker / Moby CLI if not already installed -if type docker > /dev/null 2>&1; then - echo "Docker / Moby CLI already installed." -else - if [ "${USE_MOBY}" = "true" ]; then - apt-get -y install --no-install-recommends moby-cli${cli_version_suffix} moby-buildx - apt-get -y install --no-install-recommends moby-compose || echo "(*) Package moby-compose (Docker Compose v2) not available for OS ${ID} ${VERSION_CODENAME} (${architecture}). Skipping." - else - apt-get -y install --no-install-recommends docker-ce-cli${cli_version_suffix} - fi -fi - -# Install Docker Compose if not already installed and is on a supported architecture -if type docker-compose > /dev/null 2>&1; then - echo "Docker Compose already installed." -else - TARGET_COMPOSE_ARCH="$(uname -m)" - if [ "${TARGET_COMPOSE_ARCH}" = "amd64" ]; then - TARGET_COMPOSE_ARCH="x86_64" - fi - if [ "${TARGET_COMPOSE_ARCH}" != "x86_64" ]; then - # Use pip to get a version that runns on this architecture - if ! dpkg -s python3-minimal python3-pip libffi-dev python3-venv > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get -y install python3-minimal python3-pip libffi-dev python3-venv - fi - export PIPX_HOME=/usr/local/pipx - mkdir -p ${PIPX_HOME} - export PIPX_BIN_DIR=/usr/local/bin - export PYTHONUSERBASE=/tmp/pip-tmp - export PIP_CACHE_DIR=/tmp/pip-tmp/cache - pipx_bin=pipx - if ! type pipx > /dev/null 2>&1; then - pip3 install --disable-pip-version-check --no-cache-dir --user pipx - pipx_bin=/tmp/pip-tmp/bin/pipx - fi - ${pipx_bin} install --pip-args '--no-cache-dir --force-reinstall' docker-compose - rm -rf /tmp/pip-tmp - else - find_version_from_git_tags DOCKER_DASH_COMPOSE_VERSION "https://github.com/docker/compose" "tags/" - echo "(*) Installing docker-compose ${DOCKER_DASH_COMPOSE_VERSION}..." - curl -fsSL "https://github.com/docker/compose/releases/download/${DOCKER_DASH_COMPOSE_VERSION}/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose - chmod +x /usr/local/bin/docker-compose - fi -fi - -# If init file already exists, exit -if [ -f "/usr/local/share/docker-init.sh" ]; then - exit 0 -fi -echo "docker-init doesnt exist, adding..." - -# By default, make the source and target sockets the same -if [ "${SOURCE_SOCKET}" != "${TARGET_SOCKET}" ]; then - touch "${SOURCE_SOCKET}" - ln -s "${SOURCE_SOCKET}" "${TARGET_SOCKET}" -fi - -# Add a stub if not adding non-root user access, user is root -if [ "${ENABLE_NONROOT_DOCKER}" = "false" ] || [ "${USERNAME}" = "root" ]; then - echo -e '#!/usr/bin/env bash\nexec "$@"' > /usr/local/share/docker-init.sh - chmod +x /usr/local/share/docker-init.sh - exit 0 -fi - -# Setup a docker group in the event the docker socket's group is not root -if ! grep -qE '^docker:' /etc/group; then - groupadd --system docker -fi -usermod -aG docker "${USERNAME}" -DOCKER_GID="$(grep -oP '^docker:x:\K[^:]+' /etc/group)" - -# If enabling non-root access and specified user is found, setup socat and add script -chown -h "${USERNAME}":root "${TARGET_SOCKET}" -if ! dpkg -s socat > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get -y install socat -fi -tee /usr/local/share/docker-init.sh > /dev/null \ -<< EOF -#!/usr/bin/env bash -#------------------------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. -#------------------------------------------------------------------------------------------------------------- - -set -e - -SOCAT_PATH_BASE=/tmp/vscr-docker-from-docker -SOCAT_LOG=\${SOCAT_PATH_BASE}.log -SOCAT_PID=\${SOCAT_PATH_BASE}.pid - -# Wrapper function to only use sudo if not already root -sudoIf() -{ - if [ "\$(id -u)" -ne 0 ]; then - sudo "\$@" - else - "\$@" - fi -} - -# Log messages -log() -{ - echo -e "[\$(date)] \$@" | sudoIf tee -a \${SOCAT_LOG} > /dev/null -} - -echo -e "\n** \$(date) **" | sudoIf tee -a \${SOCAT_LOG} > /dev/null -log "Ensuring ${USERNAME} has access to ${SOURCE_SOCKET} via ${TARGET_SOCKET}" - -# If install, try to update the docker group with the right GID. If the group is root, -# fall back on using socat to forward the docker socket to another unix socket so -# that we can set permissions on it without affecting the host. -if [ "${ENABLE_NONROOT_DOCKER}" = "true" ] && [ "${SOURCE_SOCKET}" != "${TARGET_SOCKET}" ] && [ "${USERNAME}" != "root" ] && [ "${USERNAME}" != "0" ]; then - SOCKET_GID=\$(stat -c '%g' ${SOURCE_SOCKET}) - if [ "\${SOCKET_GID}" != "0" ] && [ "\${SOCKET_GID}" != "${DOCKER_GID}" ] && ! grep -E ".+:x:\${SOCKET_GID}" /etc/group; then - sudoIf groupmod --gid "\${SOCKET_GID}" docker - else - # Enable proxy if not already running - if [ ! -f "\${SOCAT_PID}" ] || ! ps -p \$(cat \${SOCAT_PID}) > /dev/null; then - log "Enabling socket proxy." - log "Proxying ${SOURCE_SOCKET} to ${TARGET_SOCKET} for vscode" - sudoIf rm -rf ${TARGET_SOCKET} - (sudoIf socat UNIX-LISTEN:${TARGET_SOCKET},fork,mode=660,user=${USERNAME} UNIX-CONNECT:${SOURCE_SOCKET} 2>&1 | sudoIf tee -a \${SOCAT_LOG} > /dev/null & echo "\$!" | sudoIf tee \${SOCAT_PID} > /dev/null) - else - log "Socket proxy already running." - fi - fi - log "Success" -fi - -# Execute whatever commands were passed in (if any). This allows us -# to set this script to ENTRYPOINT while still executing the default CMD. -set +e -exec "\$@" -EOF -chmod +x /usr/local/share/docker-init.sh -chown ${USERNAME}:root /usr/local/share/docker-init.sh -echo "Done!" diff --git a/.devcontainer/library-scripts/kubectl-helm-debian.sh b/.devcontainer/library-scripts/kubectl-helm-debian.sh deleted file mode 100644 index 0981024..0000000 --- a/.devcontainer/library-scripts/kubectl-helm-debian.sh +++ /dev/null @@ -1,249 +0,0 @@ -#!/usr/bin/env bash -#------------------------------------------------------------------------------------------------------------- -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. -#------------------------------------------------------------------------------------------------------------- -# -# Docs: https://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/kubectl-helm.md -# Maintainer: The VS Code and Codespaces Teams -# -# Syntax: ./kubectl-helm-debian.sh [kubectl verison] [Helm version] [minikube version] [kubectl SHA256] [Helm SHA256] [minikube SHA256] - -set -e - -KUBECTL_VERSION="${1:-"latest"}" -HELM_VERSION="${2:-"latest"}" -MINIKUBE_VERSION="${3:-"none"}" # latest is also valid -KUBECTL_SHA256="${4:-"automatic"}" -HELM_SHA256="${5:-"automatic"}" -MINIKUBE_SHA256="${6:-"automatic"}" -USERNAME=${7:-"automatic"} - -HELM_GPG_KEYS_URI="https://raw.githubusercontent.com/helm/helm/main/KEYS" -GPG_KEY_SERVERS="keyserver hkp://keyserver.ubuntu.com:80 -keyserver hkps://keys.openpgp.org -keyserver hkp://keyserver.pgp.com" - -if [ "$(id -u)" -ne 0 ]; then - echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.' - exit 1 -fi - -# Determine the appropriate non-root user -if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then - USERNAME="" - POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)") - for CURRENT_USER in ${POSSIBLE_USERS[@]}; do - if id -u ${CURRENT_USER} > /dev/null 2>&1; then - USERNAME=${CURRENT_USER} - break - fi - done - if [ "${USERNAME}" = "" ]; then - USERNAME=root - fi -elif [ "${USERNAME}" = "none" ] || ! id -u ${USERNAME} > /dev/null 2>&1; then - USERNAME=root -fi - -USERHOME="/home/$USERNAME" -if [ "$USERNAME" = "root" ]; then - USERHOME="/root" -fi - - -# Get central common setting -get_common_setting() { - if [ "${common_settings_file_loaded}" != "true" ]; then - curl -sfL "https://aka.ms/vscode-dev-containers/script-library/settings.env" 2>/dev/null -o /tmp/vsdc-settings.env || echo "Could not download settings file. Skipping." - common_settings_file_loaded=true - fi - if [ -f "/tmp/vsdc-settings.env" ]; then - local multi_line="" - if [ "$2" = "true" ]; then multi_line="-z"; fi - local result="$(grep ${multi_line} -oP "$1=\"?\K[^\"]+" /tmp/vsdc-settings.env | tr -d '\0')" - if [ ! -z "${result}" ]; then declare -g $1="${result}"; fi - fi - echo "$1=${!1}" -} - -# Figure out correct version of a three part version number is not passed -find_version_from_git_tags() { - local variable_name=$1 - local requested_version=${!variable_name} - if [ "${requested_version}" = "none" ]; then return; fi - local repository=$2 - local prefix=${3:-"tags/v"} - local separator=${4:-"."} - local last_part_optional=${5:-"false"} - if [ "$(echo "${requested_version}" | grep -o "." | wc -l)" != "2" ]; then - local escaped_separator=${separator//./\\.} - local last_part - if [ "${last_part_optional}" = "true" ]; then - last_part="(${escaped_separator}[0-9]+)?" - else - last_part="${escaped_separator}[0-9]+" - fi - local regex="${prefix}\\K[0-9]+${escaped_separator}[0-9]+${last_part}$" - local version_list="$(git ls-remote --tags ${repository} | grep -oP "${regex}" | tr -d ' ' | tr "${separator}" "." | sort -rV)" - if [ "${requested_version}" = "latest" ] || [ "${requested_version}" = "current" ] || [ "${requested_version}" = "lts" ]; then - declare -g ${variable_name}="$(echo "${version_list}" | head -n 1)" - else - set +e - declare -g ${variable_name}="$(echo "${version_list}" | grep -E -m 1 "^${requested_version//./\\.}([\\.\\s]|$)")" - set -e - fi - fi - if [ -z "${!variable_name}" ] || ! echo "${version_list}" | grep "^${!variable_name//./\\.}$" > /dev/null 2>&1; then - echo -e "Invalid ${variable_name} value: ${requested_version}\nValid values:\n${version_list}" >&2 - exit 1 - fi - echo "${variable_name}=${!variable_name}" -} - -# Function to run apt-get if needed -apt_get_update_if_needed() -{ - if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then - echo "Running apt-get update..." - apt-get update - else - echo "Skipping apt-get update." - fi -} - -# Checks if packages are installed and installs them if not -check_packages() { - if ! dpkg -s "$@" > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get -y install --no-install-recommends "$@" - fi -} - -# Ensure apt is in non-interactive to avoid prompts -export DEBIAN_FRONTEND=noninteractive - -# Install dependencies -check_packages curl ca-certificates coreutils gnupg2 dirmngr bash-completion -if ! type git > /dev/null 2>&1; then - apt_get_update_if_needed - apt-get -y install --no-install-recommends git -fi - -architecture="$(uname -m)" -case $architecture in - x86_64) architecture="amd64";; - aarch64 | armv8*) architecture="arm64";; - aarch32 | armv7* | armvhf*) architecture="arm";; - i?86) architecture="386";; - *) echo "(!) Architecture $architecture unsupported"; exit 1 ;; -esac - -# Install the kubectl, verify checksum -echo "Downloading kubectl..." -if [ "${KUBECTL_VERSION}" = "latest" ] || [ "${KUBECTL_VERSION}" = "lts" ] || [ "${KUBECTL_VERSION}" = "current" ] || [ "${KUBECTL_VERSION}" = "stable" ]; then - KUBECTL_VERSION="$(curl -sSL https://dl.k8s.io/release/stable.txt)" -else - find_version_from_git_tags KUBECTL_VERSION https://github.com/kubernetes/kubernetes -fi -if [ "${KUBECTL_VERSION::1}" != 'v' ]; then - KUBECTL_VERSION="v${KUBECTL_VERSION}" -fi -curl -sSL -o /usr/local/bin/kubectl "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/linux/${architecture}/kubectl" -chmod 0755 /usr/local/bin/kubectl -if [ "$KUBECTL_SHA256" = "automatic" ]; then - KUBECTL_SHA256="$(curl -sSL "https://dl.k8s.io/${KUBECTL_VERSION}/bin/linux/${architecture}/kubectl.sha256")" -fi -([ "${KUBECTL_SHA256}" = "dev-mode" ] || (echo "${KUBECTL_SHA256} */usr/local/bin/kubectl" | sha256sum -c -)) -if ! type kubectl > /dev/null 2>&1; then - echo '(!) kubectl installation failed!' - exit 1 -fi - -# kubectl bash completion -kubectl completion bash > /etc/bash_completion.d/kubectl - -# kubectl zsh completion -if [ -e "${USERHOME}}/.oh-my-zsh" ]; then - mkdir -p "${USERHOME}/.oh-my-zsh/completions" - kubectl completion zsh > "${USERHOME}/.oh-my-zsh/completions/_kubectl" - chown -R "${USERNAME}" "${USERHOME}/.oh-my-zsh" -fi - -# Install Helm, verify signature and checksum -echo "Downloading Helm..." -find_version_from_git_tags HELM_VERSION "https://github.com/helm/helm" -if [ "${HELM_VERSION::1}" != 'v' ]; then - HELM_VERSION="v${HELM_VERSION}" -fi -mkdir -p /tmp/helm -helm_filename="helm-${HELM_VERSION}-linux-${architecture}.tar.gz" -tmp_helm_filename="/tmp/helm/${helm_filename}" -curl -sSL "https://get.helm.sh/${helm_filename}" -o "${tmp_helm_filename}" -curl -sSL "https://github.com/helm/helm/releases/download/${HELM_VERSION}/${helm_filename}.asc" -o "${tmp_helm_filename}.asc" -export GNUPGHOME="/tmp/helm/gnupg" -mkdir -p "${GNUPGHOME}" -chmod 700 ${GNUPGHOME} -get_common_setting HELM_GPG_KEYS_URI -get_common_setting GPG_KEY_SERVERS true -curl -sSL "${HELM_GPG_KEYS_URI}" -o /tmp/helm/KEYS -echo -e "disable-ipv6\n${GPG_KEY_SERVERS}" > ${GNUPGHOME}/dirmngr.conf -gpg -q --import "/tmp/helm/KEYS" -if ! gpg --verify "${tmp_helm_filename}.asc" > ${GNUPGHOME}/verify.log 2>&1; then - echo "Verification failed!" - cat /tmp/helm/gnupg/verify.log - exit 1 -fi -if [ "${HELM_SHA256}" = "automatic" ]; then - curl -sSL "https://get.helm.sh/${helm_filename}.sha256" -o "${tmp_helm_filename}.sha256" - curl -sSL "https://github.com/helm/helm/releases/download/${HELM_VERSION}/${helm_filename}.sha256.asc" -o "${tmp_helm_filename}.sha256.asc" - if ! gpg --verify "${tmp_helm_filename}.sha256.asc" > /tmp/helm/gnupg/verify.log 2>&1; then - echo "Verification failed!" - cat /tmp/helm/gnupg/verify.log - exit 1 - fi - HELM_SHA256="$(cat "${tmp_helm_filename}.sha256")" -fi -([ "${HELM_SHA256}" = "dev-mode" ] || (echo "${HELM_SHA256} *${tmp_helm_filename}" | sha256sum -c -)) -tar xf "${tmp_helm_filename}" -C /tmp/helm -mv -f "/tmp/helm/linux-${architecture}/helm" /usr/local/bin/ -chmod 0755 /usr/local/bin/helm -rm -rf /tmp/helm -if ! type helm > /dev/null 2>&1; then - echo '(!) Helm installation failed!' - exit 1 -fi - -# Install Minikube, verify checksum -if [ "${MINIKUBE_VERSION}" != "none" ]; then - echo "Downloading minikube..." - if [ "${MINIKUBE_VERSION}" = "latest" ] || [ "${MINIKUBE_VERSION}" = "lts" ] || [ "${MINIKUBE_VERSION}" = "current" ] || [ "${MINIKUBE_VERSION}" = "stable" ]; then - MINIKUBE_VERSION="latest" - else - find_version_from_git_tags MINIKUBE_VERSION https://github.com/kubernetes/minikube - if [ "${MINIKUBE_VERSION::1}" != "v" ]; then - MINIKUBE_VERSION="v${MINIKUBE_VERSION}" - fi - fi - # latest is also valid in the download URLs - curl -sSL -o /usr/local/bin/minikube "https://storage.googleapis.com/minikube/releases/${MINIKUBE_VERSION}/minikube-linux-${architecture}" - chmod 0755 /usr/local/bin/minikube - if [ "$MINIKUBE_SHA256" = "automatic" ]; then - MINIKUBE_SHA256="$(curl -sSL "https://storage.googleapis.com/minikube/releases/${MINIKUBE_VERSION}/minikube-linux-${architecture}.sha256")" - fi - ([ "${MINIKUBE_SHA256}" = "dev-mode" ] || (echo "${MINIKUBE_SHA256} */usr/local/bin/minikube" | sha256sum -c -)) - if ! type minikube > /dev/null 2>&1; then - echo '(!) minikube installation failed!' - exit 1 - fi - # Create minkube folder with correct privs in case a volume is mounted here - mkdir -p "${USERHOME}/.minikube" - chown -R $USERNAME "${USERHOME}/.minikube" - chmod -R u+wrx "${USERHOME}/.minikube" -fi - -if ! type docker > /dev/null 2>&1; then - echo -e '\n(*) Warning: The docker command was not found.\n\nYou can use one of the following scripts to install it:\n\nhttps://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/docker-in-docker.md\n\nor\n\nhttps://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/docker.md' -fi - -echo -e "\nDone!" \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..f33a02c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for more information: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates +# https://containers.dev/guide/dependabot + +version: 2 +updates: + - package-ecosystem: "devcontainers" + directory: "/" + schedule: + interval: weekly diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..76acbad --- /dev/null +++ b/Makefile @@ -0,0 +1,42 @@ +# Define Minikube start with a specific driver +minikube-start: + @minikube start + +# Define Minikube delete +minikube-delete: + @minikube delete + +# Deploy Exivity Helm chart to Minikube +deploy-exivity-chart: + @helm upgrade --install exivity ./charts/exivity \ + --namespace exivity \ + --create-namespace + +# Deploy NFS Helm chart to Minikube +# This is a dependency for the exivity Helm chart +deploy-nfs-chart: + @helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ + @helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ + --namespace nfs-server \ + --create-namespace \ + --set nfs.server=0.0.0.0 \ + --set persistence.enabled=true \ + --set persistence.size=5Gi \ + --set storageClass.name=nfs-client \ + --set storageClass.allowVolumeExpansion=true \ + --set 'storageClass.mountOptions[0]=nfsvers=4.2' \ + --set 'storageClass.mountOptions[1]=rsize=4096' \ + --set 'storageClass.mountOptions[2]=wsize=4096' \ + --set 'storageClass.mountOptions[3]=hard' \ + --set 'storageClass.mountOptions[4]=retrans=3' \ + --set 'storageClass.mountOptions[5]=proto=tcp' \ + --set 'storageClass.mountOptions[6]=noatime' \ + --set 'storageClass.mountOptions[7]=nodiratime' + +# Test Helm chart +test: + @echo "Running tests..." + # Here you can define specific test commands or scripts + +# Makefile targets +.PHONY: minikube-start minikube-delete deploy-exivity-chart deploy-nfs-chart test From 7161b28152094429190378e44f98bd668639c6a2 Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Tue, 30 Apr 2024 11:24:29 +0200 Subject: [PATCH 03/14] Fix conditional statement in use deployment.yaml Signed-off-by: Steffen Exler --- charts/exivity/templates/use/certs.yaml | 2 +- charts/exivity/templates/use/deployment.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/exivity/templates/use/certs.yaml b/charts/exivity/templates/use/certs.yaml index 636facf..1a6414d 100644 --- a/charts/exivity/templates/use/certs.yaml +++ b/charts/exivity/templates/use/certs.yaml @@ -1,4 +1,4 @@ -{{if gt (len .Values.service.use.caCertificates) 0 -}} +{{- if gt (len (default "" .Values.service.use.caCertificates)) 0 }} apiVersion: v1 kind: Secret metadata: diff --git a/charts/exivity/templates/use/deployment.yaml b/charts/exivity/templates/use/deployment.yaml index 7e52eb5..ea47493 100644 --- a/charts/exivity/templates/use/deployment.yaml +++ b/charts/exivity/templates/use/deployment.yaml @@ -38,7 +38,7 @@ spec: - name: log persistentVolumeClaim: claimName: {{ include "exivity.fullname" $ -}}-use-log - {{- if gt (len .Values.service.use.caCertificates) 0 }} + {{- if gt (len (default "" .Values.service.use.caCertificates)) 0 }} - name: cert-volume emptyDir: {} - name: ca-certificates From 0c0da5b9a36bc5a8ac7f4050781bc72e6c51f656 Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Tue, 30 Apr 2024 09:43:33 +0000 Subject: [PATCH 04/14] Add support for NFS storage class and chart version in Makefile Signed-off-by: Steffen Exler --- Makefile | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 76acbad..8bd73a3 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,7 @@ +# Constants +NFS_STORAGE_CLASS := nfs-client +NFS_CHART_VERSION = 1.8.0 + # Define Minikube start with a specific driver minikube-start: @minikube start @@ -10,19 +14,21 @@ minikube-delete: deploy-exivity-chart: @helm upgrade --install exivity ./charts/exivity \ --namespace exivity \ - --create-namespace + --create-namespace \ + --set storage.storageClass=$(NFS_STORAGE_CLASS) \ + --set ingress.host=localhost # Deploy NFS Helm chart to Minikube # This is a dependency for the exivity Helm chart deploy-nfs-chart: - @helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ - @helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ + @helm repo add nfs-ganesha-server-and-external-provisioner https://kubernetes-sigs.github.io/nfs-ganesha-server-and-external-provisioner/ + @helm install nfs-server nfs-ganesha-server-and-external-provisioner/nfs-server-provisioner \ + --version $(NFS_CHART_VERSION) \ --namespace nfs-server \ --create-namespace \ - --set nfs.server=0.0.0.0 \ --set persistence.enabled=true \ --set persistence.size=5Gi \ - --set storageClass.name=nfs-client \ + --set storageClass.name=$(NFS_STORAGE_CLASS) \ --set storageClass.allowVolumeExpansion=true \ --set 'storageClass.mountOptions[0]=nfsvers=4.2' \ --set 'storageClass.mountOptions[1]=rsize=4096' \ From de139c1d302e49931a7a8994bfd3a9da2d371e46 Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Tue, 30 Apr 2024 12:55:55 +0000 Subject: [PATCH 05/14] Add support for NFS storage class and chart version in Makefile Signed-off-by: Steffen Exler --- Makefile | 10 +++++++--- test.sh | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100755 test.sh diff --git a/Makefile b/Makefile index 8bd73a3..be5b423 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,13 @@ # Constants NFS_STORAGE_CLASS := nfs-client -NFS_CHART_VERSION = 1.8.0 +NFS_CHART_VERSION := 1.8.0 + +INGRESS_HOSTNAME := exivity.local # Define Minikube start with a specific driver minikube-start: @minikube start + @minikube addons enable ingress # Define Minikube delete minikube-delete: @@ -16,7 +19,8 @@ deploy-exivity-chart: --namespace exivity \ --create-namespace \ --set storage.storageClass=$(NFS_STORAGE_CLASS) \ - --set ingress.host=localhost + --set ingress.host=$(INGRESS_HOSTNAME) \ + --set ingress.annotations."nginx\.ingress\.kubernetes\.io/rewrite-target"="/" # Deploy NFS Helm chart to Minikube # This is a dependency for the exivity Helm chart @@ -42,7 +46,7 @@ deploy-nfs-chart: # Test Helm chart test: @echo "Running tests..." - # Here you can define specific test commands or scripts + @./test.sh $(INGRESS_HOSTNAME) $$(minikube ip) # Makefile targets .PHONY: minikube-start minikube-delete deploy-exivity-chart deploy-nfs-chart test diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..aa019ef --- /dev/null +++ b/test.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# Check if both parameters are provided +if [ "$#" -ne 2 ]; then + echo "Usage: $0 HOSTNAME IP_ADDRESS" + exit 1 +fi + +# Read parameters +HOSTNAME=$1 +IP_ADDRESS=$2 + +# Use curl to make an HTTP request +response=$(curl -s -o /dev/null -w "%{http_code}" --header "Host: $HOSTNAME" http://$IP_ADDRESS) + +# Print the HTTP status code and a friendly message +echo "HTTP response code: $response" +if [ "$response" -eq 200 ]; then + echo "Connection to $HOSTNAME at $IP_ADDRESS was successful!" +else + echo "Failed to connect to $HOSTNAME at $IP_ADDRESS. Response code: $response" +fi From 63ee592c8cba0b25c4e8ac7d297b2e0e62f32a8a Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Tue, 30 Apr 2024 15:25:10 +0000 Subject: [PATCH 06/14] Update devcontainer image to Python 3.12 in devcontainer.json Signed-off-by: Steffen Exler --- .devcontainer/devcontainer.json | 8 ++--- Makefile | 12 +++++--- test.sh | 22 -------------- test/requirements.txt | 1 + test/test.py | 54 +++++++++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 30 deletions(-) delete mode 100755 test.sh create mode 100644 test/requirements.txt create mode 100644 test/test.py diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 16bfc4a..87fb238 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -3,7 +3,7 @@ { "name": "Kubernetes - Minikube-in-Docker", // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile - "image": "mcr.microsoft.com/devcontainers/base:bullseye", + "image": "mcr.microsoft.com/devcontainers/python:1-3.12-bullseye", "features": { "ghcr.io/devcontainers/features/docker-in-docker:2": {}, @@ -17,13 +17,13 @@ "ms-kubernetes-tools.vscode-kubernetes-tools" ] } - } + }, // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], - // Use 'postCreateCommand' to run commands after the container is created. - // "postCreateCommand": "kubectl version", + // Install test dependencies inside the container. + "postCreateCommand": "pip install -r test/requirements.txt" // Use 'postStartCommand' to run commands after the container is created like starting minikube. // "postStartCommand": "nohup bash -c 'minikube start &' > minikube.log 2>&1", diff --git a/Makefile b/Makefile index be5b423..d3c4566 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ INGRESS_HOSTNAME := exivity.local # Define Minikube start with a specific driver minikube-start: - @minikube start + @minikube start --memory 8192 --cpus 2 @minikube addons enable ingress # Define Minikube delete @@ -20,7 +20,8 @@ deploy-exivity-chart: --create-namespace \ --set storage.storageClass=$(NFS_STORAGE_CLASS) \ --set ingress.host=$(INGRESS_HOSTNAME) \ - --set ingress.annotations."nginx\.ingress\.kubernetes\.io/rewrite-target"="/" + --set ingress.ingressClassName="nginx" \ + --set logLevel.backend="debug" \ # Deploy NFS Helm chart to Minikube # This is a dependency for the exivity Helm chart @@ -43,10 +44,13 @@ deploy-nfs-chart: --set 'storageClass.mountOptions[6]=noatime' \ --set 'storageClass.mountOptions[7]=nodiratime' +# Deploy all Helm charts +deploy-charts: deploy-nfs-chart deploy-exivity-chart + # Test Helm chart test: @echo "Running tests..." - @./test.sh $(INGRESS_HOSTNAME) $$(minikube ip) + @python3 test/test.py --hostname $(INGRESS_HOSTNAME) --ip $$(minikube ip) # Makefile targets -.PHONY: minikube-start minikube-delete deploy-exivity-chart deploy-nfs-chart test +.PHONY: minikube-start minikube-delete deploy-charts deploy-exivity-chart deploy-nfs-chart test diff --git a/test.sh b/test.sh deleted file mode 100755 index aa019ef..0000000 --- a/test.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -# Check if both parameters are provided -if [ "$#" -ne 2 ]; then - echo "Usage: $0 HOSTNAME IP_ADDRESS" - exit 1 -fi - -# Read parameters -HOSTNAME=$1 -IP_ADDRESS=$2 - -# Use curl to make an HTTP request -response=$(curl -s -o /dev/null -w "%{http_code}" --header "Host: $HOSTNAME" http://$IP_ADDRESS) - -# Print the HTTP status code and a friendly message -echo "HTTP response code: $response" -if [ "$response" -eq 200 ]; then - echo "Connection to $HOSTNAME at $IP_ADDRESS was successful!" -else - echo "Failed to connect to $HOSTNAME at $IP_ADDRESS. Response code: $response" -fi diff --git a/test/requirements.txt b/test/requirements.txt new file mode 100644 index 0000000..077c95d --- /dev/null +++ b/test/requirements.txt @@ -0,0 +1 @@ +requests==2.31.0 \ No newline at end of file diff --git a/test/test.py b/test/test.py new file mode 100644 index 0000000..6bde10a --- /dev/null +++ b/test/test.py @@ -0,0 +1,54 @@ +import sys +import unittest +import requests +import argparse + +# Create a parser for the custom arguments +custom_parser = argparse.ArgumentParser(add_help=False) +custom_parser.add_argument( + "--hostname", type=str, required=True, help="Hostname of the test server" +) +custom_parser.add_argument( + "--ip", type=str, required=True, help="IP address of the test server" +) +custom_args, remaining_argv = custom_parser.parse_known_args() + + +class EndpointTestCase(unittest.TestCase): + BASE_URL = f"http://{custom_args.ip}" + + TEST_CASES = [ + { + "path": "/", + "expected_status": 200, + "method": "GET", + }, + { + "path": "/v1/auth/token", + "expected_status": 200, + "method": "POST", + "headers": { + "Content-Type": "application/x-www-form-urlencoded", + "Accept": "application/json", + }, + "data": "username=admin&password=exivity", + }, + ] + + def test_endpoints(self): + for case in self.TEST_CASES: + with self.subTest(case=case): + url = f"{self.BASE_URL}{case['path']}" + headers = {"Host": custom_args.hostname} + headers.update(case.get("headers", {})) + data = case.get("data") + response = requests.request( + method=case["method"], url=url, headers=headers, data=data + ) + self.assertEqual(response.status_code, case["expected_status"]) + + +if __name__ == "__main__": + # Replace the system's argv with the remaining arguments after removing custom ones + sys.argv[1:] = remaining_argv + unittest.main() From fb778394974e06a8351f903ff012848c3e9a2c38 Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Tue, 30 Apr 2024 15:29:25 +0000 Subject: [PATCH 07/14] Update Makefile to include HELM_TIMEOUT variable Signed-off-by: Steffen Exler --- Makefile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d3c4566..ee5fb9a 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,8 @@ NFS_CHART_VERSION := 1.8.0 INGRESS_HOSTNAME := exivity.local +HELM_TIMEOUT := 10m + # Define Minikube start with a specific driver minikube-start: @minikube start --memory 8192 --cpus 2 @@ -18,10 +20,12 @@ deploy-exivity-chart: @helm upgrade --install exivity ./charts/exivity \ --namespace exivity \ --create-namespace \ + --wait \ + --timeout $(HELM_TIMEOUT) \ --set storage.storageClass=$(NFS_STORAGE_CLASS) \ --set ingress.host=$(INGRESS_HOSTNAME) \ --set ingress.ingressClassName="nginx" \ - --set logLevel.backend="debug" \ + --set logLevel.backend="debug" # Deploy NFS Helm chart to Minikube # This is a dependency for the exivity Helm chart @@ -31,6 +35,8 @@ deploy-nfs-chart: --version $(NFS_CHART_VERSION) \ --namespace nfs-server \ --create-namespace \ + --wait \ + --timeout $(HELM_TIMEOUT) \ --set persistence.enabled=true \ --set persistence.size=5Gi \ --set storageClass.name=$(NFS_STORAGE_CLASS) \ From d1fb10d152cf69848117167146184b97f3e51d9d Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Tue, 30 Apr 2024 15:32:25 +0000 Subject: [PATCH 08/14] Add integration test workflow for deploying application to Minikube Signed-off-by: Steffen Exler --- .github/workflows/integration-test.yml | 51 ++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/integration-test.yml diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml new file mode 100644 index 0000000..129a73e --- /dev/null +++ b/.github/workflows/integration-test.yml @@ -0,0 +1,51 @@ +name: Deploy Application to Minikube + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.8' + + - name: Install Dependencies + run: | + sudo apt-get update + sudo apt-get install -y conntrack + pip install requests + + - name: Install Minikube + run: | + curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 + sudo install minikube-linux-amd64 /usr/local/bin/minikube + + - name: Start Minikube + run: make minikube-start + + - name: Install Helm + run: | + curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 + chmod 700 get_helm.sh + ./get_helm.sh + + - name: Deploy NFS and Exivity Helm charts + run: make deploy-charts + + - name: Run Tests + run: make test + + - name: Clean up Minikube + if: always() + run: make minikube-delete From 4bed1ec9d644ae21b8bca161eec4a3ec6b73b165 Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Tue, 30 Apr 2024 15:40:27 +0000 Subject: [PATCH 09/14] Add wait step in integration test workflow Signed-off-by: Steffen Exler --- .github/workflows/integration-test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 129a73e..1ace6fd 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -43,6 +43,9 @@ jobs: - name: Deploy NFS and Exivity Helm charts run: make deploy-charts + - name: Wait for NFS and Exivity to be ready + run: sleep 60 + - name: Run Tests run: make test From c66272effddb64db5c96907f32310c2a2ea39740 Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Tue, 30 Apr 2024 15:45:36 +0000 Subject: [PATCH 10/14] Update integration test workflow to include clean up step Signed-off-by: Steffen Exler --- .github/workflows/integration-test.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 1ace6fd..64e0730 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -47,8 +47,4 @@ jobs: run: sleep 60 - name: Run Tests - run: make test - - - name: Clean up Minikube - if: always() - run: make minikube-delete + run: make test \ No newline at end of file From be2be49dfc5fac8ea22d4bc8d6693af5988e632c Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Tue, 30 Apr 2024 18:02:06 +0200 Subject: [PATCH 11/14] Update integration test workflow to include installation of Python dependencies Signed-off-by: Steffen Exler --- .github/workflows/integration-test.yml | 2 +- Makefile | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 64e0730..2f8a54b 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -24,7 +24,7 @@ jobs: run: | sudo apt-get update sudo apt-get install -y conntrack - pip install requests + make install-python-depst - name: Install Minikube run: | diff --git a/Makefile b/Makefile index ee5fb9a..9506983 100644 --- a/Makefile +++ b/Makefile @@ -53,10 +53,15 @@ deploy-nfs-chart: # Deploy all Helm charts deploy-charts: deploy-nfs-chart deploy-exivity-chart +# Install Python dependencies +install-python-deps: + @echo "Installing Python dependencies..." + @pip install -r test/requirements.txt + # Test Helm chart test: @echo "Running tests..." @python3 test/test.py --hostname $(INGRESS_HOSTNAME) --ip $$(minikube ip) # Makefile targets -.PHONY: minikube-start minikube-delete deploy-charts deploy-exivity-chart deploy-nfs-chart test +.PHONY: minikube-start minikube-delete deploy-charts deploy-exivity-chart deploy-nfs-chart install-python-deps test From 27ecaa2d4bd554cf3111a07f2972bc2d0470da11 Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Thu, 2 May 2024 08:59:29 +0200 Subject: [PATCH 12/14] Update integration test workflow to fix typo in make command Signed-off-by: Steffen Exler --- .github/workflows/integration-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 2f8a54b..7e70023 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -24,7 +24,7 @@ jobs: run: | sudo apt-get update sudo apt-get install -y conntrack - make install-python-depst + make install-python-deps - name: Install Minikube run: | From adea0720ccdfdc91c4784c032b1aefccdac09077 Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Thu, 2 May 2024 14:23:28 +0200 Subject: [PATCH 13/14] Update integration test workflow to include wait step Signed-off-by: Steffen Exler --- .github/workflows/integration-test.yml | 3 --- Makefile | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 7e70023..df4b6e7 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -43,8 +43,5 @@ jobs: - name: Deploy NFS and Exivity Helm charts run: make deploy-charts - - name: Wait for NFS and Exivity to be ready - run: sleep 60 - - name: Run Tests run: make test \ No newline at end of file diff --git a/Makefile b/Makefile index 9506983..2bedc00 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,7 @@ deploy-exivity-chart: --namespace exivity \ --create-namespace \ --wait \ + --wait-for-jobs \ --timeout $(HELM_TIMEOUT) \ --set storage.storageClass=$(NFS_STORAGE_CLASS) \ --set ingress.host=$(INGRESS_HOSTNAME) \ From 2eca930bfcfaff151f765bb0f5e92c645d2095b7 Mon Sep 17 00:00:00 2001 From: Steffen Exler Date: Thu, 2 May 2024 16:41:50 +0200 Subject: [PATCH 14/14] Revert "Update integration test workflow to include wait step" This reverts commit adea0720ccdfdc91c4784c032b1aefccdac09077. Signed-off-by: Steffen Exler --- .github/workflows/integration-test.yml | 3 +++ Makefile | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index df4b6e7..7e70023 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -43,5 +43,8 @@ jobs: - name: Deploy NFS and Exivity Helm charts run: make deploy-charts + - name: Wait for NFS and Exivity to be ready + run: sleep 60 + - name: Run Tests run: make test \ No newline at end of file diff --git a/Makefile b/Makefile index 2bedc00..9506983 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,6 @@ deploy-exivity-chart: --namespace exivity \ --create-namespace \ --wait \ - --wait-for-jobs \ --timeout $(HELM_TIMEOUT) \ --set storage.storageClass=$(NFS_STORAGE_CLASS) \ --set ingress.host=$(INGRESS_HOSTNAME) \