f-34: metadata: add metadata in dispatcher #34
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
This commit is contained in:
parent
883d628bf6
commit
ae81158b2d
5 changed files with 221 additions and 15 deletions
|
|
@ -42,12 +42,13 @@ func StartVM(db *badger.DB, name string, cfg *configuration.Config) error {
|
|||
}
|
||||
|
||||
if err := metadata.StartMetadata(metadata.NoCloudConfig{
|
||||
Name: name,
|
||||
VpcName: d.vpcName,
|
||||
BindIP: d.interfaceIP,
|
||||
BindPort: d.metadataPort,
|
||||
Password: d.password,
|
||||
SSHKEY: d.sshkey,
|
||||
Name: name,
|
||||
VpcName: d.vpcName,
|
||||
BindIP: d.interfaceIP,
|
||||
BindPort: d.metadataPort,
|
||||
Password: d.password,
|
||||
SSHKEY: d.sshkey,
|
||||
Documents: d.documents,
|
||||
}, cfg, false); err != nil {
|
||||
return fmt.Errorf("start metadata: %w", err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ type vmData struct {
|
|||
uefi bool
|
||||
password string
|
||||
sshkey string
|
||||
documents map[string]string
|
||||
}
|
||||
|
||||
func loadVM(db *badger.DB, name string) (vmData, error) {
|
||||
|
|
@ -124,5 +125,17 @@ func loadVM(db *badger.DB, name string) (vmData, error) {
|
|||
d.password, _ = kv.GetFromDB(db, "vm/"+name+"/password")
|
||||
d.sshkey, _ = kv.GetFromDB(db, "vm/"+name+"/sshkey")
|
||||
|
||||
docPrefix := "vm/" + name + "/metadata/"
|
||||
docEntries, err := kv.ListByPrefix(db, docPrefix)
|
||||
if err != nil {
|
||||
return d, fmt.Errorf("list metadata documents: %w", err)
|
||||
}
|
||||
if len(docEntries) > 0 {
|
||||
d.documents = make(map[string]string, len(docEntries))
|
||||
for key, content := range docEntries {
|
||||
d.documents[strings.TrimPrefix(key, docPrefix)] = content
|
||||
}
|
||||
}
|
||||
|
||||
return d, nil
|
||||
}
|
||||
|
|
|
|||
90
internal/vm/data_test.go
Normal file
90
internal/vm/data_test.go
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
package vm
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.g3e.fr/syonad/two/pkg/db/kv"
|
||||
"github.com/dgraph-io/badger/v4"
|
||||
)
|
||||
|
||||
func newVMInDB(t *testing.T) *badger.DB {
|
||||
t.Helper()
|
||||
db := kv.InitDB(kv.Config{Path: t.TempDir()}, false)
|
||||
t.Cleanup(func() { db.Close() })
|
||||
|
||||
kv.AddInDB(db, "vm/vm-1/subnet", "sn-000001")
|
||||
kv.AddInDB(db, "subnet/sn-000001/vpc", "vp-admin")
|
||||
kv.AddInDB(db, "subnet/sn-000001/interface_ip", "10.1.1.1")
|
||||
kv.AddInDB(db, "subnet/sn-000001/dhcp/10.1.1.2", "00:22:33:00:01:02")
|
||||
kv.AddInDB(db, "vm/vm-1/ip", "10.1.1.2")
|
||||
kv.AddInDB(db, "vm/vm-1/metadata_port", "8081")
|
||||
kv.AddInDB(db, "vm/vm-1/disk/vda", "/data/root.qcow2")
|
||||
kv.AddInDB(db, "vm/vm-1/memory", "2048")
|
||||
kv.AddInDB(db, "vm/vm-1/cpus", "2")
|
||||
return db
|
||||
}
|
||||
|
||||
func TestLoadVM_NoDocuments(t *testing.T) {
|
||||
db := newVMInDB(t)
|
||||
|
||||
d, err := loadVM(db, "vm-1")
|
||||
if err != nil {
|
||||
t.Fatalf("loadVM : %v", err)
|
||||
}
|
||||
if d.documents != nil {
|
||||
t.Errorf("aucun document en base, la map doit rester nil : %v", d.documents)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadVM_ReadsDocuments(t *testing.T) {
|
||||
db := newVMInDB(t)
|
||||
userData := "#cloud-config\npackages:\n - nginx\n"
|
||||
kv.AddInDB(db, "vm/vm-1/metadata/user-data", userData)
|
||||
kv.AddInDB(db, "vm/vm-1/metadata/network-config", "version: 2\n")
|
||||
|
||||
d, err := loadVM(db, "vm-1")
|
||||
if err != nil {
|
||||
t.Fatalf("loadVM : %v", err)
|
||||
}
|
||||
if len(d.documents) != 2 {
|
||||
t.Fatalf("2 documents attendus, obtenu %d : %v", len(d.documents), d.documents)
|
||||
}
|
||||
if d.documents["user-data"] != userData {
|
||||
t.Errorf("user-data altéré au passage en base :\nattendu %q\nobtenu %q", userData, d.documents["user-data"])
|
||||
}
|
||||
if d.documents["network-config"] != "version: 2\n" {
|
||||
t.Errorf("network-config inattendu : %q", d.documents["network-config"])
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadVM_DocumentKeysAreStrippedOfPrefix(t *testing.T) {
|
||||
db := newVMInDB(t)
|
||||
kv.AddInDB(db, "vm/vm-1/metadata/vendor-data", "v")
|
||||
|
||||
d, err := loadVM(db, "vm-1")
|
||||
if err != nil {
|
||||
t.Fatalf("loadVM : %v", err)
|
||||
}
|
||||
for key := range d.documents {
|
||||
if key != "vendor-data" {
|
||||
t.Errorf("clé de document attendue %q, obtenue %q — le préfixe doit être retiré", "vendor-data", key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadVM_EmptyDocumentIsPreserved(t *testing.T) {
|
||||
db := newVMInDB(t)
|
||||
kv.AddInDB(db, "vm/vm-1/metadata/user-data", "")
|
||||
|
||||
d, err := loadVM(db, "vm-1")
|
||||
if err != nil {
|
||||
t.Fatalf("loadVM : %v", err)
|
||||
}
|
||||
content, ok := d.documents["user-data"]
|
||||
if !ok {
|
||||
t.Fatal("un document vide doit survivre au passage en base : c'est une demande de ne rien servir")
|
||||
}
|
||||
if content != "" {
|
||||
t.Errorf("contenu attendu vide, obtenu %q", content)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue