Coriolis/provider_funktionsstatus.md

8.5 KiB

Hier ist eine detaillierte Aufschlüsselung, welche Funktionen unser STACKIT Provider-Plugin (theoretisch) abdeckt, nachdem es erfolgreich installiert und die .endpoint-Datei hochgeladen wurde.

Voraussetzung: Alle Stackit...-Wrapper-Klassen (z.B. StackitInstance, StackitVolume) in der provider.py wurden korrekt an die JSON-Antworten der STACKIT API angepasst.


Teil 1: Basis-Funktionen (implementiert)

Diese Funktionen bilden das Fundament. Coriolis kann Ihre STACKIT-Umgebung jetzt "sehen" und als Quelle (Source) oder Ziel (Destination) für Migrations-Jobs auswählen.

1. Authentifizierung & Konnektivität

  • Status: Implementiert
  • Funktion: Coriolis kann die .endpoint-Datei lesen, sich über OAuth 2.0 bei der STACKIT IAM API authentifizieren und Bearer Tokens abrufen.
  • Test: Die authenticate()-Methode testet erfolgreich die Verbindung zur IaaS API (/flavors) UND zur Object Storage API (/buckets). Der Endpoint wird in der UI als "Valid" angezeigt.

2. Inventarisierung (Ressourcen-Erkennung)

  • Status: Implementiert
  • Funktion: Coriolis kann die Listen-Funktionen aufrufen, um alle relevanten Ressourcen in Ihrem STACKIT-Projekt zu sehen.
  • Abgedeckte Methoden:
    • list_instances(): Sie sehen alle Ihre VMs inklusive zugehöriger Labels (STACKIT "labels").
    • list_volumes(): Sie sehen alle Ihre Volumes inklusive Labels.
    • list_snapshots(): Sie sehen alle Volume-Snapshots; vererbte Labels werden ausgewiesen.
    • list_networks(): Sie sehen Ihre Netzwerke inklusive Labels.
    • list_subnets(): Zeigt "Pseudo-Subnetze", die aus den Netzwerk-CIDRs abgeleitet werden.
    • list_images(): Sie sehen alle verfügbaren OS-Images.
    • list_flavors(): Sie sehen alle verfügbaren VM-Größen.
  • Nutzen: Unverzichtbar, um im Migrations-Assistenten Quell-VMs auszuwählen oder Ziel-Netzwerke/Flavors festzulegen. Die Labels erlauben jetzt detailliertes Tagging für UI-Filtern und Projekt-Metadaten.

3. Basis-Lebenszyklus-Management (VMs)

  • Status: Implementiert
  • Funktion: Grundlegende Steuerung von VMs.
  • Abgedeckte Methoden:
    • power_on_instance()
    • power_off_instance()
    • get_instance_status()
  • Nutzen: Coriolis kann VMs vor einer Snapshot-Erstellung sicher herunterfahren.

4. Basis-Storage-Management (Volumes & Snapshots)

  • Status: Implementiert
  • Funktion: Erstellen und Löschen von Storage-Ressourcen.
  • Abgedeckte Methoden:
    • create_snapshot(): Sehr wichtig. Dies ist der erste Schritt einer jeden Migration von STACKIT weg.
    • delete_snapshot(): Wichtig für das Aufräumen.
    • create_volume(): Erstellt ein neues, leeres Volume. Wird als Basis für den Daten-Import benötigt.
    • delete_volume(): Wichtig für das Aufräumen.
    • attach_volume() / detach_volume(): Wichtig, um Volumes an temporäre Worker-VMs anzuhängen.

5. Basis-Object-Storage-Management (Control Plane)

  • Status: Implementiert (als interne Helfer-Methoden)
  • Funktion: Vorbereitung des Datentransfers.
  • Abgedeckte Methoden:
    • _get_or_create_migration_bucket(): Stellt sicher, dass ein S3-Bucket für die Migration existiert.
    • _create_temp_s3_credentials(): Erstellt S3 Access/Secret Keys für die Worker-VMs.
    • _delete_temp_s3_credentials(): Räumt die S3-Schlüssel nach dem Transfer wieder auf.
  • Nutzen: Essenzielle Vorbereitung für die noch fehlenden Datentransfer-Funktionen.

Teil 2: Erweiterte Migration-Funktionen (implementiert)

Diese Bausteine bilden den Kern des Worker-gestützten Migrations-Workflows, bei dem Coriolis temporäre VMs startet, um Daten physisch zu übertragen.

