Zum Inhalt

Polycrate API 0.14.14

Release-Datum: 18. März 2026
Typ: Feature-Patch

Highlights

  • S3 Bucket CORS Reconciliation – Automatische permissive CORS-Konfiguration für neue S3 Buckets auf Ceph-Clustern; neues cors_allow_all-Feld, Hash-basierte Idempotenz
  • Note Detail UI: Monaco Editor – Monaco Auto-Save als Standard-Editor im Note Detail, umschaltbar über SystemConfig; neue wiederverwendbare noteContentEditor-Komponente
  • Personal Note „Assign to me" – Neue Checkbox im Create-Note-Popover, Default true; Notes erscheinen direkt im „My open Todos"-Dropdown
  • Archived-Filter Fix – Drei unabhängige Bugs behoben; Archived-Filter in V2-Tables (K8s Clusters, Endpoints, S3 Buckets etc.) funktioniert jetzt korrekt
  • SLO UI Redesigns – Kompaktere Layouts für SLO/SLA Status Box, Agent Monitoring Status Box und SLO Overview Widget

Artefakte

Docker Image

docker pull cargo.ayedo.cloud/polycrate/polycrate-api:0.14.14

Block

polycrate pull cargo.ayedo.cloud/ayedo/k8s/polycrate-api:0.9.11
polycrate run polycrate-api install

Neue Features

S3 Bucket CORS Reconciliation

Ceph RGW setzt auf neu angelegten Buckets standardmäßig eine restriktive CORS Policy, die Browser-Uploads via Presigned URLs blockiert. Die API reconciliert die CORS-Konfiguration jetzt automatisch.

Neues Feld cors_allow_all auf S3Bucket:

  • Default false auf Model-Ebene (bestehende Buckets bleiben unverändert)
  • Create-Form setzt initial=True für neue Buckets
  • Steuert das Setzen/Entfernen einer permissiven CORS-Policy via S3 API (put_bucket_cors / delete_bucket_cors)
  • Nur wirksam für Cluster vom Typ rook-ceph; MinIO-Cluster werden stillschweigend übersprungen

Implementierungsdetails:

  • Neue Methoden auf S3Cluster: apply_bucket_cors(), remove_bucket_cors(), reconcile_bucket_cors()
  • Hash-basierte Idempotenz: CORS wird nur applied wenn sich der Hash ändert (cors_config_hash-Feld auf S3Bucket)
  • Nutzt Cluster-Admin-Credential – Bucket-Credentials haben auf Ceph keine CORS-Rechte
  • Neue Warning Condition S3_BUCKET_CORS_NOT_APPLIED bei Fehlern
  • Integration in S3Bucket.provision() und S3Bucket.run_reconciliation()

Migration: Neue Migration 0065_s3bucket_cors.py für cors_allow_all und cors_config_hash.

Note Detail UI: Monaco Auto-Save Editor

Der Milkdown-Editor im Note Detail wird durch Monaco ersetzt – identisches Layout und UX-Paradigma wie der PersonalNote-Editor.

Neue noteContentEditor-Alpine.js-Komponente:

  • Full-height Editor (calc(100vh - 160px))
  • Top Bar mit Save-Status (saving… / ✓ saved / ✗ save failed) und Ctrl+S-Hint
  • Bottom Bar mit allen Metadaten-Aktionen (Status, Assignees, Remind At, Links)
  • Auto-Save mit 1500ms Debounce, PATCH auf /api/v1/notes/<pk>/
  • Monaco-Instanz als Closure-Variable (nicht in Alpine Proxy) – identisches Pattern wie PersonalNote
  • x-ignore auf Monaco-Container verhindert Alpine-DOM-Diffing

SystemConfig-Toggle:

  • Neuer Key NOTE_EDITOR_ENGINE ("monaco" | "milkdown", Default "monaco")
  • Umschaltbar im SystemConfig-UI ohne Deployment
  • Milkdown-Code bleibt als Fallback erhalten

Personal Note „Assign to me"

Im Create-Note-Popover des PersonalNote-Editors gibt es eine neue „Assign to me"-Checkbox (Default: true). Wenn aktiviert, wird der erstellende User beim Anlegen als Assignee gesetzt – die Note erscheint damit direkt im „My open Todos"-Dropdown der Topbar.

  • Frontend: neues popoverAssignToMe-State-Feld, assign_to_me im POST-Payload
  • Backend: NoteViewSet.perform_create() wertet assign_to_me aus und ruft note.assigned_to.add(request.user) auf
  • Reset-Verhalten: Checkbox behält den zuletzt gewählten Wert beim Schließen

Endpoint Quick Accept Status Code

