Skip to content

Commit 30c3a32

Browse files
mgorripahelltCopilot
authored
Improve subnet overlap error message for Docker mgmt network (#2845)
### Context Fixes #2786 ### Changes - Intercept "Pool overlaps" error from Docker. - List existing Docker networks and match by subnet. - Return a clear, actionable error message with a link to the docs. ### Example Before: Error response from daemon: invalid pool request: Pool overlaps with other one on this address space. After: Subnet 172.20.0.0/16 already in use by Docker network "testnet". See https://containerlab.dev/manual/network/ --- This is my first contribution to containerlab. --------- Co-authored-by: hellt <[email protected]> Co-authored-by: Copilot <[email protected]>
1 parent 08d4e73 commit 30c3a32

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

runtime/docker/docker.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,48 @@ func (d *DockerRuntime) createMgmtBridge( //nolint: funlen
340340

341341
netCreateResponse, err := d.Client.NetworkCreate(nctx, d.mgmt.Network, opts)
342342
if err != nil {
343+
// Handle subnet overlap error
344+
if strings.Contains(strings.ToLower(err.Error()), strings.ToLower("Pool overlaps")) ||
345+
strings.Contains(strings.ToLower(err.Error()), strings.ToLower("subnet")) {
346+
networksAndAddresses := map[string][]string{}
347+
nets, listErr := d.Client.NetworkList(nctx, networkapi.ListOptions{})
348+
if listErr != nil {
349+
return "", fmt.Errorf(
350+
"failed to list Docker networks while handling subnet overlap error: %w (original error: %v)",
351+
listErr,
352+
err,
353+
)
354+
}
355+
for _, n := range nets {
356+
for _, cfg := range n.IPAM.Config {
357+
// store existing networks and their subnets
358+
networksAndAddresses[n.Name] = append(networksAndAddresses[n.Name], cfg.Subnet)
359+
if cfg.Subnet == d.mgmt.IPv4Subnet || cfg.Subnet == d.mgmt.IPv6Subnet {
360+
return "", fmt.Errorf(
361+
"subnet %s already in use by Docker network %q. See https://containerlab.dev/manual/network/",
362+
cfg.Subnet,
363+
n.Name,
364+
)
365+
}
366+
}
367+
}
368+
// fallback: no exact match, but clarify
369+
// Show both IPv4 and IPv6 subnets in the error message if present
370+
requestedSubnets := d.mgmt.IPv4Subnet
371+
if d.mgmt.IPv6Subnet != "" {
372+
if requestedSubnets != "" {
373+
requestedSubnets += ", "
374+
}
375+
requestedSubnets += d.mgmt.IPv6Subnet
376+
}
377+
return "", fmt.Errorf(
378+
"requested subnet(s) %s overlap an existing Docker network. Existing networks: %v. Original error: %w. See https://containerlab.dev/manual/network/",
379+
requestedSubnets,
380+
networksAndAddresses,
381+
err,
382+
)
383+
}
384+
343385
return "", err
344386
}
345387

0 commit comments

Comments
 (0)