From 4128050052faf7bc3d53a7e1c9bf875de8fc66a6 Mon Sep 17 00:00:00 2001 From: GnomeZworc Date: Thu, 24 Apr 2025 14:16:31 +0200 Subject: [PATCH] regorg sidebar Signed-off-by: GnomeZworc --- agent/http/Home.md => Agent HTTP.md | 11 +- agent/instance/Home.md => Agent Instance.md | 0 agent/Home.md => Agent KVM.md | 10 +- agent/metadata/Home.md => Agent Metadata.md | 0 agent/network/Home.md => Agent Network.md | 0 .../Home.md => Agent Persistance.md | 0 Event Bus.md | 129 ++++++++++++++++++ Home.md | 4 +- _Sidebar.md | 11 ++ agent/agent_archi.drawio.svg | 4 + 10 files changed, 155 insertions(+), 14 deletions(-) rename agent/http/Home.md => Agent HTTP.md (95%) rename agent/instance/Home.md => Agent Instance.md (100%) rename agent/Home.md => Agent KVM.md (72%) rename agent/metadata/Home.md => Agent Metadata.md (100%) rename agent/network/Home.md => Agent Network.md (100%) rename agent/persistance/Home.md => Agent Persistance.md (100%) create mode 100644 Event Bus.md create mode 100644 _Sidebar.md create mode 100644 agent/agent_archi.drawio.svg diff --git a/agent/http/Home.md b/Agent HTTP.md similarity index 95% rename from agent/http/Home.md rename to Agent HTTP.md index a19076f..cf838f5 100644 --- a/agent/http/Home.md +++ b/Agent HTTP.md @@ -152,7 +152,14 @@ func main() { http.HandleFunc("/rpc", rpcHandler(taskQueue, resultChan)) - log.Println("Serveur JSON-RPC sur :8080") - log.Fatal(http.ListenAndServe(":8080", nil)) + + go func() { + log.Println("Serveur JSON-RPC sur :8080") + log.Fatal(http.ListenAndServe(":8080", nil)) + }() + + for { + time.Sleep(1 * time.Hour) + } } ``` \ No newline at end of file diff --git a/agent/instance/Home.md b/Agent Instance.md similarity index 100% rename from agent/instance/Home.md rename to Agent Instance.md diff --git a/agent/Home.md b/Agent KVM.md similarity index 72% rename from agent/Home.md rename to Agent KVM.md index 86b74b9..39e6ea9 100644 --- a/agent/Home.md +++ b/Agent KVM.md @@ -1,5 +1,3 @@ -# Agent kvm - ## Fonctionnement L'agent fera plusieurs chose: @@ -25,10 +23,4 @@ Tout cela serait lancer depuis une api: - renvoie la list complete de toutes vms qui tourne sur l'host et leur status - vm zmobie compris -## Architecture - -- [Reseaux](./agent/network/Home.md) -- [Les vms](./agent/instance/Home.md) -- [Serveur http](./agent/http/Home.md) -- [Persistance](./agent/persistance/Home.md) -- [Metadata](./agent/metadata/Home.md) \ No newline at end of file +## Architecture \ No newline at end of file diff --git a/agent/metadata/Home.md b/Agent Metadata.md similarity index 100% rename from agent/metadata/Home.md rename to Agent Metadata.md diff --git a/agent/network/Home.md b/Agent Network.md similarity index 100% rename from agent/network/Home.md rename to Agent Network.md diff --git a/agent/persistance/Home.md b/Agent Persistance.md similarity index 100% rename from agent/persistance/Home.md rename to Agent Persistance.md diff --git a/Event Bus.md b/Event Bus.md new file mode 100644 index 0000000..d95e10f --- /dev/null +++ b/Event Bus.md @@ -0,0 +1,129 @@ +# A simple event queue + +## 🧱 Design simple en Go + +### 🎛️ Structure `Event` + +```go +type EventType string + +const ( + EventStart EventType = "start" + EventStop EventType = "stop" + EventReboot EventType = "reboot" + EventAttach EventType = "attach-disk" + EventDetach EventType = "detach-disk" +) + +type VMEvent struct { + Type EventType + VMID string + Params map[string]string // optionnel selon le type +} +``` + +--- + +### 📬 EventQueue (thread-safe FIFO + notify) + +```go +type EventQueue struct { + queue []VMEvent + lock sync.Mutex + signal chan struct{} +} + +func NewEventQueue() *EventQueue { + return &EventQueue{ + queue: make([]VMEvent, 0), + signal: make(chan struct{}, 1), + } +} + +func (eq *EventQueue) Push(ev VMEvent) { + eq.lock.Lock() + defer eq.lock.Unlock() + eq.queue = append(eq.queue, ev) + + select { + case eq.signal <- struct{}{}: + default: + // si déjà notify, pas besoin de spammer + } +} + +func (eq *EventQueue) Pop() (VMEvent, bool) { + eq.lock.Lock() + defer eq.lock.Unlock() + + if len(eq.queue) == 0 { + return VMEvent{}, false + } + + ev := eq.queue[0] + eq.queue = eq.queue[1:] + return ev, true +} +``` + +--- + +### 🔁 Boucle d'exécution FIFO + +```go +func StartEventLoop(eq *EventQueue, manager *Manager) { + go func() { + for { + <-eq.signal // bloquant jusqu'à ce qu’un event arrive + + for { + ev, ok := eq.Pop() + if !ok { + break + } + + log.Printf("⏳ Processing event %s for VM %s", ev.Type, ev.VMID) + + switch ev.Type { + case EventStart: + manager.StartVMByID(ev.VMID) + case EventStop: + manager.StopVMByID(ev.VMID) + case EventAttach: + manager.AttachDisk(ev.VMID, ev.Params["path"]) + case EventDetach: + manager.DetachDisk(ev.VMID, ev.Params["path"]) + default: + log.Printf("⚠️ Unknown event type: %s", ev.Type) + } + } + } + }() +} +``` + +--- + +### 🌐 Exposition via HTTP (exemple minimal) + +```go +func handleStartVM(w http.ResponseWriter, r *http.Request, eq *EventQueue) { + vmID := r.URL.Query().Get("id") + if vmID == "" { + http.Error(w, "missing id", 400) + return + } + eq.Push(VMEvent{Type: EventStart, VMID: vmID}) + fmt.Fprintf(w, "Start request enqueued") +} +``` + +--- + +## 🔔 Résumé de la comm' inter-composants + +```text +[API HTTP] --(Push VMEvent)--> [EventQueue] --(notify chan)--> [EventLoop] + | + [Pop / Switch exec based on event type] +``` \ No newline at end of file diff --git a/Home.md b/Home.md index de7d0e1..856d54d 100644 --- a/Home.md +++ b/Home.md @@ -4,6 +4,4 @@ Bienvenue sur le wiki du projet syonad _/sjɔ.nad/_ ## Architecture -Le projet sera developper en GO en suivant le [Standard Go Project Layout](https://github.com/golang-standards/project-layout). - -Il sera composer d'un [agent](./agent/Home.md) \ No newline at end of file +Le projet sera developper en GO en suivant le [Standard Go Project Layout](https://github.com/golang-standards/project-layout). \ No newline at end of file diff --git a/_Sidebar.md b/_Sidebar.md new file mode 100644 index 0000000..a47bf0d --- /dev/null +++ b/_Sidebar.md @@ -0,0 +1,11 @@ +**Project** +- [[Home]] + +**Architecture** +- [Agent KVM](./Agent%20KVM.md) + - [Reseaux](./Agent%20Network.md) + - [Instance](./Agent%20Instance.md) + - [Metadata](./Agent%20Metadata.md) + - [Persistance](./Agent%20Persistance.md) + - [HTTP](./Agent%20HTTP.md) +- [Event BUS](./Event%20BUS.md) \ No newline at end of file diff --git a/agent/agent_archi.drawio.svg b/agent/agent_archi.drawio.svg new file mode 100644 index 0000000..aee43b8 --- /dev/null +++ b/agent/agent_archi.drawio.svg @@ -0,0 +1,4 @@ + + + +
Agent
http
json-rpc
rpc-handler
Binary
gRpc
read call
wright call
e
v
e
n
t

b
u
s
bdd
RO
RW
push
worker
pop
RO
monitoring
S
Y
S
T
E
M
RW
RO
RO
I
N
T
E
L
NOTIFY
memory
file system
push
Metadata http
Metadata http
Metadata http
Metadata http
start
\ No newline at end of file