diff --git a/pkg/hostman/guestfs/fsdriver/linux.go b/pkg/hostman/guestfs/fsdriver/linux.go index d36c25bf57..d53885ee39 100644 --- a/pkg/hostman/guestfs/fsdriver/linux.go +++ b/pkg/hostman/guestfs/fsdriver/linux.go @@ -464,6 +464,28 @@ func (l *sLinuxRootFs) DeployNetworkingScripts(rootFs IDiskPartition, nics []*ty log.Errorf("rootFs.GenerateSshHostKeys fail %s", err) } } + // force dhclient for NetworkManager + { + err := forceNetworkManagerDhclient(rootFs) + if err != nil { + log.Errorf("force NetworkManager dhclient fail %s", err) + } + } + return nil +} + +func forceNetworkManagerDhclient(rootFs IDiskPartition) error { + const nmConfPath = "/etc/NetworkManager/conf.d" + if !rootFs.Exists(nmConfPath, false) { + return nil + } + dhcpConfPath := path.Join(nmConfPath, "dhcp-client.conf") + content := `[main] +dhcp=dhclient +` + if err := rootFs.FilePutContents(dhcpConfPath, content, false, false); err != nil { + return errors.Wrapf(err, "write %s fail", dhcpConfPath) + } return nil } @@ -1034,23 +1056,16 @@ func (d *sDebianLikeRootFs) DeployNetworkingScripts(rootFs IDiskPartition, nics } else { if len(nicDesc.Ip) > 0 { cmds.WriteString(fmt.Sprintf("iface %s inet dhcp\n", nicDesc.Name)) + } + if len(nicDesc.Ip6) > 0 { + cmds.WriteString(fmt.Sprintf("iface %s inet6 dhcp\n", nicDesc.Name)) + } + if len(nicDesc.Ip) > 0 || len(nicDesc.Ip6) > 0 { if len(nicDesc.TeamingSlaves) > 0 { cmds.WriteString(getNicTeamingConfigCmds(nicDesc.TeamingSlaves)) } cmds.WriteString("\n") } - - if len(nicDesc.Ip6) > 0 { - // ipv6 support static temporarily - // TODO - cmds.WriteString(fmt.Sprintf("iface %s inet6 static\n", nicDesc.Name)) - cmds.WriteString(fmt.Sprintf(" address %s\n", nicDesc.Ip6)) - cmds.WriteString(fmt.Sprintf(" netmask %d\n", nicDesc.Masklen6)) - if len(nicDesc.Gateway6) > 0 && nicDesc.Ip == mainIp { - cmds.WriteString(fmt.Sprintf(" gateway %s\n", nicDesc.Gateway6)) - } - cmds.WriteString("\n") - } } } @@ -1496,11 +1511,20 @@ func (r *sRedhatLikeRootFs) deployNetworkingScripts(rootFs IDiskPartition, nics cmds.WriteString("IPADDR=") cmds.WriteString(nicDesc.Ip) cmds.WriteString("\n") + if len(nicDesc.Gateway) > 0 && nicDesc.Ip == mainIp { + cmds.WriteString("GATEWAY=") + cmds.WriteString(nicDesc.Gateway) + cmds.WriteString("\n") + } } - if len(nicDesc.Gateway) > 0 && nicDesc.Ip == mainIp { - cmds.WriteString("GATEWAY=") - cmds.WriteString(nicDesc.Gateway) - cmds.WriteString("\n") + if len(nicDesc.Ip6) > 0 { + cmds.WriteString("IPV6INIT=yes\n") + cmds.WriteString("DHCPV6C=no\n") + cmds.WriteString("IPV6_AUTOCONF=no\n") + cmds.WriteString(fmt.Sprintf("IPV6ADDR=%s/%d\n", nicDesc.Ip6, nicDesc.Masklen6)) + if len(nicDesc.Gateway6) > 0 && nicDesc.Ip6 == mainIp6 { + cmds.WriteString(fmt.Sprintf("IPV6_DEFAULTGW=%s\n", nicDesc.Gateway6)) + } } routes4 := make([]netutils2.SRouteInfo, 0) routes6 := make([]netutils2.SRouteInfo, 0) @@ -1514,6 +1538,14 @@ func (r *sRedhatLikeRootFs) deployNetworkingScripts(rootFs IDiskPartition, nics rtbl.WriteString(nicDesc.Name) rtbl.WriteString("\n") } + for _, r := range routes6 { + rtbl.WriteString(fmt.Sprintf("%s/%d", r.Prefix, r.PrefixLen)) + rtbl.WriteString(" via ") + rtbl.WriteString(r.Gateway.String()) + rtbl.WriteString(" dev ") + rtbl.WriteString(nicDesc.Name) + rtbl.WriteString("\n") + } rtblStr := rtbl.String() if len(rtblStr) > 0 { var fn = fmt.Sprintf("%s/route-%s", scriptPath, nicDesc.Name) @@ -1531,16 +1563,6 @@ func (r *sRedhatLikeRootFs) deployNetworkingScripts(rootFs IDiskPartition, nics } } } - - if len(nicDesc.Ip6) > 0 { - cmds.WriteString("IPV6INIT=yes\n") - cmds.WriteString("DHCPV6C=no\n") - cmds.WriteString("IPV6_AUTOCONF=no\n") - cmds.WriteString(fmt.Sprintf("IPV6ADDR=%s/%d\n", nicDesc.Ip6, nicDesc.Masklen6)) - if len(nicDesc.Gateway6) > 0 { - cmds.WriteString(fmt.Sprintf("IPV6_DEFAULTGW=%s\n", nicDesc.Gateway6)) - } - } } } else { if len(nicDesc.Ip) > 0 { @@ -1548,15 +1570,9 @@ func (r *sRedhatLikeRootFs) deployNetworkingScripts(rootFs IDiskPartition, nics } if len(nicDesc.Ip6) > 0 { - // IPv6 support static temporarily - // TODO cmds.WriteString("IPV6INIT=yes\n") cmds.WriteString("DHCPV6C=yes\n") cmds.WriteString("IPV6_AUTOCONF=yes\n") - cmds.WriteString(fmt.Sprintf("IPV6ADDR=%s/%d\n", nicDesc.Ip6, nicDesc.Masklen6)) - if len(nicDesc.Gateway6) > 0 { - cmds.WriteString("IPV6_DEFROUTE=yes\n") - } } } var fn = fmt.Sprintf("%s/ifcfg-%s", scriptPath, nicDesc.Name) @@ -1586,18 +1602,28 @@ func (r *sRedhatLikeRootFs) deployVlanNetworkingScripts(rootFs IDiskPartition, s if nicDesc.Mtu > 0 { cmds.WriteString(fmt.Sprintf("MTU=%d\n", nicDesc.Mtu)) } - - netmask := netutils2.Netlen2Mask(int(nicDesc.Masklen)) - cmds.WriteString("NETMASK=") - cmds.WriteString(netmask) - cmds.WriteString("\n") - cmds.WriteString("IPADDR=") - cmds.WriteString(nicDesc.Ip) - cmds.WriteString("\n") - if len(nicDesc.Gateway) > 0 && nicDesc.Ip == mainIp { - cmds.WriteString("GATEWAY=") - cmds.WriteString(nicDesc.Gateway) + if len(nicDesc.Ip) > 0 { + netmask := netutils2.Netlen2Mask(int(nicDesc.Masklen)) + cmds.WriteString("NETMASK=") + cmds.WriteString(netmask) cmds.WriteString("\n") + cmds.WriteString("IPADDR=") + cmds.WriteString(nicDesc.Ip) + cmds.WriteString("\n") + if len(nicDesc.Gateway) > 0 && nicDesc.Ip == mainIp { + cmds.WriteString("GATEWAY=") + cmds.WriteString(nicDesc.Gateway) + cmds.WriteString("\n") + } + } + if len(nicDesc.Ip6) > 0 { + cmds.WriteString("IPV6INIT=yes\n") + cmds.WriteString("DHCPV6C=no\n") + cmds.WriteString("IPV6_AUTOCONF=no\n") + cmds.WriteString(fmt.Sprintf("IPV6ADDR=%s/%d\n", nicDesc.Ip6, nicDesc.Masklen6)) + if len(nicDesc.Gateway6) > 0 && nicDesc.Ip6 == mainIp6 { + cmds.WriteString(fmt.Sprintf("IPV6_DEFAULTGW=%s\n", nicDesc.Gateway6)) + } } routes4 := make([]netutils2.SRouteInfo, 0) routes6 := make([]netutils2.SRouteInfo, 0) @@ -1611,6 +1637,14 @@ func (r *sRedhatLikeRootFs) deployVlanNetworkingScripts(rootFs IDiskPartition, s rtbl.WriteString(fmt.Sprintf("%s.%d", nicDesc.Name, nicDesc.Vlan)) rtbl.WriteString("\n") } + for _, r := range routes6 { + rtbl.WriteString(fmt.Sprintf("%s/%d", r.Prefix, r.PrefixLen)) + rtbl.WriteString(" via ") + rtbl.WriteString(r.Gateway.String()) + rtbl.WriteString(" dev ") + rtbl.WriteString(fmt.Sprintf("%s.%d", nicDesc.Name, nicDesc.Vlan)) + rtbl.WriteString("\n") + } rtblStr := rtbl.String() if len(rtblStr) > 0 { var fn = fmt.Sprintf("%s/route-%s", scriptPath, nicDesc.Name) diff --git a/pkg/hostman/guestfs/fsdriver/netplan.go b/pkg/hostman/guestfs/fsdriver/netplan.go index af3a8dadbe..b207d72292 100644 --- a/pkg/hostman/guestfs/fsdriver/netplan.go +++ b/pkg/hostman/guestfs/fsdriver/netplan.go @@ -156,7 +156,10 @@ func getNetplanEthernetConfig(nic *types.SServerNic, isBond bool, mainIp, mainIp } } else { // dhcp - nicConf = netplan.NewDHCP4EthernetConfig() + nicConf = netplan.NewDHCPEthernetConfig() + if len(nic.Ip) > 0 { + nicConf.EnableDHCP4() + } if len(nic.Ip6) > 0 { nicConf.EnableDHCP6() } diff --git a/pkg/hostman/guestfs/fsdriver/suse.go b/pkg/hostman/guestfs/fsdriver/suse.go index f50198d6d3..d5a681c70a 100644 --- a/pkg/hostman/guestfs/fsdriver/suse.go +++ b/pkg/hostman/guestfs/fsdriver/suse.go @@ -297,18 +297,15 @@ func (r *sSuseLikeRootFs) deployNetworkingScripts(rootFs IDiskPartition, nics [] } else { cmds.WriteString("STARTMODE=auto\n") - if len(nicDesc.Ip) > 0 { + if len(nicDesc.Ip) > 0 && len(nicDesc.Ip6) == 0 { cmds.WriteString("BOOTPROTO=dhcp4\n") + } else if len(nicDesc.Ip) == 0 && len(nicDesc.Ip6) > 0 { + cmds.WriteString("BOOTPROTO=dhcp6\n") + } else if len(nicDesc.Ip) > 0 && len(nicDesc.Ip6) > 0 { + cmds.WriteString("BOOTPROTO=dhcp\n") + } else { + cmds.WriteString("BOOTPROTO=none\n") } - - if len(nicDesc.Ip6) > 0 { - // IPv6 support static temporarily - // TODO - cmds.WriteString("IPV6INIT=yes\n") - cmds.WriteString("IPV6_AUTOCONF=no\n") - cmds.WriteString(fmt.Sprintf("IPADDR_V6=%s/%d\n", nicDesc.Ip6, nicDesc.Masklen6)) - } - } var fn = fmt.Sprintf("/etc/sysconfig/network/ifcfg-%s", nicDesc.Name) log.Debugf("%s: %s", fn, cmds.String()) diff --git a/pkg/util/netplan/netplan.go b/pkg/util/netplan/netplan.go index 8d489decd3..88fb243fdf 100644 --- a/pkg/util/netplan/netplan.go +++ b/pkg/util/netplan/netplan.go @@ -199,15 +199,19 @@ func (n *Network) YAMLString() string { return toYAMLString(n) } -func NewDHCP4EthernetConfig() *EthernetConfig { - return &EthernetConfig{ - DHCP4: true, - } +func NewDHCPEthernetConfig() *EthernetConfig { + return &EthernetConfig{} } -func (c *EthernetConfig) EnableDHCP6() { +func (c *EthernetConfig) EnableDHCP4() *EthernetConfig { + c.DHCP4 = true + return c +} + +func (c *EthernetConfig) EnableDHCP6() *EthernetConfig { c.DHCP6 = true c.AcceptRa = true + return c } func NewStaticEthernetConfig( diff --git a/pkg/util/netplan/netplan_test.go b/pkg/util/netplan/netplan_test.go index 57a13879e7..1a0a7b096a 100644 --- a/pkg/util/netplan/netplan_test.go +++ b/pkg/util/netplan/netplan_test.go @@ -21,7 +21,7 @@ import ( ) func TestNewEthernetConfig(t *testing.T) { - c := NewDHCP4EthernetConfig() + c := NewDHCPEthernetConfig().EnableDHCP4() assert := assert.New(t) assert.YAMLEq("dhcp4: true", c.YAMLString()) @@ -72,7 +72,7 @@ parameters: func TestNewNetwork(t *testing.T) { n := NewNetwork() - n.AddEthernet("eth0", NewDHCP4EthernetConfig()) + n.AddEthernet("eth0", NewDHCPEthernetConfig().EnableDHCP4()) n.AddEthernet("eth1", NewStaticEthernetConfig( "10.10.10.2/24", "",