1. Datentransfer

  • Status: Implementiert (Worker-gestützt)
    export_snapshot_to_url() und create_volume_from_url() orchestrieren:
    • Region-aware IaaS-Aufrufe über den aktualisierten StackitAPIClient.
    • Bucket- und Access-Key-Lifecycle der Object-Storage-API.
    • Worker-VMs (Image/Flavor/Netzwerk frei konfigurierbar), die via cloud-init ein JSON-Job-Manifest erhalten und anschließend über die STACKIT Run-Command v2 API Skripte zur eigentlichen Datenübertragung ausführen (Python/Boto3 + lsblk-basierte Device-Erkennung).
    • Polling für Volume- und Instanz-Status sowie optionales Verifizieren des hochgeladenen Objekts via S3 (boto3).
  • Voraussetzungen: Neue .endpoint-Felder (Region, Worker-Image/-Flavor/-Netzwerk, Bucket-Name, optionaler S3-Endpoint, Run-Command-API-URL). Ohne korrektes Worker-Image oder aktivierten STACKIT-Agent lassen sich die Run-Command-Aufrufe nicht ausführen.
  • Cleanup/Output: Worker-Instanzen und temporäre Clone-Volumes werden nach Abschluss aufgeräumt (worker_auto_cleanup). Die erzeugten S3-Zugangsdaten werden im Resultat zurückgegeben, damit nachfolgende Schritte (z.B. Ziel-Import) zugreifen können; die Löschung erfolgt nach dem eigentlichen Migrations-Workflow.

2. OS-Morphing

  • Status: Implementiert (Linux, Script-basiert für Windows)
    Die neuen Provider-Methoden prepare_instance_for_os_morphing() und inject_drivers() orchestrieren eine Worker-VM, hängen das Ziel-Volume an und führen über die STACKIT Run-Command API ein Python-Skript aus, das:
    • (Linux) Persistent-NIC-Regeln entfernt, cloud-init/Netplan/ifcfg-Dateien auf DHCP setzt, GRUB-Parameter (net.ifnames=0 biosdevname=0) injiziert und VirtIO-Module + initramfs neu baut. Optional kann ein eigenes Skript aus os_morphing_assets.linux.script eingebunden werden, welches die Standardlogik ersetzt.
    • (Windows) Ein benutzerdefiniertes Skript aus os_morphing_assets.windows.script ausführt. Dieses Script erhält Zugriff auf das Block-Device ($CORIOLIS_DEVICE) und die Job-Beschreibung und kann Treiberpakete/Cloudbase-init aus dem gleichen S3-Bucket laden. Damit lässt sich der bestehende Coriolis-Workflow (VirtIO-Treiber aktivieren, Registry anpassen, DHCP setzen) 1:1 portieren.
  • Voraussetzungen:
    • Linux-Gäste: unterstützte Dateisysteme (ext4/ext3/xfs/btrfs), update-initramfs oder dracut im Image.
    • Windows-Gäste: ein eigenes Morphing-Skript und ggf. Treiberpakete im S3-Bucket; der Worker muss über ntfs-3g, chntpw, zip/unzip verfügen (siehe Worker-VM-Spezifikation).
  • Hinweis: Ohne Windows-Skript bricht der Provider den Morphing-Schritt ab. Damit ist klar ersichtlich, welche Assets noch gepflegt werden müssen.

3. Instanz-Erstellung

  • Status: Implementiert
  • Funktion: create_instance() nutzt jetzt den STACKIT Server-Endpoint (bootVolume Payload). Wenn ein bereits importiertes Volume übergeben wird, setzt der Provider automatisch bootVolume.source = {"type": "volume", "id": ...} und verzichtet auf imageId. Damit lassen sich Ziel-VMs direkt von einem zuvor transferierten Boot-Volume starten.
  • Hinweis: Optional können weiterhin zusätzliche Volumes via volumeIds angehängt werden; root_volume_size greift nur, wenn kein eigenes Boot-Volume angegeben ist.

🟡 Teil 3: Nice-to-Have & Ausstehende Verbesserungen

Diese Funktionen sind nicht kritisch für eine Migration, würden den Provider aber robuster und benutzerfreundlicher machen.

1. Asynchrones Status-Polling

  • Status: Weitgehend Implementiert
  • Funktion: Power- (start/stop), Volume- (create) und Snapshot-Operationen (create/delete) blocken nun, bis der jeweilige Ressourcenstatus über die regulären GET-/LIST-Endpunkte den Zielzustand meldet. _wait_for_snapshot_status() nutzt GET /snapshots/{id} als Workaround, sodass kein separater /tasks/{id}-Workflow nötig ist.
  • Noch offen: Für seltene Aktionen mit separaten Task-IDs (z.B. Image-Importe) könnten wir optional noch dediziertes Task-Polling ergänzen, ist aber aktuell nicht blocker.

2. Detailliertes Ressourcen-Mapping

  • Status: Implementiert (Labels)
  • Funktion: Die Wrapper-Klassen (StackitInstance, StackitVolume, StackitNetwork) mappen jetzt die STACKIT-Labels (labels), sodass Tagging-Informationen in Coriolis sichtbar und filterbar sind.
  • Grund (Nice-to-have): Optional könnten künftig weitere Metadaten (Erstellungsdatum, detaillierte Netzwerk-IPs, Sicherheitsgruppen) ergänzt werden, die über die Labels hinausgehen.
  • Status: NICHT Implementiert
  • Funktion: Ein STACKIT-Logo in der "New Cloud Endpoint"-Auswahl anzeigen.
  • Grund (Nice-to-have): Rein kosmetisch. Wie besprochen, erfordert dies eine manuelle und riskante Bearbeitung der Coriolis-Frontend-Dateien auf dem Server.