Skip to content

Distro Compatibility Tests #22

Distro Compatibility Tests

Distro Compatibility Tests #22

name: Distro Compatibility Tests
on:
# Manual trigger for testing on different K8s distros
workflow_dispatch:
inputs:
distro:
description: 'Kubernetes distribution to test'
required: false
default: 'all'
type: choice
options:
- all
- k3s
- k0s
- kubesolo
- minikube
- talos
- microk8s
protocol:
description: 'Protocol to test'
required: false
default: 'all'
type: choice
options:
- all
- nfs
- nvmeof
- iscsi
# Run weekly to catch distro-specific issues
schedule:
- cron: '0 3 * * 0' # 3 AM UTC every Sunday
# Restrict permissions to minimum required
permissions:
contents: read
# Ensure only one distro test runs at a time
concurrency:
group: distro-compatibility-tests
cancel-in-progress: false
jobs:
# ==========================================
# Setup Phase
# ==========================================
compute-tag:
name: Compute Image Tag
runs-on: new
outputs:
image_tag: ${{ steps.tag.outputs.tag }}
steps:
- name: Compute image tag from branch
id: tag
run: |
BRANCH="${{ github.ref_name }}"
if [ "$BRANCH" = "main" ]; then
TAG="latest"
else
TAG=$(echo "$BRANCH" | sed 's/\//-/g')
fi
echo "tag=$TAG" >> $GITHUB_OUTPUT
echo "Using image tag: $TAG (from branch: $BRANCH)"
# ==========================================
# K3s Tests
# ==========================================
k3s-nfs:
name: "K3s: NFS"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'k3s' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nfs' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-k3s@v5.0.1
with:
k3s-args: '--write-kubeconfig-mode 644 --disable=traefik --disable=local-storage'
- name: Run Basic NFS Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nfs
run: ./tests/integration/test-distro-basic.sh
k3s-nvmeof:
name: "K3s: NVMe-oF"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'k3s' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nvmeof' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-k3s@v5.0.1
with:
k3s-args: '--write-kubeconfig-mode 644 --disable=traefik --disable=local-storage'
- name: Run Basic NVMe-oF Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nvmeof
run: ./tests/integration/test-distro-basic.sh
k3s-iscsi:
name: "K3s: iSCSI"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'k3s' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'iscsi' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-k3s@v5.0.1
with:
k3s-args: '--write-kubeconfig-mode 644 --disable=traefik --disable=local-storage'
- name: Run Basic iSCSI Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: iscsi
run: ./tests/integration/test-distro-basic.sh
# ==========================================
# K0s Tests
# ==========================================
k0s-nfs:
name: "K0s: NFS"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'k0s' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nfs' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-k0s@v5.0.1
with:
version: v1.34.3+k0s.0
- name: Run Basic NFS Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nfs
KUBELET_PATH: /var/lib/k0s/kubelet
run: ./tests/integration/test-distro-basic.sh
k0s-nvmeof:
name: "K0s: NVMe-oF"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'k0s' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nvmeof' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-k0s@v5.0.1
with:
version: v1.34.3+k0s.0
- name: Run Basic NVMe-oF Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nvmeof
KUBELET_PATH: /var/lib/k0s/kubelet
run: ./tests/integration/test-distro-basic.sh
k0s-iscsi:
name: "K0s: iSCSI"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'k0s' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'iscsi' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-k0s@v5.0.1
with:
version: v1.34.3+k0s.0
- name: Run Basic iSCSI Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: iscsi
KUBELET_PATH: /var/lib/k0s/kubelet
run: ./tests/integration/test-distro-basic.sh
# ==========================================
# KubeSolo Tests
# ==========================================
kubesolo-nfs:
name: "KubeSolo: NFS"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'kubesolo' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nfs' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-kubesolo@v5.0.4
with:
version: v1.1.0
- name: Debug KubeSolo on failure
if: failure()
run: |
echo "=== KubeSolo Service Status ==="
sudo systemctl status kubesolo || true
echo "=== KubeSolo Journalctl Logs ==="
sudo journalctl -u kubesolo -n 200 --no-pager || true
echo "=== System Journal (last 5 minutes) ==="
sudo journalctl --since "5 minutes ago" -n 100 --no-pager || true
- name: Run Basic NFS Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nfs
KUBELET_PATH: /var/lib/kubesolo/kubelet
run: ./tests/integration/test-distro-basic.sh
kubesolo-nvmeof:
name: "KubeSolo: NVMe-oF"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'kubesolo' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nvmeof' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-kubesolo@v5.0.4
with:
version: v1.1.0
- name: Debug KubeSolo on failure
if: failure()
run: |
echo "=== KubeSolo Service Status ==="
sudo systemctl status kubesolo || true
echo "=== KubeSolo Journalctl Logs ==="
sudo journalctl -u kubesolo -n 200 --no-pager || true
echo "=== System Journal (last 5 minutes) ==="
sudo journalctl --since "5 minutes ago" -n 100 --no-pager || true
- name: Run Basic NVMe-oF Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nvmeof
KUBELET_PATH: /var/lib/kubesolo/kubelet
run: ./tests/integration/test-distro-basic.sh
kubesolo-iscsi:
name: "KubeSolo: iSCSI"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'kubesolo' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'iscsi' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-kubesolo@v5.0.4
with:
version: v1.1.0
- name: Debug KubeSolo on failure
if: failure()
run: |
echo "=== KubeSolo Service Status ==="
sudo systemctl status kubesolo || true
echo "=== KubeSolo Journalctl Logs ==="
sudo journalctl -u kubesolo -n 200 --no-pager || true
echo "=== System Journal (last 5 minutes) ==="
sudo journalctl --since "5 minutes ago" -n 100 --no-pager || true
- name: Run Basic iSCSI Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: iscsi
KUBELET_PATH: /var/lib/kubesolo/kubelet
run: ./tests/integration/test-distro-basic.sh
# ==========================================
# Minikube Tests
# ==========================================
minikube-nfs:
name: "Minikube: NFS"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'minikube' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nfs' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-minikube@v5.0.5
with:
driver: docker
- name: Run Basic NFS Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nfs
run: ./tests/integration/test-distro-basic.sh
minikube-nvmeof:
name: "Minikube: NVMe-oF"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'minikube' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nvmeof' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-minikube@v5.0.5
with:
driver: none
- name: Run Basic NVMe-oF Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nvmeof
run: ./tests/integration/test-distro-basic.sh
minikube-iscsi:
name: "Minikube: iSCSI"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'minikube' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'iscsi' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-minikube@v5.0.5
with:
driver: none
- name: Run Basic iSCSI Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: iscsi
run: ./tests/integration/test-distro-basic.sh
# ==========================================
# Talos Tests
# ==========================================
talos-nfs:
name: "Talos: NFS"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'talos' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nfs' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-talos@v6.2.7
with:
version: v1.12.1
- name: Run Basic NFS Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nfs
KUBELET_PATH: /var/lib/kubelet
run: ./tests/integration/test-distro-basic.sh
talos-nvmeof:
name: "Talos: NVMe-oF"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'talos' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nvmeof' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-talos@v6.2.7
with:
version: v1.12.1
load-nvme-modules: 'true'
mount-dev: 'true'
- name: Run Basic NVMe-oF Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nvmeof
KUBELET_PATH: /var/lib/kubelet
run: ./tests/integration/test-distro-basic.sh
talos-iscsi:
name: "Talos: iSCSI (QEMU)"
runs-on: new
timeout-minutes: 25
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'talos' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'iscsi' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-talos@v6.2.7
with:
version: v1.12.1
provisioner: qemu
nodes: '1'
iscsi-tools: 'true'
- name: Run Basic iSCSI Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: iscsi
KUBELET_PATH: /var/lib/kubelet
run: ./tests/integration/test-distro-basic.sh
# ==========================================
# MicroK8s Tests
# ==========================================
microk8s-nfs:
name: "MicroK8s: NFS"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'microk8s' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nfs' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-microk8s@v5.0.1
- name: Run Basic NFS Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nfs
KUBELET_PATH: /var/snap/microk8s/common/var/lib/kubelet
run: ./tests/integration/test-distro-basic.sh
microk8s-nvmeof:
name: "MicroK8s: NVMe-oF"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'microk8s' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'nvmeof' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-microk8s@v5.0.1
- name: Run Basic NVMe-oF Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: nvmeof
KUBELET_PATH: /var/snap/microk8s/common/var/lib/kubelet
run: ./tests/integration/test-distro-basic.sh
microk8s-iscsi:
name: "MicroK8s: iSCSI"
runs-on: new
timeout-minutes: 15
needs: compute-tag
if: |
(github.event.inputs.distro == 'all' || github.event.inputs.distro == 'microk8s' || github.event.inputs.distro == '') &&
(github.event.inputs.protocol == 'all' || github.event.inputs.protocol == 'iscsi' || github.event.inputs.protocol == '')
steps:
- uses: actions/checkout@v6
- name: Checkout Helm chart
uses: actions/checkout@v6
with:
repository: nasty-project/nasty-chart
token: ${{ secrets.NASTY_PAT }}
path: nasty-chart
- uses: fenio/setup-microk8s@v5.0.1
- name: Run Basic iSCSI Test
env:
NASTY_HOST: ${{ secrets.NASTY_HOST }}
NASTY_API_KEY: ${{ secrets.NASTY_API_KEY }}
NASTY_FILESYSTEM: ${{ secrets.NASTY_FILESYSTEM }}
CSI_CHART_PATH: ${{ github.workspace }}/nasty-chart
CSI_IMAGE_TAG: ${{ needs.compute-tag.outputs.image_tag }}
TEST_PROTOCOL: iscsi
KUBELET_PATH: /var/snap/microk8s/common/var/lib/kubelet
run: ./tests/integration/test-distro-basic.sh
# ==========================================
# Summary
# ==========================================
test-summary:
name: "Distro Test Summary"
runs-on: new
timeout-minutes: 5
needs: [k3s-nfs, k3s-nvmeof, k3s-iscsi, k0s-nfs, k0s-nvmeof, k0s-iscsi, kubesolo-nfs, kubesolo-nvmeof, kubesolo-iscsi, minikube-nfs, minikube-nvmeof, minikube-iscsi, talos-nfs, talos-nvmeof, talos-iscsi, microk8s-nfs, microk8s-nvmeof, microk8s-iscsi]
if: always()
steps:
- name: Generate Test Summary
uses: actions/github-script@v8
with:
script: |
const distroResults = {
'K3s': {
'NFS': '${{ needs.k3s-nfs.result }}',
'NVMe-oF': '${{ needs.k3s-nvmeof.result }}',
'iSCSI': '${{ needs.k3s-iscsi.result }}'
},
'K0s': {
'NFS': '${{ needs.k0s-nfs.result }}',
'NVMe-oF': '${{ needs.k0s-nvmeof.result }}',
'iSCSI': '${{ needs.k0s-iscsi.result }}'
},
'KubeSolo': {
'NFS': '${{ needs.kubesolo-nfs.result }}',
'NVMe-oF': '${{ needs.kubesolo-nvmeof.result }}',
'iSCSI': '${{ needs.kubesolo-iscsi.result }}'
},
'Minikube': {
'NFS': '${{ needs.minikube-nfs.result }}',
'NVMe-oF': '${{ needs.minikube-nvmeof.result }}',
'iSCSI': '${{ needs.minikube-iscsi.result }}'
},
'Talos': {
'NFS': '${{ needs.talos-nfs.result }}',
'NVMe-oF': '${{ needs.talos-nvmeof.result }}',
'iSCSI': '${{ needs.talos-iscsi.result }}'
},
'MicroK8s': {
'NFS': '${{ needs.microk8s-nfs.result }}',
'NVMe-oF': '${{ needs.microk8s-nvmeof.result }}',
'iSCSI': '${{ needs.microk8s-iscsi.result }}'
}
};
const getIcon = (result) => {
switch(result) {
case 'success': return '✅';
case 'failure': return '❌';
case 'skipped': return '⏭️';
case 'cancelled': return '🚫';
default: return '⚪';
}
};
let totalPassed = 0;
let totalFailed = 0;
let totalSkipped = 0;
for (const distro of Object.keys(distroResults)) {
for (const protocol of Object.keys(distroResults[distro])) {
const result = distroResults[distro][protocol];
if (result === 'success') totalPassed++;
else if (result === 'failure') totalFailed++;
else if (result === 'skipped') totalSkipped++;
}
}
const totalTests = 18; // 6 distros × 3 protocols
let summary = `# Kubernetes Distribution Compatibility Results\n\n`;
// Overall status banner
if (totalFailed > 0) {
summary += `> ### ${totalFailed} test(s) failed\n\n`;
} else if (totalPassed === totalTests) {
summary += `> ### All distribution tests passed!\n\n`;
} else {
summary += `> ### ${totalPassed}/${totalPassed + totalFailed} tests passed (${totalSkipped} skipped)\n\n`;
}
// Quick stats
summary += `| Passed | Failed | Skipped | Total |\n`;
summary += `|:------:|:------:|:-------:|:-----:|\n`;
summary += `| ${totalPassed} | ${totalFailed} | ${totalSkipped} | ${totalTests} |\n\n`;
// Distribution results table
summary += `## Distribution Compatibility Matrix\n\n`;
summary += `| Distribution | NFS | NVMe-oF | iSCSI |\n`;
summary += `|--------------|:---:|:-------:|:-----:|\n`;
for (const [distro, protocols] of Object.entries(distroResults)) {
summary += `| ${distro} | ${getIcon(protocols['NFS'])} | ${getIcon(protocols['NVMe-oF'])} | ${getIcon(protocols['iSCSI'])} |\n`;
}
summary += `\n## Test Details\n\n`;
summary += `These tests verify basic CSI driver functionality:\n`;
summary += `- Driver deployment and pod readiness\n`;
summary += `- PVC creation and binding\n`;
summary += `- Pod creation with volume mount\n`;
summary += `- Basic I/O operations (read/write)\n`;
summary += `- Volume cleanup\n\n`;
summary += `### Tested on:\n`;
summary += `- **K3s**: Lightweight Kubernetes by Rancher\n`;
summary += `- **K0s**: Zero-friction Kubernetes by Mirantis\n`;
summary += `- **KubeSolo**: Single-node Kubernetes\n`;
summary += `- **Minikube**: Local Kubernetes for development\n`;
summary += `- **Talos**: Secure, immutable Kubernetes OS\n`;
summary += `- **MicroK8s**: Lightweight Kubernetes by Canonical\n`;
// Write to job summary
await core.summary.addRaw(summary).write();
// Fail if any test failed
if (totalFailed > 0) {
core.setFailed(`${totalFailed} test(s) failed`);
}