|
@@ -8,15 +8,27 @@ import (
|
|
|
"github.com/docker/libnetwork"
|
|
|
_ "github.com/docker/libnetwork/drivers/bridge"
|
|
|
"github.com/docker/libnetwork/pkg/options"
|
|
|
- "github.com/vishvananda/netlink"
|
|
|
)
|
|
|
|
|
|
var bridgeName = "dockertest0"
|
|
|
|
|
|
-func TestSimplebridge(t *testing.T) {
|
|
|
- bridge := &netlink.Bridge{LinkAttrs: netlink.LinkAttrs{Name: bridgeName}}
|
|
|
- netlink.LinkDel(bridge)
|
|
|
+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
|
|
|
+ }
|
|
|
|
|
|
+ network, err := controller.NewNetwork(driver, networkName, "")
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ return network, nil
|
|
|
+}
|
|
|
+
|
|
|
+func TestSimplebridge(t *testing.T) {
|
|
|
ip, subnet, err := net.ParseCIDR("192.168.100.1/24")
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
@@ -36,7 +48,7 @@ func TestSimplebridge(t *testing.T) {
|
|
|
cidrv6.IP = ip
|
|
|
|
|
|
log.Debug("Adding a simple bridge")
|
|
|
- options := options.Generic{
|
|
|
+ option := options.Generic{
|
|
|
"BridgeName": bridgeName,
|
|
|
"AddressIPv4": subnet,
|
|
|
"FixedCIDR": cidr,
|
|
@@ -48,14 +60,133 @@ func TestSimplebridge(t *testing.T) {
|
|
|
"EnableIPForwarding": true,
|
|
|
"AllowNonDefaultBridge": true}
|
|
|
|
|
|
+ network, err := createTestNetwork("simplebridge", "testnetwork", option)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ ep, _, err := network.CreateEndpoint("testep", "", "")
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := ep.Delete(); err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ if err := network.Delete(); err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestUnknownDriver(t *testing.T) {
|
|
|
+ _, 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) {
|
|
|
controller := libnetwork.New()
|
|
|
|
|
|
- driver, err := controller.NewNetworkDriver("simplebridge", options)
|
|
|
+ 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) {
|
|
|
+ controller := libnetwork.New()
|
|
|
+
|
|
|
+ option := options.Generic{}
|
|
|
+ driver, err := controller.NewNetworkDriver("simplebridge", option)
|
|
|
+ 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"
|
|
|
+
|
|
|
+ n, err := createTestNetwork("simplebridge", networkName, options.Generic{})
|
|
|
+ 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) {
|
|
|
+ networkType := "simplebridge"
|
|
|
+
|
|
|
+ n, err := createTestNetwork(networkType, "testnetwork", options.Generic{})
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
- network, err := controller.NewNetwork(driver, "testnetwork", "")
|
|
|
+ if n.Type() != networkType {
|
|
|
+ t.Fatalf("Expected network type %s, got %s", networkType, n.Type())
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestNetworkID(t *testing.T) {
|
|
|
+ networkType := "simplebridge"
|
|
|
+
|
|
|
+ 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) {
|
|
|
+ option := options.Generic{
|
|
|
+ "BridgeName": bridgeName,
|
|
|
+ "AllowNonDefaultBridge": true}
|
|
|
+
|
|
|
+ network, err := createTestNetwork("simplebridge", "testnetwork", option)
|
|
|
if err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
@@ -65,6 +196,16 @@ func TestSimplebridge(t *testing.T) {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
|
|
|
+ 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.
|
|
|
if err := ep.Delete(); err != nil {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
@@ -73,3 +214,70 @@ func TestSimplebridge(t *testing.T) {
|
|
|
t.Fatal(err)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func TestUnknownNetwork(t *testing.T) {
|
|
|
+ option := options.Generic{
|
|
|
+ "BridgeName": bridgeName,
|
|
|
+ "AllowNonDefaultBridge": true}
|
|
|
+
|
|
|
+ network, err := createTestNetwork("simplebridge", "testnetwork", option)
|
|
|
+ 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) {
|
|
|
+ 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}
|
|
|
+
|
|
|
+ network, err := createTestNetwork("simplebridge", "testnetwork", option)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ ep, _, err := network.CreateEndpoint("testep", "", "")
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+}
|