Compare commits

..

27 Commits

Author SHA1 Message Date
afc44ebbf8 Sync chart from pieced-operator 0.1.42 2026-05-10 20:16:28 +00:00
1ef1c0e456 Sync chart from pieced-operator 0.1.41 2026-05-10 19:56:48 +00:00
f182211601 Sync chart from pieced-operator 0.1.40 2026-05-10 19:23:49 +00:00
5d46d3ada0 Sync chart from pieced-operator 0.1.39 2026-05-01 20:16:26 +00:00
e98dd8b0a2 Sync chart from pieced-operator 0.1.38 2026-05-01 16:42:18 +00:00
90a9aad15d Sync chart from pieced-operator 0.1.37 2026-05-01 16:12:31 +00:00
4f4b4286dc Sync chart from pieced-operator 0.1.36 2026-05-01 09:08:18 +00:00
1cc2ec2e92 Sync chart from pieced-operator 0.1.35 2026-05-01 08:37:15 +00:00
b3cc9b0975 Sync chart from pieced-operator 0.1.34 2026-05-01 08:26:13 +00:00
a6f19e23c6 Sync chart from pieced-operator 0.1.33 2026-04-30 21:27:54 +00:00
ec41528f1e Sync chart from pieced-operator 0.1.32 2026-04-30 20:53:31 +00:00
23f16bc7a8 Sync chart from pieced-operator 0.1.31 2026-04-30 20:42:39 +00:00
229d8e5389 Sync chart from pieced-operator 0.1.30 2026-04-30 20:19:45 +00:00
69983fa321 Sync chart from pieced-operator 0.1.29 2026-04-30 20:08:59 +00:00
9c2bc1223f Sync chart from pieced-operator 0.1.28 2026-04-29 21:49:48 +00:00
a31c259909 Sync chart from pieced-operator 0.1.27 2026-04-29 21:40:33 +00:00
2230aae540 Sync chart from pieced-operator 0.1.26 2026-04-29 21:29:39 +00:00
037d4d8994 Sync chart from pieced-operator 0.1.25 2026-04-29 21:13:52 +00:00
55ee4b27be Sync chart from pieced-operator 0.1.24 2026-04-29 21:06:11 +00:00
3e903a2d76 Sync chart from pieced-operator 0.1.23 2026-04-29 20:46:33 +00:00
884f5730a3 Sync chart from pieced-operator 0.1.22 2026-04-29 20:13:53 +00:00
5129786b77 Sync chart from pieced-operator 0.1.21 2026-04-29 19:35:52 +00:00
297bc50184 Sync chart from pieced-operator 0.1.20 2026-04-28 21:18:51 +00:00
cf673e379d Sync chart from pieced-operator 0.1.19 2026-04-28 21:06:54 +00:00
4863dcd8a8 Sync chart from pieced-operator 0.1.18 2026-04-28 20:58:28 +00:00
b73f3b45ea Sync chart from pieced-operator 0.1.17 2026-04-28 20:47:10 +00:00
8bc8dae266 Sync chart from pieced-operator 0.1.16 2026-04-28 20:10:19 +00:00
5 changed files with 98 additions and 9 deletions

View File

@@ -1,6 +1,6 @@
apiVersion: v2
name: pieced-operator
description: PieCed IT tenant lifecycle operator
version: 0.1.15
appVersion: "0.1.15"
version: 0.1.42
appVersion: "0.1.42"
type: application

View File

@@ -87,6 +87,18 @@ spec:
suspend:
type: boolean
description: Stops reconciliation without deleting resources.
openClawImage:
type: object
description: >
Per-tenant override for the OpenClaw container image
tag. When unset, the operator uses the platform
default from the pieced-openclaw-config ConfigMap.
Set by platform admins via the portal; customer-
facing onboarding does not expose this field.
properties:
tag:
type: string
description: Image tag (e.g. "2026.4.22").
status:
type: object
properties:
@@ -123,6 +135,25 @@ spec:
type: array
items:
type: string
suspendedAt:
type: string
format: date-time
warnings:
type: array
items:
type: object
required:
- source
properties:
source:
type: string
reason:
type: string
message:
type: string
since:
type: string
format: date-time
observedGeneration:
type: integer
format: int64

