Explorar el Código

Merge pull request #47 from mrjana/cnm

Change IP address and gateway to use proper types
Madhu Venugopal hace 10 años
padre
commit
6006a8af49

+ 8 - 5
libnetwork/driverapi/driverapi.go

@@ -1,6 +1,9 @@
 package driverapi
 
-import "errors"
+import (
+	"errors"
+	"net"
+)
 
 var (
 	// ErrEndpointExists is returned if more than one endpoint is added to the network
@@ -50,10 +53,10 @@ type Interface struct {
 	DstName string
 
 	// IPv4 address for the interface.
-	Address string
+	Address net.IPNet
 
 	// IPv6 address for the interface.
-	AddressIPv6 string
+	AddressIPv6 net.IPNet
 }
 
 // SandboxInfo represents all possible information that
@@ -63,10 +66,10 @@ type SandboxInfo struct {
 	Interfaces []*Interface
 
 	// IPv4 gateway for the sandbox.
-	Gateway string
+	Gateway net.IP
 
 	// IPv6 gateway for the sandbox.
-	GatewayIPv6 string
+	GatewayIPv6 net.IP
 
 	// TODO: Add routes and ip tables etc.
 }

+ 4 - 4
libnetwork/drivers/bridge/bridge.go

@@ -293,11 +293,11 @@ func (d *driver) CreateEndpoint(nid, eid driverapi.UUID, sboxKey string, config
 	intf := &driverapi.Interface{}
 	intf.SrcName = name2
 	intf.DstName = "eth0"
-	intf.Address = ipv4Addr.String()
-	sinfo.Gateway = n.bridge.bridgeIPv4.IP.String()
+	intf.Address = ipv4Addr
+	sinfo.Gateway = n.bridge.bridgeIPv4.IP
 	if n.bridge.Config.EnableIPv6 {
-		intf.AddressIPv6 = ipv6Addr.String()
-		sinfo.GatewayIPv6 = n.bridge.bridgeIPv6.IP.String()
+		intf.AddressIPv6 = ipv6Addr
+		sinfo.GatewayIPv6 = n.bridge.bridgeIPv6.IP
 	}
 
 	n.endpoint.addressIPv4 = ip4

+ 12 - 19
libnetwork/drivers/bridge/network_test.go

@@ -1,7 +1,6 @@
 package bridge
 
 import (
-	"net"
 	"testing"
 
 	"github.com/docker/libnetwork/driverapi"
@@ -41,33 +40,25 @@ func TestLinkCreate(t *testing.T) {
 		t.Fatalf("Could not find source link %s: %v", interfaces[0].SrcName, err)
 	}
 
-	ip, _, err := net.ParseCIDR(interfaces[0].Address)
-	if err != nil {
-		t.Fatalf("Invalid IPv4 address returned, ip = %s: %v", interfaces[0].Address, err)
-	}
-
 	n := dr.network
+	ip := interfaces[0].Address.IP
 	if !n.bridge.bridgeIPv4.Contains(ip) {
 		t.Fatalf("IP %s is not a valid ip in the subnet %s", ip.String(), n.bridge.bridgeIPv4.String())
 	}
 
-	ip6, _, err := net.ParseCIDR(interfaces[0].AddressIPv6)
-	if err != nil {
-		t.Fatalf("Invalid IPv6 address returned, ip = %s: %v", interfaces[0].AddressIPv6, err)
-	}
-
+	ip6 := interfaces[0].AddressIPv6.IP
 	if !n.bridge.bridgeIPv6.Contains(ip6) {
 		t.Fatalf("IP %s is not a valid ip in the subnet %s", ip6.String(), bridgeIPv6.String())
 	}
 
-	if sinfo.Gateway != n.bridge.bridgeIPv4.IP.String() {
+	if sinfo.Gateway.String() != n.bridge.bridgeIPv4.IP.String() {
 		t.Fatalf("Invalid default gateway. Expected %s. Got %s", n.bridge.bridgeIPv4.IP.String(),
-			sinfo.Gateway)
+			sinfo.Gateway.String())
 	}
 
-	if sinfo.GatewayIPv6 != n.bridge.bridgeIPv6.IP.String() {
+	if sinfo.GatewayIPv6.String() != n.bridge.bridgeIPv6.IP.String() {
 		t.Fatalf("Invalid default gateway for IPv6. Expected %s. Got %s", n.bridge.bridgeIPv6.IP.String(),
-			sinfo.GatewayIPv6)
+			sinfo.GatewayIPv6.String())
 	}
 }
 
@@ -115,9 +106,11 @@ func TestLinkCreateNoEnableIPv6(t *testing.T) {
 	}
 
 	interfaces := sinfo.Interfaces
-	if interfaces[0].AddressIPv6 != "" ||
-		sinfo.GatewayIPv6 != "" {
-		t.Fatalf("Expected IPv6 address and GatewayIPv6 to be empty when IPv6 enabled. Instead got IPv6 = %s and GatewayIPv6 = %s",
-			interfaces[0].AddressIPv6, sinfo.GatewayIPv6)
+	if len(interfaces[0].AddressIPv6.IP) != 0 {
+		t.Fatalf("Expectd IPv6 address to be nil when IPv6 is not enabled. Got IPv6 = %s", interfaces[0].AddressIPv6.String())
+	}
+
+	if sinfo.GatewayIPv6 != nil {
+		t.Fatalf("Expected GatewayIPv6 to be nil when IPv6 is not enabled. Got GatewayIPv6 = %s", sinfo.GatewayIPv6.String())
 	}
 }

+ 6 - 23
libnetwork/sandbox/configure_linux.go

@@ -17,8 +17,6 @@ func configureInterface(iface netlink.Link, settings *driverapi.Interface) error
 		{setInterfaceName, fmt.Sprintf("error renaming interface %q to %q", ifaceName, settings.DstName)},
 		{setInterfaceIP, fmt.Sprintf("error setting interface %q IP to %q", ifaceName, settings.Address)},
 		{setInterfaceIPv6, fmt.Sprintf("error setting interface %q IPv6 to %q", ifaceName, settings.AddressIPv6)},
-		/*		{setInterfaceGateway, fmt.Sprintf("error setting interface %q gateway to %q", ifaceName, settings.Gateway)},
-				{setInterfaceGatewayIPv6, fmt.Sprintf("error setting interface %q IPv6 gateway to %q", ifaceName, settings.GatewayIPv6)}, */
 	}
 
 	for _, config := range ifaceConfigurators {
@@ -29,36 +27,21 @@ func configureInterface(iface netlink.Link, settings *driverapi.Interface) error
 	return nil
 }
 
-func setGatewayIP(gw string) error {
-	ip := net.ParseIP(gw)
-	if ip == nil {
-		return fmt.Errorf("bad address format %q", gw)
-	}
-
+func setGatewayIP(gw net.IP) error {
 	return netlink.RouteAdd(&netlink.Route{
 		Scope: netlink.SCOPE_UNIVERSE,
-		Gw:    ip,
+		Gw:    gw,
 	})
 }
 
 func setInterfaceIP(iface netlink.Link, settings *driverapi.Interface) error {
-	ipAddr, err := netlink.ParseAddr(settings.Address)
-	if err == nil {
-		err = netlink.AddrAdd(iface, ipAddr)
-	}
-	return err
+	ipAddr := &netlink.Addr{IPNet: &settings.Address, Label: ""}
+	return netlink.AddrAdd(iface, ipAddr)
 }
 
 func setInterfaceIPv6(iface netlink.Link, settings *driverapi.Interface) error {
-	if settings.AddressIPv6 == "" {
-		return nil
-	}
-
-	ipAddr, err := netlink.ParseAddr(settings.AddressIPv6)
-	if err == nil {
-		err = netlink.AddrAdd(iface, ipAddr)
-	}
-	return err
+	ipAddr := &netlink.Addr{IPNet: &settings.Address, Label: ""}
+	return netlink.AddrAdd(iface, ipAddr)
 }
 
 func setInterfaceName(iface netlink.Link, settings *driverapi.Interface) error {

+ 3 - 2
libnetwork/sandbox/namespace_linux.go

@@ -2,6 +2,7 @@ package sandbox
 
 import (
 	"fmt"
+	"net"
 	"os"
 	"runtime"
 	"syscall"
@@ -120,7 +121,7 @@ func (n *networkNamespace) AddInterface(i *driverapi.Interface) error {
 	return nil
 }
 
-func (n *networkNamespace) SetGateway(gw string) error {
+func (n *networkNamespace) SetGateway(gw net.IP) error {
 	err := setGatewayIP(gw)
 	if err == nil {
 		n.sinfo.Gateway = gw
@@ -129,7 +130,7 @@ func (n *networkNamespace) SetGateway(gw string) error {
 	return err
 }
 
-func (n *networkNamespace) SetGatewayIPv6(gw string) error {
+func (n *networkNamespace) SetGatewayIPv6(gw net.IP) error {
 	err := setGatewayIP(gw)
 	if err == nil {
 		n.sinfo.GatewayIPv6 = gw

+ 9 - 3
libnetwork/sandbox/sandbox.go

@@ -1,6 +1,10 @@
 package sandbox
 
-import "github.com/docker/libnetwork/driverapi"
+import (
+	"net"
+
+	"github.com/docker/libnetwork/driverapi"
+)
 
 // Sandbox represents a network sandbox, identified by a specific key.  It
 // holds a list of Interfaces, routes etc, and more can be added dynamically.
@@ -19,7 +23,9 @@ type Sandbox interface {
 	// interface according to the specified settings.
 	AddInterface(*driverapi.Interface) error
 
-	SetGateway(gw string) error
+	// Set default IPv4 gateway for the sandbox
+	SetGateway(gw net.IP) error
 
-	SetGatewayIPv6(gw string) error
+	// Set default IPv6 gateway for the sandbox
+	SetGatewayIPv6(gw net.IP) error
 }

+ 15 - 0
libnetwork/sandbox/sandbox_unsupported.go

@@ -0,0 +1,15 @@
+// +build !linux
+
+package sandbox
+
+import "errors"
+
+var (
+	ErrNotImplemented = errors.New("not implemented")
+)
+
+// NewSandbox provides a new sandbox instance created in an os specific way
+// provided a key which uniquely identifies the sandbox
+func NewSandbox(key string) (Sandbox, error) {
+	return nil, ErrNotImplemented
+}

+ 20 - 0
libnetwork/sandbox/sandbox_unsupported_test.go

@@ -0,0 +1,20 @@
+// +build !linux
+
+package sandbox
+
+import (
+	"errors"
+	"testing"
+)
+
+var (
+	ErrNotImplemented = errors.New("not implemented")
+)
+
+func newKey(t *testing.T) (string, error) {
+	return nil, ErrNotImplemented
+}
+
+func verifySandbox(t *testing.T, s Sandbox) {
+	return
+}