Distro Compatibility Tests #21
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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`); | |
| } |