f-25: code: move load data to dedicated function

Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
This commit is contained in:
GnomeZworc 2026-04-26 17:57:16 +02:00
commit cc9998028d
Signed by: nicolas.boufideline
GPG key ID: 4406BBBF8845D632
6 changed files with 222 additions and 208 deletions

View file

@ -2,8 +2,6 @@ package vm
import (
"fmt"
"strconv"
"strings"
"git.g3e.fr/syonad/two/internal/iptables"
"git.g3e.fr/syonad/two/internal/metadata"
@ -24,84 +22,28 @@ func StartVM(db *badger.DB, name string) error {
return nil
}
subnetName, err := kv.GetFromDB(db, "vm/"+name+"/subnet")
d, err := loadVM(db, name)
if err != nil {
return fmt.Errorf("get subnet: %w", err)
return err
}
vpcName, err := kv.GetFromDB(db, "subnet/"+subnetName+"/vpc")
if err != nil {
return fmt.Errorf("get vpc: %w", err)
}
gatewayIP, err := kv.GetFromDB(db, "subnet/"+subnetName+"/gateway_ip")
if err != nil {
return fmt.Errorf("get gateway_ip: %w", err)
}
bridge := "br-" + strings.SplitN(subnetName, "-", 2)[1]
tapIDStr, err := kv.GetFromDB(db, "vm/"+name+"/tap_id")
if err != nil {
return fmt.Errorf("get tap_id: %w", err)
}
tapID, err := strconv.Atoi(tapIDStr)
if err != nil {
return fmt.Errorf("parse tap_id: %w", err)
}
vmIP, err := kv.GetFromDB(db, "vm/"+name+"/ip")
if err != nil {
return fmt.Errorf("get ip: %w", err)
}
metadataPort, err := kv.GetFromDB(db, "vm/"+name+"/metadata_port")
if err != nil {
return fmt.Errorf("get metadata_port: %w", err)
}
mac, err := kv.GetFromDB(db, "vm/"+name+"/mac")
if err != nil {
return fmt.Errorf("get mac: %w", err)
}
volumePath, err := kv.GetFromDB(db, "vm/"+name+"/volume_path")
if err != nil {
return fmt.Errorf("get volume_path: %w", err)
}
memoryStr, err := kv.GetFromDB(db, "vm/"+name+"/memory")
if err != nil {
return fmt.Errorf("get memory: %w", err)
}
memory, _ := strconv.Atoi(memoryStr)
cpusStr, err := kv.GetFromDB(db, "vm/"+name+"/cpus")
if err != nil {
return fmt.Errorf("get cpus: %w", err)
}
cpus, _ := strconv.Atoi(cpusStr)
password, _ := kv.GetFromDB(db, "vm/"+name+"/password")
sshkey, _ := kv.GetFromDB(db, "vm/"+name+"/sshkey")
if err := netif.CreateTap(tapID, bridge, vpcName); err != nil {
if err := netif.CreateTap(d.tapID, d.bridge, d.vpcName); err != nil {
return fmt.Errorf("create tap: %w", err)
}
if err := netns.Call(vpcName, func() error {
return iptables.AddMetadataRedirect(vmIP, gatewayIP, metadataPort)
if err := netns.Call(d.vpcName, func() error {
return iptables.AddMetadataRedirect(d.ip, d.gatewayIP, d.metadataPort)
}); err != nil {
return fmt.Errorf("add metadata redirect: %w", err)
}
if err := metadata.StartMetadata(metadata.NoCloudConfig{
Name: name,
VpcName: vpcName,
BindIP: gatewayIP,
BindPort: metadataPort,
Password: password,
SSHKEY: sshkey,
VpcName: d.vpcName,
BindIP: d.gatewayIP,
BindPort: d.metadataPort,
Password: d.password,
SSHKEY: d.sshkey,
}, db, false); err != nil {
return fmt.Errorf("start metadata: %w", err)
}

100
internal/vm/data.go Normal file
View file

@ -0,0 +1,100 @@
package vm
import (
"fmt"
"strconv"
"strings"
"git.g3e.fr/syonad/two/pkg/db/kv"
"github.com/dgraph-io/badger/v4"
)
type vmData struct {
subnetName string
vpcName string
gatewayIP string
bridge string
tapID int
ip string
metadataPort string
mac string
volumePath string
memory int
cpus int
password string
sshkey string
}
func loadVM(db *badger.DB, name string) (vmData, error) {
var d vmData
subnetName, err := kv.GetFromDB(db, "vm/"+name+"/subnet")
if err != nil {
return d, fmt.Errorf("get subnet: %w", err)
}
d.subnetName = subnetName
d.bridge = "br-" + strings.SplitN(subnetName, "-", 2)[1]
vpcName, err := kv.GetFromDB(db, "subnet/"+subnetName+"/vpc")
if err != nil {
return d, fmt.Errorf("get vpc: %w", err)
}
d.vpcName = vpcName
gatewayIP, err := kv.GetFromDB(db, "subnet/"+subnetName+"/gateway_ip")
if err != nil {
return d, fmt.Errorf("get gateway_ip: %w", err)
}
d.gatewayIP = gatewayIP
tapIDStr, err := kv.GetFromDB(db, "vm/"+name+"/tap_id")
if err != nil {
return d, fmt.Errorf("get tap_id: %w", err)
}
tapID, err := strconv.Atoi(tapIDStr)
if err != nil {
return d, fmt.Errorf("parse tap_id: %w", err)
}
d.tapID = tapID
ip, err := kv.GetFromDB(db, "vm/"+name+"/ip")
if err != nil {
return d, fmt.Errorf("get ip: %w", err)
}
d.ip = ip
metadataPort, err := kv.GetFromDB(db, "vm/"+name+"/metadata_port")
if err != nil {
return d, fmt.Errorf("get metadata_port: %w", err)
}
d.metadataPort = metadataPort
mac, err := kv.GetFromDB(db, "vm/"+name+"/mac")
if err != nil {
return d, fmt.Errorf("get mac: %w", err)
}
d.mac = mac
volumePath, err := kv.GetFromDB(db, "vm/"+name+"/volume_path")
if err != nil {
return d, fmt.Errorf("get volume_path: %w", err)
}
d.volumePath = volumePath
memoryStr, err := kv.GetFromDB(db, "vm/"+name+"/memory")
if err != nil {
return d, fmt.Errorf("get memory: %w", err)
}
d.memory, _ = strconv.Atoi(memoryStr)
cpusStr, err := kv.GetFromDB(db, "vm/"+name+"/cpus")
if err != nil {
return d, fmt.Errorf("get cpus: %w", err)
}
d.cpus, _ = strconv.Atoi(cpusStr)
d.password, _ = kv.GetFromDB(db, "vm/"+name+"/password")
d.sshkey, _ = kv.GetFromDB(db, "vm/"+name+"/sshkey")
return d, nil
}

View file

@ -2,7 +2,6 @@ package vm
import (
"fmt"
"strconv"
"time"
configuration "git.g3e.fr/syonad/two/internal/config/agent"
@ -25,38 +24,9 @@ func StopVM(db *badger.DB, name string, cfg *configuration.Config) error {
return nil
}
subnetName, err := kv.GetFromDB(db, "vm/"+name+"/subnet")
d, err := loadVM(db, name)
if err != nil {
return fmt.Errorf("get subnet: %w", err)
}
vpcName, err := kv.GetFromDB(db, "subnet/"+subnetName+"/vpc")
if err != nil {
return fmt.Errorf("get vpc: %w", err)
}
gatewayIP, err := kv.GetFromDB(db, "subnet/"+subnetName+"/gateway_ip")
if err != nil {
return fmt.Errorf("get gateway_ip: %w", err)
}
tapIDStr, err := kv.GetFromDB(db, "vm/"+name+"/tap_id")
if err != nil {
return fmt.Errorf("get tap_id: %w", err)
}
tapID, err := strconv.Atoi(tapIDStr)
if err != nil {
return fmt.Errorf("parse tap_id: %w", err)
}
vmIP, err := kv.GetFromDB(db, "vm/"+name+"/ip")
if err != nil {
return fmt.Errorf("get ip: %w", err)
}
metadataPort, err := kv.GetFromDB(db, "vm/"+name+"/metadata_port")
if err != nil {
return fmt.Errorf("get metadata_port: %w", err)
return err
}
socketPath := fmt.Sprintf("/tmp/%s.qmp-sock", name)
@ -81,8 +51,8 @@ func StopVM(db *badger.DB, name string, cfg *configuration.Config) error {
}
}
if err := netns.Call(vpcName, func() error {
return iptables.DeleteMetadataRedirect(vmIP, gatewayIP, metadataPort)
if err := netns.Call(d.vpcName, func() error {
return iptables.DeleteMetadataRedirect(d.ip, d.gatewayIP, d.metadataPort)
}); err != nil {
return fmt.Errorf("delete metadata redirect: %w", err)
}
@ -91,7 +61,7 @@ func StopVM(db *badger.DB, name string, cfg *configuration.Config) error {
return fmt.Errorf("stop metadata: %w", err)
}
if err := netif.DeleteTap(tapID, vpcName); err != nil {
if err := netif.DeleteTap(d.tapID, d.vpcName); err != nil {
return fmt.Errorf("delete tap: %w", err)
}