Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
4048f03
feat: kubebuilder scaffold for the MemgraphCluster operator
as51340 Jul 23, 2026
fe8d990
testing: Make test coverage opt-in so make test works under Go toolch…
as51340 Jul 23, 2026
4c1e86e
testing: Pin golangci-lint build to the project's Go toolchain
as51340 Jul 23, 2026
18b9987
feat: Add CLAUDE.md
as51340 Jul 23, 2026
d7c264d
feat: CR in, per-role workloads out (#21)
as51340 Jul 23, 2026
d076552
feat: HA client, planner, controller wiring (#22)
as51340 Jul 23, 2026
9cd1163
testing: licensed MemgraphCluster bootstrap test #23
as51340 Jul 24, 2026
03065ba
feat: continuous re-registration reconciliation (#24)
as51340 Jul 24, 2026
271e615
feat: status subresource with MAIN, conditions, printer columns (#25)
as51340 Jul 27, 2026
5183afc
feat: CEL immutability + creation-time validation (#26)
as51340 Jul 27, 2026
b2377a4
feat: storage configuration with PVC retention policy (#27)
as51340 Jul 27, 2026
67b9414
feat: pod-tuning knobs — probes, resources, labels, ports, cluster do…
as51340 Jul 27, 2026
d2dfb69
feat: operator install chart (CRDs, least-privilege RBAC, controller …
as51340 Jul 27, 2026
0785c33
feat: release pipeline — operator image, chart cross-published to hel…
as51340 Jul 27, 2026
957aaf8
docs: quickstart README and a minimal example the e2e suite applies (…
as51340 Jul 27, 2026
e2ba8cb
feat: Add support for optional log volume
as51340 Jul 27, 2026
93a615d
feat: Add support for core dumps containers
as51340 Jul 27, 2026
4290dda
feat: Add support for extraVolumes and extraVolumeMounts
as51340 Jul 27, 2026
343e5e2
fix: require a coordinator leader before planning registration (#32)
as51340 Jul 28, 2026
db21b20
feat: Add the rest of the issues
as51340 Jul 28, 2026
5883e6f
feat: mutable topology with scale-up support (#33)
as51340 Jul 28, 2026
cff3f62
testing: Fix e2e test
as51340 Jul 28, 2026
d48bd42
feat: data-instance scale-down with MAIN-safe retirement (#34)
as51340 Jul 28, 2026
c6e02dd
feat: coordinator scale-down with leadership-safe Raft removal (#35)
as51340 Jul 29, 2026
f8da2b8
fix: Avoid two connections on observeCluster
as51340 Jul 29, 2026
c779f72
feat: Take into account replication lag before demotion
as51340 Jul 29, 2026
19f6b48
fix: Data instances comparison
as51340 Jul 29, 2026
99929e6
fix: gflags and CI flakiness
as51340 Jul 29, 2026
64f6823
fix: Args concatenation
as51340 Jul 29, 2026
2c14bdb
docs: retention policy applied on whenScaled and on whenDeleted
as51340 Jul 29, 2026
f9b5b39
feat: RegistrationFailed status
as51340 Jul 29, 2026
ef10478
feat: Promotion candidates with fallback to the demoted MAIN
as51340 Jul 30, 2026
810ca53
fix: Sample declares a valid dataInstances count
as51340 Jul 30, 2026
106c5fb
feat: sequenced rolling restart, MAIN and Raft leader last (#36)
as51340 Aug 3, 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
12 changes: 12 additions & 0 deletions .claude/skills/grill-me/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
name: grill-me
description: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions "grill me".
---

Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.

Ask the questions one at a time, waiting for the feedback on each question before continuing. Asking multiple questions at once is bewildering.

If a *fact* can be answered by exploring the codebase, look it up rather than asking me. The *decisions*, though, are mine - put each one to me and wait for my answer.

Do not enact the plan until I confirm we have reached a shared understanding.
11 changes: 11 additions & 0 deletions .custom-gcl.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# This file configures golangci-lint with module plugins.
# When you run 'make lint', it will automatically build a custom golangci-lint binary
# with all the plugins listed below.
#
# See: https://golangci-lint.run/plugins/module-plugins/
version: v2.12.2
plugins:
# logcheck validates structured logging calls and parameters (e.g., balanced key-value pairs)
- module: "sigs.k8s.io/logtools"
import: "sigs.k8s.io/logtools/logcheck/gclplugin"
version: latest
35 changes: 35 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"name": "Kubebuilder DevContainer",
"image": "golang:1.26",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"moby": false,
"dockerDefaultAddressPool": "base=172.30.0.0/16,size=24"
},
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers/features/common-utils:2": {
"upgradePackages": true
}
},

"runArgs": ["--privileged", "--init"],

"customizations": {
"vscode": {
"settings": {
"terminal.integrated.shell.linux": "/bin/bash"
},
"extensions": [
"ms-kubernetes-tools.vscode-kubernetes-tools",
"ms-azuretools.vscode-docker"
]
}
},

"remoteEnv": {
"GO111MODULE": "on"
},

"onCreateCommand": "bash .devcontainer/post-install.sh"
}

153 changes: 153 additions & 0 deletions .devcontainer/post-install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
#!/bin/bash
set -euo pipefail

echo "===================================="
echo "Kubebuilder DevContainer Setup"
echo "===================================="

# Verify running as root (required for installing to /usr/local/bin and /etc)
if [ "$(id -u)" -ne 0 ]; then
echo "ERROR: This script must be run as root"
exit 1
fi

echo ""
echo "Detecting system architecture..."
# Detect architecture using uname
MACHINE=$(uname -m)
case "${MACHINE}" in
x86_64)
ARCH="amd64"
;;
aarch64|arm64)
ARCH="arm64"
;;
*)
echo "WARNING: Unsupported architecture ${MACHINE}, defaulting to amd64"
ARCH="amd64"
;;
esac
echo "Architecture: ${ARCH}"

echo ""
echo "------------------------------------"
echo "Setting up bash completion..."
echo "------------------------------------"

BASH_COMPLETIONS_DIR="/usr/share/bash-completion/completions"

# Enable bash-completion in root's .bashrc (devcontainer runs as root)
if ! grep -q "source /usr/share/bash-completion/bash_completion" ~/.bashrc 2>/dev/null; then
echo 'source /usr/share/bash-completion/bash_completion' >> ~/.bashrc
echo "Added bash-completion to .bashrc"
fi

echo ""
echo "------------------------------------"
echo "Installing development tools..."
echo "------------------------------------"

# Install kind
if ! command -v kind &> /dev/null; then
echo "Installing kind..."
curl -Lo /usr/local/bin/kind "https://kind.sigs.k8s.io/dl/latest/kind-linux-${ARCH}"
chmod +x /usr/local/bin/kind
echo "kind installed successfully"
fi

# Generate kind bash completion
if command -v kind &> /dev/null; then
if kind completion bash > "${BASH_COMPLETIONS_DIR}/kind" 2>/dev/null; then
echo "kind completion installed"
else
echo "WARNING: Failed to generate kind completion"
fi
fi

# Install kubebuilder
if ! command -v kubebuilder &> /dev/null; then
echo "Installing kubebuilder..."
curl -Lo /usr/local/bin/kubebuilder "https://go.kubebuilder.io/dl/latest/linux/${ARCH}"
chmod +x /usr/local/bin/kubebuilder
echo "kubebuilder installed successfully"
fi

# Generate kubebuilder bash completion
if command -v kubebuilder &> /dev/null; then
if kubebuilder completion bash > "${BASH_COMPLETIONS_DIR}/kubebuilder" 2>/dev/null; then
echo "kubebuilder completion installed"
else
echo "WARNING: Failed to generate kubebuilder completion"
fi
fi

# Install kubectl
if ! command -v kubectl &> /dev/null; then
echo "Installing kubectl..."
KUBECTL_VERSION=$(curl -Ls https://dl.k8s.io/release/stable.txt)
curl -Lo /usr/local/bin/kubectl "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/linux/${ARCH}/kubectl"
chmod +x /usr/local/bin/kubectl
echo "kubectl installed successfully"
fi

# Generate kubectl bash completion
if command -v kubectl &> /dev/null; then
if kubectl completion bash > "${BASH_COMPLETIONS_DIR}/kubectl" 2>/dev/null; then
echo "kubectl completion installed"
else
echo "WARNING: Failed to generate kubectl completion"
fi
fi

# Generate Docker bash completion
if command -v docker &> /dev/null; then
if docker completion bash > "${BASH_COMPLETIONS_DIR}/docker" 2>/dev/null; then
echo "docker completion installed"
else
echo "WARNING: Failed to generate docker completion"
fi
fi

echo ""
echo "------------------------------------"
echo "Configuring Docker environment..."
echo "------------------------------------"

# Wait for Docker to be ready
echo "Waiting for Docker to be ready..."
for i in {1..30}; do
if docker info >/dev/null 2>&1; then
echo "Docker is ready"
break
fi
if [ "$i" -eq 30 ]; then
echo "WARNING: Docker not ready after 30s"
fi
sleep 1
done

# Create kind network (ignore if already exists)
if ! docker network inspect kind >/dev/null 2>&1; then
if docker network create kind >/dev/null 2>&1; then
echo "Created kind network"
else
echo "WARNING: Failed to create kind network (may already exist)"
fi
fi

echo ""
echo "------------------------------------"
echo "Verifying installations..."
echo "------------------------------------"
kind version
kubebuilder version
kubectl version --client
docker --version
go version

echo ""
echo "===================================="
echo "DevContainer ready!"
echo "===================================="
echo "All development tools installed successfully."
echo "You can now start building Kubernetes operators."
12 changes: 10 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# More info: https://docs.docker.com/engine/reference/builder/#dockerignore-file
# Ignore build and test binaries.
bin/
# Ignore everything by default and re-include only needed files
**

# Re-include Go source files (but not *_test.go)
!**/*.go
**/*_test.go

# Re-include Go module files
!go.mod
!go.sum
1 change: 0 additions & 1 deletion .github/CODEOWNERS

This file was deleted.

11 changes: 0 additions & 11 deletions .github/config_files/config_lint.yaml

This file was deleted.

65 changes: 0 additions & 65 deletions .github/workflows/kubelint.yaml

This file was deleted.

31 changes: 31 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Lint

on:
push:
branches:
- main
pull_request:

permissions: {}

jobs:
lint:
permissions:
contents: read
name: Run on Ubuntu
runs-on: ubuntu-latest
steps:
- name: Clone the code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

- name: Setup Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version-file: go.mod

- name: Check linter configuration
run: make lint-config
- name: Run linter
run: make lint
28 changes: 0 additions & 28 deletions .github/workflows/pre-commit.yaml

This file was deleted.

Loading