add metadata info
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
parent
dbf1541a4f
commit
f8bd1aa345
2 changed files with 122 additions and 1 deletions
|
|
@ -31,3 +31,4 @@ Tout cela serait lancer depuis une api:
|
||||||
- [Les vms](./agent/instance/Home.md)
|
- [Les vms](./agent/instance/Home.md)
|
||||||
- [Serveur http](./agent/http/Home.md)
|
- [Serveur http](./agent/http/Home.md)
|
||||||
- [Persistance](./agent/persistance/Home.md)
|
- [Persistance](./agent/persistance/Home.md)
|
||||||
|
- [Metadata](./agent/metadata/Home.md)
|
||||||
120
agent/metadata/Home.md
Normal file
120
agent/metadata/Home.md
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
# Metadata server
|
||||||
|
|
||||||
|
```go
|
||||||
|
package metadata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Metadata struct {
|
||||||
|
Name string
|
||||||
|
SSHKeys []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Server struct {
|
||||||
|
metadata Metadata
|
||||||
|
listener net.Listener
|
||||||
|
server *http.Server
|
||||||
|
mu sync.Mutex
|
||||||
|
port int
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(metadata Metadata, port int) *Server {
|
||||||
|
return &Server{
|
||||||
|
metadata: metadata,
|
||||||
|
port: port,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) Start() error {
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
addr := fmt.Sprintf("127.0.0.1:%d", s.port)
|
||||||
|
ln, err := net.Listen("tcp", addr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
s.listener = ln
|
||||||
|
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
mux.HandleFunc("/meta-data", s.handleMetaData)
|
||||||
|
mux.HandleFunc("/user-data", s.handleUserData)
|
||||||
|
|
||||||
|
s.server = &http.Server{
|
||||||
|
Handler: mux,
|
||||||
|
}
|
||||||
|
go s.server.Serve(ln)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) Stop() error {
|
||||||
|
s.mu.Lock()
|
||||||
|
defer s.mu.Unlock()
|
||||||
|
|
||||||
|
if s.server != nil {
|
||||||
|
return s.server.Close()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) handleMetaData(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprintf(w, "instance-id: %s\n", s.metadata.Name)
|
||||||
|
fmt.Fprintf(w, "local-hostname: %s\n", s.metadata.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) handleUserData(w http.ResponseWriter, r *http.Request) {
|
||||||
|
keys := strings.Join(s.metadata.SSHKeys, "\n - ")
|
||||||
|
userData := fmt.Sprintf(`#cloud-config
|
||||||
|
ssh_authorized_keys:
|
||||||
|
- %s
|
||||||
|
`, keys)
|
||||||
|
fmt.Fprint(w, userData)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
type VM struct {
|
||||||
|
Name string
|
||||||
|
SSHKeys []string
|
||||||
|
MetaServer *metadata.Server
|
||||||
|
MetaPort int
|
||||||
|
// ... autres champs comme PID, TAP name, etc.
|
||||||
|
}
|
||||||
|
|
||||||
|
func StartVM(vm *VM) error {
|
||||||
|
meta := metadata.Metadata{
|
||||||
|
Name: vm.Name,
|
||||||
|
SSHKeys: vm.SSHKeys,
|
||||||
|
}
|
||||||
|
metaSrv := metadata.New(meta, vm.MetaPort)
|
||||||
|
err := metaSrv.Start()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("metadata start failed: %w", err)
|
||||||
|
}
|
||||||
|
vm.MetaServer = metaSrv
|
||||||
|
|
||||||
|
// suite du démarrage de la VM : QEMU, netns, redirection iptables...
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func StopVM(vm *VM) error {
|
||||||
|
// arrêter QEMU, nettoyer TAP, etc...
|
||||||
|
|
||||||
|
if vm.MetaServer != nil {
|
||||||
|
err := vm.MetaServer.Stop()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Erreur arrêt metadata VM %s: %v\n", vm.Name, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
```
|
||||||
Loading…
Add table
Add a link
Reference in a new issue