Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
32e2e35
feat: remove Helm charts and keep only operator-based deployment
raballew Apr 9, 2026
982fbf9
fix: propagate RuntimeError in check_jumpstarter_installation instead…
raballew Apr 9, 2026
5703171
fix: remove stale noqa C901 complexity suppression from check_jumpsta…
raballew Apr 9, 2026
7d81dbd
fix: remove stale METHOD=helm references from root Makefile
raballew Apr 9, 2026
68b3370
fix: remove vestigial chart_name field from V1Alpha1JumpstarterInstance
raballew Apr 9, 2026
5bddf6b
fix: correct stale default version comment in compat setup script
raballew Apr 9, 2026
8e6fc6d
fix: update version discovery to query operator image repo instead of…
raballew Apr 9, 2026
1b33888
fix: fail fast when Jumpstarter CR baseDomain is not found in compat …
raballew Apr 9, 2026
da45f15
fix: remove vestigial METHOD variable from Makefiles
raballew Apr 9, 2026
eb514ef
fix: remove vestigial METHOD deployment abstraction
raballew Apr 9, 2026
4fbbf94
fix: remove old-controller compat test (v0.7.0 has no operator instal…
raballew Apr 9, 2026
0be9480
Revert "fix: remove old-controller compat test (v0.7.0 has no operato…
raballew Apr 11, 2026
d6beafd
fix: deploy old controller v0.8.1 via operator installer in compat tests
raballew Apr 11, 2026
0abe23b
fix: remove stale bats test file re-added by revert
raballew Apr 11, 2026
075b1ee
fix: address CodeRabbit review findings
raballew Apr 11, 2026
67b3edd
fix: fail fast when baseDomain is empty in e2e setup
raballew Apr 11, 2026
cbdc07a
fix: load operator image in e2e-compat-old-client CI job
raballew Apr 11, 2026
54f6c02
fix: use client version 0.7.4 for old-client compat test
raballew Apr 11, 2026
1b4ceb0
fix: use correct kustomize image name and require CR instances for in…
raballew Apr 13, 2026
4e27ff1
test: add coverage for helm-removal changes in kubectl, operations, a…
raballew Apr 16, 2026
76b85fb
fix: resolve lint violations and improve test coverage for helm-remov…
raballew Apr 16, 2026
9d63523
fix: add coverage source config for proper diff-cover path resolution
raballew Apr 17, 2026
e73eea0
fix: surface error information from _check_cr_instances instead of sw…
raballew Apr 30, 2026
b5ef0c6
fix: narrow exception handling in get_cluster_info to avoid masking p…
raballew Apr 30, 2026
6af54d5
fix: F001 - surface error on nonzero return code in _check_cr_instanc…
raballew Apr 30, 2026
102a78f
fix: F002 - narrow list_clusters exception clause to avoid masking pr…
raballew Apr 30, 2026
4041f40
test: exercise custom minikube path in test_list_clusters_custom_para…
raballew May 12, 2026
9cf659e
fix: propagate kubectl errors in compat setup baseDomain fetch
raballew May 12, 2026
0478adf
fix: return explicit installed False from _check_cr_instances on empt…
raballew May 12, 2026
915912a
fix: scope BASEDOMAIN and endpoint vars as local in deploy_old_contro…
raballew May 12, 2026
cc5b263
test: cover CR instance check error path in check_jumpstarter_install…
raballew May 12, 2026
0e2390f
test: add mock-based tests for controller version resolution
raballew May 12, 2026
c1471f6
fix: correct get_kubectl_contexts return type to List[Dict[str, Any]]
raballew May 12, 2026
86cc4b7
fix: use Optional[OutputCallback] for nullable callback parameters
raballew May 12, 2026
ab3c371
fix: enable branch coverage in coverage configuration
raballew May 12, 2026
00a7e11
fix: add CrInstanceResult TypedDict and include installed in all erro…
raballew May 12, 2026
1e3d5a0
fix: define KubectlContext TypedDict for get_kubectl_contexts return …
raballew May 12, 2026
600e526
fix: extract actual namespace from CR metadata in _check_cr_instances
raballew May 12, 2026
4f8112e
fix: remove unreachable json.JSONDecodeError from outer except clauses
raballew May 12, 2026
65e4ca3
fix: remove unused kind parameter from list_clusters
raballew May 12, 2026
b0d47dc
test: verify install_jumpstarter_operator arguments in default path
raballew May 12, 2026
84d1751
fix: correct COMPAT_CLIENT_VERSION default in header comment
raballew May 12, 2026
49e876a
fix: add status to empty CR result and narrow exception handler in ge…
raballew May 12, 2026
ea9217f
refactor: use typed result variants for _check_cr_instances return value
raballew May 12, 2026
5d1d961
fix: use type narrowing in _apply_cr_result instead of .get()
raballew May 12, 2026
f71d16d
fix: resolve ruff lint violations
raballew May 12, 2026
38819b4
fix: use shared WaitForExporter in compat tests
raballew May 12, 2026
04ca25d
fix: remove unused --kind CLI option from get cluster commands
raballew May 12, 2026
e0032b2
fix: use KubectlContext type annotation consistently
raballew May 12, 2026
f2b8b8f
fix: delegate controller Makefile targets to operator Makefile
raballew May 12, 2026
54c2211
Revert "fix: delegate controller Makefile targets to operator Makefile"
raballew May 12, 2026
b4cea71
fix: restore controller Makefile's own config paths
raballew May 12, 2026
233f042
Update e2e/compat/setup.sh
raballew May 13, 2026
dc3f02e
Update e2e/compat/setup.sh
raballew May 13, 2026
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
1 change: 0 additions & 1 deletion .cursor/rules/working-with-operator.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ controller/
│ │ ├── bundle/ # OLM bundle manifests
│ │ ├── test/e2e/ # E2E tests
│ │ └── Makefile # Operator-specific make targets
│ └── helm/ # Helm charts (alternative deployment)
├── api/ # Jumpstarter core CRDs (Client, Exporter, Lease, etc.)
├── internal/ # Controller business logic
│ └── config/ # Config structs used by controller
Expand Down
39 changes: 0 additions & 39 deletions .github/workflows/build-images.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -273,42 +273,3 @@ jobs:
});
}

