Zum Inhalt

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.

Pflicht-Schritte nach Upgrade

  • polycrate-operator-Block upgraden (Block-basiertes Lookup — sonst wird installed_version nicht korrekt propagiert).
  • API-/CLI-Clients regenerieren (OpenAPI-Schema hat breaking-artige Änderungen bei K8sApp, /api/v1/contacts//api/v1/users/).
  • Neue SystemConfig-Defaults setzen (siehe Pflicht-Konfiguration).

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.

User-Aktion

  • MUSS (wenn Keycloak genutzt): In SystemConfig → Kategorie "Keycloak" die Felder KEYCLOAK_INTEGRATION_ENABLED=true sowie Keycloak-Server-URL, Realm, Admin-Client-Credentials setzen.
  • MUSS: Nach Upgrade im Admin kontrollieren, dass migrierte Contact→User-Objekte mit Keycloak verknüpft sind (keycloak_user_id gesetzt). Neu-Sync bei Bedarf via Admin-Aktion.
  • MUSS: API-Clients, die auf /api/v1/contacts/ zugegriffen haben, auf /api/v1/users/ umstellen.
  • KANN: Superuser-Flag auf bestehenden Accounts prüfen — User-Assignment auf ManagedObjects ist jetzt auf Superuser beschränkt.

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).

User-Aktion

  • MUSS (wenn externe Zonen genutzt werden): Provider-Credential vom Kind DNS-Provider anlegen (Route53, Cloudflare, Hetzner-DNS etc. — alle von python-lexicon unterstützten Provider).
  • MUSS: SystemConfig.default_external_dns_zone_product und SystemConfig.default_internal_dns_zone_product konfigurieren, damit neue Zonen automatisch einem Produkt zugeordnet werden.
  • AUTOMATISCH: Bestehende DNSZones werden via Migration als kind=internal markiert; bestehende OrganizationProduct-Einträge mit fehlendem active_from werden gebackfillt.
  • KANN: Externe Zonen mit kind=external + provider_credential über UI oder API anlegen; Records werden via Lexicon-Client synchronisiert.

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.

User-Aktion

  • MUSS: polycrate-operator-Block auf eine Version upgraden, die Block-basiertes Lookup unterstützt (siehe Operator-Release-Notes; im archenemy-Workspace geladen). Ohne Upgrade wird installed_version nicht korrekt aktualisiert.
  • MUSS: OperatorConfigs in K8s-Clustern prüfen — artifact_discovery- und state_poly-Sektionen entfallen; bestehende Configs werden durch Reconciliation bereinigt.
  • MUSS: API-Clients regenerieren (OpenAPI) — K8sApp.artifact / artifact_package FKs sind entfernt; stattdessen installed_block / installed_block_version / installed_version verwenden.
  • KANN (empfohlen): Custom-Integrationen, die ArtifactHub-URL verwendeten, auf DataSource polycrate-hub umstellen.
  • KANN (Polycrate-Hub-Import): Der Seed-Import legt eine deaktivierte DataSource polycrate-hub-ayedo (kind=polycrate-hub, system_level=true) an. Um Template Blocks automatisch aus dem Hub zu synchronisieren: im Admin/UI die DataSource aktivieren (is_enabled=true) und in SystemConfig → Kategorie "Polycrate Hub" die Felder POLYCRATE_HUB_ENDPOINT, POLYCRATE_HUB_USERNAME, POLYCRATE_HUB_PASSWORD setzen. Ohne Aktivierung ändert sich nichts am bisherigen Verhalten.

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.

User-Aktion

  • MUSS: SystemConfig.default_k8s_volume_product setzen — sonst werden neue K8sVolumes nicht automatisch einem Produkt zugeordnet.
  • AUTOMATISCH: Backfill-Migration setzt Product auf bestehende K8sVolumes; OrganizationProduct.active_from wird für Legacy-Daten gesetzt.
  • KANN: python manage.py generate_cost_statements für Cost-Statement-Runs.

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.

