Browse code

daemon/libnetwork: replace IpamConf.CopyTo with IpamConf.Copy()

The IpamConf.CopyTo function expected the caller to construct an
IpamConf to copy to, but all callsites created an empty struct.
In addition, `CopyTo` would never return an error, so the error
return was redundant.

Replace it with a `Copy()` function, which makes it easier to
consume.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Sebastiaan van Stijn authored on 2025/08/10 21:15:08
Showing 1 changed files
... ...
@@ -5,6 +5,7 @@ import (
5 5
 	"encoding/json"
6 6
 	"errors"
7 7
 	"fmt"
8
+	"maps"
8 9
 	"net"
9 10
 	"net/netip"
10 11
 	"runtime"
... ...
@@ -315,18 +316,18 @@ func (n *Network) New() datastore.KVObject {
315 315
 	}
316 316
 }
317 317
 
318
-// CopyTo deep copies to the destination IpamConfig
319
-func (c *IpamConf) CopyTo(dstC *IpamConf) error {
320
-	dstC.PreferredPool = c.PreferredPool
321
-	dstC.SubPool = c.SubPool
322
-	dstC.Gateway = c.Gateway
323
-	if c.AuxAddresses != nil {
324
-		dstC.AuxAddresses = make(map[string]string, len(c.AuxAddresses))
325
-		for k, v := range c.AuxAddresses {
326
-			dstC.AuxAddresses[k] = v
327
-		}
318
+// Copy returns a deep copy of the [IpamConf]. If the receiver is nil,
319
+// Copy returns nil.
320
+func (c *IpamConf) Copy() *IpamConf {
321
+	if c == nil {
322
+		return nil
323
+	}
324
+	return &IpamConf{
325
+		PreferredPool: c.PreferredPool,
326
+		SubPool:       c.SubPool,
327
+		Gateway:       c.Gateway,
328
+		AuxAddresses:  maps.Clone(c.AuxAddresses),
328 329
 	}
329
-	return nil
330 330
 }
331 331
 
332 332
 // CopyTo deep copies to the destination IpamInfo
... ...
@@ -500,12 +501,8 @@ func (n *Network) CopyTo(o datastore.KVObject) error {
500 500
 		}
501 501
 	}
502 502
 
503
-	for _, v4conf := range n.ipamV4Config {
504
-		dstV4Conf := &IpamConf{}
505
-		if err := v4conf.CopyTo(dstV4Conf); err != nil {
506
-			return err
507
-		}
508
-		dstN.ipamV4Config = append(dstN.ipamV4Config, dstV4Conf)
503
+	for _, c := range n.ipamV4Config {
504
+		dstN.ipamV4Config = append(dstN.ipamV4Config, c.Copy())
509 505
 	}
510 506
 
511 507
 	for _, v4info := range n.ipamV4Info {
... ...
@@ -516,12 +513,8 @@ func (n *Network) CopyTo(o datastore.KVObject) error {
516 516
 		dstN.ipamV4Info = append(dstN.ipamV4Info, dstV4Info)
517 517
 	}
518 518
 
519
-	for _, v6conf := range n.ipamV6Config {
520
-		dstV6Conf := &IpamConf{}
521
-		if err := v6conf.CopyTo(dstV6Conf); err != nil {
522
-			return err
523
-		}
524
-		dstN.ipamV6Config = append(dstN.ipamV6Config, dstV6Conf)
519
+	for _, c := range n.ipamV6Config {
520
+		dstN.ipamV6Config = append(dstN.ipamV6Config, c.Copy())
525 521
 	}
526 522
 
527 523
 	for _, v6info := range n.ipamV6Info {
... ...
@@ -1776,20 +1769,12 @@ func (n *Network) IpamConfig() (ipamType string, ipamOptions map[string]string,
1776 1776
 
1777 1777
 	ipamV4Config = make([]*IpamConf, len(n.ipamV4Config))
1778 1778
 	for i, c := range n.ipamV4Config {
1779
-		cc := &IpamConf{}
1780
-		if err := c.CopyTo(cc); err != nil {
1781
-			log.G(context.TODO()).WithError(err).Error("Error copying ipam ipv4 config")
1782
-		}
1783
-		ipamV4Config[i] = cc
1779
+		ipamV4Config[i] = c.Copy()
1784 1780
 	}
1785 1781
 
1786 1782
 	ipamV6Config = make([]*IpamConf, len(n.ipamV6Config))
1787 1783
 	for i, c := range n.ipamV6Config {
1788
-		cc := &IpamConf{}
1789
-		if err := c.CopyTo(cc); err != nil {
1790
-			log.G(context.TODO()).WithError(err).Debug("Error copying ipam ipv6 config")
1791
-		}
1792
-		ipamV6Config[i] = cc
1784
+		ipamV6Config[i] = c.Copy()
1793 1785
 	}
1794 1786
 
1795 1787
 	return n.ipamType, n.ipamOptions, ipamV4Config, ipamV6Config