Files
ssh-netbox-wrapper/internal/resolver/interface_name.go
T
Sebastian Unterschütz 8ef4bbec16
Release / release (push) Failing after 51s
Add core modules (SSH args parser, cache, resolver, NetBox client) with tests
2026-05-23 12:38:41 +02:00

39 lines
1.1 KiB
Go

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
}