User-Aktion

  • Keine Pflicht-Aktion.
  • KANN: Custom-CSS-Overrides auf Detail-Templates prüfen — Layout ist einheitlich.
  • KANN: display_content Template-Tag für eigene Templates nutzen.

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.

User-Aktion

  • MUSS (wenn Vydeo genutzt): In SystemConfig → Kategorie "Integrations / Vydeo" die Felder VYDEO_INTEGRATION_ENABLED=true, VYDEO_ENDPOINT (z. B. https://api.vydeo.io) und VYDEO_API_TOKEN setzen. Wird Vydeo nicht genutzt: VYDEO_INTEGRATION_ENABLED=false (Default) — keine Aktion.
  • KANN: Bestehende Notes im Admin an Projekte binden (neues FK).
  • KANN: Meeting-Notes mit Vydeo anlegen — Meeting wird automatisch erstellt und bei Note-Delete/Resolve gecancelt.

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.

User-Aktion

  • KANN: S3Cluster.allow_new_buckets=False setzen, um Neu-Buckets zu sperren.
  • AUTOMATISCH: S3Bucket-Agents werden automatisch assigned; manuelle Permission-Vergabe obsolet.
  • KANN: Endpoints, die anhaltend HTTP-Errors liefern, werden automatisch auf do_not_monitor gesetzt — im Admin kontrollieren.
  • KANN: K8sCluster kind=loopback für lokale Setups.

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.

User-Aktion

  • KANN (wenn Loopback genutzt wird): In SystemConfig → Kategorie "Integrations / Loopback" die Felder LOOPBACK_INTEGRATION_ENABLED=true, LOOPBACK_API_ENDPOINT (z. B. https://api.loopback.cloud) und LOOPBACK_API_KEY (Bearer-Token) setzen. Ohne Aktivierung ist die Integration no-op — keine Aktion.
  • MUSS (wenn aktiviert): Eine Organisation in SystemConfig.system_owner_organization als SystemOwner referenzieren. loopback_org_id wird ausschliesslich an dieser Organisation persistiert; andere Organisationen zeigen den Wert read-only über den SystemOwner an.
  • MUSS (wenn aktiviert): Organization.legal_name muss exakt dem Namen der Loopback-Org entsprechen; Workspace.fqdn muss exakt dem Namen des Loopback-Projects entsprechen. Ansonsten tauchen ORGANIZATION_LOOPBACK_ORG_UNRESOLVED bzw. ORGANIZATION_LOOPBACK_PROJECT_UNRESOLVED Warning-Conditions am Objekt auf.
  • KANN: Conditions am Organization-Objekt als Early-Warning für Integrations-Drift monitoren — AUTH_FAILED deutet auf ein falsches oder abgelaufenes LOOPBACK_API_KEY hin, API_UNREACHABLE auf Netzwerkprobleme oder falsch gesetzten LOOPBACK_API_ENDPOINT.

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.

User-Aktion

Keine. Neue Monitoring- und Audit-Features sind direkt nutzbar.

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.

User-Aktion

  • MUSS: API-Clients / polycrate-cli regenerieren, um die neuen LabelKeys zu erhalten.
  • KANN (nur bei externen Tools): Der interne Log Explorer V2 wird automatisch auf die neuen polycrate_*-Keys migriert — keine User-Aktion. Nur wenn eigene externe VictoriaLogs-/Grafana-Dashboards oder LogsQL-Queries ausserhalb von polycrate-api existieren, die noch auf *.polycrate.io/*-Label-Keys zugreifen, müssen diese auf die neuen polycrate_*-Keys umgestellt werden.
  • KANN: Labels werden nicht mehr direkt im MO-Form editiert — dedizierte Label-UI nutzen.

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.

User-Aktion

Keine. UI-Verbesserungen sind direkt sichtbar.

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.

User-Aktion

  • MUSS: Bookmarks auf /portal/ entfernen — liefert 404.
  • MUSS: API-Clients mit PatchedK8sAppRequest regenerieren.
  • KANN: FTS-Indexing läuft nun mit korrektem Default — bestehende Queries verifizieren.

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.