Polycrate API 0.14.14
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
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