2015-03-20 20:54:49 +00:00
|
|
|
package libnetwork_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
log "github.com/Sirupsen/logrus"
|
|
|
|
"github.com/docker/libnetwork"
|
|
|
|
_ "github.com/docker/libnetwork/drivers/bridge"
|
2015-04-17 21:18:55 -07:00
|
|
|
"github.com/docker/libnetwork/netutils"
|
2015-04-13 18:40:42 +00:00
|
|
|
"github.com/docker/libnetwork/pkg/options"
|
2015-03-20 20:54:49 +00:00
|
|
|
)
|
|
|
|
|
2015-04-15 05:25:42 +00:00
|
|
|
var bridgeName = "dockertest0"
|
2015-04-09 20:48:13 +00:00
|
|
|
|
2015-04-16 05:01:29 +00:00
|
|
|
func createTestNetwork(networkType, networkName string, option options.Generic) (libnetwork.Network, error) {
|
|
|
|
controller := libnetwork.New()
|
|
|
|
|
|
|
|
driver, err := controller.NewNetworkDriver(networkType, option)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2015-03-20 20:54:49 +00:00
|
|
|
|
2015-04-16 05:01:29 +00:00
|
|
|
network, err := controller.NewNetwork(driver, networkName, "")
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return network, nil
|
|
|
|
}
|
|
|
|
|
2015-04-23 10:49:57 -07:00
|
|
|
func Testbridge(t *testing.T) {
|
2015-04-17 21:18:55 -07:00
|
|
|
defer netutils.SetupTestNetNS(t)()
|
2015-03-20 20:54:49 +00:00
|
|
|
ip, subnet, err := net.ParseCIDR("192.168.100.1/24")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
subnet.IP = ip
|
|
|
|
|
|
|
|
ip, cidr, err := net.ParseCIDR("192.168.100.2/28")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
cidr.IP = ip
|
|
|
|
|
|
|
|
ip, cidrv6, err := net.ParseCIDR("fe90::1/96")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
cidrv6.IP = ip
|
|
|
|
|
2015-04-23 10:49:57 -07:00
|
|
|
log.Debug("Adding a bridge")
|
2015-04-16 05:01:29 +00:00
|
|
|
option := options.Generic{
|
2015-04-15 05:25:42 +00:00
|
|
|
"BridgeName": bridgeName,
|
|
|
|
"AddressIPv4": subnet,
|
|
|
|
"FixedCIDR": cidr,
|
|
|
|
"FixedCIDRv6": cidrv6,
|
|
|
|
"EnableIPv6": true,
|
|
|
|
"EnableIPTables": true,
|
|
|
|
"EnableIPMasquerade": true,
|
|
|
|
"EnableICC": true,
|
|
|
|
"EnableIPForwarding": true,
|
|
|
|
"AllowNonDefaultBridge": true}
|
2015-03-20 20:54:49 +00:00
|
|
|
|
2015-04-23 10:49:57 -07:00
|
|
|
network, err := createTestNetwork("bridge", "testnetwork", option)
|
2015-04-16 05:01:29 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2015-04-23 11:15:15 -07:00
|
|
|
ep, err := network.CreateEndpoint("testep", "sb1", nil)
|
2015-04-16 05:01:29 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2015-04-17 23:13:29 -07:00
|
|
|
epList := network.Endpoints()
|
|
|
|
if len(epList) != 1 {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if ep != epList[0] {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2015-04-16 05:01:29 +00:00
|
|
|
if err := ep.Delete(); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := network.Delete(); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUnknownDriver(t *testing.T) {
|
2015-04-17 21:18:55 -07:00
|
|
|
defer netutils.SetupTestNetNS(t)()
|
2015-04-20 04:23:04 -07:00
|
|
|
|
2015-04-16 05:01:29 +00:00
|
|
|
_, err := createTestNetwork("unknowndriver", "testnetwork", options.Generic{})
|
|
|
|
if err == nil {
|
|
|
|
t.Fatal("Expected to fail. But instead succeeded")
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := err.(libnetwork.NetworkTypeError); !ok {
|
|
|
|
t.Fatalf("Did not fail with expected error. Actual error: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNilDriver(t *testing.T) {
|
2015-04-13 18:40:42 +00:00
|
|
|
controller := libnetwork.New()
|
|
|
|
|
2015-04-16 05:01:29 +00:00
|
|
|
option := options.Generic{}
|
|
|
|
_, err := controller.NewNetwork(nil, "dummy", option)
|
|
|
|
if err == nil {
|
|
|
|
t.Fatal("Expected to fail. But instead succeeded")
|
|
|
|
}
|
|
|
|
|
|
|
|
if err != libnetwork.ErrNilNetworkDriver {
|
|
|
|
t.Fatalf("Did not fail with expected error. Actual error: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNoInitDriver(t *testing.T) {
|
|
|
|
controller := libnetwork.New()
|
|
|
|
|
|
|
|
option := options.Generic{}
|
|
|
|
_, err := controller.NewNetwork(&libnetwork.NetworkDriver{}, "dummy", option)
|
|
|
|
if err == nil {
|
|
|
|
t.Fatal("Expected to fail. But instead succeeded")
|
|
|
|
}
|
|
|
|
|
|
|
|
if err != libnetwork.ErrInvalidNetworkDriver {
|
|
|
|
t.Fatalf("Did not fail with expected error. Actual error: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDuplicateNetwork(t *testing.T) {
|
2015-04-17 21:18:55 -07:00
|
|
|
defer netutils.SetupTestNetNS(t)()
|
2015-04-16 05:01:29 +00:00
|
|
|
controller := libnetwork.New()
|
|
|
|
|
|
|
|
option := options.Generic{}
|
2015-04-23 10:49:57 -07:00
|
|
|
driver, err := controller.NewNetworkDriver("bridge", option)
|
2015-04-16 05:01:29 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = controller.NewNetwork(driver, "testnetwork", "")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = controller.NewNetwork(driver, "testnetwork", "")
|
|
|
|
if err == nil {
|
|
|
|
t.Fatal("Expected to fail. But instead succeeded")
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := err.(libnetwork.NetworkNameError); !ok {
|
|
|
|
t.Fatalf("Did not fail with expected error. Actual error: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNetworkName(t *testing.T) {
|
|
|
|
networkName := "testnetwork"
|
|
|
|
|
2015-04-23 10:49:57 -07:00
|
|
|
n, err := createTestNetwork("bridge", networkName, options.Generic{})
|
2015-04-16 05:01:29 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if n.Name() != networkName {
|
|
|
|
t.Fatalf("Expected network name %s, got %s", networkName, n.Name())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNetworkType(t *testing.T) {
|
2015-04-23 10:49:57 -07:00
|
|
|
networkType := "bridge"
|
2015-04-16 05:01:29 +00:00
|
|
|
|
|
|
|
n, err := createTestNetwork(networkType, "testnetwork", options.Generic{})
|
2015-03-20 20:54:49 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2015-04-16 05:01:29 +00:00
|
|
|
if n.Type() != networkType {
|
|
|
|
t.Fatalf("Expected network type %s, got %s", networkType, n.Type())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNetworkID(t *testing.T) {
|
2015-04-23 10:49:57 -07:00
|
|
|
networkType := "bridge"
|
2015-04-16 05:01:29 +00:00
|
|
|
|
|
|
|
n, err := createTestNetwork(networkType, "testnetwork", options.Generic{})
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if n.ID() == "" {
|
|
|
|
t.Fatal("Expected non-empty network id")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDeleteNetworkWithActiveEndpoints(t *testing.T) {
|
2015-04-17 21:18:55 -07:00
|
|
|
defer netutils.SetupTestNetNS(t)()
|
2015-04-16 05:01:29 +00:00
|
|
|
option := options.Generic{
|
|
|
|
"BridgeName": bridgeName,
|
|
|
|
"AllowNonDefaultBridge": true}
|
|
|
|
|
2015-04-23 10:49:57 -07:00
|
|
|
network, err := createTestNetwork("bridge", "testnetwork", option)
|
2015-04-15 05:25:42 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2015-04-23 11:15:15 -07:00
|
|
|
ep, err := network.CreateEndpoint("testep", "sb2", nil)
|
2015-04-15 05:25:42 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2015-04-16 05:01:29 +00:00
|
|
|
err = network.Delete()
|
|
|
|
if err == nil {
|
|
|
|
t.Fatal("Expected to fail. But instead succeeded")
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := err.(*libnetwork.ActiveEndpointsError); !ok {
|
|
|
|
t.Fatalf("Did not fail with expected error. Actual error: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Done testing. Now cleanup.
|
2015-04-15 05:25:42 +00:00
|
|
|
if err := ep.Delete(); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2015-03-20 20:54:49 +00:00
|
|
|
if err := network.Delete(); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
2015-04-16 05:01:29 +00:00
|
|
|
|
|
|
|
func TestUnknownNetwork(t *testing.T) {
|
2015-04-17 21:18:55 -07:00
|
|
|
defer netutils.SetupTestNetNS(t)()
|
2015-04-16 05:01:29 +00:00
|
|
|
option := options.Generic{
|
|
|
|
"BridgeName": bridgeName,
|
|
|
|
"AllowNonDefaultBridge": true}
|
|
|
|
|
2015-04-23 10:49:57 -07:00
|
|
|
network, err := createTestNetwork("bridge", "testnetwork", option)
|
2015-04-16 05:01:29 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = network.Delete()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = network.Delete()
|
|
|
|
if err == nil {
|
|
|
|
t.Fatal("Expected to fail. But instead succeeded")
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := err.(*libnetwork.UnknownNetworkError); !ok {
|
|
|
|
t.Fatalf("Did not fail with expected error. Actual error: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestUnknownEndpoint(t *testing.T) {
|
2015-04-17 21:18:55 -07:00
|
|
|
defer netutils.SetupTestNetNS(t)()
|
2015-04-16 05:01:29 +00:00
|
|
|
ip, subnet, err := net.ParseCIDR("192.168.100.1/24")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
subnet.IP = ip
|
|
|
|
|
|
|
|
option := options.Generic{
|
|
|
|
"BridgeName": bridgeName,
|
|
|
|
"AddressIPv4": subnet,
|
|
|
|
"AllowNonDefaultBridge": true}
|
|
|
|
|
2015-04-23 10:49:57 -07:00
|
|
|
network, err := createTestNetwork("bridge", "testnetwork", option)
|
2015-04-16 05:01:29 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2015-04-23 11:15:15 -07:00
|
|
|
ep, err := network.CreateEndpoint("testep", "sb1", nil)
|
2015-04-16 05:01:29 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = ep.Delete()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = ep.Delete()
|
|
|
|
if err == nil {
|
|
|
|
t.Fatal("Expected to fail. But instead succeeded")
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := err.(*libnetwork.UnknownEndpointError); !ok {
|
|
|
|
t.Fatalf("Did not fail with expected error. Actual error: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Done testing. Now cleanup
|
|
|
|
if err := network.Delete(); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|