package store import ( "context" "path/filepath" "testing" "pve-confsync/internal/nodesync" ) func TestNodesAndProfiles(t *testing.T) { ctx := context.Background() st, err := Open(filepath.Join(t.TempDir(), "t.db"), testKey(1)) if err != nil { t.Fatal(err) } if err := st.SaveCluster(ctx, "", Cluster{Name: "lab", Role: ClusterPrimary, URL: "https://lab:8006", Password: "cluster-pass"}); err != nil { t.Fatal(err) } if err := st.SetNodes(ctx, "lab", []Discovered{{"pve1", "10.0.0.11"}, {"pve2", "10.0.0.12"}}); err != nil { t.Fatal(err) } if err := st.PinNode(ctx, "lab", "pve2", "ssh-ed25519 AAAA", nil); err != nil { t.Fatal(err) } // the cluster password by default, the node's own one once set a, err := st.NodeAccessOf(ctx, "lab", "pve2") if err != nil || a.SSH.Password != "cluster-pass" || a.SSH.Host != "10.0.0.12" || a.SSH.HostKey == "" { t.Fatalf("%+v %v", a.SSH, err) } if err := st.SaveNode(ctx, "lab", "pve2", "192.168.0.12", 22, "own-pass", false); err != nil { t.Fatal(err) } a, _ = st.NodeAccessOf(ctx, "lab", "pve2") if a.SSH.Password != "own-pass" || a.SSH.Host != "192.168.0.12" || a.SSH.HostKey != "" { t.Fatalf("new address must forget the host key: %+v", a.SSH) } // a node gone from the cluster is removed if err := st.SetNodes(ctx, "lab", []Discovered{{"pve1", "10.0.0.11"}}); err != nil { t.Fatal(err) } if ns, _ := st.Nodes(ctx); len(ns) != 1 || ns[0].Key != "lab/pve1" { t.Fatalf("nodes: %+v", ns) } p := nodesync.Profile{Name: "net", Master: "lab/pve1", Targets: []string{"lab/pve2"}, Items: []string{"network"}, Mapping: map[string]nodesync.TargetMap{"lab/pve2": {NICs: map[string]string{"eno1": "enp1s0"}}}} if err := st.SaveProfile(ctx, "", p); err != nil { t.Fatal(err) } if err := st.SaveProfile(ctx, "", nodesync.Profile{Name: "bad", Master: "lab/pve1", Targets: []string{"lab/pve1"}, Items: []string{"network"}}); err == nil { t.Error("master as target accepted") } // renaming the cluster follows in the nodes and the profiles c, _, _ := st.Cluster(ctx, "lab") c.Name = "rennes" if err := st.SaveCluster(ctx, "lab", c); err != nil { t.Fatal(err) } got, err := st.Profile(ctx, "net") if err != nil || got.Master != "rennes/pve1" || got.Targets[0] != "rennes/pve2" || got.Mapping["rennes/pve2"].NICs["eno1"] != "enp1s0" { t.Fatalf("profile after rename: %+v %v", got, err) } if ns, _ := st.Nodes(ctx); len(ns) != 1 || ns[0].Key != "rennes/pve1" { t.Fatalf("nodes after rename: %+v", ns) } }