From eda9844d51e1fe4c3af7cb2d55474a666e3f9db4 Mon Sep 17 00:00:00 2001 From: Damyan Yordanov Date: Thu, 26 Sep 2024 10:41:09 +0200 Subject: [PATCH 1/3] Fix null pointer in ApplyEndpoint() --- plugins/metal/plugin.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/metal/plugin.go b/plugins/metal/plugin.go index caa8b52..8e98bc5 100644 --- a/plugins/metal/plugin.go +++ b/plugins/metal/plugin.go @@ -11,6 +11,8 @@ import ( "os" "strings" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "github.com/coredhcp/coredhcp/handler" "github.com/coredhcp/coredhcp/logger" "github.com/coredhcp/coredhcp/plugins" @@ -23,7 +25,6 @@ import ( "github.com/mdlayher/netx/eui64" "gopkg.in/yaml.v3" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - controllerruntime "sigs.k8s.io/controller-runtime" ) var log = logger.GetLogger("plugins/metal") @@ -179,7 +180,7 @@ func ApplyEndpointForInventory(name string, mac net.HardwareAddr, ip *netip.Addr return fmt.Errorf("kubernetes client not initialized") } - if _, err := controllerruntime.CreateOrUpdate(ctx, cl, endpoint, func() error { return nil }); err != nil { + if _, err := controllerutil.CreateOrPatch(ctx, cl, endpoint, nil); err != nil { return fmt.Errorf("failed to apply endpoint: %v", err) } From 40496c9ce24f1d56bda0c84f7f16b0bd5a842c8e Mon Sep 17 00:00:00 2001 From: Damyan Yordanov Date: Thu, 26 Sep 2024 14:22:48 +0200 Subject: [PATCH 2/3] Improve logging output Do not return error if an unknown inventory shows up, just print the info --- plugins/metal/plugin.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/metal/plugin.go b/plugins/metal/plugin.go index 8e98bc5..e023f82 100644 --- a/plugins/metal/plugin.go +++ b/plugins/metal/plugin.go @@ -57,13 +57,12 @@ func setup6(args ...string) (handler.Handler6, error) { } func loadConfig(args ...string) (map[string]string, error) { - log.Info("Loading metal config") path, err := parseArgs(args...) if err != nil { return nil, fmt.Errorf("invalid configuration: %v", err) } - log.Info("Reading metal config file", "ConfigFile", path) + log.Infof("Reading metal config file %s", path) configData, err := os.ReadFile(path) if err != nil { return nil, fmt.Errorf("failed to read config file: %v", err) @@ -81,7 +80,7 @@ func loadConfig(args ...string) (map[string]string, error) { } } - log.Info("Loaded metal config", "Inventories", len(inventories)) + log.Infof("Loaded metal config with %d inventories", len(inventories)) return inventories, nil } @@ -136,8 +135,9 @@ func handler4(req, resp *dhcpv4.DHCPv4) (*dhcpv4.DHCPv4, bool) { func applyEndpointForMACAddress(mac net.HardwareAddr, subnetFamily ipamv1alpha1.SubnetAddressType) error { inventoryName, ok := inventoryMap[mac.String()] if !ok { - // done here, next plugin - return fmt.Errorf("unknown inventory MAC address: %s", mac.String()) + // done here, return no error, next plugin + log.Printf("Unknown inventory MAC address: %s", mac.String()) + return nil } ip, err := GetIPForMACAddress(mac, subnetFamily) @@ -148,6 +148,8 @@ func applyEndpointForMACAddress(mac net.HardwareAddr, subnetFamily ipamv1alpha1. if ip != nil { if err := ApplyEndpointForInventory(inventoryName, mac, ip); err != nil { return fmt.Errorf("could not apply endpoint for inventory: %s", err) + } else { + log.Infof("Successfully applied endpoint for inventory %s[%s]", inventoryName, mac.String()) } } else { log.Infof("Could not find IP for MAC address %s", mac.String()) From 6b21ea99c51be538a6da277cae7fbe7866fbbdfc Mon Sep 17 00:00:00 2001 From: Damyan Yordanov Date: Thu, 26 Sep 2024 14:31:56 +0200 Subject: [PATCH 3/3] Always set inventory map low case, no matter the configuration casing --- plugins/metal/plugin.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/metal/plugin.go b/plugins/metal/plugin.go index e023f82..f19e0ef 100644 --- a/plugins/metal/plugin.go +++ b/plugins/metal/plugin.go @@ -76,7 +76,7 @@ func loadConfig(args ...string) (map[string]string, error) { inventories := make(map[string]string) for _, i := range config { if i.MacAddress != "" && i.Name != "" { - inventories[i.MacAddress] = i.Name + inventories[strings.ToLower(i.MacAddress)] = i.Name } } @@ -133,7 +133,7 @@ func handler4(req, resp *dhcpv4.DHCPv4) (*dhcpv4.DHCPv4, bool) { } func applyEndpointForMACAddress(mac net.HardwareAddr, subnetFamily ipamv1alpha1.SubnetAddressType) error { - inventoryName, ok := inventoryMap[mac.String()] + inventoryName, ok := inventoryMap[strings.ToLower(mac.String())] if !ok { // done here, return no error, next plugin log.Printf("Unknown inventory MAC address: %s", mac.String()) @@ -203,7 +203,7 @@ func GetIPForMACAddress(mac net.HardwareAddr, subnetFamily ipamv1alpha1.SubnetAd return nil, fmt.Errorf("failed to list IPs: %v", err) } - sanitizedMAC := strings.Replace(mac.String(), ":", "", -1) + sanitizedMAC := strings.Replace(strings.ToLower(mac.String()), ":", "", -1) for _, ip := range ips.Items { if ip.Labels["mac"] == sanitizedMAC && ipFamilyMatches(ip, subnetFamily) { return &ip.Status.Reserved.Net, nil