Ensure unique veth name and myc ip per container

This commit is contained in:
Scott Yeager 2025-06-20 19:57:47 -07:00
parent 9bdaf13797
commit 0618b41ae2

25
main.go
View File

@ -1,6 +1,8 @@
package main package main
import ( import (
"crypto/sha256"
"encoding/hex"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net" "net"
@ -46,8 +48,8 @@ func cmdAdd(args *skel.CmdArgs) error {
return fmt.Errorf("failed to get Mycelium IP: %v", err) return fmt.Errorf("failed to get Mycelium IP: %v", err)
} }
// Create veth pair // Create veth pair with unique naming
hostVethName := fmt.Sprintf("veth-%s", args.ContainerID[:8]) hostVethName := generateVethName(args.ContainerID)
containerVethName := "eth0" containerVethName := "eth0"
hostVeth, containerVeth, err := createVethPair(hostVethName, containerVethName) hostVeth, containerVeth, err := createVethPair(hostVethName, containerVethName)
@ -101,7 +103,7 @@ func cmdCheck(args *skel.CmdArgs) error {
func cmdDel(args *skel.CmdArgs) error { func cmdDel(args *skel.CmdArgs) error {
// Clean up veth pair (host side will be automatically removed) // Clean up veth pair (host side will be automatically removed)
hostVethName := fmt.Sprintf("veth-%s", args.ContainerID[:8]) hostVethName := generateVethName(args.ContainerID)
link, err := netlink.LinkByName(hostVethName) link, err := netlink.LinkByName(hostVethName)
if err != nil { if err != nil {
@ -146,14 +148,25 @@ func getMyceliumIP(interfaceName string) (net.IP, error) {
} }
func generateContainerIP(myceliumPrefix net.IP, containerID string) net.IP { func generateContainerIP(myceliumPrefix net.IP, containerID string) net.IP {
// Generate a container IP within the /64 prefix // Generate a unique container IP within the /64 prefix using container ID hash
// Using simple approach: prefix + ::1 (could be made more sophisticated) hash := sha256.Sum256([]byte(containerID))
containerIP := make(net.IP, len(myceliumPrefix)) containerIP := make(net.IP, len(myceliumPrefix))
copy(containerIP, myceliumPrefix) copy(containerIP, myceliumPrefix)
containerIP[15] = 1 // Set last byte to 1
// Use first 8 bytes of hash for the host part (last 64 bits)
copy(containerIP[8:], hash[:8])
return containerIP return containerIP
} }
func generateVethName(containerID string) string {
// Generate unique but short veth name using hash of container ID
hash := sha256.Sum256([]byte(containerID))
shortHash := hex.EncodeToString(hash[:4]) // Use first 4 bytes for 8-char hex
return fmt.Sprintf("veth-%s", shortHash)
}
func createVethPair(hostName, containerName string) (netlink.Link, netlink.Link, error) { func createVethPair(hostName, containerName string) (netlink.Link, netlink.Link, error) {
veth := &netlink.Veth{ veth := &netlink.Veth{
LinkAttrs: netlink.LinkAttrs{Name: hostName}, LinkAttrs: netlink.LinkAttrs{Name: hostName},