Polycrate API 0.15.0

Polycrate API 0.15.0

Release-Datum: 18. April 2026 Typ: Feature (Bundled)

Übersicht

0.15.0 ist das erste grosse Bundled-Release seit 0.14.17. Es bündelt die vollständige User/Contact-Migration mit Keycloak, das abgeschlossene Artifacts-zu-Blocks-Refactoring, externe DNS-Zonen via Lexicon, K8sVolume und DNSZone als Productized Models, das flächendeckend ausgerollte Managed Object Dashboard, ein neues RBAC-Permission-System und zahlreiche Infrastruktur-, Label- und Performance-Verbesserungen.

Highlights

  • User/Contact-Migration — Contacts werden automatisch zu First-Class-Usern; Keycloak-Provisionierung bei User.save(), Error-Handling blockiert Save nicht mehr. Neue User-Admin-UI + API unter /api/v1/users/.
  • Artifacts → Blocks Refactoring abgeschlossen — Operator- und Loadbalancer-Lookup laufen jetzt über Block statt Artifact; K8sApp.installed_version ist Block-basiert; ArtifactHub und ArtifactRepository-Discovery sind entfernt.
  • Externe DNS-Zonen — Provisioning via python-lexicon für alle gängigen DNS-Provider (Route53, Cloudflare, Hetzner-DNS, …). DNSZone ist jetzt Productized Model mit separaten Produkten für internal/external.
  • K8sVolume Productized — Automatische Product-Zuordnung, Billing via get_billing_quantity-Hook, Fixes an computed_cost.
  • Managed Object Dashboard flächendeckend — 16 Detail-UIs migriert (K8sApp, Workspace, S3Cluster, Endpoint, S3Bucket, Host, LB, K8sVolume, K8sCluster, Project, Block, Note, DataSource, ActionRun, Downtime, Credential).
  • Generisches RBAC-Permission-System — Einheitliche Permission-Checks für alle ManagedObjects, end-to-end getestet mit Nicht-Admin-Usern.
  • Dashboard-Revamp — Tab-Layout mit System-Übersicht, archivierte Objekte gefiltert, Add-Note-/Execute-Actions-/Restart-Kontextmenüs.
  • Labels via OpenAPI — Label-Konstanten als Single Source of Truth für API und CLI; neue Keys criticality, priority, controlled_by; Log-Explorer-V2 auf polycrate_*-Keys migriert.
  • Vydeo Integration erweitert — Meeting-Notes mit Vydeo-Sync, granulare Trigger-Steuerung, Cancel bei Note-Resolve/Delete, User-Sync als Celery-Task.
  • Loopback-Integration — Organisationen und ihre primären Workspaces werden automatisch gegen die Loopback-API aufgelöst; loopback_org_id am SystemOwner und loopback_project_id je Organisation; strukturierte Condition-Propagation bei Auth-/Timeout-/Match-Fehlern.

Artefakte

Docker Image

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

Block

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

Änderungen nach Themen

Auth / RBAC / User-Management / Keycloak

Contacts werden automatisch zu User-Objekten migriert. Keycloak-User werden bei User.save() automatisch provisioniert, wenn KEYCLOAK_INTEGRATION_ENABLED=True; Fehler blockieren Save nicht mehr und werden sauber geloggt. Neue User-Admin-UI + API-Endpoints unter /api/v1/users/. Generisches RBAC-Permission-System für alle ManagedObjects. Credentials erhalten einen eigenen Top-Level-Sidebar-Eintrag und ein Managed-Object-Dashboard-Detail-UI. User-Assignment auf ManagedObjects ist auf Superuser beschränkt. End-to-end Nicht-Admin-Tests für Auth/RBAC. Fixes: User-Edit NoReverseMatch bei Integer-PK, Agent benötigte Create-Permission für Artifacts.

DNS (externe Zonen, Productized)

Externe DNS-Zonen werden via python-lexicon provisioniert; neues Feld DNSZone.kind (internal / external) + provider_credential FK. DNSZone ist Productized Model mit separaten Produkten für internal/external. Fix: OrganizationProduct.active_from wird bei Auto-Reconciliation korrekt gesetzt (Proration).

Artifacts → Blocks Refactoring (grösstes Thema)

Operator- und Loadbalancer-Lookup läuft über Block statt Artifact. managed_by umgekehrt: K8sApp.managed_by = Block. CatalogueApp mit template_block FK, K8sApp-Artifact-Chain migriert. ArtifactHub-Integration entfernt; ArtifactRepository-Discovery abgeschaltet. OperatorConfig: artifact_discovery-Sektion entfernt; .state.poly-Integration aus Operator-Deployment entfernt. Block-Model erhält Template-Felder, nullable FKs und neue Felder. Workspace-Reconciliation importiert Template-Blocks. K8sApp.installed_version ist Block-basiert; API schreibbar; Auto-Deployment aktualisiert installed_version; Block-Version-Update bei Auto-Deployment gefixt. Neuer DataSource-Kind polycrate-hub mit Detail-UI. ActionRun- und Block-Detail-UI auf Managed Object Dashboard. Artifact content_url Filter für Operator-Lookup; stale prefetch nach Refactor gefixt; Operator-Template-Block-Lookup registry_url-Mismatch gefixt.

