From 8ab23366fb09065838013bb464d83aaca1ac2f51 Mon Sep 17 00:00:00 2001 From: Miguel Duarte Barroso Date: Tue, 24 Aug 2021 13:19:31 +0200 Subject: [PATCH] static ipam: do not parse the CIDR twice With this patch, when the IPs are provisioned via CNI args or via `RuntimeConfig` the CIDR is only parsed once. Signed-off-by: Miguel Duarte Barroso --- plugins/ipam/static/main.go | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/plugins/ipam/static/main.go b/plugins/ipam/static/main.go index 514622b1..38cd7616 100644 --- a/plugins/ipam/static/main.go +++ b/plugins/ipam/static/main.go @@ -192,12 +192,13 @@ func LoadIPAMConfig(bytes []byte, envArgs string) (*IPAMConfig, string, error) { if n.Args != nil && n.Args.A != nil && len(n.Args.A.IPs) != 0 { // args IP overwrites IP, so clear IPAM Config n.IPAM.Addresses = make([]Address, 0, len(n.Args.A.IPs)) - for _, addr := range n.Args.A.IPs { - _, _, err := net.ParseCIDR(addr) + for _, addrStr := range n.Args.A.IPs { + ip, addr, err := net.ParseCIDR(addrStr) if err != nil { - return nil, "", fmt.Errorf("an entry in the 'ips' field is NOT in CIDR notation, got: '%s'", addr) + return nil, "", fmt.Errorf("an entry in the 'ips' field is NOT in CIDR notation, got: '%s'", addrStr) } - n.IPAM.Addresses = append(n.IPAM.Addresses, Address{AddressStr: addr}) + addr.IP = ip + n.IPAM.Addresses = append(n.IPAM.Addresses, Address{AddressStr: addrStr, Address: *addr}) } } @@ -205,12 +206,13 @@ func LoadIPAMConfig(bytes []byte, envArgs string) (*IPAMConfig, string, error) { if len(n.RuntimeConfig.IPs) != 0 { // runtimeConfig IP overwrites IP, so clear IPAM Config n.IPAM.Addresses = make([]Address, 0, len(n.RuntimeConfig.IPs)) - for _, addr := range n.RuntimeConfig.IPs { - _, _, err := net.ParseCIDR(addr) + for _, addrStr := range n.RuntimeConfig.IPs { + ip, addr, err := net.ParseCIDR(addrStr) if err != nil { - return nil, "", fmt.Errorf("an entry in the 'ips' field is NOT in CIDR notation, got: '%s'", addr) + return nil, "", fmt.Errorf("an entry in the 'ips' field is NOT in CIDR notation, got: '%s'", addrStr) } - n.IPAM.Addresses = append(n.IPAM.Addresses, Address{AddressStr: addr}) + addr.IP = ip + n.IPAM.Addresses = append(n.IPAM.Addresses, Address{AddressStr: addrStr, Address: *addr}) } } @@ -219,13 +221,15 @@ func LoadIPAMConfig(bytes []byte, envArgs string) (*IPAMConfig, string, error) { numV6 := 0 for i := range n.IPAM.Addresses { - ip, addr, err := net.ParseCIDR(n.IPAM.Addresses[i].AddressStr) - if err != nil { - return nil, "", fmt.Errorf( - "the 'address' field is expected to be in CIDR notation, got: '%s'", n.IPAM.Addresses[i].AddressStr) + if n.IPAM.Addresses[i].Address.IP == nil { + ip, addr, err := net.ParseCIDR(n.IPAM.Addresses[i].AddressStr) + if err != nil { + return nil, "", fmt.Errorf( + "the 'address' field is expected to be in CIDR notation, got: '%s'", n.IPAM.Addresses[i].AddressStr) + } + n.IPAM.Addresses[i].Address = *addr + n.IPAM.Addresses[i].Address.IP = ip } - n.IPAM.Addresses[i].Address = *addr - n.IPAM.Addresses[i].Address.IP = ip if err := canonicalizeIP(&n.IPAM.Addresses[i].Address.IP); err != nil { return nil, "", fmt.Errorf("invalid address %d: %s", i, err)