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¶
Block¶
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
falseauf Model-Ebene (bestehende Buckets bleiben unverändert) - Create-Form setzt
initial=Truefü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 aufS3Bucket) - Nutzt Cluster-Admin-Credential – Bucket-Credentials haben auf Ceph keine CORS-Rechte
- Neue Warning Condition
S3_BUCKET_CORS_NOT_APPLIEDbei Fehlern - Integration in
S3Bucket.provision()undS3Bucket.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) undCtrl+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-ignoreauf 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_meim POST-Payload - Backend:
NoteViewSet.perform_create()wertetassign_to_meaus und ruftnote.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_codevorhanden und der Code nicht bereits akzeptiert ist - PATCH via generiertem API-Client (
apiV1EndpointsPartialUpdate), vollständigerspec-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:
- Hard-Filter überschrieb FilterSet:
apply_archived_filters()setzte bedingungslosarchived=False– FilterSet-Param kam zu spät. Fix: Wennarchivedim Query-Param → Hard-Filter überspringen. archivedfehlte im FilterSet:ManagedObjectBaseFilterhatte keinarchived-Feld mit Custom-Methode. Fix:filter_archived()berücksichtigt auch archivierte Workspaces und Organisations.- API-Client kannte
archivednicht:services.gen.jsenthieltarchivednicht 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:
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.- K8sApp fehlte:
get_slo_tracked_models()gab nur[Endpoint, K8sCluster]zurück – K8sApps wurden nicht mitgezählt. Fix:K8sApphinzugefügt. - Queryset-Inkonsistenz:
tracked-Zähler undwithin_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_minutesvia direkte Summierung ausDowntimeAffectedObject-Records
Agent Monitoring Status Box Redesign¶
- Layout-Konsistenz mit SLO/SLA Box: gleiche Card-Struktur,
border-tstattmt-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_statusstatt Schwellenwert