Pricing / Productized Models

K8sVolume ist Productized Model mit Default-Product-Zuordnung. Pricing.get_billing_quantity-Hook für usage-basierte Abrechnung. Fix: S3Bucket.computed_cost war leer. Fix: ProductizedModel-Detail-Serializer enthält computed_cost. Provider: CCM/CSI-Felder + K8s-Volume-Product. Analyse gemischter Datenquellen auf Organization Detail View. Neues Management-Command generate_cost_statements.

Managed Object Dashboard Migrationen

Zentrale Dashboard-Component + Single-Include-Partial. Detail-UI-Migrationen für K8sApp, Workspace, S3Cluster, Operator Deployment, ManagedObject created_by_component, Endpoint, S3Bucket, Host, LoadbalancerInstance, K8sVolume, K8sCluster, Project, Block, Note, DataSource, ActionRun, Credential und Downtime. Neuer Tab "Conditions/Tolerations/Labels/Annotations". Metrics-Tabs für Host, LB, K8sVolume, K8sCluster. WorkspaceSerializer auf ManagedObjectDetailSerializer refactored.

Notes / Projects / Meetings / Vydeo

Embedded Note Mixin, Note-Timetracking + Project-FK, Project-Management, Note/Project-Bereinigung. Meeting-Note-Kind mit Vydeo-Integration; Note-Kind-Kachel-Selector. Vydeo-User-Sync als Celery-Task; granulare Trigger-Steuerung + Cancel-bei-Resolve; Vydeo-Meeting wird bei Note-Löschung gecancelt. PersonalNote: fehlende Breadcrumbs gefixt; Superadmin-Lesezugriff. Note-Component-Footer: Project- und Vydeo-Links. Note-Assignees: Alpine-Dropdown mit Suche statt SelectMultiple.

S3 / K8s / Host / LB / Endpoint Infrastruktur

K8sCluster kind=loopback (lokale Cluster via in-Cluster-Kubeconfig; nicht zu verwechseln mit der weiter unten beschriebenen Loopback-API-Integration). K8sVolume PersistentVolume-Tracking; List-UI Namespace-Spalte. S3Cluster: Capacity-Tracking via Prometheus, current_usage aus Bucket-Aggregation, allow_new_buckets Feld, select_related-Fix. S3Bucket: Minio-Policy nach provision(); Agent-Permissions + Filter; Lösch-Fehlerbehandlung + API-Fehlertransport; ViewSet-Auto-Assignment + OpenAPI-Schema-Fix. BackupSchedule Name-Validierung. S3-Cluster-Endpoint-Reachability. Endpoint: do_not_monitor Reconciliation-Guard; Auto-Do-Not-Monitor via HTTP-Status-Codes. LoadbalancerRegion-Reconciliation meldet IPAM-Fehler korrekt. Backup-Retention-Task NoneType-Fix; Downtime-Timeline fehlende Annotations.

Loopback-Integration

Polycrate kann Organisationen und Workspaces gegen die externe Loopback-API auflösen, um loopback_org_id und loopback_project_id zu persistieren. Das Matching erfolgt über Organization.legal_name (→ Loopback-Org, nur am konfigurierten SystemOwner persistiert) und Workspace.fqdn der primären Workspace einer Organisation (→ Loopback-Project, pro Organisation persistiert). Die Reconciliation läuft als Teil der regulären Organization-Reconciliation und ist no-op, solange LOOPBACK_INTEGRATION_ENABLED=false gesetzt ist.

Der LoopbackClient klassifiziert API-Fehler strukturiert: LoopbackAuthError (401/403), LoopbackTimeoutError, LoopbackUnreachableError, LoopbackBadRequestError (400), LoopbackError (generisch). Jeder Fehlertyp wird auf eine dedizierte Condition am Organization-Objekt gemappt: ORGANIZATION_LOOPBACK_AUTH_FAILED, ORGANIZATION_LOOPBACK_API_UNREACHABLE, ORGANIZATION_LOOPBACK_ORG_UNRESOLVED, ORGANIZATION_LOOPBACK_PROJECT_UNRESOLVED. Erfolgreiche Auflösungen entfernen die jeweilige Condition wieder. Auf dem Organization-Dashboard existiert eine read-only Card, die loopback_org_id (mit SystemOwner-Hinweis) und loopback_project_id samt Resolve-Status, Auth-Status und Copy-to-Clipboard anzeigt, solange LOOPBACK_INTEGRATION_ENABLED=true ist.

