summaryrefslogtreecommitdiff
path: root/scripts/test_orchestrator_api.go
diff options
context:
space:
mode:
authorexatombe <jeremy27.clara22@gmail.com>2025-10-30 00:16:17 +0100
committerexatombe <jeremy27.clara22@gmail.com>2025-10-30 00:16:17 +0100
commit0068551700163729c1c42b4435b51064e28461a2 (patch)
treec1b3407d052642a97285154797976433b157aa22 /scripts/test_orchestrator_api.go
parent7604e249e332a872ae2e19f9826b56e3bd9313aa (diff)
feat: Implement orchestrator for PostgreSQL management via Docker and Kubernetes
- Added configuration options for orchestrator in config.go, including Docker and Kubernetes settings. - Created orchestrator package to manage PostgreSQL instances, supporting automatic container creation, conflict resolution, and resource limits. - Implemented Docker orchestrator with methods for creating, deleting, and retrieving database information. - Added Kubernetes orchestrator skeleton with TODOs for future implementation. - Developed comprehensive README documentation for orchestrator usage and configuration. - Created test script for orchestrator API to validate functionality and ensure reliability.
Diffstat (limited to 'scripts/test_orchestrator_api.go')
-rw-r--r--scripts/test_orchestrator_api.go137
1 files changed, 137 insertions, 0 deletions
diff --git a/scripts/test_orchestrator_api.go b/scripts/test_orchestrator_api.go
new file mode 100644
index 0000000..ee926ee
--- /dev/null
+++ b/scripts/test_orchestrator_api.go
@@ -0,0 +1,137 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "log"
+
+ "github.com/ketsuna-org/sovrabase/internal/config"
+ "github.com/ketsuna-org/sovrabase/internal/orchestrator"
+)
+
+func main() {
+ log.Println("🚀 Test de l'API Orchestrator\n")
+
+ // Charger la configuration
+ cfg, err := config.LoadConfig("../config.toml")
+ if err != nil {
+ log.Fatalf("❌ Erreur de chargement de la config: %v", err)
+ }
+
+ log.Printf("✅ Configuration chargĂ©e (type: %s)\n\n", cfg.Orchestrator.Type)
+
+ // Créer l'orchestrateur
+ orch, err := orchestrator.NewOrchestrator(&cfg.Orchestrator)
+ if err != nil {
+ log.Fatalf("❌ Erreur de crĂ©ation de l'orchestrateur: %v", err)
+ }
+
+ ctx := context.Background()
+ projectID := "my-awesome-project"
+
+ // Test 1: Vérifier si la base existe déjà
+ log.Println("📋 Test 1: VĂ©rification de l'existence")
+ exists, err := orch.DatabaseExists(ctx, projectID)
+ if err != nil {
+ log.Fatalf("❌ Erreur: %v", err)
+ }
+ log.Printf(" Existe déjà: %v\n\n", exists)
+
+ // Si existe déjà, la supprimer d'abord
+ if exists {
+ log.Println("đŸ—‘ïž Base existante dĂ©tectĂ©e, suppression...")
+ if err := orch.DeleteDatabase(ctx, projectID); err != nil {
+ log.Fatalf("❌ Erreur de suppression: %v", err)
+ }
+ log.Println(" ✅ SupprimĂ©e\n")
+ }
+
+ // Test 2: Créer une nouvelle base de données
+ log.Println("📋 Test 2: CrĂ©ation d'une nouvelle base de donnĂ©es")
+ options := &orchestrator.DatabaseOptions{
+ PostgresVersion: "16-alpine",
+ Port: 5434,
+ Memory: "512m",
+ CPUs: "0.5",
+ }
+
+ dbInfo, err := orch.CreateDatabase(ctx, projectID, options)
+ if err != nil {
+ log.Fatalf("❌ Erreur de crĂ©ation: %v", err)
+ }
+
+ log.Println(" ✅ Base de donnĂ©es créée avec succĂšs!")
+ printDatabaseInfo(dbInfo)
+
+ // Test 3: Récupérer les informations
+ log.Println("\n📋 Test 3: RĂ©cupĂ©ration des informations")
+ dbInfo2, err := orch.GetDatabaseInfo(ctx, projectID)
+ if err != nil {
+ log.Fatalf("❌ Erreur: %v", err)
+ }
+ log.Println(" ✅ Informations rĂ©cupĂ©rĂ©es")
+ printDatabaseInfo(dbInfo2)
+
+ // Test 4: Lister toutes les bases de données
+ log.Println("\n📋 Test 4: Liste de toutes les bases de donnĂ©es")
+ databases, err := orch.ListDatabases(ctx)
+ if err != nil {
+ log.Fatalf("❌ Erreur: %v", err)
+ }
+ log.Printf(" ✅ Nombre de bases trouvĂ©es: %d\n", len(databases))
+ for i, db := range databases {
+ log.Printf(" %d. %s (%s) - Port: %s\n", i+1, db.ProjectID, db.Status, db.Port)
+ }
+
+ // Test 5: Tester un conflit (création d'une base existante)
+ log.Println("\n📋 Test 5: Test de conflit (crĂ©ation d'une base existante)")
+ _, err = orch.CreateDatabase(ctx, projectID, options)
+ if err != nil {
+ log.Printf(" ✅ Erreur attendue reçue: %v\n", err)
+ } else {
+ log.Println(" ❌ Aucune erreur reçue (inattendu!)")
+ }
+
+ // Test 6: Supprimer la base de données
+ log.Println("\n📋 Test 6: Suppression de la base de donnĂ©es")
+ if err := orch.DeleteDatabase(ctx, projectID); err != nil {
+ log.Fatalf("❌ Erreur de suppression: %v", err)
+ }
+ log.Println(" ✅ Base de donnĂ©es supprimĂ©e")
+
+ // Test 7: Vérifier que la base n'existe plus
+ log.Println("\n📋 Test 7: VĂ©rification de la suppression")
+ exists, err = orch.DatabaseExists(ctx, projectID)
+ if err != nil {
+ log.Fatalf("❌ Erreur: %v", err)
+ }
+ log.Printf(" ✅ Existe: %v (attendu: false)\n", exists)
+
+ log.Println("\n" + repeat("=", 60))
+ log.Println("🎉 Tous les tests sont passĂ©s avec succĂšs!")
+ log.Println(repeat("=", 60))
+}
+
+func printDatabaseInfo(db *orchestrator.DatabaseInfo) {
+ fmt.Println("\n " + repeat("-", 50))
+ fmt.Printf(" 📊 Projet: %s\n", db.ProjectID)
+ fmt.Printf(" 📩 Conteneur: %s\n", db.ContainerName)
+ fmt.Printf(" 🆔 Container ID: %s\n", db.ContainerID[:12])
+ fmt.Printf(" 📊 Status: %s\n", db.Status)
+ fmt.Printf(" 🐘 Version: PostgreSQL %s\n", db.PostgresVersion)
+ fmt.Printf(" 🔌 Port: %s\n", db.Port)
+ fmt.Printf(" đŸ’Ÿ Database: %s\n", db.Database)
+ fmt.Printf(" đŸ‘€ User: %s\n", db.User)
+ fmt.Printf(" 🔑 Password: %s\n", db.Password)
+ fmt.Printf(" 🔗 Connection: %s\n", db.ConnectionString)
+ fmt.Printf(" 📅 Created: %s\n", db.CreatedAt.Format("2006-01-02 15:04:05"))
+ fmt.Println(" " + repeat("-", 50))
+}
+
+func repeat(s string, n int) string {
+ result := ""
+ for i := 0; i < n; i++ {
+ result += s
+ }
+ return result
+}