From a06ef45fb0173d69399a6547a7dd037807fb37e9 Mon Sep 17 00:00:00 2001 From: Adam Dyess Date: Fri, 11 Oct 2024 16:20:37 -0500 Subject: [PATCH] Test using concierge --- .github/actions/with-post-steps/action.yaml | 3 + .github/actions/with-post-steps/main.js | 2 +- .github/workflows/e2e.yaml | 5 +- action.yaml | 1 + src/bootstrap/main.sh | 128 +++++++++++++++++++- src/cleanup/main.sh | 64 ++++++++++ 6 files changed, 197 insertions(+), 6 deletions(-) diff --git a/.github/actions/with-post-steps/action.yaml b/.github/actions/with-post-steps/action.yaml index 2bc7cf1..dfd1bd7 100644 --- a/.github/actions/with-post-steps/action.yaml +++ b/.github/actions/with-post-steps/action.yaml @@ -10,6 +10,9 @@ inputs: post: description: "Post command/script." required: true + json: + description: "Inputs to pass through to the main command." + required: true key: description: "Name of the state variable used to detect the post step." required: false diff --git a/.github/actions/with-post-steps/main.js b/.github/actions/with-post-steps/main.js index 31d4988..654ede9 100644 --- a/.github/actions/with-post-steps/main.js +++ b/.github/actions/with-post-steps/main.js @@ -4,7 +4,7 @@ const { appendFileSync } = require("fs"); const { EOL } = require("os"); function run(cmd) { - const subprocess = spawn(cmd, { stdio: "inherit", shell: true }); + const subprocess = spawn(cmd, { stdio: "inherit", shell: true, env: process.env }); subprocess.on("exit", (exitCode) => { process.exitCode = exitCode; }); diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index e437bc8..7d93dac 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -1,9 +1,9 @@ name: Test Operator Setup on: push: - branches: [main] + branches: [main, concierge] pull_request: - branches: [main] + branches: [main, concierge] jobs: Inclusive-naming-check: @@ -259,5 +259,6 @@ jobs: run: echo "name=$CONTROLLER_NAME" >> $GITHUB_OUTPUT - name: Test we can switch to the controllers run: | + set -eu juju switch ${{ steps.k8s-controller.outputs.name }} juju switch ${{ steps.lxd-controller.outputs.name }} diff --git a/action.yaml b/action.yaml index 16548ff..6f34c04 100644 --- a/action.yaml +++ b/action.yaml @@ -79,6 +79,7 @@ runs: - name: Cache uses: ./.github/actions/with-post-steps with: + json: ${{ toJson(inputs) }} main: "src/bootstrap/main.sh" post: "src/cleanup/main.sh" branding: diff --git a/src/bootstrap/main.sh b/src/bootstrap/main.sh index 3dd0f96..e68428e 100755 --- a/src/bootstrap/main.sh +++ b/src/bootstrap/main.sh @@ -1,6 +1,128 @@ #!/bin/bash +set -eu -# The following will eventually just be snap install concierge -sudo snap install go --classic -go install github.com/jnsgruk/concierge@latest +function _get_input() { + local __resultvar=$1 + local key=$2 + local default_value=${3:-''} + local value=$(echo "$INPUT_JSON" | grep -oP '"'"$key"'"\s*:\s*"\K[^"]+') + value=${value:-$default_value} + eval $__resultvar="'$value'" +} + +function install_concierge() { + # The following will eventually just be snap install concierge + echo "::group::Installing concierge" + export PATH=$PATH:$HOME/go/bin + sudo snap install go --classic + go install github.com/jnsgruk/concierge@latest + echo "::endgroup::" +} + + +function install_tox_if_needed() { + local version="" + _get_input version "tox-version" + echo "Ensuring tox installed..." + + if command -v tox &> /dev/null; then + echo "tox is already installed" + tox --version + elif command -v pip &> /dev/null; then + echo "::group::Installing tox with pip..." + TOX_VERSION_ARG=$([ -n "$version" ] && echo "==$version" || echo "") + pip install tox$TOX_VERSION_ARG + echo "::endgroup::" + else + echo "::group::Installing tox with apt..." + sudo apt-get update + sudo apt-get install python3-tox + echo "::endgroup::" + fi +} + +function plan_concierge() { + local provider="" + local channel="" + local lxd_channel="" + local charm_channel="" + local charmcraft_channel="" + local juju_channel="" + local jq_channel="" + local juju_bundle_channel="" + local juju_crashdump_channel="" + local microk8s_addons="" + + _get_input provider "provider" + _get_input channel "channel" + _get_input lxd_channel "lxd-channel" + _get_input charm_channel "charm-channel" + _get_input charmcraft_channel "charmcraft-channel" + _get_input juju_channel "juju-channel" + _get_input jq_channel "jq-channel" "latest/stable" + _get_input juju_bundle_channel "juju-bundle-channel" "latest/stable" + _get_input juju_crashdump_channel "juju-crashdump-channel" "latest/stable" + _get_input microk8s_addons "microk8s-addons" + local lxd_used_channel=${channel:-$lxd_channel} + + cat < concierge.yaml +juju: + model-defaults: +providers: + lxd: + enable: true + channel: ${lxd_used_channel} +EOF + if [ ${provider} == "microk8s" ]; then + # Convert space-separated list to JSON array + microk8s_addons_json=$(echo "$microk8s_addons" | awk '{printf "["; for(i=1;i<=NF;i++) printf "\"%s\"%s", $i, (i> concierge.yaml + microk8s: + enable: true + channel: ${channel} + addons: ${microk8s_addons_json} +EOF + fi + cat <> concierge.yaml +host: + snaps: + - charmcraft + - kubectl + - charm/${charm_channel} + - jq/${jq_channel} + - juju-bundle/${juju_bundle_channel} + - juju-crashdump/${juju_crashdump_channel} +EOF + + export CONCIERGE_JUJU_CHANNEL=${juju_channel} + export CONCIERGE_LXD_CHANNEL=${lxd_channel} + export CONCIERGE_CHARMCRAFT_CHANNEL=${charmcraft_channel} + export SHELL=/bin/bash + + echo "::group::Concierge (concierge.yaml):" + cat concierge.yaml + echo "::endgroup::" + + echo "::group::Concierge (environment):" + printenv | sort | grep -i concierge + echo "::endgroup::" + + echo "::group::Running concierge..." + set -x + concierge prepare --trace -v + set +x + echo "::endgroup::" + + echo "Concierge run complete." + local CONTROLLER_NAME=$(juju controllers --format json | jq -r '.["current-controller"]') + echo "CONTROLLER_NAME=$CONTROLLER_NAME" >> $GITHUB_ENV +} + +function run() { + install_concierge + install_tox_if_needed + plan_concierge +} + +run \ No newline at end of file diff --git a/src/cleanup/main.sh b/src/cleanup/main.sh index a9bf588..fcf371d 100755 --- a/src/cleanup/main.sh +++ b/src/cleanup/main.sh @@ -1 +1,65 @@ #!/bin/bash +set -eu +echo "Cleaning up..." + +function _get_input() { + local __resultvar=$1 + local key=$2 + local default_value=${3:-''} + local value=$(echo "$INPUT_JSON" | grep -oP '"'"$key"'"\s*:\s*"\K[^"]+') + value=${value:-$default_value} + eval $__resultvar="'$value'" +} + +function destroy_controller() { + local controller=$1 + local juju_channel=""; + _get_input juju_channel "juju-channel" + + echo "Removing controller ${controller}..." + if [[ "${juju_channel}" == 2.9* ]]; then + juju destroy-controller -y ${controller} --destroy-all-models --destroy-storage + else + juju destroy-controller ${controller} --no-prompt --destroy-all-models --destroy-storage + fi +} + +function find_and_upload_juju_crashdump() { + local crashdump_files=$(find . -name "juju-crashdump-*.tar.xz") + + if [ -z "${crashdump_files}" ]; then + echo "No juju-crashdump files found." + else + for file in ${crashdump_files}; do + echo "Found crashdump file: ${file}" + upload_artifact $file + done + fi +} + +function upload_artifact() { + local file=$1 + local artifact_name=$(basename $file) + + echo "Uploading artifact not yet implemented: ${artifact_name}" + echo "::set-output name=artifact::${artifact_name}" + echo "::set-output name=artifact_path::${file}" +} + +function run() { + local controller=${CONTROLLER_NAME} + local provider="" + _get_input provider "provider" + + if [ -n "${controller}"]; then + if [ "${provider}" != "microk8s" ] && [ "${provider}" != "lxd" ]; then + destroy_controller ${controller} + fi + + echo "::group::uploading juju-crashdump" + find_and_upload_juju_crashdump + echo "::endgroup::" + fi +} + +run \ No newline at end of file