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()undcreate_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).
- Region-aware IaaS-Aufrufe über den aktualisierten
- 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-Methodenprepare_instance_for_os_morphing()undinject_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 +initramfsneu baut. Optional kann ein eigenes Skript ausos_morphing_assets.linux.scripteingebunden werden, welches die Standardlogik ersetzt. - (Windows) Ein benutzerdefiniertes Skript aus
os_morphing_assets.windows.scriptausfü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.
- (Linux) Persistent-NIC-Regeln entfernt,
- Voraussetzungen:
- Linux-Gäste: unterstützte Dateisysteme (ext4/ext3/xfs/btrfs),
update-initramfsoderdracutim Image. - Windows-Gäste: ein eigenes Morphing-Skript und ggf. Treiberpakete im S3-Bucket; der Worker muss über
ntfs-3g,chntpw,zip/unzipverfügen (siehe Worker-VM-Spezifikation).
- Linux-Gäste: unterstützte Dateisysteme (ext4/ext3/xfs/btrfs),
- 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 (bootVolumePayload). Wenn ein bereits importiertes Volume übergeben wird, setzt der Provider automatischbootVolume.source = {"type": "volume", "id": ...}und verzichtet aufimageId. Damit lassen sich Ziel-VMs direkt von einem zuvor transferierten Boot-Volume starten. - Hinweis: Optional können weiterhin zusätzliche Volumes via
volumeIdsangehängt werden;root_volume_sizegreift 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()nutztGET /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.
3. UI-Kosmetik (Logo)
- 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.