dhcp: daemon dhcp client timeout is configurable

Fixes #470

Signed-off-by: toby lorne <toby@toby.codes>
This commit is contained in:
toby lorne 2021-01-11 21:27:42 +00:00
parent 3161bb52e0
commit 25fc741e37
2 changed files with 14 additions and 6 deletions

View File

@ -42,11 +42,13 @@ type DHCP struct {
mux sync.Mutex mux sync.Mutex
leases map[string]*DHCPLease leases map[string]*DHCPLease
hostNetnsPrefix string hostNetnsPrefix string
clientTimeout time.Duration
} }
func newDHCP() *DHCP { func newDHCP(clientTimeout time.Duration) *DHCP {
return &DHCP{ return &DHCP{
leases: make(map[string]*DHCPLease), leases: make(map[string]*DHCPLease),
clientTimeout: clientTimeout,
} }
} }
@ -64,7 +66,7 @@ func (d *DHCP) Allocate(args *skel.CmdArgs, result *current.Result) error {
clientID := generateClientID(args.ContainerID, conf.Name, args.IfName) clientID := generateClientID(args.ContainerID, conf.Name, args.IfName)
hostNetns := d.hostNetnsPrefix + args.Netns hostNetns := d.hostNetnsPrefix + args.Netns
l, err := AcquireLease(clientID, hostNetns, args.IfName, 5*time.Second) l, err := AcquireLease(clientID, hostNetns, args.IfName, d.clientTimeout)
if err != nil { if err != nil {
return err return err
} }
@ -157,7 +159,10 @@ func getListener(socketPath string) (net.Listener, error) {
} }
} }
func runDaemon(pidfilePath string, hostPrefix string, socketPath string) error { func runDaemon(
pidfilePath, hostPrefix, socketPath string,
dhcpClientTimeout time.Duration,
) error {
// since other goroutines (on separate threads) will change namespaces, // since other goroutines (on separate threads) will change namespaces,
// ensure the RPC server does not get scheduled onto those // ensure the RPC server does not get scheduled onto those
runtime.LockOSThread() runtime.LockOSThread()
@ -177,7 +182,7 @@ func runDaemon(pidfilePath string, hostPrefix string, socketPath string) error {
return fmt.Errorf("Error getting listener: %v", err) return fmt.Errorf("Error getting listener: %v", err)
} }
dhcp := newDHCP() dhcp := newDHCP(dhcpClientTimeout)
dhcp.hostNetnsPrefix = hostPrefix dhcp.hostNetnsPrefix = hostPrefix
rpc.Register(dhcp) rpc.Register(dhcp)
rpc.HandleHTTP() rpc.HandleHTTP()

View File

@ -22,6 +22,7 @@ import (
"net/rpc" "net/rpc"
"os" "os"
"path/filepath" "path/filepath"
"time"
"github.com/containernetworking/cni/pkg/skel" "github.com/containernetworking/cni/pkg/skel"
"github.com/containernetworking/cni/pkg/types" "github.com/containernetworking/cni/pkg/types"
@ -37,17 +38,19 @@ func main() {
var pidfilePath string var pidfilePath string
var hostPrefix string var hostPrefix string
var socketPath string var socketPath string
var timeout time.Duration
daemonFlags := flag.NewFlagSet("daemon", flag.ExitOnError) daemonFlags := flag.NewFlagSet("daemon", flag.ExitOnError)
daemonFlags.StringVar(&pidfilePath, "pidfile", "", "optional path to write daemon PID to") daemonFlags.StringVar(&pidfilePath, "pidfile", "", "optional path to write daemon PID to")
daemonFlags.StringVar(&hostPrefix, "hostprefix", "", "optional prefix to host root") daemonFlags.StringVar(&hostPrefix, "hostprefix", "", "optional prefix to host root")
daemonFlags.StringVar(&socketPath, "socketpath", "", "optional dhcp server socketpath") daemonFlags.StringVar(&socketPath, "socketpath", "", "optional dhcp server socketpath")
daemonFlags.DurationVar(&timeout, "timeout", 5*time.Second, "optional dhcp client timeout duration")
daemonFlags.Parse(os.Args[2:]) daemonFlags.Parse(os.Args[2:])
if socketPath == "" { if socketPath == "" {
socketPath = defaultSocketPath socketPath = defaultSocketPath
} }
if err := runDaemon(pidfilePath, hostPrefix, socketPath); err != nil { if err := runDaemon(pidfilePath, hostPrefix, socketPath, timeout); err != nil {
log.Printf(err.Error()) log.Printf(err.Error())
os.Exit(1) os.Exit(1)
} }