publish-helm-charts:
needs: build-and-push-image
if: ${{ github.repository_owner == 'jumpstarter-dev' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/release-')) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Get version
run: |
VERSION=$(git describe --tags)
VERSION=${VERSION#v} # remove the leading v prefix for version
echo "VERSION=${VERSION}" >> $GITHUB_ENV
echo "VERSION=${VERSION}"

- name: Build helm charts
run: |
echo packaging ${VERSION}
# patch the sub-chart app-version, because helm package won't do it
sed -i "s/^appVersion:.*/appVersion: $VERSION/" controller/deploy/helm/jumpstarter/charts/jumpstarter-controller/Chart.yaml
helm package ./controller/deploy/helm/jumpstarter --version "${VERSION}" --app-version "${VERSION}"

- name: Login helm
env:
PASSWORD: ${{ secrets.QUAY_TOKEN }}
USER: jumpstarter-dev+jumpstarter_ci
run:
helm registry login quay.io -u ${USER} -p ${PASSWORD}

- name: Push helm charts
run: |
helm push jumpstarter-*.tgz oci://${{ env.QUAY_ORG }}/helm

if [[ "${{ github.ref }}" == "refs/heads/release-*" ]]; then
RELEASE_BRANCH_NAME=$(basename "${{ github.ref }}")
helm chart save jumpstarter-*.tgz ${{ env.QUAY_ORG }}/helm:${RELEASE_BRANCH_NAME}
helm chart push ${{ env.QUAY_ORG }}/helm:${RELEASE_BRANCH_NAME}
fi
9 changes: 1 addition & 8 deletions .github/workflows/controller-kind.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,16 @@ on:

jobs:
deploy-kind:
strategy:
matrix:
method:
- helm
- operator
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Run make deploy (${{ matrix.method }})
- name: Run make deploy
working-directory: controller
run: make deploy
env:
METHOD: ${{ matrix.method }}

e2e-test-operator:
runs-on: ubuntu-latest
Expand Down
37 changes: 19 additions & 18 deletions .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,6 @@ jobs:
run: make e2e-setup
env:
CI: true
METHOD: operator
SKIP_BUILD: "true"
PREBUILT_WHEELS_DIR: /tmp/python-wheels
OPERATOR_IMG: quay.io/jumpstarter-dev/jumpstarter-operator:latest
Expand All @@ -240,15 +239,13 @@ jobs:
run: make e2e-run
env:
CI: true
METHOD: operator

# ============================================================================
# Compatibility tests: cross-version interop between controller and client/exporter
# These jobs can be removed once 0.7.x controller support is no longer needed.
# ============================================================================

e2e-compat-old-controller:
needs: [changes, build-python-wheels]
needs: changes
if: needs.changes.outputs.should_run == 'true' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-24.04
timeout-minutes: 60
Expand All @@ -264,26 +261,19 @@ jobs:
with:
go-version: "1.22"

- name: Download python wheels
uses: actions/download-artifact@v4
with:
name: python-wheels
path: /tmp/python-wheels

- name: Setup compat environment (old controller v0.7.0)
- name: Setup compat environment (old controller v0.8.1)
run: make e2e-compat-setup COMPAT_SCENARIO=old-controller
env:
CI: true
COMPAT_CONTROLLER_TAG: v0.7.0
PREBUILT_WHEELS_DIR: /tmp/python-wheels
COMPAT_CONTROLLER_TAG: v0.8.1

- name: Run compat tests (old controller + new client/exporter)
run: make e2e-compat-run COMPAT_TEST=old-controller
env:
CI: true

e2e-compat-old-client:
needs: [changes, build-controller-image, build-python-wheels]
needs: [changes, build-controller-image, build-operator-image, build-python-wheels]
if: needs.changes.outputs.should_run == 'true' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-24.04
timeout-minutes: 60
Expand All @@ -305,22 +295,33 @@ jobs:
name: controller-image-amd64
path: /tmp/artifacts

- name: Download operator image
uses: actions/download-artifact@v4
with:
name: operator-image-amd64
path: /tmp/artifacts

- name: Download python wheels
uses: actions/download-artifact@v4
with:
name: python-wheels
path: /tmp/python-wheels

- name: Load controller image
run: docker load < /tmp/artifacts/controller-image.tar
- name: Load container images and operator manifest
run: |
docker load < /tmp/artifacts/controller-image.tar
docker load < /tmp/artifacts/operator-image.tar
mkdir -p controller/deploy/operator/dist
cp /tmp/artifacts/operator-install.yaml controller/deploy/operator/dist/install.yaml

- name: Setup compat environment (old client v0.7.0)
- name: Setup compat environment (old client v0.7.4)
run: make e2e-compat-setup COMPAT_SCENARIO=old-client
env:
CI: true
COMPAT_CLIENT_VERSION: "0.7.1"
COMPAT_CLIENT_VERSION: "0.7.4"
SKIP_BUILD: "true"
PREBUILT_WHEELS_DIR: /tmp/python-wheels
OPERATOR_IMG: quay.io/jumpstarter-dev/jumpstarter-operator:latest

- name: Run compat tests (new controller + old client/exporter)
run: make e2e-compat-run COMPAT_TEST=old-client
Expand Down
18 changes: 0 additions & 18 deletions .github/workflows/lint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ jobs:
runs-on: ubuntu-latest
outputs:
controller: ${{ steps.filter.outputs.controller }}
helm: ${{ steps.filter.outputs.helm }}
protocol: ${{ steps.filter.outputs.protocol }}
python: ${{ steps.filter.outputs.python }}
steps:
Expand All @@ -31,9 +30,6 @@ jobs:
controller:
- 'controller/**'
- '.github/workflows/lint.yaml'
helm:
- 'controller/deploy/helm/**'
- '.github/workflow/lint.yaml'
protocol:
- 'protocol/**'
- '.github/workflows/lint.yaml'
Expand All @@ -60,20 +56,6 @@ jobs:
working-directory: controller
run: make lint

lint-helm:
needs: changes
if: needs.changes.outputs.helm == 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Run helm linter
working-directory: controller
run: make lint-helm

lint-protobuf:
needs: changes
if: needs.changes.outputs.protocol == 'true'
Expand Down
20 changes: 7 additions & 13 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@
# Subdirectories containing projects
SUBDIRS := python protocol controller e2e

# Deployment method for e2e tests: operator (default) or helm
METHOD ?= operator

# Default target
.PHONY: all
all: build
Expand All @@ -33,9 +30,6 @@ help:
@echo " make e2e-full - Full setup + run (for CI or first time)"
@echo " make e2e-clean - Clean up e2e test environment (delete cluster, certs, etc.)"
@echo ""
@echo " Use METHOD=operator (default) or METHOD=helm to select deployment method"
@echo " Example: make e2e-setup METHOD=helm"
@echo ""
@echo "Per-project targets:"
@echo " make build-<project> - Build specific project"
@echo " make test-<project> - Test specific project"
Expand Down Expand Up @@ -121,14 +115,14 @@ test-controller:
# Setup e2e testing environment (one-time)
.PHONY: e2e-setup
e2e-setup:
@echo "Setting up e2e test environment (method: $(METHOD))..."
@METHOD=$(METHOD) bash e2e/setup-e2e.sh
@echo "Setting up e2e test environment..."
@bash e2e/setup-e2e.sh

# Run e2e tests
.PHONY: e2e-run
e2e-run:
@echo "Running e2e tests (method: $(METHOD))..."
@METHOD=$(METHOD) bash e2e/run-e2e.sh
@echo "Running e2e tests..."
@bash e2e/run-e2e.sh

# Convenience alias for running e2e tests
.PHONY: e2e
Expand All @@ -137,7 +131,7 @@ e2e: e2e-run
# Full e2e setup + run
.PHONY: e2e-full
e2e-full:
@METHOD=$(METHOD) bash e2e/run-e2e.sh --full
@bash e2e/run-e2e.sh --full

# Clean up e2e test environment
.PHONY: e2e-clean
Expand Down Expand Up @@ -172,8 +166,8 @@ test-e2e: e2e-run
# Compatibility E2E testing (cross-version tests, separate from main e2e)
COMPAT_SCENARIO ?= old-controller
COMPAT_TEST ?= old-controller
COMPAT_CONTROLLER_TAG ?= v0.7.0
COMPAT_CLIENT_VERSION ?= 0.7.1
COMPAT_CONTROLLER_TAG ?= v0.8.1
COMPAT_CLIENT_VERSION ?= 0.7.4

.PHONY: e2e-compat-setup
e2e-compat-setup:
Expand Down
37 changes: 4 additions & 33 deletions controller/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,6 @@ endif
# tools. (i.e. podman)
CONTAINER_TOOL ?= podman

# Deployment method: operator (default) or helm
METHOD ?= operator

# Cluster type: kind (default) or k3s
CLUSTER_TYPE ?= kind
export CLUSTER_TYPE
Expand Down Expand Up @@ -67,17 +64,8 @@ help: ## Display this help.
.PHONY: manifests
manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
$(CONTROLLER_GEN) rbac:roleName=jumpstarter-manager-role crd webhook paths="./api/..." paths="./internal/..." \
output:crd:artifacts:config=deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/crds/ \
output:rbac:artifacts:config=deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/rbac/

# Add ArgoCD sync-wave annotation to RBAC role for proper deployment ordering (PR #207)
@awk '/^ name: jumpstarter-manager-role$$/{print; print " annotations:"; print " argocd.argoproj.io/sync-wave: \"-1\""; next}1' \
deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/rbac/role.yaml > \
deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/rbac/role.yaml.tmp && \
mv deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/rbac/role.yaml.tmp \
deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/rbac/role.yaml

cp deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/crds/* deploy/operator/config/crd/bases/
output:crd:artifacts:config=deploy/operator/config/crd/bases/ \
output:rbac:artifacts:config=deploy/operator/config/rbac/
Comment thread
coderabbitai[bot] marked this conversation as resolved.

# Regenerate operator install.yaml to include updated CRDs
$(MAKE) -C deploy/operator build-installer
Expand Down Expand Up @@ -188,25 +176,13 @@ uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified
$(KUSTOMIZE) build config/crd | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f -

.PHONY: deploy
deploy: cluster grpcurl ## Deploy controller using METHOD (operator or helm). Set SKIP_BUILD=1 to skip image builds.
deploy: cluster grpcurl ## Deploy controller using the operator. Set SKIP_BUILD=1 to skip image builds. Set CLUSTER_TYPE=k3s for k3s.
ifeq ($(SKIP_BUILD),)
$(MAKE) docker-build
endif
ifeq ($(METHOD),operator)
ifeq ($(SKIP_BUILD),)
$(MAKE) build-operator
endif
./hack/deploy_with_operator.sh
else ifeq ($(METHOD),helm)
./hack/deploy_with_helm.sh
else
$(error Unknown METHOD=$(METHOD). Use 'operator' or 'helm')
endif

# Backward compatibility alias
.PHONY: deploy-with-operator
deploy-with-operator:
$(MAKE) deploy METHOD=operator

.PHONY: deploy-operator
deploy-operator: docker-build build-operator cluster grpcurl ## Deploy only the operator (without Jumpstarter CR)
Expand All @@ -221,17 +197,12 @@ operator-logs:

.PHONY: deploy-with-operator-parallel
deploy-with-operator-parallel:
make deploy METHOD=operator -j5 --output-sync=target
make deploy -j5 --output-sync=target

.PHONY: deploy-exporters
deploy-exporters:
./hack/demoenv/prepare_exporters.sh

.PHONY: lint-helm
lint-helm:
helm lint deploy/helm/jumpstarter


.PHONY: undeploy
undeploy: kustomize ## Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion.
$(KUSTOMIZE) build config/default | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f -
Expand Down
23 changes: 0 additions & 23 deletions controller/deploy/helm/jumpstarter/.helmignore

This file was deleted.

9 changes: 0 additions & 9 deletions controller/deploy/helm/jumpstarter/Chart.yaml

This file was deleted.

This file was deleted.

Loading
Loading