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
BlockstattArtifact;K8sApp.installed_versionist Block-basiert; ArtifactHub undArtifactRepository-Discovery sind entfernt. - Externe DNS-Zonen — Provisioning via
python-lexiconfür alle gängigen DNS-Provider (Route53, Cloudflare, Hetzner-DNS, …).DNSZoneist jetzt Productized Model mit separaten Produkten fürinternal/external. - K8sVolume Productized — Automatische Product-Zuordnung, Billing via
get_billing_quantity-Hook, Fixes ancomputed_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 aufpolycrate_*-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_idam SystemOwner undloopback_project_idje 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.kindwird für alle bestehenden Zonen aufinternalgebackfillt.K8sVolume.productwird für bestehende Volumes aufSystemConfig.default_k8s_volume_productgesetzt.OrganizationProduct.active_fromwird für Legacy-Einträge aufcreated_atoder Org-Startdatum gesetzt.SystemConfigbekommt 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.kindwird um DNS-Provider-Kinds erweitert.
Pflicht-Konfiguration nach Deploy
- Keycloak (falls genutzt):
SystemConfig→KEYCLOAK_INTEGRATION_ENABLED=true+ Server-URL / Realm / Admin-Credentials setzen. - DNS: Falls externe Zonen verwaltet werden sollen,
default_external_dns_zone_productunddefault_internal_dns_zone_productinSystemConfigsetzen. - K8sVolume Pricing:
default_k8s_volume_productinSystemConfigsetzen, damit neu angelegteK8sVolumes automatisch einem Produkt zugeordnet werden. - polycrate-operator-Block: Auf kompatible Version upgraden (Block-basiertes Lookup). Ohne Upgrade wird
installed_versionnicht korrekt propagiert.
API-/CLI-Clients regenerieren
K8sApphat keineartifact/artifact_packageFKs mehr — stattdesseninstalled_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. S3BucketViewSethat korrigiertes OpenAPI-Schema + Agent-Auto-Assignment.
Entfernte Komponenten
/portal/(Organization Portal) ist komplett entfernt. Bestehende Bookmarks liefern 404.- ArtifactHub-Discovery und
artifact_discoveryaus 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.