package resolver import ( "context" "fmt" "net/http" "net/http/httptest" "testing" "git.zb-server.de/Sebi/ssh-netbox-wrapper/internal/netbox" ) func TestVMResolversStayWithinTheirNetBoxInstance(t *testing.T) { sources := make([]netbox.Source, 0, 2) for i, name := range []string{"office", "lab"} { ip := fmt.Sprintf("10.0.0.%d", i+1) srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Query().Get("virtual_machine_id") != "7" { t.Errorf("wrong VM filter: %s", r.URL.RawQuery) } if r.Header.Get("Authorization") != "Token "+name { t.Error("VM lookup used another instance's credentials") } fmt.Fprintf(w, `{"count":1,"results":[{"address":%q}]}`, ip+"/24") })) t.Cleanup(srv.Close) sources = append(sources, netbox.Source{Name: name, URL: srv.URL, Token: name}) } client := netbox.NewMultiClient(sources) management, err := NewManagementSubnetStrategy([]string{"10.0.0.0/8"}) if err != nil { t.Fatal(err) } for i, source := range sources { host := &netbox.HostEntry{Source: source.Name, Name: "vm", Kind: "vm", ID: 7} for _, strategy := range []Strategy{management, &InterfaceNameStrategy{name: "mgmt0"}} { ip, err := strategy.Resolve(context.Background(), host, client) if want := fmt.Sprintf("10.0.0.%d", i+1); err != nil || ip != want { t.Fatalf("%s VM resolved through wrong instance: %q, %v", strategy.Name(), ip, err) } } } }