From ef663b4e704d2e688f4f908a23e70f652c38df20 Mon Sep 17 00:00:00 2001 From: Jason-ZW Date: Mon, 22 Oct 2018 10:11:12 +0800 Subject: [PATCH] Add dhcp timeout parameter --- cmd/cloudinitsave/cloudinitsave.go | 6 ++++++ cmd/network/network.go | 3 +++ config/schema.go | 1 + os-config.tpl.yml | 1 + pkg/init/cloudinit/cloudinit.go | 7 +++++++ pkg/netconf/netconf_linux.go | 5 +++++ pkg/netconf/types.go | 15 ++++++++------- 7 files changed, 31 insertions(+), 7 deletions(-) diff --git a/cmd/cloudinitsave/cloudinitsave.go b/cmd/cloudinitsave/cloudinitsave.go index 141536e9..86570fd0 100644 --- a/cmd/cloudinitsave/cloudinitsave.go +++ b/cmd/cloudinitsave/cloudinitsave.go @@ -284,12 +284,18 @@ func getDatasources(datasources []string) []datasource.Datasource { } func enableDoLinkLocal() { + cfg := rancherConfig.LoadConfig() + dhcpTimeout := cfg.Rancher.Defaults.Network.DHCPTimeout + if cfg.Rancher.Network.DHCPTimeout > 0 { + dhcpTimeout = cfg.Rancher.Network.DHCPTimeout + } _, err := netconf.ApplyNetworkConfigs(&netconf.NetworkConfig{ Interfaces: map[string]netconf.InterfaceConfig{ "eth0": { IPV4LL: true, }, }, + DHCPTimeout: dhcpTimeout, }, false, false) if err != nil { log.Errorf("Failed to apply link local on eth0: %v", err) diff --git a/cmd/network/network.go b/cmd/network/network.go index 35ae00f5..b1166cd8 100644 --- a/cmd/network/network.go +++ b/cmd/network/network.go @@ -42,6 +42,9 @@ func ApplyNetworkConfig(cfg *config.CloudConfig) { } userSetHostname := cfg.Hostname != "" + if cfg.Rancher.Network.DHCPTimeout <= 0 { + cfg.Rancher.Network.DHCPTimeout = cfg.Rancher.Defaults.Network.DHCPTimeout + } dhcpSetDNS, err := netconf.ApplyNetworkConfigs(&cfg.Rancher.Network, userSetHostname, userSetDNS) if err != nil { log.Errorf("Failed to apply network configs(by netconf): %v", err) diff --git a/config/schema.go b/config/schema.go index d1599f28..9dd7859c 100644 --- a/config/schema.go +++ b/config/schema.go @@ -81,6 +81,7 @@ var schema = `{ "properties": { "pre_cmds": {"$ref": "#/definitions/list_of_strings"}, + "dhcp_timeout": {"type": "integer"}, "dns": {"type": "object"}, "interfaces": {"type": "object"}, "post_cmds": {"$ref": "#/definitions/list_of_strings"}, diff --git a/os-config.tpl.yml b/os-config.tpl.yml index 1ee3a1c6..49008213 100644 --- a/os-config.tpl.yml +++ b/os-config.tpl.yml @@ -14,6 +14,7 @@ rancher: engine: docker-18.03.1-ce {{end -}} network: + dhcp_timeout: 10 dns: nameservers: [8.8.8.8, 8.8.4.4] system_docker_logs: /var/log/system-docker.log diff --git a/pkg/init/cloudinit/cloudinit.go b/pkg/init/cloudinit/cloudinit.go index 092097fb..6f6f9f49 100644 --- a/pkg/init/cloudinit/cloudinit.go +++ b/pkg/init/cloudinit/cloudinit.go @@ -13,6 +13,13 @@ func CloudInit(cfg *config.CloudConfig) (*config.CloudConfig, error) { stateConfig := config.LoadConfigWithPrefix(config.StateDir) cfg.Rancher.CloudInit.Datasources = stateConfig.Rancher.CloudInit.Datasources + if stateConfig.Rancher.Network.DHCPTimeout > 0 { + cfg.Rancher.Network.DHCPTimeout = stateConfig.Rancher.Network.DHCPTimeout + if err := config.Set("rancher.network.dhcp_timeout", stateConfig.Rancher.Network.DHCPTimeout); err != nil { + log.Error(err) + } + } + if len(stateConfig.Rancher.Network.Interfaces) > 0 { cfg.Rancher.Network = stateConfig.Rancher.Network if err := config.Set("rancher.network", stateConfig.Rancher.Network); err != nil { diff --git a/pkg/netconf/netconf_linux.go b/pkg/netconf/netconf_linux.go index a8e73ed6..c5fca8f8 100644 --- a/pkg/netconf/netconf_linux.go +++ b/pkg/netconf/netconf_linux.go @@ -6,6 +6,7 @@ import ( "net" "os" "os/exec" + "strconv" "strings" "sync" "syscall" @@ -290,6 +291,10 @@ func runDhcp(netCfg *NetworkConfig, iface string, argstr string, setHostname, se args = append(args, "--nohook", "resolv.conf") } + if netCfg.DHCPTimeout > 0 { + args = append(args, "--timeout", strconv.Itoa(netCfg.DHCPTimeout)) + } + // Wait for lease // TODO: this should be optional - based on kernel arg? args = append(args, "-w", "--debug") diff --git a/pkg/netconf/types.go b/pkg/netconf/types.go index f99faeba..1e7f809c 100644 --- a/pkg/netconf/types.go +++ b/pkg/netconf/types.go @@ -1,13 +1,14 @@ package netconf type NetworkConfig struct { - PreCmds []string `yaml:"pre_cmds,omitempty"` - DNS DNSConfig `yaml:"dns,omitempty"` - Interfaces map[string]InterfaceConfig `yaml:"interfaces,omitempty"` - PostCmds []string `yaml:"post_cmds,omitempty"` - HTTPProxy string `yaml:"http_proxy,omitempty"` - HTTPSProxy string `yaml:"https_proxy,omitempty"` - NoProxy string `yaml:"no_proxy,omitempty"` + PreCmds []string `yaml:"pre_cmds,omitempty"` + DHCPTimeout int `yaml:"dhcp_timeout,omitempty"` + DNS DNSConfig `yaml:"dns,omitempty"` + Interfaces map[string]InterfaceConfig `yaml:"interfaces,omitempty"` + PostCmds []string `yaml:"post_cmds,omitempty"` + HTTPProxy string `yaml:"http_proxy,omitempty"` + HTTPSProxy string `yaml:"https_proxy,omitempty"` + NoProxy string `yaml:"no_proxy,omitempty"` } type InterfaceConfig struct {