diff --git a/plugins/ipam/dhcp/daemon.go b/plugins/ipam/dhcp/daemon.go index 2404db8f..fcffd0f8 100644 --- a/plugins/ipam/dhcp/daemon.go +++ b/plugins/ipam/dhcp/daemon.go @@ -127,7 +127,7 @@ func (d *DHCP) clearLease(contID, netName string) { delete(d.leases, contID+netName) } -func getListener() (net.Listener, error) { +func getListener(socketPath string) (net.Listener, error) { l, err := activation.Listeners() if err != nil { return nil, err @@ -151,7 +151,7 @@ func getListener() (net.Listener, error) { } } -func runDaemon(pidfilePath string, hostPrefix string) error { +func runDaemon(pidfilePath string, hostPrefix string, socketPath string) error { // since other goroutines (on separate threads) will change namespaces, // ensure the RPC server does not get scheduled onto those runtime.LockOSThread() @@ -166,7 +166,7 @@ func runDaemon(pidfilePath string, hostPrefix string) error { } } - l, err := getListener() + l, err := getListener(socketPath) if err != nil { return fmt.Errorf("Error getting listener: %v", err) } diff --git a/plugins/ipam/dhcp/main.go b/plugins/ipam/dhcp/main.go index f393dd67..b4dbb235 100644 --- a/plugins/ipam/dhcp/main.go +++ b/plugins/ipam/dhcp/main.go @@ -15,6 +15,7 @@ package main import ( + "encoding/json" "flag" "fmt" "log" @@ -28,18 +29,24 @@ import ( "github.com/containernetworking/cni/pkg/version" ) -const socketPath = "/run/cni/dhcp.sock" +const defaultSocketPath = "/run/cni/defaultdhcp.sock" func main() { if len(os.Args) > 1 && os.Args[1] == "daemon" { var pidfilePath string var hostPrefix string + var socketPath string daemonFlags := flag.NewFlagSet("daemon", flag.ExitOnError) daemonFlags.StringVar(&pidfilePath, "pidfile", "", "optional path to write daemon PID to") daemonFlags.StringVar(&hostPrefix, "hostprefix", "", "optional prefix to netns") + daemonFlags.StringVar(&socketPath, "socketpath", "", "optional dhcp server socketpath") daemonFlags.Parse(os.Args[2:]) - if err := runDaemon(pidfilePath, hostPrefix); err != nil { + if socketPath == "" { + socketPath = defaultSocketPath + } + + if err := runDaemon(pidfilePath, hostPrefix, socketPath); err != nil { log.Printf(err.Error()) os.Exit(1) } @@ -78,7 +85,31 @@ func cmdGet(args *skel.CmdArgs) error { return fmt.Errorf("not implemented") } +type SocketPathConf struct { + DaemonSocketPath string `json:"daemonSocketPath,omitempty"` +} + +type TempNetConf struct { + IPAM SocketPathConf `json:"ipam,omitempty"` +} + +func getSocketPath(stdinData []byte) (string, error) { + conf := TempNetConf{} + if err := json.Unmarshal(stdinData, &conf); err != nil { + return "", fmt.Errorf("error parsing socket path conf: %v", err) + } + if conf.IPAM.DaemonSocketPath == "" { + return defaultSocketPath, nil + } + return conf.IPAM.DaemonSocketPath, nil +} + func rpcCall(method string, args *skel.CmdArgs, result interface{}) error { + socketPath, err := getSocketPath(args.StdinData) + if err != nil { + return fmt.Errorf("error obtaining socketPath: %v", err) + } + client, err := rpc.DialHTTP("unix", socketPath) if err != nil { return fmt.Errorf("error dialing DHCP daemon: %v", err)