diff --git a/.github/actions/quick-rpm-clean/action.yaml b/.github/actions/quick-rpm-clean/action.yaml index d58e249e..f321d4f4 100644 --- a/.github/actions/quick-rpm-clean/action.yaml +++ b/.github/actions/quick-rpm-clean/action.yaml @@ -62,8 +62,12 @@ runs: set -euo pipefail set -x + # Pre-install the patch script since it may not exist on main branch yet + sudo podman cp ./src/topolvm/patch_lvmd_config.sh microshift-okd:/usr/local/bin/patch_lvmd_config.sh + sudo podman exec microshift-okd chmod +x /usr/local/bin/patch_lvmd_config.sh + sudo podman exec -i microshift-okd \ - env TAG="${{ inputs.install-tag }}" \ + env TAG="${{ inputs.install-tag }}" VG_NAME="${VG_NAME:-myvg1}" SPARE_GB="${SPARE_GB:-10}" \ bash -xeuo pipefail < ./src/quickrpm.sh # Restart the greenboot service synchronously to check the health of the system. @@ -76,8 +80,9 @@ runs: set -euo pipefail set -x + VG_NAME="${VG_NAME:-myvg1}" sudo podman exec -i microshift-okd systemctl stop microshift.service - sudo podman exec -i microshift-okd vgremove myvg1 + sudo podman exec -i microshift-okd vgremove "${VG_NAME}" sudo podman exec -i microshift-okd systemctl start microshift.service # Restart the greenboot service synchronously to check the health of the system. diff --git a/.github/actions/quick-start-clean/action.yaml b/.github/actions/quick-start-clean/action.yaml index 1e668fc0..e508b60d 100644 --- a/.github/actions/quick-start-clean/action.yaml +++ b/.github/actions/quick-start-clean/action.yaml @@ -52,7 +52,8 @@ runs: sudo podman image exists microshift-okd && exit 1 # Verify the LVM volume group and backing storage are removed - sudo vgs | grep myvg1 && exit 1 + VG_NAME="${VG_NAME:-myvg1}" + sudo vgs | grep "${VG_NAME}" && exit 1 if [ -e /var/lib/microshift-okd ]; then ls -la /var/lib/microshift-okd/ exit 1 diff --git a/CLAUDE.md b/CLAUDE.md index 2570c1fe..bc7e9801 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -159,6 +159,22 @@ TopoLVM CSI provides persistent storage: - Configure size via `LVM_VOLSIZE` (default: 1G) - Install `microshift-topolvm` package for host deployments +### TopoLVM Configuration + +The following environment variables can be used to customize TopoLVM: + +- `VG_NAME`: LVM volume group name (default: `myvg1`) +- `SPARE_GB`: Spare GB to reserve in the volume group (default: `10`) + +Example usage: +```bash +# Use custom volume group name and smaller spare for testing +make run VG_NAME=testvg SPARE_GB=2 LVM_VOLSIZE=5G + +# Using quickstart scripts +VG_NAME=customvg SPARE_GB=5 sudo -E ./src/quickstart.sh +``` + ## Cluster Manager `src/cluster_manager.sh` manages multi-node bootc clusters: @@ -166,7 +182,7 @@ TopoLVM CSI provides persistent storage: - Manages TopoLVM LVM backend - Supports operations: create, add-node, start, stop, delete, ready, healthy, status, env - Node naming: `microshift-okd-1`, `microshift-okd-2`, etc. -- Environment variables: `USHIFT_IMAGE`, `LVM_DISK`, `VG_NAME`, `ISOLATED_NETWORK`, `EXPOSE_KUBEAPI_PORT` +- Environment variables: `USHIFT_IMAGE`, `LVM_DISK`, `VG_NAME`, `SPARE_GB`, `ISOLATED_NETWORK`, `EXPOSE_KUBEAPI_PORT` ## Important Notes diff --git a/Makefile b/Makefile index 5532cbcc..b91ca6d6 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,8 @@ EMBED_CONTAINER_IMAGES ?= 0 # Options used in the 'run' target LVM_VOLSIZE ?= 1G +VG_NAME ?= myvg1 +SPARE_GB ?= 10 ISOLATED_NETWORK ?= 0 EXPOSE_KUBEAPI_PORT ?= 1 @@ -37,7 +39,6 @@ RPM_IMAGE := microshift-okd-rpm USHIFT_IMAGE := microshift-okd SRPM_IMAGE := microshift-okd-srpm LVM_DISK := /var/lib/microshift-okd/lvmdisk.image -VG_NAME := myvg1 PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST)))) include $(PROJECT_DIR)/src/copr/copr.mk @@ -133,25 +134,25 @@ image: .PHONY: run run: - @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} EXPOSE_KUBEAPI_PORT=${EXPOSE_KUBEAPI_PORT} ./src/cluster_manager.sh create + @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} EXPOSE_KUBEAPI_PORT=${EXPOSE_KUBEAPI_PORT} ./src/cluster_manager.sh create .PHONY: add-node add-node: - @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} EXPOSE_KUBEAPI_PORT=0 ./src/cluster_manager.sh add-node + @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} EXPOSE_KUBEAPI_PORT=0 ./src/cluster_manager.sh add-node .PHONY: start start: - @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} EXPOSE_KUBEAPI_PORT=0 ./src/cluster_manager.sh start + @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} EXPOSE_KUBEAPI_PORT=0 ./src/cluster_manager.sh start .PHONY: stop stop: - @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} ./src/cluster_manager.sh stop + @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} ./src/cluster_manager.sh stop .PHONY: run-ready run-ready: @echo "Waiting 5m for the MicroShift service to be ready" @for _ in $$(seq 60); do \ - if USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} ./src/cluster_manager.sh ready ; then \ + if USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} ./src/cluster_manager.sh ready ; then \ printf "\nOK\n" && exit 0; \ fi ; \ sleep 5 ; \ @@ -162,7 +163,7 @@ run-ready: run-healthy: @echo "Waiting 15m for the MicroShift service to be healthy" @for _ in $$(seq 60); do \ - if USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} ./src/cluster_manager.sh healthy ; then \ + if USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} ./src/cluster_manager.sh healthy ; then \ printf "\nOK\n" && exit 0; \ fi ; \ sleep 5 ; \ @@ -171,15 +172,15 @@ run-healthy: .PHONY: run-status run-status: - @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} ./src/cluster_manager.sh status + @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} ./src/cluster_manager.sh status .PHONY: env env: run-ready - @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} EXPOSE_KUBEAPI_PORT=1 ./src/cluster_manager.sh env "${CMD}" + @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} EXPOSE_KUBEAPI_PORT=1 ./src/cluster_manager.sh env "${CMD}" .PHONY: clean clean: - @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} ./src/cluster_manager.sh delete + @USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} ./src/cluster_manager.sh delete .PHONY: clean-all clean-all: diff --git a/ansible/roles/microshift-okd-bootc/defaults/main.yaml b/ansible/roles/microshift-okd-bootc/defaults/main.yaml new file mode 100644 index 00000000..dafd2e3d --- /dev/null +++ b/ansible/roles/microshift-okd-bootc/defaults/main.yaml @@ -0,0 +1,5 @@ +--- +# Default values for TopoLVM configuration +# These can be overridden via inventory or --extra-vars +lvm_vg_name: myvg1 +lvm_spare_gb: 10 diff --git a/ansible/roles/microshift-okd-bootc/tasks/topolvm.yaml b/ansible/roles/microshift-okd-bootc/tasks/topolvm.yaml index e4462880..c3341ac3 100644 --- a/ansible/roles/microshift-okd-bootc/tasks/topolvm.yaml +++ b/ansible/roles/microshift-okd-bootc/tasks/topolvm.yaml @@ -53,17 +53,17 @@ - name: Debug loop device path ansible.builtin.debug: var: loop_device_path - - name: Create volume group 'myvg1' on {{ loop_device_path }} + - name: Create volume group '{{ lvm_vg_name }}' on {{ loop_device_path }} community.general.lvg: - vg: myvg1 + vg: "{{ lvm_vg_name }}" pvs: "{{ loop_device_path }}" state: present force: true # Corresponds to vgcreate -f. Use with care if PVs might be in use by other VGs. become: true - - - name: Create {{ lvm_thinpool_size_giga }}G thin pool 'thinpool' in volume group 'myvg1' + + - name: Create {{ lvm_thinpool_size_giga }}G thin pool 'thinpool' in volume group '{{ lvm_vg_name }}' community.general.lvol: - vg: myvg1 + vg: "{{ lvm_vg_name }}" lv: thinpool size: "{{ lvm_thinpool_size_giga }}G" opts: "--type thin-pool" # This creates a thin pool diff --git a/ansible/roles/microshift-okd-bootc/vars/main.yaml b/ansible/roles/microshift-okd-bootc/vars/main.yaml index ea412ad0..143c3ff1 100644 --- a/ansible/roles/microshift-okd-bootc/vars/main.yaml +++ b/ansible/roles/microshift-okd-bootc/vars/main.yaml @@ -11,7 +11,4 @@ microshift_download_dir: "./cache/microshift_assets" # size of the lvm loopback disk lvm_disk_size_in_giga: 20 -# logical volume group name -# WARNING: the name is default for the topolvm driver,it shouldn't be changed. -lvm_vg_name: myvg1 lvm_thinpool_size_giga: 6 \ No newline at end of file diff --git a/packaging/bootc.Containerfile b/packaging/bootc.Containerfile index 7b358106..2f89092c 100644 --- a/packaging/bootc.Containerfile +++ b/packaging/bootc.Containerfile @@ -47,6 +47,13 @@ RUN dnf install -y 'greenboot-0.15.*' && dnf clean all COPY --chmod=755 ./src/rpm/postinstall.sh ${USHIFT_POSTINSTALL_SCRIPT} RUN ${USHIFT_POSTINSTALL_SCRIPT} && rm -vf "${USHIFT_POSTINSTALL_SCRIPT}" +# Install TopoLVM configuration patching script and systemd drop-in +# This allows runtime configuration of VG_NAME and SPARE_GB via environment variables +COPY --chmod=755 ./src/topolvm/patch_lvmd_config.sh /usr/local/bin/patch_lvmd_config.sh +RUN mkdir -p /etc/systemd/system/microshift.service.d && \ + printf '[Service]\nExecStartPre=/usr/local/bin/patch_lvmd_config.sh\n' \ + > /etc/systemd/system/microshift.service.d/00-patch-lvmd.conf + # If the EMBED_CONTAINER_IMAGES environment variable is set to 1, temporarily # configure user namespace UID and GID mappings. This allows the skopeo command # to operate without errors when copying the container images. diff --git a/src/cluster_manager.sh b/src/cluster_manager.sh index 915b0995..f1059f08 100755 --- a/src/cluster_manager.sh +++ b/src/cluster_manager.sh @@ -14,6 +14,7 @@ EXTRA_CONFIG="${EXTRA_CONFIG:-/var/lib/microshift-okd/custom_config.yaml}" LVM_VOLSIZE="${LVM_VOLSIZE:-1G}" API_SERVER_PORT="${API_SERVER_PORT:-6443}" VG_NAME="${VG_NAME:-myvg1}" +SPARE_GB="${SPARE_GB:-10}" ISOLATED_NETWORK="${ISOLATED_NETWORK:-0}" EXPOSE_KUBEAPI_PORT="${EXPOSE_KUBEAPI_PORT:-0}" @@ -130,6 +131,8 @@ _add_node() { ${network_opts} \ ${port_opts} \ ${mount_opts} \ + -e VG_NAME="${VG_NAME}" \ + -e SPARE_GB="${SPARE_GB}" \ --tmpfs /var/lib/containers \ --name "${name}" \ --hostname "${name}" \ diff --git a/src/quickclean.sh b/src/quickclean.sh index 898b8533..e2d3d4a9 100755 --- a/src/quickclean.sh +++ b/src/quickclean.sh @@ -3,7 +3,10 @@ set -euo pipefail LVM_DISK="/var/lib/microshift-okd/lvmdisk.image" LVM_CONFIG="/etc/systemd/system/microshift.service.d/99-lvm-config.conf" -VG_NAME="myvg1" +TOPOLVM_CONFIG="/etc/systemd/system/microshift.service.d/00-patch-lvmd.conf" +TOPOLVM_PATCH_SCRIPT="/usr/local/bin/patch_lvmd_config.sh" +TOPOLVM_PATCH_DIR="/etc/microshift/manifests.d/001-microshift-topolvm" +VG_NAME="${VG_NAME:-myvg1}" # Check if the script is running as root if [ "$(id -u)" -ne 0 ]; then @@ -25,9 +28,14 @@ if rpm -q microshift &>/dev/null ; then # Remove the LVM configuration if [ -f "${LVM_CONFIG}" ] ; then rm -f "${LVM_CONFIG}" - systemctl daemon-reload fi + # Remove the TopoLVM configuration + rm -f "${TOPOLVM_CONFIG}" + rm -f "${TOPOLVM_PATCH_SCRIPT}" + rm -rf "${TOPOLVM_PATCH_DIR}" + systemctl daemon-reload + dnf remove -y 'microshift*' # Undo post-installation configuration rm -f /etc/sysctl.d/99-microshift.conf diff --git a/src/quickrpm.sh b/src/quickrpm.sh index 16c5afd4..a0890c3b 100755 --- a/src/quickrpm.sh +++ b/src/quickrpm.sh @@ -9,7 +9,8 @@ RPM_SOURCE=${RPM_SOURCE:-github} # Accepted values: github, copr-nightly COPR_REPO=${COPR_REPO:-@microshift-io/microshift-nightly} LVM_DISK="/var/lib/microshift-okd/lvmdisk.image" -VG_NAME="myvg1" +VG_NAME="${VG_NAME:-myvg1}" +SPARE_GB="${SPARE_GB:-10}" WORKDIR=$(mktemp -d /tmp/microshift-quickrpm-XXXXXX) trap 'rm -rf "${WORKDIR}"' EXIT @@ -144,6 +145,29 @@ EOF systemctl daemon-reload } +function setup_topolvm_config() { + local -r vg_name="$1" + local -r spare_gb="$2" + + # Install the TopoLVM configuration patch script if not already present + if [ ! -x /usr/local/bin/patch_lvmd_config.sh ]; then + curl -fSsL --retry 5 --max-time 60 \ + "https://github.com/${OWNER}/${REPO}/raw/${BRANCH}/src/topolvm/patch_lvmd_config.sh" \ + -o /usr/local/bin/patch_lvmd_config.sh + chmod +x /usr/local/bin/patch_lvmd_config.sh + fi + + # Create systemd drop-in to run the patch script with VG_NAME and SPARE_GB + mkdir -p /etc/systemd/system/microshift.service.d + cat > /etc/systemd/system/microshift.service.d/00-patch-lvmd.conf <&2 + exit 1 +fi + +PATCH_DIR="/etc/microshift/manifests.d/001-microshift-topolvm" + +# Only create the patch if non-default values are specified +if [ "${VG_NAME}" = "myvg1" ] && [ "${SPARE_GB}" = "10" ]; then + # Clean up any stale patch files from previous runs with custom values + rm -rf "${PATCH_DIR}" + exit 0 +fi + +mkdir -p "${PATCH_DIR}" + +# Create ConfigMap as a resource (not a patch) for MicroShift to apply +cat > "${PATCH_DIR}/topolvm-lvmd-configmap.yaml" < "${PATCH_DIR}/kustomization.yaml" <