package resolver import ( "context" "fmt" "net/url" "git.zb-server.de/Sebi/ssh-netbox-wrapper/internal/netbox" ) // InterfaceNameStrategy finds the first IP assigned to a named interface (e.g. "mgmt0", "eth0"). type InterfaceNameStrategy struct { name string } func (s *InterfaceNameStrategy) Name() string { return "interface_name" } func (s *InterfaceNameStrategy) Resolve(ctx context.Context, entry *netbox.HostEntry, client *netbox.Client) (string, error) { // Build filter parameters for IP addresses attached to the named interface. var filterParam string switch entry.Kind { case "device": filterParam = fmt.Sprintf("device_id=%d&interface_name=%s", entry.ID, url.QueryEscape(s.name)) case "vm": filterParam = fmt.Sprintf("virtual_machine_id=%d&vminterface_name=%s", entry.ID, url.QueryEscape(s.name)) default: return "", fmt.Errorf("unknown kind %q", entry.Kind) } ips, err := client.GetIPsWithFilter(ctx, filterParam) if err != nil { return "", fmt.Errorf("fetching IPs for interface %q: %w", s.name, err) } if len(ips) == 0 { return "", ErrNoIP } return ips[0], nil }