fix: agent controller pod reconciliation — use Create not Update, wire volumes/env/VolumeMounts #1

Closed
agent-engineering wants to merge 1 commit from fix/agent-pod-reconcile into main
First-time contributor

What this fixes

The kubeclaw-controller was stripping required pod fields (volumes, serviceAccountName, nodeName) when trying to Update existing pods during reconciliation. This caused ErrImageNeverPull for all Agent pods outside the scobleclaw namespace.

Fixes https://os.scoble.me/forgejo/marcus/scobleclaw/issues/10

Changes

  • Pods now created fresh on first reconcile instead of trying to update existing pods (which fails because Update strips API-injected fields like volumes, serviceAccountName, and nodeName)
  • Added ImagePullPolicy: Never — required for locally-built Nix images
  • Wired Volumes and VolumeMounts from Agent spec into the pod spec
  • Wired user-defined Env vars from Agent spec
  • Image changes now handled via delete + recreate instead of pod update (the Kubernetes-safe pattern)
  • Added podImageEqual helper to detect when an image change requires pod recreation

Verification

Tested with cust-demo namespace:

kubectl apply -f - <<EOF
apiVersion: kubeclaw.scoble.me/v1alpha1
kind: Agent
metadata:
  name: demo-concierge
  namespace: cust-demo
spec:
  agentId: demo-concierge
  model: deepseek-v4-pro:cloud
  image: hermes-speckl/sme:latest
  replicas: 1
EOF

Result: kubeclaw-agent-demo-concierge pod → Running in cust-demo namespace ✅

Files Changed

  • internal/controller/agent_controller.go — core reconciliation fix
  • api/v1alpha1/agent_types.go — added Volumes, VolumeMounts, ImagePullPolicy, Env fields to AgentSpec
  • api/v1alpha1/zz_generated.deepcopy.go — auto-generated
  • config/crd/bases/*.yaml — regenerated CRD schemas with new fields
  • config/samples/06-agent.yaml — updated example with new fields
## What this fixes The kubeclaw-controller was stripping required pod fields (volumes, serviceAccountName, nodeName) when trying to Update existing pods during reconciliation. This caused `ErrImageNeverPull` for all Agent pods outside the `scobleclaw` namespace. Fixes https://os.scoble.me/forgejo/marcus/scobleclaw/issues/10 ## Changes - **Pods now created fresh on first reconcile** instead of trying to update existing pods (which fails because Update strips API-injected fields like volumes, serviceAccountName, and nodeName) - Added `ImagePullPolicy: Never` — required for locally-built Nix images - Wired `Volumes` and `VolumeMounts` from Agent spec into the pod spec - Wired user-defined `Env` vars from Agent spec - Image changes now handled via **delete + recreate** instead of pod update (the Kubernetes-safe pattern) - Added `podImageEqual` helper to detect when an image change requires pod recreation ## Verification Tested with `cust-demo` namespace: ``` kubectl apply -f - <<EOF apiVersion: kubeclaw.scoble.me/v1alpha1 kind: Agent metadata: name: demo-concierge namespace: cust-demo spec: agentId: demo-concierge model: deepseek-v4-pro:cloud image: hermes-speckl/sme:latest replicas: 1 EOF ``` Result: `kubeclaw-agent-demo-concierge` pod → **Running** in `cust-demo` namespace ✅ ## Files Changed - `internal/controller/agent_controller.go` — core reconciliation fix - `api/v1alpha1/agent_types.go` — added `Volumes`, `VolumeMounts`, `ImagePullPolicy`, `Env` fields to AgentSpec - `api/v1alpha1/zz_generated.deepcopy.go` — auto-generated - `config/crd/bases/*.yaml` — regenerated CRD schemas with new fields - `config/samples/06-agent.yaml` — updated example with new fields
Owner

This was a PR description documenting the fix that was already merged. No further action needed. Closing.

This was a PR description documenting the fix that was already merged. No further action needed. Closing.

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: sscoble/kubeclaw#1
No description provided.