Skip to content

Commit

Permalink
Add IPv6 support for network
Browse files Browse the repository at this point in the history
Signed-off-by: Hanchin Hsieh <me@yuchanns.xyz>
  • Loading branch information
yuchanns committed Jan 24, 2023
1 parent 39ff2bf commit e37e19c
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 31 deletions.
6 changes: 3 additions & 3 deletions cmd/nerdctl/network_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func newNetworkCreateCommand() *cobra.Command {
networkCreateCommand.Flags().String("ipam-driver", "default", "IP Address Management Driver")
networkCreateCommand.RegisterFlagCompletionFunc("ipam-driver", shellCompleteIPAMDrivers)
networkCreateCommand.Flags().StringArray("ipam-opt", nil, "Set IPAM driver specific options")
networkCreateCommand.Flags().String("subnet", "", `Subnet in CIDR format that represents a network segment, e.g. "10.5.0.0/16"`)
networkCreateCommand.Flags().StringArray("subnet", nil, `Subnet in CIDR format that represents a network segment, e.g. "10.5.0.0/16"`)
networkCreateCommand.Flags().String("gateway", "", `Gateway for the master subnet`)
networkCreateCommand.Flags().String("ip-range", "", `Allocate container ip from a sub-range`)
networkCreateCommand.Flags().StringArray("label", nil, "Set metadata for a network")
Expand Down Expand Up @@ -79,7 +79,7 @@ func networkCreateAction(cmd *cobra.Command, args []string) error {
if err != nil {
return err
}
subnetStr, err := cmd.Flags().GetString("subnet")
subnets, err := cmd.Flags().GetStringArray("subnet")
if err != nil {
return err
}
Expand All @@ -105,7 +105,7 @@ func networkCreateAction(cmd *cobra.Command, args []string) error {
Options: strutil.ConvertKVStringsToMap(opts),
IPAMDriver: ipamDriver,
IPAMOptions: strutil.ConvertKVStringsToMap(ipamOpts),
Subnet: subnetStr,
Subnets: subnets,
Gateway: gatewayStr,
IPRange: ipRangeStr,
Labels: labels,
Expand Down
2 changes: 1 addition & 1 deletion pkg/cmd/network/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import (
)

func Create(options types.NetworkCreateOptions, stdout io.Writer) error {
if options.CreateOptions.Subnet == "" {
if len(options.CreateOptions.Subnets) == 0 {
if options.CreateOptions.Gateway != "" || options.CreateOptions.IPRange != "" {
return fmt.Errorf("cannot set gateway or ip-range without subnet, specify --subnet manually")
}
Expand Down
6 changes: 3 additions & 3 deletions pkg/netutil/netutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ type CreateOptions struct {
Options map[string]string
IPAMDriver string
IPAMOptions map[string]string
Subnet string
Subnets []string
Gateway string
IPRange string
Labels []string
Expand All @@ -244,7 +244,7 @@ func (e *CNIEnv) CreateNetwork(opts CreateOptions) (*NetworkConfig, error) { //n
}

fn := func() error {
ipam, err := e.generateIPAM(opts.IPAMDriver, opts.Subnet, opts.Gateway, opts.IPRange, opts.IPAMOptions)
ipam, err := e.generateIPAM(opts.IPAMDriver, opts.Subnets, opts.Gateway, opts.IPRange, opts.IPAMOptions)
if err != nil {
return err
}
Expand Down Expand Up @@ -353,7 +353,7 @@ func (e *CNIEnv) createDefaultNetworkConfig() error {
opts := CreateOptions{
Name: DefaultNetworkName,
Driver: DefaultNetworkName,
Subnet: DefaultCIDR,
Subnets: []string{DefaultCIDR},
IPAMDriver: "default",
Labels: []string{fmt.Sprintf("%s=true", labels.NerdctlDefaultNetwork)},
}
Expand Down
39 changes: 29 additions & 10 deletions pkg/netutil/netutil_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,24 +155,23 @@ func (e *CNIEnv) generateCNIPlugins(driver string, name string, ipam map[string]
return plugins, nil
}

func (e *CNIEnv) generateIPAM(driver string, subnetStr, gatewayStr, ipRangeStr string, opts map[string]string) (map[string]interface{}, error) {
func (e *CNIEnv) generateIPAM(driver string, subnets []string, gatewayStr, ipRangeStr string, opts map[string]string) (map[string]interface{}, error) {
var ipamConfig interface{}
switch driver {
case "default", "host-local":
subnet, err := e.parseSubnet(subnetStr)
if err != nil {
return nil, err
ipamConf := newHostLocalIPAMConfig()
ipamConf.Routes = []IPAMRoute{
{Dst: "0.0.0.0/0"},
}
ipamRange, err := parseIPAMRange(subnet, gatewayStr, ipRangeStr)
ranges, findIPv4, err := e.parseIPAMRanges(subnets, gatewayStr, ipRangeStr)
if err != nil {
return nil, err
}

ipamConf := newHostLocalIPAMConfig()
ipamConf.Routes = []IPAMRoute{
{Dst: "0.0.0.0/0"},
ipamConf.Ranges = append(ipamConf.Ranges, ranges...)
if !findIPv4 {
ranges, _, _ = e.parseIPAMRanges([]string{""}, gatewayStr, ipRangeStr)
ipamConf.Ranges = append(ipamConf.Ranges, ranges...)
}
ipamConf.Ranges = append(ipamConf.Ranges, []IPAMRange{*ipamRange})
ipamConfig = ipamConf
case "dhcp":
ipamConf := newDHCPIPAMConfig()
Expand All @@ -193,6 +192,26 @@ func (e *CNIEnv) generateIPAM(driver string, subnetStr, gatewayStr, ipRangeStr s
return ipam, nil
}

func (e *CNIEnv) parseIPAMRanges(subnets []string, gateway, ipRange string) ([][]IPAMRange, bool, error) {
findIPv4 := false
ranges := make([][]IPAMRange, 0, len(subnets))
for i := range subnets {
subnet, err := e.parseSubnet(subnets[i])
if err != nil {
return nil, findIPv4, err
}
if !findIPv4 && subnet.IP.To4() != nil {
findIPv4 = true
}
ipamRange, err := parseIPAMRange(subnet, gateway, ipRange)
if err != nil {
return nil, findIPv4, err
}
ranges = append(ranges, []IPAMRange{*ipamRange})
}
return ranges, findIPv4, nil
}

func fixUpIsolation(e *CNIEnv, name string, plugins []CNIPlugin) []CNIPlugin {
isolationPath := filepath.Join(e.Path, "isolation")
if _, err := exec.LookPath(isolationPath); err == nil {
Expand Down
25 changes: 11 additions & 14 deletions pkg/netutil/netutil_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,27 +66,24 @@ func (e *CNIEnv) generateCNIPlugins(driver string, name string, ipam map[string]
return plugins, nil
}

func (e *CNIEnv) generateIPAM(driver string, subnetStr, gatewayStr, ipRangeStr string, opts map[string]string) (map[string]interface{}, error) {
subnet, err := e.parseSubnet(subnetStr)
func (e *CNIEnv) generateIPAM(driver string, subnets []string, gatewayStr, ipRangeStr string, opts map[string]string) (map[string]interface{}, error) {
switch driver {
case "default":
default:
return nil, fmt.Errorf("unsupported ipam driver %q", driver)
}

ipamConfig := newWindowsIPAMConfig()
subnet, err := e.parseSubnet(subnets[0])
if err != nil {
return nil, err
}
ipamRange, err := parseIPAMRange(subnet, gatewayStr, ipRangeStr)
if err != nil {
return nil, err
}

var ipamConfig interface{}
switch driver {
case "default":
ipamConf := newWindowsIPAMConfig()
ipamConf.Subnet = ipamRange.Subnet
ipamConf.Routes = append(ipamConf.Routes, IPAMRoute{Gateway: ipamRange.Gateway})
ipamConfig = ipamConf
default:
return nil, fmt.Errorf("unsupported ipam driver %q", driver)
}

ipamConfig.Subnet = ipamRange.Subnet
ipamConfig.Routes = append(ipamConfig.Routes, IPAMRoute{Gateway: ipamRange.Gateway})
ipam, err := structToMap(ipamConfig)
if err != nil {
return nil, err
Expand Down

0 comments on commit e37e19c

Please sign in to comment.