Aller au contenu

Architecture générale

CloudPoolManager est un système trois tiers communiquant en gRPC, avec un reverse proxy Caddy en façade et deux bases de données.

Les services

Service Chemin Ports Rôle
Frontend frontend/ 5173 (dev Vite) UI SvelteKit (enseignant + étudiant)
Control Center control_center/ 50051 (gRPC), 50055 (gRPC-Web + REST) Orchestration : users, pools, attribution, notation, inventaire
Microservice OpenStack microservices/openstack/ 50052 (gRPC), 8080 (REST interne) Provisionnement des VMs via gophercloud
Caddy caddy/ 443 (HTTPS) Reverse proxy : route gRPC-Web, REST, frontend
Auth auth/ (gitignored) 3893 (LDAP), 5556 (OIDC) GLAuth (LDAP) + Dex (OIDC/PKCE)
Guacamole distant + tunnel 18080 (tunnel local) Terminal web (clientless RDP/SSH/VNC)

Schéma détaillé des flux

flowchart LR
    subgraph nav["Navigateur"]
        FE["SvelteKit\nstores: authStore, serverpoolStore"]
    end

    CADDY{{"Caddy :443"}}

    subgraph CC["Control Center :50051 / :50055"]
        OIDC["Intercepteur OIDC\n(méthodes publiques exemptées)"]
        SVC["Services gRPC:\nAuth, GatherData, Pool,\nConfig, User, AttribVM"]
        REST["REST /api/*:\ninventory, github, nbgrader,\nguac-url, jupyter-proxy, register"]
        MON["Monitoring:\nscheduling + guac sync"]
    end

    subgraph MS["Microservice :50052"]
        GRPC2["PoolManager gRPC\nSendRessources / stream"]
        CRAWL["Monitor (2s):\nCheckAndCreate"]
        WK["Workers:\nCreate/Delete/Attrib/Stop/Start VM"]
    end

    PG[("PostgreSQL")]
    SQ[("SQLite\nPoolManagerVM.db")]
    OSC["OpenStack\nComputeClient (vmpool)\nInfra*Client (vmpoolmanager)"]
    DEX["Dex / GLAuth"]
    GH["GitHub OAuth"]
    GUA["Guacamole distant\n(tunnel 18080)"]

    FE -->|"/rpc/* (gRPC-Web)"| CADDY
    FE -->|"/api/* (REST)"| CADDY
    FE -->|"/dex/* (OIDC)"| CADDY
    FE -->|"/guacamole/*"| CADDY
    CADDY --> OIDC --> SVC
    CADDY --> REST
    CADDY --> DEX
    CADDY --> GUA
    SVC <-->|gRPC| GRPC2
    GRPC2 --> CRAWL --> WK --> OSC
    SVC --- PG
    MON --- PG
    REST --- PG
    CRAWL --- SQ
    WK --- SQ
    REST -->|register conn| GUA
    OIDC -.->|valide JWT| DEX
    REST -.->|callback| GH
    OSC -.->|"VM boot: POST /api/register"| REST

Flux clés (résumé)

Création de pool — Frontend → CreatePool RPC → le Control Center stocke le pool en PostgreSQL → envoie un RessourceRequest au microservice → job mis en file SQLite → un worker appelle l'API OpenStack → la VM s'enregistre au boot via REST /api/register → l'état remonte au frontend. Détails : Création des pools.

Attribution d'une VMAttribVMinPool RPC → on alloue une VM libre du pool → on injecte la clé SSH de l'étudiant → renvoie IP + username. Détails : Attribution.

Temps réel — Le Control Center diffuse les changements via PostgreSQL LISTEN/NOTIFY ; le frontend s'abonne et met à jour les stores Svelte.

Les deux projets OpenStack ⚠️

C'est un point d'architecture important (source de plusieurs bugs).

flowchart LR
    subgraph infra["Projet INFRA — INFRA_OS_CLOUD=ipp-idcs-vmpoolmanager"]
        I1["Listing images / flavors / réseaux\n(InfraImageClient, InfraComputeClient…)"]
    end
    subgraph student["Projet VMs — OS_CLOUD=ipp-idcs-vmpool"]
        S1["Création / suppression / stop / start des VMs\n(ComputeClient, ImageClient…)"]
    end
    front["Frontend liste les images"] --> I1
    crawl["Le crawler crée les VMs"] --> S1
  • Le frontend liste les images depuis le projet infra (vmpoolmanager).
  • Les VMs sont créées dans le projet vmpool (OS_CLOUD).
  • ⚠️ Les UUID d'images sont scopés par projet : un UUID valide côté infra ne l'est pas forcément côté vmpool. Voir la résolution d'image dans Provisionnement.

Configuration : models/client.go (CreateParams, initStudentClients, initInfraClients).

Définitions Proto

  • proto/frontcontrol.proto — Frontend ↔ Control Center (AuthService, GatherDataService, PoolService, ConfigService, UserService, AttribVMService).
  • proto/poolmanager.proto — Control Center ↔ Microservice (PoolManager : create/delete VMs, stream d'état, list resources).

Code généré : Go dans */pb/ et control_center/frontcontrolpb/, TypeScript dans frontend/src/lib/grpc/.

Bases de données

BDD Service Contenu
PostgreSQL Control Center pools, servers, users, configs, vm_instances (registrar), sessions GitHub, image_proposals
SQLite (PoolManagerVM.db) Microservice file d'attente de jobs + miroir local des pools/servers

Schéma d'auto-enregistrement des VMs : sql/registrar_schema.sql.

⚠️ Le Control Center charge control_center/.env en priorité (puis ../.env en repli) — voir Développement.