View File

@@ -0,0 +1,25 @@
{{/*
Platform-wide default OpenClaw image tag. Used by the operator when a
PiecedTenant has no explicit `spec.openClawImage.tag` override.
Tag-only by design — see internal/openclawconfig/loader.go for
rationale (single image-selector field avoids SSA field-ownership
ambiguity). For reproducibility-critical deployments, pin by using
an immutable release tag.
If `defaultTag` is empty (or this ConfigMap doesn't exist), the
operator falls back to a hardcoded built-in version.
Tenants without an `openClawImage` override automatically follow
changes to this ConfigMap on the next reconcile — the operator
watches it and re-enqueues affected tenants.
*/}}
apiVersion: v1
kind: ConfigMap
metadata:
name: pieced-openclaw-config
namespace: {{ .Release.Namespace }}
labels:
app.kubernetes.io/name: pieced-operator
data:
defaultTag: {{ .Values.openClaw.defaultTag | quote }}

View File

@@ -8,9 +8,17 @@ metadata:
app.kubernetes.io/name: pieced-operator
rules:
# --- PiecedTenant CRD ---
# `delete` is required so the operator can self-initiate the post-
# 60-day cleanup of suspended tenants (Bug 37b). Without it, the
# `r.Delete(ctx, tenant)` call in the suspend block fails with a
# 403 every reconcile cycle while the tenant sits past its
# retention window. Until then this verb wasn't strictly needed —
# the customer/portal initiated CR deletes, and the operator's
# finalizer ran cleanup; only with operator-initiated deletion did
# the missing verb become a problem.
- apiGroups: ["pieced.ch"]
resources: ["piecedtenants"]
verbs: ["get", "list", "watch", "update", "patch"]
verbs: ["get", "list", "watch", "update", "patch", "delete"]
- apiGroups: ["pieced.ch"]
resources: ["piecedtenants/status"]
verbs: ["get", "update", "patch"]
@@ -34,29 +42,34 @@ rules:
verbs: ["create", "patch"]
# --- Capsule Tenant ---
# `patch` is required for server-side apply (SSA) — controller-runtime's
# `client.Apply` uses HTTP PATCH with content-type application/apply-patch+yaml.
# We keep `update` for backwards-compat in case any code path still does
# replace-style writes (currently none). Same applies to all unstructured
# resources below.
- apiGroups: ["capsule.clastix.io"]
resources: ["tenants"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# --- ESO SecretStore ---
- apiGroups: ["external-secrets.io"]
resources: ["secretstores"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# --- ESO ExternalSecret ---
- apiGroups: ["external-secrets.io"]
resources: ["externalsecrets"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# --- Cilium CiliumNetworkPolicy ---
- apiGroups: ["cilium.io"]
resources: ["ciliumnetworkpolicies"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# --- OpenClaw OpenClawInstance ---
- apiGroups: ["openclaw.rocks"]
resources: ["openclawinstances"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# --- Leader election (coordination) ---
- apiGroups: ["coordination.k8s.io"]

View File

@@ -1,6 +1,6 @@
image:
repository: registry.c5ai.ch/pieced/pieced-operator
tag: "0.1.15"
tag: "0.1.42"
pullPolicy: IfNotPresent
imagePullSecrets:
@@ -56,3 +56,23 @@ serviceAccount:
# Network policy — restrict operator egress to only what it needs
networkPolicy:
enabled: true
# OpenClaw image default (Feature: per-tenant version overrides).
#
# Materialised as the `pieced-openclaw-config` ConfigMap, which the
# operator reads on every reconcile. Per-tenant overrides set via the
# portal (PiecedTenant.spec.openClawImage.tag) take precedence over
# this default for the affected tenants.
#
# We support tag-only (not digest) by design — a single image-selector
# field avoids SSA field-ownership ambiguity when switching values,
# and the downstream OpenClaw operator handles a tag-only image spec
# unambiguously. For reproducibility-critical deployments, pin by
# using an immutable release tag.
#
# Empty defaultTag falls back to the operator's built-in version.
# Admins can edit this value at runtime via the portal admin UI;
# the resulting ConfigMap edits trigger reconciles for every tenant
# that doesn't have its own override.
openClaw:
defaultTag: "2026.4.22"