• v0.3.11 ed0462a2e9

    v0.3.11 Stable

    pipeline-bot released this 2026-07-24 12:31:19 +00:00 | 0 commits to main since this release

    Fixed

    • Run installed Admin and S3 operations inside the circuit breaker instead of
      counting only the in-memory delegate lookup. Typed network failures and
      operation deadlines now trip the breaker and fail fast after the configured
      threshold, and the half-open transition now admits exactly one concurrent
      probe.
    • Exercise the served shared-harness and circuit-breaker metric families in
      the Kind suite. The scrape Pod now uses a digest-pinned curl image and its
      projected service-account token at runtime, so bearer credentials are no
      longer embedded in the Pod spec or verbose logs.
    • Remove the unused pre-shared-harness metrics implementation and tests; those
      metric names were never registered by the manager.
    • Use Go's any-error Athens|direct proxy fallback in both image builds.
      In-cluster builds still prefer Athens, while local/isolated e2e builds no
      longer fail when the cluster-only Athens DNS name is unreachable.
    • Build and validate with the rebuild-durable fleet Go 1.26.5 builder from
      Codeberg. Its single-architecture build host avoids expanding Docker Hub's
      multi-platform Go index through Zot while carrying current stdlib fixes; a
      test now keeps the compile and release-test builder references identical,
      platform-explicit, and digest-pinned.
    • Make make deploy restore its temporary manager-image override on both
      success and failure, so live and e2e deploys no longer dirty the checkout.

    Included changes (v0.3.10 -> v0.3.11)

    • 5d6b4ec7f8d7 test(build): lock reviewed fleet builder digest
    • c9bee5b13760 test(build): pin fleet builder contract
    • 578ab6c3f0c3 build: pull fleet Go builder from Codeberg
    • cebc6ef2ab11 build: use fleet Go 1.26.5 image
    • 4c002ff3e08b test(e2e): exercise metrics and API conversion lifecycle
    • 96b0b9a7a438 fix(minioclient): measure remote failures in breaker
    Downloads
  • v0.3.10 fdfaa0f568

    v0.3.10 Stable

    pipeline-bot released this 2026-07-24 02:17:07 +00:00 | 9 commits to main since this release

    Fixed

    • Rewrite the cert-manager CA injection annotation on every conversion CRD to
      the deployed serving Certificate. v1alpha1 API requests previously failed
      TLS verification because the rendered CRDs retained Kubebuilder's
      system/serving-cert placeholder.
    • Gate the install bundle and cluster smoke test on both admission and
      conversion CA wiring so a healthy validating webhook cannot mask a broken
      version-conversion path.

    Included changes (v0.3.9 -> v0.3.10)

    • c2b360c449ad fix(webhook): wire conversion CRD trust bundles
    Downloads
  • v0.3.9 3bb849c2a6

    v0.3.9 Stable

    pipeline-bot released this 2026-07-24 01:33:13 +00:00 | 13 commits to main since this release

    Changed

    • Split the user and service-account convergence paths into explicit lifecycle
      phases and clear the full static-analysis backlog so controller behavior is
      easier to review and extend.
    • Emit Kubernetes Events through the current events.k8s.io recorder API across
      every controller while retaining compatibility with the shared harness.

    Fixed

    • Preserve spec.minioRef across v1alpha1/v1beta1 conversion for every
      top-level resource, cross-namespace spec.bucketRef.namespace for every
      bucket subresource, and credential spec.secret.extraData; the v1beta1
      storage schema previously omitted or discarded these fields.
    • Make MinioServiceAccount rotation retries converge MinIO on the candidate
      key already published to the managed Secret. A durable, non-secret status
      checkpoint prevents transient UpdateServiceAccount(NewSecretKey) failures
      from minting a different key and churning consumers on every retry.

    Security

    • Update vulnerable Prometheus, OpenTelemetry, x/net, and x/text
      dependencies to their patched release floors.
    • Build with digest-pinned Go 1.25.12, which includes the crypto/tls fix for
      GO-2026-5856, and use cryptographic entropy for reconcile-backoff jitter.

    Included changes (v0.3.8 -> v0.3.9)

    • 3a04236d04d1 build: align CI with patched Go toolchain
    • f1389773914f fix(operator): harden reconciliation and storage contracts
    Downloads
  • v0.3.8 710476f13c

    v0.3.8 Stable

    pipeline-bot released this 2026-07-21 09:45:50 +00:00 | 18 commits to main since this release

    Changed

    • Incremental release.

    Included changes (v0.3.7 -> v0.3.8)

    • 2611d77b7aa2 chore: remove confirmed-dead code (dead-code hunt)
    Downloads
  • v0.3.7 b6a68baf84

    v0.3.7 Stable

    pipeline-bot released this 2026-07-17 11:14:00 +00:00 | 22 commits to main since this release

    Changed

    • Bump libseanfarm-operator v0.4.11 -> v0.4.12 (lib-autobump: rides the shared-library release train; the envtest release gate validates the suite against it on the next ship).
    • Adopt the lib's canonical operator.mk scaffolding: vendor it and shrink the Makefile to project vars + repo-specific targets (build/docker/installer/e2e/load/deploy) — the shared dev-loop targets and tool pins (manifests/generate/fmt/vet/test/lint*, Dependencies, including the go.mod-derived ENVTEST versions this repo previously derived itself) now come from the include, re-synced by the lib-bump autoland on every lib release. make test picks up the shared defaults (adds -covermode=atomic).

    Included changes (v0.3.6 -> v0.3.7)

    • 6acdab0b15a5 chore(scaffolding): adopt operator.mk (lib v0.4.12)
    • 4c5f2e487e0e chore(deps): bump libseanfarm-operator v0.4.11 -> v0.4.12 (lib-autobump)
    Downloads
  • v0.3.6 f7e7dce1bf

    v0.3.6 Stable

    pipeline-bot released this 2026-07-16 16:58:13 +00:00 | 28 commits to main since this release

    Added

    • Operator metrics via libseanfarm reconcile.Metrics: reconcile counts/durations +
      status-write outcomes per controller — first custom metrics for this operator
      (minio_resource_operator_reconcile_total,
      minio_resource_operator_reconcile_duration_seconds,
      minio_resource_operator_status_update_total).

    Changed

    • Bump libseanfarm-operator v0.4.10 -> v0.4.11 (lib-autobump: rides the shared-library release train; the envtest release gate validates the suite against it on the next ship).

    Fixed

    • Build: repo-scoped BuildKit gomod cache id (gomod-mro) — the onboarding cold
      fetch hit the shared-Athens zip corruption and poisoned the fleet-shared gomod
      mount's minio-go entry, failing every release rebuild with zip: not a valid zip file.
    • ComputeBackoff arch-dependent overflow: for large failure counts the float64
      product overflowed int64 — arm64 clamps (cap worked, local tests passed) but amd64
      wraps negative, skips the cap, and the jitter arithmetic underflows back to a
      ~263-year positive backoff. Now capped in the float domain before conversion.
      Caught by the pipeline envtest gate's amd64 pod on onboarding day one.

    Included changes (v0.3.5 -> v0.3.6)

    • c35ea55f2767 feat(metrics): enable libseanfarm reconcile.Metrics
    • dfa595f56624 chore(deps): bump libseanfarm-operator v0.4.10 -> v0.4.11 (lib-autobump)
    Downloads
  • v0.3.5 f4b3ab9f2e

    v0.3.5 Stable

    pipeline-bot released this 2026-07-16 06:18:01 +00:00 | 34 commits to main since this release

    Changed

    • Onboarded to the pipeline (go-operator-image PipelineProject): trunk branch,
      VERSION, ci-test.Dockerfile validate gate, CHANGELOG merge=union, Dockerfile
      aligned with siblings (digest-pinned golang, Athens GOPROXY, BuildKit cache
      mounts, no go build -a); legacy .argo/ CI retired. Replaces the raw
      codeberg-main flux + Shipwright build path.
    • Bump libseanfarm-operator v0.4.1 -> v0.4.10: nine releases of shared-harness
      fixes, headlined by the R5 wave (dry-run delete no longer touches the remote —
      this operator sets DryRunAnnotation + HoldUntilSuccess, so the v0.4.1 dry-run
      delete could REALLY delete buckets/users; empty Ready=False reason 422 guard;
      Degraded truncation; stale Progressing clear).

    v0.1.2

    Quality checkpoint release after comprehensive bug hunting analysis. No issues found.

    Validation Performed

    Round 1: Race Condition Analysis

    • All tests pass with -race flag (controller + minioclient packages)
    • Verified proper mutex usage (RWMutex in circuit breaker, mutex in fake client)
    • No data races detected in concurrent reconciliation

    Round 2: Nil Pointer Dereference Analysis

    • All Status field accesses safe (embedded struct, never nil)
    • Helper functions have proper nil checks (observedGen in handleResolveBucketTransient)
    • BucketRef validation enforced via webhooks (MinLength, Pattern constraints)

    Round 3: Resource Leak Analysis

    • Contexts properly canceled (defer cancel() in IsBucketEmpty)
    • No goroutines spawned in production code (test-only usage with proper synchronization)
    • MinIO client uses SDK connection pooling (no manual cleanup required)
    • No file handles or unclosed resources

    Round 4: Dead Code Analysis

    • go vet ./... clean (no unused variables)
    • staticcheck ./... clean (no unused code)
    • All constants properly used (ReasonInvalidPolicy, error variables)
    • No TODOs or FIXMEs in production code
    • No commented-out code blocks

    Round 5: Edge Case & Validation Analysis

    • Backoff handles negative failureCount (clamped to 0)
    • Backoff handles overflow (capped at maxBackoff)
    • Backoff jitter ensures positive result (defensive check at line 84-86)
    • Bucket name validation via OpenAPI schema (MinLength=3, MaxLength=63, Pattern for S3 compliance)
    • Webhook singleton enforcement prevents configuration races
    • All internal documentation links verified

    Test Results

    • 265 controller tests passing
    • 17 circuit breaker tests passing
    • 11 backoff tests passing
    • Race detector: Clean (no races detected)

    Notes

    • No code changes in this release
    • No API changes
    • All existing deployments continue to work unchanged
    • This release serves as a documented quality checkpoint after v0.1.1

    v0.1.1

    Patch release with bug fixes and documentation corrections found during post-release validation.

    Bug Fixes

    Round 1-2: Build & Resource Management

    • Fixed stray cmd/cmd binary created during build interfering with compilation
    • Added cmd/cmd to .gitignore to prevent accidental commits
    • Added defensive nil check for conds parameter in handleTransientDeleteNotReady() (defensive programming improvement)

    Round 3-4: Dead Code & Documentation

    • CRITICAL: Removed unimplemented custom metrics (minio_operator_reconcile_duration_seconds, minio_operator_client_errors_total)
      • These metrics were documented but never instrumented in the code
      • Replaced with placeholder comment pointing to controller-runtime built-in metrics
      • Impact: Documentation now accurately reflects available metrics
    • Updated docs/SCALE.md to remove references to unimplemented metrics
    • Updated docs/operations/monitoring.md to document actual circuit breaker metrics:
      • minio_operator_circuit_breaker_state (gauge: 0=Closed, 1=Open, 2=HalfOpen)
      • minio_operator_circuit_breaker_transitions_total (counter with from_state/to_state labels)
      • minio_operator_circuit_breaker_failures_total (counter)
      • minio_operator_circuit_breaker_successes_total (counter)
      • minio_operator_circuit_breaker_rejections_total (counter)
    • Updated CHANGELOG.md v0.1.0 section to list correct metrics

    Round 5: Final Integration

    • Verified all tests pass (265 controller tests, circuit breaker tests, backoff tests)
    • Confirmed no race conditions with go test -race
    • Validated circuit breaker concurrency patterns (mutex-protected state machine)
    • Verified backoff handles edge cases (negative failureCount, int32 overflow)

    Notes

    • No functional changes to circuit breaker or exponential backoff logic
    • No API changes
    • All existing deployments continue to work unchanged
    • Built-in controller-runtime metrics remain available:
      • controller_runtime_reconcile_time_seconds (histogram with controller label)
      • controller_runtime_reconcile_errors_total (counter with controller label)
      • workqueue_* (depth, adds, retries)

    Upgrade Instructions

    No special upgrade steps required. Deploy as usual:

    kubectl apply -f https://codeberg.org/someara/minio-resource-operator/raw/tag/v0.1.1/dist/install.yaml
    

    v0.1.0

    Production-ready release with stable v1beta1 API, comprehensive operations documentation, automated CI/CD via Argo Workflows, and extensive migration tooling.

    API Stability (Breaking Change)

    • v1beta1 API introduced: Production-stable API with backward compatibility guarantees
      • All 16 CRD kinds available under minio.sean.farm/v1beta1
      • Storage version: v1beta1 (new CRs stored as v1beta1)
      • Served versions: v1alpha1 (deprecated) + v1beta1 (stable)
    • v1alpha1 API deprecated: No breaking changes yet, but migration recommended
      • Deprecated as of v0.1.0, will be removed in v0.3.0 (6+ months)
      • Conversion webhook provides transparent bidirectional translation
      • See Migration Guide
    • Conversion webhooks: Hub/Spoke pattern with lossless round-trip conversion
      • v1beta1 as Hub (storage version)
      • v1alpha1 as Spoke (deprecated, converted via webhook)
      • 32 conversion files (16 types × 2 directions)
      • /convert endpoint handles all API version translation

    Resilience & Scale Features (Phase 2)

    • Circuit Breaker: Prevents reconcile storms during persistent MinIO outages
      • 3-state machine: Closed → Open (fail-fast) → HalfOpen (probe recovery)
      • Configurable thresholds: --circuit-breaker-threshold=5 (failures before opening)
      • Configurable timeout: --circuit-breaker-timeout=30s (wait before probe)
      • Health check endpoint: /readyz/minio-circuit reports circuit state
      • Prometheus metrics: minio_operator_circuit_breaker_state, minio_operator_circuit_breaker_transitions_total
    • Exponential Backoff: Intelligent retry delays for transient errors
      • Progression: 5s → 10s → 20s → 40s → 80s → 160s → 300s (capped)
      • Per-CR FailureCount field tracks consecutive transient failures
      • Automatic reset to 0 on success (Ready=True)
      • Preserves drift detection: Success paths still requeue at 5-minute intervals
      • Applied across all 16 reconcilers for ReasonDependencyNotReady errors
    • Load Testing Framework:
      • test/load/load_test.go: 5 load test scenarios (baseline, churn, outage recovery, dependency ordering, scale ceiling)
      • test/load/helpers.go: Fixture creation, metrics collection, percentile calculation
      • Makefile targets: make test-load, make profile-load (with CPU/memory profiling)
    • Scale Documentation:
      • docs/SCALE.md: Comprehensive scale guide (800+ lines)
      • Tested configurations: Small (100 CRs), Medium (500 CRs), Large (1000 CRs)
      • Performance characteristics: Convergence time, memory/CPU usage, reconcile latency
      • Bottlenecks identified: Informer cache memory, MinIO IAM write amplification
      • Tunables: MaxConcurrentReconciles, DefaultResyncInterval, circuit breaker thresholds
      • Monitoring: Prometheus metrics (built-in + circuit breaker), alert rules, troubleshooting guide
    • Prometheus Metrics:
      • Built-in controller-runtime metrics: controller_runtime_reconcile_time_seconds, controller_runtime_reconcile_errors_total, workqueue_*
      • Circuit breaker metrics: minio_operator_circuit_breaker_state, minio_operator_circuit_breaker_transitions_total, minio_operator_circuit_breaker_failures_total, minio_operator_circuit_breaker_successes_total, minio_operator_circuit_breaker_rejections_total

    Operations & Production Readiness

    • Security documentation:
      • SECURITY.md: Vulnerability disclosure policy, security contact
      • docs/security-best-practices.md: Pod Security Standards, NetworkPolicies, RBAC, Secret management, audit logging (518 lines)
    • Operations runbooks (3,416 lines total):
      • docs/operations/troubleshooting.md: 9 common failure modes with diagnosis and fixes (710 lines)
      • docs/operations/monitoring.md: Prometheus ServiceMonitor, Grafana dashboards, 11 alert rules (689 lines)
      • docs/operations/capacity-planning.md: Resource sizing for 100-2000 CR scales (654 lines)
      • docs/operations/ha-dr.md: HA deployment, leader election, backup/DR procedures (845 lines)
    • API stability policy:
      • docs/api-stability.md: Version support matrix, deprecation policy, schema change rules
      • docs/migration-guide-v1beta1.md: Step-by-step migration guide with 3 migration methods, troubleshooting, FAQs

    CI/CD & Automation

    • Argo Workflows integration:
      • .argo/workflow-ci.yaml: PR checks (lint, test, verify-installer, e2e) with DAG-based parallel execution
      • .argo/cronworkflow-security.yaml: Weekly security scanning (govulncheck, Trivy repo/image, go mod verify)
      • .argo/workflowtemplate-common.yaml: Reusable workflow templates (checkout, golang-base, docker-build)
      • .argo/workflow-release.yaml: Automated release pipeline (build multi-arch images, generate installer, create release)
      • .argo/setup.sh: One-command setup script for deploying workflows to cluster
      • .argo/README.md + QUICKSTART.md: Comprehensive documentation

    Migration Tooling

    • Automated migration:
      • hack/migrate-to-v1beta1.sh: Script with dry-run, namespace filtering, backup/restore (300+ lines)
      • Validates prerequisites (kubectl, v1beta1 API availability)
      • Backs up all v1alpha1 CRs before migration
      • Handles 16 CRD kinds in dependency order
    • Sample CRs:
      • config/samples-v1beta1/: 16 v1beta1 sample files + kustomization.yaml
      • Updated from v1alpha1 samples with new apiVersion
    • Testing:
      • test/e2e/api_version_migration_test.go: 10 conversion specs (460+ lines)
        • Round-trip conversion validation (v1alpha1 ↔ v1beta1)
        • Cross-version updates (create v1alpha1, update v1beta1)
        • Enum and complex type conversion (ILMRule nested structs)
        • Mixed version reconciliation (bucket v1alpha1 + sub-resource v1beta1)
        • Status field preservation
        • Storage version verification

    Configuration & Deployment

    • CRD conversion patches:
      • config/crd/patches/webhook_in_all_crds.yaml: Conversion webhook configuration
      • config/crd/patches/cainjection_in_all_crds.yaml: cert-manager CA injection
      • Updated config/crd/kustomization.yaml with conversion webhook patches
    • Dual API version support: All CRDs serve both v1alpha1 (deprecated) and v1beta1 (stable)

    Breaking Changes & Migration

    • v1alpha1 deprecation: Begin migration planning now. v1alpha1 will be removed in v0.3.0 (estimated Q4 2026).
    • Storage version change: New CRs stored as v1beta1. Existing v1alpha1 CRs work unchanged via conversion webhook.
    • Zero-downtime migration: Operator upgrade to v0.1.0 does not require CR migration. CRs can be migrated incrementally.

    Upgrade Instructions

    1. Upgrade operator: kubectl apply -f https://codeberg.org/someara/minio-resource-operator/raw/tag/v0.1.0/dist/install.yaml
    2. Verify webhook: kubectl get certificate -n minio-operator-system minio-operator-serving-cert (Ready=True)
    3. Test conversion: kubectl get miniouser.v1beta1 <name> (should work for existing v1alpha1 CRs)
    4. Optional: Migrate CRs: ./hack/migrate-to-v1beta1.sh --dry-run (see Migration Guide)

    Compatibility

    • Kubernetes: 1.30+ (tested with 1.35)
    • Go: 1.25+
    • cert-manager: 1.16.5+
    • MinIO: RELEASE.2024-* (tested with RELEASE.2024-11-07T00-52-20Z)

    Known Issues

    • None at release time

    Contributors

    This release includes contributions from Claude Opus 4.6 (AI pair programming assistant).

    For detailed migration instructions, see Migration Guide.
    For API stability commitments, see API Stability Policy.

    v0.0.81

    • test/e2e: four new Ordered Contexts covering referenced-delete
      refusal — proves the operator blocks CR deletion with
      reason=Referenced until in-cluster references are dropped:
      • "MinioPolicy delete refusal while referenced" — creates a
        MinioPolicy, binds it to a MinioUser (deletionPolicy: Delete so
        the server-side user unbinds cleanly on drain), deletes the
        policy, asserts the finalizer + server-side policy persist and
        status.conditions[Ready].reason=Referenced; drops the user and
        nudges the policy; asserts the CR and MinIO-side policy drain.
        Guards miniopolicy_controller.go:117-193.
      • "MinioUser delete refusal while referenced by MinioServiceAccount"
        — creates a MinioUser, seeds a MinioServiceAccount with
        spec.parentUser pointing at it, attempts the user delete,
        asserts refusal with reason=Referenced; drops the SA, nudges
        the user; asserts drain. Guards
        miniouser_controller.go:445-538.
      • "MinioUser delete refusal while referenced by MinioGroupMembership"
        — same shape, referencing CR is a MinioGroupMembership with the
        user in spec.users.
      • "MinioGroup delete refusal while referenced" — creates a
        MinioGroup, seeds a MinioGroupMembership targeting it, asserts
        refusal; drops the MGM; tolerates the MinioGroup's watch on
        MinioGroupMembership auto-reconciling the group before the nudge
        lands; asserts the server-side group is drained (gone OR empty).
        Guards miniogroup_controller.go:187-308.
    • Total e2e spec count: 55 → 59.

    v0.0.80

    • test/e2e: three new Ordered Contexts continuing the mutation-path
      coverage push started in v0.0.79:
      • "MinioGroup spec.policies mutation" — mirror of the MinioUser
        policies mutation spec against a group target. Creates two
        MinioPolicy fixtures, binds one to a group (seeded with a
        MinioGroupMembership so the IAM group exists), then adds and drops
        policies; asserts mc admin group info reflects each transition.
        Guards the group policy diff path at
        internal/controller/miniogroup_controller.go:175-180.
      • "MinioBucketPolicy body mutation" — applies a BucketPolicy granting
        anonymous s3:GetObject on a fresh bucket, then mutates
        spec.policy to s3:ListBucket; asserts mc anonymous get-json
        reflects each body.
      • "MinioPolicy spec.buckets mutation" — applies a profile-backed
        MinioPolicy scoped to bucketA, captures status.appliedPolicyHash,
        then retargets to bucketB; asserts the hash advances and the
        rendered policy body's resource ARNs flip.

    v0.0.79

    • test/e2e: three new Ordered Contexts covering mutation/update paths
      across the identity graph:
      • "MinioUser spec.policies mutation" — boots two fresh MinioPolicy
        fixtures, attaches one to a MinioUser, then mutates spec.policies
        to add the second and drop the first; asserts mc admin user info
        reflects each transition. Guards syncUserPolicies at
        internal/controller/miniouser_controller.go:337-411
        (AttachPolicy / DetachPolicy drift reconciliation).
      • "MinioPolicy body mutation" — applies a MinioPolicy with
        profile: ro, captures status.appliedPolicyHash, then switches
        to profile: rw; asserts the hash advances and mc admin policy info emits s3:PutObject (absent from ro). Guards the re-push
        path at internal/controller/miniopolicy_controller.go:81-109.
      • "MinioGroupMembership spec.users add/remove" — creates two
        MinioUser fixtures, binds only one via a MinioGroupMembership,
        then mutates spec.users to add and drop members; asserts
        mc admin group info reflects each membership transition. Guards
        UpdateGroupMembers at
        internal/controller/miniogroupmembership_controller.go:129-144.

    v0.0.78

    • test/e2e: four new Ordered Contexts pinning credential-lifecycle and
      policy-body contracts that previously had only unit coverage:
      • "MinioUser spec.secret.name target move" — mutates spec.secret.name
        after Ready, asserts the new managed Secret carries the same
        access key and secret key (no rotation during migration), the old
        Secret is deleted, status.observedSecret advances, and the
        preserved creds still authenticate against MinIO. Guards F64 at
        internal/controller/miniouser_controller.go:91-103,315-327.
      • "MinioServiceAccount spec.secret.name target move" — same contract
        for SAs, guarding F65 at
        internal/controller/minioserviceaccount_controller.go:168-179,504-515.
      • "MinioServiceAccount update semantics" — mutates spec.description
        and spec.policyJson after Ready, asserts status.appliedPolicyHash
        advances and mc admin user svcacct info reflects the new
        description. Guards the UpdateServiceAccount paths at
        internal/controller/minioserviceaccount_controller.go:421-476.
      • "MinioPolicy raw JSON with nameOverride" — applies a spec.policyJson
        MinioPolicy with a spec.nameOverride, asserts status.policyName
        equals the override, mc admin policy info <override> returns the
        raw Sid/Action, and the policy is NOT addressable under the CR name.
        Guards effectivePolicyName at
        internal/controller/miniopolicy_controller.go:204-206.

    v0.0.77

    • test/e2e: three new Ordered Contexts covering data-loss-guard paths:
      • "Non-empty bucket delete refusal" — seeds an object via mc cp,
        triggers kubectl delete miniobucket with DeletionPolicy=Delete, and
        asserts the finalizer stalls with Ready=False/reason=BucketNotEmpty
        and the bucket survives server-side until the object is removed.
      • "MinioUser spec.enabled toggle" — flips spec.enabled between true and
        false and proves the server-side IAM status propagates by observing
        runMCWithCreds auth rc flip (guards syncUserStatus at
        internal/controller/miniouser_controller.go:424-440).
      • "MinioUser managed Secret loss refusal" — deletes the managed Secret
        out-of-band after Ready, asserts reason=ManagedSecretLost, and
        confirms with a 15s Consistently that the Secret is NOT silently
        recreated (guards the refusal branch at
        internal/controller/miniouser_controller.go:117-128).
    • test/e2e/live_minio_helpers_test.go: added mcSeedObject(bucket, key, content) helper that runs a custom one-shot pod script to chain
      echo > file && mc cp, unblocking specs that need to populate a
      bucket before exercising delete-refusal paths.
    • README.md: release checklist now includes an explicit step to update
      CHANGELOG.md before tagging.

    v0.0.76

    • test/e2e: "Idempotent reapply" Ordered Context. Re-applies an
      unchanged MinioUser manifest N times and asserts over a 15s window
      that the managed Secret's minio_secret_key and the CR's
      status.appliedSecretKeyHash are stable, proving the F124–F153
      drift-skip fast path engages.

    v0.0.75

    • test/e2e: "Concurrent reconcile" Ordered Context. Applies a set of
      sibling MinioBuckets in a single manifest and asserts they all reach
      Ready within a common deadline, proving the controller's parallel
      reconcile path does not deadlock on a shared MinIO client.

    v0.0.74

    • CHANGELOG.md: introduced; backfilled entries for v0.0.65 through
      v0.0.73. Release checklist continues from main branch.

    v0.0.73

    • hack/smoke-install.sh: IMG is now mandatory; :latest and unqualified
      values are rejected up front. The webhook-readiness probe fails closed
      ("webhook service never answered on :9443 after 120s") instead of silently
      falling through. cert-manager pinned version bumped from v1.16.2 to v1.16.5.

    v0.0.72

    • config/prometheus/monitor.yaml: corrected cross-reference to
      monitor_tls_patch.yaml (was pointing at the non-existent
      servicemonitor_tls_patch.yaml).
    • config/prometheus/monitor_tls_patch.yaml: SERVICE_NAME/SERVICE_NAMESPACE
      placeholders replaced with the concrete namePrefixed service DNS name.
    • config/default/kustomization.yaml: added a commented
      [METRICS WITH CERTMANAGER] patch entry referencing
      cert_metrics_manager_patch.yaml, which was previously an orphan file.

    v0.0.71

    • config/samples/: replaced the 16 # TODO(user): Add fields here stubs
      with runnable examples exercising each CRD's required fields. Cross-refs
      (MinioILMPolicy -> MinioBucket, MinioServiceAccount -> MinioUser, etc.)
      line up so kubectl apply -f config/samples/ yields a coherent graph.

    v0.0.70

    • test/e2e: out-of-order dependency-recovery coverage. Applies child
      resources before their parents (MinioUser -> MinioPolicy,
      MinioGroupMembership -> MinioGroup + MinioUser, MinioBucketTags ->
      MinioBucket), asserts the child stays Ready=False until the parent
      arrives, then converges.

    v0.0.69

    • test/e2e: DeletionPolicy=Delete coverage for bucket lifecycle CRs
      (MinioBucket, MinioBucketObjectLock, MinioBucketRetention). Verifies
      server-side state is reaped on CR deletion when policy is Delete and
      preserved when Retain.

    v0.0.68

    • Bugfix: MinioGroup controller now always issues an UpdateGroupMembers
      request with IsRemove=true when the desired member set is empty,
      tolerating NotFound. Previously the controller short-circuited when
      desc.Members was empty, leaving the MinIO-side group un-GC'd if it still
      had policies attached. See internal/controller/miniogroup_controller.go.
    • test/e2e: DeletionPolicy=Delete coverage for identity CRs (MinioUser,
      MinioServiceAccount, MinioGroup, MinioPolicy).

    v0.0.67

    • test/e2e: DeletionPolicy=Delete coverage for bucket-subresource CRs
      (MinioBucketCORS, MinioBucketEncryption, MinioBucketPolicy,
      MinioBucketQuota, MinioBucketTags, MinioBucketVersioning).

    v0.0.66

    • test/e2e: credential-rotation coverage for MinioUser and
      MinioServiceAccount (rotate annotation drives a new secret key and the
      managed Secret is updated).

    v0.0.65

    • test/e2e: clientSecretRef is now included in the reserved-extra-key
      admission-denial specs for MinioIDPOpenID.

    v0.0.64

    • test/e2e: live webhook admission-denial coverage. Each CRD's negative
      paths (bad bucket names, reserved extras, immutable-field mutation, etc.)
      round-trip through the real cert-manager-wired validating webhook.

    v0.0.63

    • test/e2e: live-MinIO coverage extended to MinioBucketEncryption,
      MinioILMPolicy, MinioBucketObjectLock, MinioBucketRetention, and
      MinioIDPOpenID.

    v0.0.62

    • test/e2e: dropped the F92 poke workaround and added coverage for four
      bucket subresources (Tags, CORS, Quota, Versioning).

    v0.0.61

    • test/e2e: extended live-MinIO coverage to MinioPolicy, MinioUser,
      MinioGroup, and MinioServiceAccount.
    • config/manager: bumped manager container memory limit.

    v0.0.60

    • Project rename: minio-operator -> minio-resource-operator to
      disambiguate from the upstream minio/operator project. Go module path,
      image name, and CRD group (minio.sean.farm) unchanged.

    v0.0.59 and earlier (v0.0.44 - v0.0.58)

    Rapid-fire feature/fix pipeline (F80-F153), summarized:

    • iamdoc validator hardening (F101-F111): Resource/Action shape checks,
      top-level key whitelist, Id shape check, Condition operator block
      validation, FuzzValidate panic guard, document/statement size and array
      caps, ASCII control-character rejection, exported limit constants.
    • profile bucket-name validation (F114-F123): webhook + controller
      enforcement of S3-legal bucket names when rendering canned profiles.
    • drift-skip + appliedPolicyHash (F124-F143): every policy-bearing CR
      gained an appliedPolicyHash / appliedSecretKeyHash status field so
      steady-state reconciles skip the expensive MinIO round-trip when the
      server-side state already matches.
    • identity-name validation + drift-skip (F144-F153): MinioUser /
      MinioServiceAccount got the same hash-gated fast path; usernames /
      parentUser strings validated at admission.
    • taxonomy refactor + rotate-ack conflict retry + mapper/formatter
      hardening (F80-F99, v0.0.59)
      : error-taxonomy cleanup across the
      controller set and MinIO-client mappers.

    For the v0.0.1 - v0.0.43 prehistory, consult git log directly; those
    releases predate the F-feature numbering scheme.

    Included changes (v0.3.4 -> v0.3.5)

    • a4090f25fc86 fix(backoff): cap exponential backoff in the float domain (amd64 float->int64 overflow)
    • 6986160bd601 chore(ci): refire — real corrupt module was klauspost/compress v1.18.2 on Athens (truncated, non-zero-byte; EOCD scan), now purged + re-fetch verified
    • 14fec95982bf fix(build): gomod-mro2 — first mro mount caught a partial minio-go zip from the aborted cold fetch
    • a303bedfebcd fix(build): gomod-mro2 — first mro mount got a partial minio-go zip from the aborted cold fetch
    • 26700f7b97e7 chore(ci): refire build — poisoned Athens entries purged (28 zero-byte version dirs)
    • d6c0d9e69405 fix(build): repo-scoped gomod cache id (poisoned shared mount: minio-go zip corruption)
    • 4624a2467eb1 chore(ci): refire build — transient shared-Athens cold-fetch zip corruption (known class, self-healing)
    • 32821d3577fc feat(cicd): pipeline onboarding contract + libseanfarm-operator v0.4.1 -> v0.4.10
    Downloads