Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions .github/actions/quick-rpm-clean/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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.
Expand Down
3 changes: 2 additions & 1 deletion .github/actions/quick-start-clean/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 17 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,14 +159,30 @@ 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:
- Creates podman network for node communication
- 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

Expand Down
21 changes: 11 additions & 10 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand Down Expand Up @@ -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 ; \
Expand All @@ -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 ; \
Expand All @@ -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:
Expand Down
5 changes: 5 additions & 0 deletions ansible/roles/microshift-okd-bootc/defaults/main.yaml
Original file line number Diff line number Diff line change
@@ -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
10 changes: 5 additions & 5 deletions ansible/roles/microshift-okd-bootc/tasks/topolvm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 0 additions & 3 deletions ansible/roles/microshift-okd-bootc/vars/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
7 changes: 7 additions & 0 deletions packaging/bootc.Containerfile
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
3 changes: 3 additions & 0 deletions src/cluster_manager.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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}"

Expand Down Expand Up @@ -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}" \
Expand Down
12 changes: 10 additions & 2 deletions src/quickclean.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
28 changes: 27 additions & 1 deletion src/quickrpm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 <<EOF
[Service]
Environment=VG_NAME=${vg_name}
Environment=SPARE_GB=${spare_gb}
ExecStartPre=/usr/local/bin/patch_lvmd_config.sh
EOF
systemctl daemon-reload
}

function start_microshift() {
"${WORKDIR}/postinstall.sh"
systemctl start microshift.service
Expand Down Expand Up @@ -185,13 +209,15 @@ copr-nightly)
esac
prepare_lvm_disk "${LVM_DISK}" "${VG_NAME}"
setup_lvm_service "${LVM_DISK}" "${VG_NAME}"
setup_topolvm_config "${VG_NAME}" "${SPARE_GB}"
start_microshift

# Follow-up instructions
echo
echo "MicroShift is running on the host"
echo "LVM disk: ${LVM_DISK}"
echo "VG name: ${VG_NAME}"
echo "Spare GB: ${SPARE_GB}"
echo
echo "To verify that MicroShift pods are up and running, run the following command:"
echo " - sudo oc get pods -A --kubeconfig /var/lib/microshift/resources/kubeadmin/kubeconfig"
Expand Down
5 changes: 4 additions & 1 deletion src/quickstart.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ IMAGE=${IMAGE:-"ghcr.io/${OWNER}/${REPO}"}
TAG=${TAG:-latest}

LVM_DISK="/var/lib/microshift-okd/lvmdisk.image"
VG_NAME="myvg1"
VG_NAME="${VG_NAME:-myvg1}"
SPARE_GB="${SPARE_GB:-10}"

function pull_bootc_image() {
local -r image_ref="$1"
Expand Down Expand Up @@ -61,6 +62,8 @@ function run_bootc_image() {
podman run --privileged --rm -d \
--replace \
${vol_opts} \
-e VG_NAME="${VG_NAME}" \
-e SPARE_GB="${SPARE_GB}" \
--name microshift-okd \
--hostname 127.0.0.1.nip.io \
"${image_ref}"
Expand Down
65 changes: 65 additions & 0 deletions src/topolvm/patch_lvmd_config.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/bin/bash
# Patches TopoLVM ConfigMap with user-specified VG_NAME and SPARE_GB
# This script is executed as ExecStartPre in the microshift.service to
# configure TopoLVM with custom volume group name and spare-gb settings.
set -euo pipefail

# Read environment variables from /proc/1/environ (container's init process)
# since systemd services don't automatically inherit container environment
if [ -f /proc/1/environ ]; then
for var in VG_NAME SPARE_GB; do
value=$(tr '\0' '\n' < /proc/1/environ | grep "^${var}=" | cut -d= -f2- || true)
if [ -n "${value}" ]; then
export "${var}=${value}"
fi
done
fi

VG_NAME="${VG_NAME:-myvg1}"
SPARE_GB="${SPARE_GB:-10}"

# Validate SPARE_GB is a non-negative integer
if ! [[ "${SPARE_GB}" =~ ^[0-9]+$ ]]; then
echo "ERROR: SPARE_GB must be a non-negative integer, got '${SPARE_GB}'" >&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" <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: topolvm-lvmd-0
namespace: topolvm-system
labels:
app.kubernetes.io/instance: topolvm
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: topolvm
idx: "0"
data:
lvmd.yaml: |
socket-name: /run/topolvm/lvmd.sock
device-classes:
- default: true
name: ssd
spare-gb: ${SPARE_GB}
volume-group: ${VG_NAME}
EOF

cat > "${PATCH_DIR}/kustomization.yaml" <<EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- topolvm-lvmd-configmap.yaml
EOF