Im Agent Monitoring Table des Endpoint Detail UI erscheint neben einem DOWN-Status-Code jetzt ein „+ accept"-Button. Ein Klick fügt den Code direkt zu spec.http.accepted_status_codes hinzu – ohne Seitennavigation.

  • Nur sichtbar wenn item.status_code vorhanden und der Code nicht bereits akzeptiert ist
  • PATCH via generiertem API-Client (apiV1EndpointsPartialUpdate), vollständiger spec-Spread
  • Nach Erfolg: lokaler State-Update + Toast, Button wird zu „accepted"-Badge
  • Loading-State während des Requests (Button deaktiviert)

Fixes

RECONCILIATION_FAILED als WARNING_CONDITION

RECONCILIATION_FAILED fehlte in WARNING_CONDITIONS und hatte keinen Einfluss auf den Object State. Objekte mit dauerhaft fehlschlagender Reconciliation verblieben im Status OK.

Fix: RECONCILIATION_FAILED ist jetzt in WARNING_CONDITIONS registriert. Betroffene Objekte wechseln in den State WARNING – bis die nächste Reconciliation erfolgreich ist.

Agent Health: ManagedObject-Logging

Log-Meldungen in AgentHealthView.post() wurden nach Auflösung des agent-Objekts noch via logger.* geschrieben und waren im Agent Detail UI nicht sichtbar.

Fix: Alle Meldungen nach agent-Auflösung nutzen jetzt agent.log() mit korrektem Severity-Level.

Archived-Filter V2-Table

Der Archived-Filter in V2-Tables (K8s Clusters, Endpoints, S3 Buckets etc.) zeigte bei allen Einstellungen (All/Yes/No) dieselbe Objektanzahl. Drei unabhängige Bugs wurden behoben:

  1. Hard-Filter überschrieb FilterSet: apply_archived_filters() setzte bedingungslos archived=False – FilterSet-Param kam zu spät. Fix: Wenn archived im Query-Param → Hard-Filter überspringen.
  2. archived fehlte im FilterSet: ManagedObjectBaseFilter hatte kein archived-Feld mit Custom-Methode. Fix: filter_archived() berücksichtigt auch archivierte Workspaces und Organisations.
  3. API-Client kannte archived nicht: services.gen.js enthielt archived nicht im Query-Mapping. Fix: API-Client neu generiert.

SLO/SLA Budget-Berechnung

Drei Bugs führten zu inkonsistenten X/Y within target-Anzeigen im SLO Overview Widget:

  1. within_budget-Inkonsistenz: Unreconcilierte Objekte (slo_availability = 0.00) zählten im Durchschnitt als 100%, aber nicht als „within budget". Fix: within_budget-Check nutzt denselben Fallback-Wert wie die Durchschnittsberechnung.
  2. K8sApp fehlte: get_slo_tracked_models() gab nur [Endpoint, K8sCluster] zurück – K8sApps wurden nicht mitgezählt. Fix: K8sApp hinzugefügt.
  3. Queryset-Inkonsistenz: tracked-Zähler und within_budget-Zähler verwendeten unterschiedliche Filter (archivierte Workspaces/Orgs). Fix: Beide nutzen jetzt identische Filter.

Infra Drawer Copy-Button Position

Bei langen Werten (z.B. API Keys) im Credential Drawer war der Copy-Button rechts abgeschnitten.

Fix: Copy-Button jetzt links vom Text-Inhalt, Outer-Span mit w-full min-w-0, Text-Span mit break-all.

Verbesserungen

SLO/SLA Status Box Redesign

  • Object State Label aus der Box entfernt (Criticality-Badge stattdessen im Titel)
  • Kompaktes 2-Spalten-Layout: SLO + SLA gestapelt links, Downtime History rechts
  • Target inline im Label (SLO (30D · 99.95%)), keine separate Target-Zeile
  • Downtime History filtert jetzt auf SLA Window (365d statt 30d)
  • slo_downtime_minutes / sla_downtime_minutes via direkte Summierung aus DowntimeAffectedObject-Records

Agent Monitoring Status Box Redesign

  • Layout-Konsistenz mit SLO/SLA Box: gleiche Card-Struktur, border-t statt mt-2, Pfeil-Rotation korrigiert
  • UP / DOWN / Failure Rate als kompakte Badges direkt im Titel
  • „N assigned"-Badge und separater Summary-Block entfernt
  • Footer-Block entfernt (Redundanz zum Failure-Rate-Badge)

SLO Overview Widget Redesign

  • Icon aus Titel entfernt
  • Statistik-Badges (tracked / BREACHED / AT RISK / ALL OK) direkt im Titel statt separatem Grid
  • Overall-Anzeige: kompaktes 2-Spalten Bar-Style (Budget-Health-Balken, Farbe grün/orange/rot)
  • SLA-Spalte in der Tabelle hinzugefügt (sla_availability, sla_status)
  • Downtime-Spalte entfernt
  • Farbgebung nach slo_status / sla_status statt Schwellenwert