Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
8439aeb
chore: prep work for v2
AbdelrhmanHamouda Jan 16, 2026
cb5c9bf
feat: scaffold Go operator with Operator SDK v1.42.0 (#261)
AbdelrhmanHamouda Jan 16, 2026
09e0fc1
feat: implement v1 API types matching Java CRD schema (#262)
AbdelrhmanHamouda Jan 16, 2026
09a4cce
feat: implement configuration system for Go operator (#263)
AbdelrhmanHamouda Jan 17, 2026
b5c8f21
chore: cleanup readme
AbdelrhmanHamouda Jan 17, 2026
7e3187a
feat: implement Phase 3 resource builders for Jobs and Services
AbdelrhmanHamouda Jan 19, 2026
971786b
feat: implement core reconciler for LocustTest CR (#265)
AbdelrhmanHamouda Jan 19, 2026
a01ba89
docs: update phase 4 status to complete
AbdelrhmanHamouda Jan 19, 2026
da3ad7c
test: add tests (#266)
AbdelrhmanHamouda Jan 19, 2026
fc29d1c
feat: implement v2 API types with grouped configuration and new featu…
AbdelrhmanHamouda Jan 19, 2026
eafcea2
feat: implement v1↔v2 conversion webhook with E2E tests (#268)
AbdelrhmanHamouda Jan 19, 2026
22bb8c0
feat: implement status subresource and migrate to v2 API (#269)
AbdelrhmanHamouda Jan 20, 2026
9af9f86
feat: implement volume mounting with target filtering (Issue #252) (#…
AbdelrhmanHamouda Jan 20, 2026
9db9e55
feat: add OpenTelemetry support for native Locust metrics export (#271)
AbdelrhmanHamouda Jan 20, 2026
b0b9a42
feat: rewrite Helm chart for Go operator v2.0.0 and revamp ci and tes…
AbdelrhmanHamouda Jan 23, 2026
2a65954
docs: fix and improve
AbdelrhmanHamouda Jan 26, 2026
38c14a5
chore: Address all 86 review items from Go operator rewrite PR (#275)
AbdelrhmanHamouda Feb 10, 2026
5394e2a
fix: prevent autoquit timeout=0 override and protect operator-critica…
AbdelrhmanHamouda Feb 10, 2026
5985596
1 pr review fixes (#276)
AbdelrhmanHamouda Feb 10, 2026
7555ca2
chore(rbac): remove unused configmaps and secrets permissions from Cl…
AbdelrhmanHamouda Feb 10, 2026
4bf685d
chore: improve Dockerfile build, Helm chart UX, and add logging utili…
AbdelrhmanHamouda Feb 11, 2026
1bbfc0d
fix(10-04): add webhook cert polling and mark secret optional in Helm
AbdelrhmanHamouda Feb 11, 2026
7cf2a4d
feat(12-01): replace .Owns with .Watches for pod health monitoring
AbdelrhmanHamouda Feb 11, 2026
bbd0301
fix(12-01): fix broken tests for updateStatusFromJobs signature change
AbdelrhmanHamouda Feb 11, 2026
4559354
test(12-02): add unit tests for mapPodToLocustTest mapping function
AbdelrhmanHamouda Feb 11, 2026
2c7189c
test(12-02): add unit tests for pod health integration in status updates
AbdelrhmanHamouda Feb 11, 2026
d173990
feat: pod health
AbdelrhmanHamouda Feb 11, 2026
c463302
test(13-01): add envtest integration test for pod health monitoring
AbdelrhmanHamouda Feb 11, 2026
cedeb28
feat(13-02): add detailed logging and graceful retry for external res…
AbdelrhmanHamouda Feb 11, 2026
1c24f08
fix: resolve CI pipeline failures for linter and go mod checks
AbdelrhmanHamouda Feb 11, 2026
f2842e6
fix(e2e): stabilize metrics endpoint test and cert-manager setup
AbdelrhmanHamouda Feb 11, 2026
60b1cc2
fix: fix make file
AbdelrhmanHamouda Feb 11, 2026
2e4786a
chore(14-01): add mermaid diagram support to mkdocs.yml
AbdelrhmanHamouda Feb 11, 2026
7e762a9
docs(14-01): expand status field documentation with lifecycle and CI/…
AbdelrhmanHamouda Feb 11, 2026
b82485b
docs(14-02): add comprehensive FAQ documentation
AbdelrhmanHamouda Feb 11, 2026
b8c69f3
docs(14-02): add security best practices guide
AbdelrhmanHamouda Feb 11, 2026
52b8a7b
docs(14-02): add FAQ and Security to MkDocs navigation
AbdelrhmanHamouda Feb 11, 2026
1e88c34
feat(15-01): rewrite architecture documentation with Mermaid diagrams
AbdelrhmanHamouda Feb 11, 2026
1125a73
feat(15-01): add production-ready LocustTest example CR
AbdelrhmanHamouda Feb 11, 2026
24ec8d3
feat(16-01): restructure navigation and add SEO metadata
AbdelrhmanHamouda Feb 11, 2026
56ca467
feat(16-02): add comparison page for operator vs alternatives
AbdelrhmanHamouda Feb 11, 2026
7ff91ba
feat(16-01): add Schema.org JSON-LD structured data script
AbdelrhmanHamouda Feb 11, 2026
bc25c3e
feat(16-03): add comparison.md to mkdocs.yml navigation
AbdelrhmanHamouda Feb 11, 2026
fd3de37
docs: reorganize Demo section to top of how_does_it_work.md
AbdelrhmanHamouda Feb 12, 2026
331957c
Docs/improve (#277)
AbdelrhmanHamouda Feb 12, 2026
338fa63
docs(helm): clarify webhook configuration as optional with use case
AbdelrhmanHamouda Feb 13, 2026
06e2892
docs(how-to-guides): fix technical inaccuracies and improve clarity a…
AbdelrhmanHamouda Feb 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
5 changes: 2 additions & 3 deletions .cz.yaml
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
---
commitizen:
annotated_tag: true
bump_message: "bump(release): v$current_version \u2192 v$new_version"
bump_message: "bump(release): v$current_version v$new_version"
name: cz_conventional_commits
tag_format: $major.$minor.$patch$prerelease
update_changelog_on_bump: true
version: 1.1.1
version: 2.0.0
version_files:
- build.gradle:version
- charts/locust-k8s-operator/Chart.yaml:appVersion
- charts/locust-k8s-operator/Chart.yaml:version
34 changes: 34 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# More info: https://docs.docker.com/engine/reference/builder/#dockerignore-file

# Test files
test/
*_test.go

# Documentation
docs/
*.md
LICENSE

# Git
.git/
.gitignore

# IDE
.idea/
.vscode/

# CI
.github/
.golangci.yml

# Build artifacts
bin/
cover.out
coverage.out

# Planning
.planning/

# Python
venv/
__pycache__/
29 changes: 29 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
root = true

[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true

[*.go]
indent_style = tab
indent_size = 4

[*.{yaml,yml}]
indent_style = space
indent_size = 2

[*.{md,markdown}]
trim_trailing_whitespace = false

[Makefile]
indent_style = tab

[Dockerfile]
indent_style = space
indent_size = 4

[*.sh]
indent_style = space
indent_size = 2
2 changes: 1 addition & 1 deletion .github/ct.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
debug: true
validate-maintainers: false
helm-extra-args: --timeout 600
helm-extra-args: --timeout 300s
144 changes: 89 additions & 55 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,149 +7,183 @@ on:
branches:
- master
- main
pull_request_target:
types: [ opened, synchronize, reopened, ready_for_review ]
pull_request:
types: [opened, synchronize, reopened, ready_for_review]

# Sets default read-only permissions for the workflow.
permissions: read-all

jobs:
# Job to build and validate the project.
build:
name: 🏗️ Build & Validate
# ============================================
# Go Operator Build & Test
# ============================================
build-go:
name: 🏗️ Build Go Operator
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
# Step 1: Checks out the repository code.
- name: 📂 Checkout repo
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}

# Step 2: Sets up JDK 21.
- name: ☕ Set up JDK 21
uses: actions/setup-java@v4
- name: 🔧 Setup Go
uses: actions/setup-go@v5
with:
java-version: 21
distribution: temurin
go-version-file: go.mod

# Step 3: Validates the Gradle wrapper to ensure its integrity.
- name: ✅ Validate Gradle wrapper
uses: gradle/wrapper-validation-action@v3.4.2
- name: 📥 Download dependencies
run: go mod download

# Step 4: Builds the project and generates a JaCoCo test report.
- name: 🛠️ Build
uses: gradle/gradle-build-action@v3.5.0
- name: 🔍 Run linter
uses: golangci/golangci-lint-action@v8
with:
arguments: build jacocoTestReport -i
version: v2.1.0

- name: 🛠️ Build
run: make build

- name: ✅ Run tests
run: make test

# Step 5: Reports code coverage to Codecov.
- name: 📊 Report coverage
if: always()
uses: codecov/codecov-action@v5
with:
name: branch-${{ github.ref }}
verbose: true
files: cover.out
flags: go-unit-tests
name: go-coverage
fail_ci_if_error: false

# Step 6: Runs the Codacy coverage reporter.
- name: 📈 Run codacy coverage reporter
uses: codacy/codacy-coverage-reporter-action@v1
- name: 📦 Upload Go test artifacts on failure
if: failure()
uses: actions/upload-artifact@v4
with:
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}

# Step 7: Uploads build artifacts.
- name: 📦 Upload build artifacts
uses: actions/upload-artifact@v4.4.0
with:
name: Build Artifacts
name: go-test-artifacts
path: |
**/build/reports
cover.out
retention-days: 7

# Job to lint and test the Helm chart.
# ============================================
# Helm Chart Lint & Test
# ============================================
lint-test-helm:
name: 🌊 Lint & Test chart
runs-on: ubuntu-latest
needs:
- build
timeout-minutes: 30
steps:
# Step 1: Checks out the repository code.
- name: 📂 Checkout
uses: actions/checkout@v4.1.1
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}

# Step 2: Sets up Helm.
- name: 🌊 Set up Helm
uses: azure/setup-helm@v4
with:
version: v3.10.0
version: v3.14.0

# Step 3: Sets up Python.
- name: 🐍 Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.9'
check-latest: true

# Step 4: Sets up chart-testing.
- name: 📊 Set up chart-testing
uses: helm/chart-testing-action@v2.7.0

# Step 5: Lists the Helm charts that have changed.
- name: 📋 Run chart-testing (list-changed)
id: list-changed
run: |
changed=$(ct list-changed --target-branch ${{ github.event.repository.default_branch }})
if [[ -n "$changed" ]]; then
echo "::set-output name=changed::true"
echo "changed=true" >> $GITHUB_OUTPUT
fi

# Step 6: Lints the Helm charts.
- name: 🔎 Run chart-testing (lint)
run: ct lint --target-branch ${{ github.event.repository.default_branch }} --config .github/ct.yaml

# Step 7: Creates a KinD cluster if any charts have changed.
- name: ⛵ Create kind cluster
uses: helm/kind-action@v1.12.0
if: steps.list-changed.outputs.changed == 'true'

# Step 8: Installs the Helm charts.
- name: 🔧 Setup Go
if: steps.list-changed.outputs.changed == 'true'
uses: actions/setup-go@v5
with:
go-version-file: go.mod

- name: 🛠️ Install ko
if: steps.list-changed.outputs.changed == 'true'
uses: ko-build/setup-ko@v0.7

- name: 🐳 Build operator image with ko
if: steps.list-changed.outputs.changed == 'true'
env:
KO_DOCKER_REPO: lotest/locust-k8s-operator
run: |
CHART_VERSION=$(grep '^appVersion:' charts/locust-k8s-operator/Chart.yaml | awk '{print $2}' | tr -d '"')
ko build ./cmd --local --bare --tags=${CHART_VERSION}

- name: 📦 Load image into kind cluster
if: steps.list-changed.outputs.changed == 'true'
run: |
CHART_VERSION=$(grep '^appVersion:' charts/locust-k8s-operator/Chart.yaml | awk '{print $2}' | tr -d '"')
kind load docker-image lotest/locust-k8s-operator:${CHART_VERSION} --name chart-testing

- name: 🚀 Run chart-testing (install)
run: ct install --target-branch ${{ github.event.repository.default_branch }} --config .github/ct.yaml
run: ct install --target-branch ${{ github.event.repository.default_branch }} --config .github/ct.yaml --helm-extra-set-args "--set=image.pullPolicy=Never"

- name: 📦 Collect kind cluster logs on failure
if: failure() && steps.list-changed.outputs.changed == 'true'
run: kind export logs kind-logs --name chart-testing

- name: 📦 Upload Helm test artifacts on failure
if: failure() && steps.list-changed.outputs.changed == 'true'
uses: actions/upload-artifact@v4
with:
name: helm-test-artifacts
path: |
kind-logs/
retention-days: 7

# Job to test the documentation.
docs-test:
name: 📚 Test documentation
runs-on: ubuntu-latest
needs:
- lint-test-helm
timeout-minutes: 15
steps:
# Step 1: Checks out the repository code.
- name: 📂 Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}

# Step 2: Sets up Python.
- name: 🐍 Setup python
uses: actions/setup-python@v5
with:
python-version: 3.x

# Step 3: Installs dependencies.
- name: 📦 Install dependencies
run: |
pip install \
mkdocs-material \
mkdocs-git-revision-date-localized-plugin
mkdocs-git-revision-date-localized-plugin \
mkdocs-minify-plugin

# Step 4: Builds the documentation.
- name: 📄 Build documentation
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python -m mkdocs build

- name: 📦 Upload docs build artifacts on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: docs-build-artifacts
path: |
site/
retention-days: 7
1 change: 1 addition & 0 deletions .github/workflows/docs-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ jobs:
run: |
pip install mkdocs-material
pip install mkdocs-git-revision-date-localized-plugin
pip install mkdocs-minify-plugin

- name: 🔧 Configure MkDocs for preview
run: |
Expand Down
61 changes: 61 additions & 0 deletions .github/workflows/go-test-e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: 🚀 Go E2E Tests

on:
push:
branches: [main, master]
paths:
- 'cmd/**'
- 'api/**'
- 'internal/**'
- 'test/**'
- 'go.mod'
- 'go.sum'
- 'Makefile'
pull_request:
paths:
- 'cmd/**'
- 'api/**'
- 'internal/**'
- 'test/**'
- 'go.mod'
- 'go.sum'
- 'Makefile'

permissions: read-all

jobs:
test-e2e:
name: 🎯 Run E2E Tests
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: 📥 Clone the code
uses: actions/checkout@v4

- name: 🔧 Setup Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod

- name: ☸️ Create Kind cluster
uses: helm/kind-action@v1.12.0
with:
cluster_name: locust-k8s-operator-test-e2e
wait: 120s

- name: 🔍 Verify go mod tidy
run: |
go mod tidy
git diff --exit-code -- go.mod go.sum

- name: 🎯 Run E2E tests
run: make test-e2e

- name: 📦 Upload E2E test artifacts on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: e2e-test-artifacts
path: |
cover.out
retention-days: 7
Loading
Loading