Downtime / SLO / Monitoring / Audit

Downtime Timeline Graph; SLO-Overview Downtime-Filter auf SLA-relevant; Custom Time Range; metricChart Reset-Toolbar. SSH-Session und Workspace-Sync Activity-Audit API.

Labels / OpenAPI / CLI-Integration

ManagedObject-Labels-System mit system_labels + merged_labels. Label-Konstanten via OpenAPI als Single Source of Truth für API + CLI. Log-Explorer-V2-Label-Migration auf neue polycrate_-Keys. LabelKey-Enum erweitert: criticality, priority, controlled_by. Labels-Feld aus ManagedObjectBaseForm entfernt.

Dashboard / Navigation / UI Polish

Dashboard-Revamp mit Tab-Layout + System-Übersicht. Workspace-State .state.poly (API-seitig). Projects v2: active-Filter Default auf "All". Execute-Actions-Button nur für Instance Blocks. "Add Note" im Dashboard-Kontextmenü. ActionRun-Restart-Button aus Topbar in Dashboard-Tab + Timeline. Dashboard zeigt archivierte Objekte ausgefiltert. Dashboard zeigt alle Objekte unabhängig von Org-Membership. Dashboard-Footer-Fix für Credential/Endpoint/LoadbalancerInstance; redundanter jsonify_pretty-Filter; Copy-Button-Bug.

Performance / Housekeeping

FTS DB-Load Analyse + invertierter Signal-Guard-Default; Celery-Task-Result-Bloat. Frontend-Performance-Analyse; N+1-Fix auf Organization Detail View. Seed-Import überschreibt bestehende Provider/DataSources nicht. /portal/ (Organization Portal) abgeschaltet und Code entfernt. Management-Commands-Inventar. PatchedK8sAppRequest OpenAPI-Schema-Fix.


Migration

0.15.0 enthält datenverarbeitende Migrationen, aber keine harten Breaking Changes, die manuelles Eingreifen erfordern — die meisten Änderungen laufen als Django-Data-Migrations automatisch beim Deploy durch.

Automatische Data-Migrations

  • Contacts werden zu Usern migriert. Bestehende Contact-FKs werden auf User umgebogen.
  • DNSZone.kind wird für alle bestehenden Zonen auf internal gebackfillt.
  • K8sVolume.product wird für bestehende Volumes auf SystemConfig.default_k8s_volume_product gesetzt.
  • OrganizationProduct.active_from wird für Legacy-Einträge auf created_at oder Org-Startdatum gesetzt.
  • SystemConfig bekommt neue Keys: default_s3_bucket_cluster, default_external_dns_zone_product, default_internal_dns_zone_product, default_k8s_volume_product, LOOPBACK_INTEGRATION_ENABLED, LOOPBACK_API_ENDPOINT, LOOPBACK_API_KEY.
  • Credential.kind wird um DNS-Provider-Kinds erweitert.

Pflicht-Konfiguration nach Deploy

  1. Keycloak (falls genutzt): SystemConfigKEYCLOAK_INTEGRATION_ENABLED=true + Server-URL / Realm / Admin-Credentials setzen.
  2. DNS: Falls externe Zonen verwaltet werden sollen, default_external_dns_zone_product und default_internal_dns_zone_product in SystemConfig setzen.
  3. K8sVolume Pricing: default_k8s_volume_product in SystemConfig setzen, damit neu angelegte K8sVolumes automatisch einem Produkt zugeordnet werden.
  4. polycrate-operator-Block: Auf kompatible Version upgraden (Block-basiertes Lookup). Ohne Upgrade wird installed_version nicht korrekt propagiert.

API-/CLI-Clients regenerieren

  • K8sApp hat keine artifact/artifact_package FKs mehr — stattdessen installed_block, installed_block_version, installed_version.
  • PatchedK8sAppRequest-OpenAPI-Schema wurde korrigiert.
  • /api/v1/contacts/ existiert nicht mehr — stattdessen /api/v1/users/.
  • Neue LabelKeys (criticality, priority, controlled_by) sind im OpenAPI-Enum.
  • S3BucketViewSet hat korrigiertes OpenAPI-Schema + Agent-Auto-Assignment.

Entfernte Komponenten

  • /portal/ (Organization Portal) ist komplett entfernt. Bestehende Bookmarks liefern 404.
  • ArtifactHub-Discovery und artifact_discovery aus OperatorConfig sind entfernt.
  • .state.poly-Integration aus Operator-Deployment entfernt.

Downtime / Rollback

Rollback auf 0.14.17 ist möglich, aber wegen der Data-Migrations (Contact→User, DNSZone.kind, OrganizationProduct.active_from, K8sVolume.product) nur mit vollem Datenbank-Restore sauber durchführbar. DB-Backup VOR Upgrade erstellen.