1package bridge
2
3import (
4	"testing"
5
6	"github.com/docker/libnetwork/driverapi"
7	"github.com/docker/libnetwork/netlabel"
8	"github.com/docker/libnetwork/testutils"
9	"github.com/vishvananda/netlink"
10)
11
12func TestLinkCreate(t *testing.T) {
13	defer testutils.SetupTestOSContext(t)()
14	d := newDriver()
15
16	if err := d.configure(nil); err != nil {
17		t.Fatalf("Failed to setup driver config: %v", err)
18	}
19
20	mtu := 1490
21	config := &networkConfiguration{
22		BridgeName: DefaultBridgeName,
23		Mtu:        mtu,
24		EnableIPv6: true,
25	}
26	genericOption := make(map[string]interface{})
27	genericOption[netlabel.GenericData] = config
28
29	ipdList := getIPv4Data(t, "")
30	err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
31	if err != nil {
32		t.Fatalf("Failed to create bridge: %v", err)
33	}
34
35	te := newTestEndpoint(ipdList[0].Pool, 10)
36	err = d.CreateEndpoint("dummy", "", te.Interface(), nil)
37	if err != nil {
38		if _, ok := err.(InvalidEndpointIDError); !ok {
39			t.Fatalf("Failed with a wrong error :%s", err.Error())
40		}
41	} else {
42		t.Fatal("Failed to detect invalid config")
43	}
44
45	// Good endpoint creation
46	err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
47	if err != nil {
48		t.Fatalf("Failed to create a link: %s", err.Error())
49	}
50
51	err = d.Join("dummy", "ep", "sbox", te, nil)
52	if err != nil {
53		t.Fatalf("Failed to create a link: %s", err.Error())
54	}
55
56	// Verify sbox endoint interface inherited MTU value from bridge config
57	sboxLnk, err := netlink.LinkByName(te.iface.srcName)
58	if err != nil {
59		t.Fatal(err)
60	}
61	if mtu != sboxLnk.Attrs().MTU {
62		t.Fatal("Sandbox endpoint interface did not inherit bridge interface MTU config")
63	}
64	// TODO: if we could get peer name from (sboxLnk.(*netlink.Veth)).PeerName
65	// then we could check the MTU on hostLnk as well.
66
67	te1 := newTestEndpoint(ipdList[0].Pool, 11)
68	err = d.CreateEndpoint("dummy", "ep", te1.Interface(), nil)
69	if err == nil {
70		t.Fatal("Failed to detect duplicate endpoint id on same network")
71	}
72
73	if te.iface.dstName == "" {
74		t.Fatal("Invalid Dstname returned")
75	}
76
77	_, err = netlink.LinkByName(te.iface.srcName)
78	if err != nil {
79		t.Fatalf("Could not find source link %s: %v", te.iface.srcName, err)
80	}
81
82	n, ok := d.networks["dummy"]
83	if !ok {
84		t.Fatalf("Cannot find network %s inside driver", "dummy")
85	}
86	ip := te.iface.addr.IP
87	if !n.bridge.bridgeIPv4.Contains(ip) {
88		t.Fatalf("IP %s is not a valid ip in the subnet %s", ip.String(), n.bridge.bridgeIPv4.String())
89	}
90
91	ip6 := te.iface.addrv6.IP
92	if !n.bridge.bridgeIPv6.Contains(ip6) {
93		t.Fatalf("IP %s is not a valid ip in the subnet %s", ip6.String(), bridgeIPv6.String())
94	}
95
96	if !te.gw.Equal(n.bridge.bridgeIPv4.IP) {
97		t.Fatalf("Invalid default gateway. Expected %s. Got %s", n.bridge.bridgeIPv4.IP.String(),
98			te.gw.String())
99	}
100
101	if !te.gw6.Equal(n.bridge.bridgeIPv6.IP) {
102		t.Fatalf("Invalid default gateway for IPv6. Expected %s. Got %s", n.bridge.bridgeIPv6.IP.String(),
103			te.gw6.String())
104	}
105}
106
107func TestLinkCreateTwo(t *testing.T) {
108	defer testutils.SetupTestOSContext(t)()
109	d := newDriver()
110
111	if err := d.configure(nil); err != nil {
112		t.Fatalf("Failed to setup driver config: %v", err)
113	}
114
115	config := &networkConfiguration{
116		BridgeName: DefaultBridgeName,
117		EnableIPv6: true}
118	genericOption := make(map[string]interface{})
119	genericOption[netlabel.GenericData] = config
120
121	ipdList := getIPv4Data(t, "")
122	err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
123	if err != nil {
124		t.Fatalf("Failed to create bridge: %v", err)
125	}
126
127	te1 := newTestEndpoint(ipdList[0].Pool, 11)
128	err = d.CreateEndpoint("dummy", "ep", te1.Interface(), nil)
129	if err != nil {
130		t.Fatalf("Failed to create a link: %s", err.Error())
131	}
132
133	te2 := newTestEndpoint(ipdList[0].Pool, 12)
134	err = d.CreateEndpoint("dummy", "ep", te2.Interface(), nil)
135	if err != nil {
136		if _, ok := err.(driverapi.ErrEndpointExists); !ok {
137			t.Fatalf("Failed with a wrong error: %s", err.Error())
138		}
139	} else {
140		t.Fatal("Expected to fail while trying to add same endpoint twice")
141	}
142}
143
144func TestLinkCreateNoEnableIPv6(t *testing.T) {
145	defer testutils.SetupTestOSContext(t)()
146	d := newDriver()
147
148	if err := d.configure(nil); err != nil {
149		t.Fatalf("Failed to setup driver config: %v", err)
150	}
151
152	config := &networkConfiguration{
153		BridgeName: DefaultBridgeName}
154	genericOption := make(map[string]interface{})
155	genericOption[netlabel.GenericData] = config
156
157	ipdList := getIPv4Data(t, "")
158	err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
159	if err != nil {
160		t.Fatalf("Failed to create bridge: %v", err)
161	}
162	te := newTestEndpoint(ipdList[0].Pool, 30)
163	err = d.CreateEndpoint("dummy", "ep", te.Interface(), nil)
164	if err != nil {
165		t.Fatalf("Failed to create a link: %s", err.Error())
166	}
167
168	iface := te.iface
169	if iface.addrv6 != nil && iface.addrv6.IP.To16() != nil {
170		t.Fatalf("Expectd IPv6 address to be nil when IPv6 is not enabled. Got IPv6 = %s", iface.addrv6.String())
171	}
172
173	if te.gw6.To16() != nil {
174		t.Fatalf("Expected GatewayIPv6 to be nil when IPv6 is not enabled. Got GatewayIPv6 = %s", te.gw6.String())
175	}
176}
177
178func TestLinkDelete(t *testing.T) {
179	defer testutils.SetupTestOSContext(t)()
180	d := newDriver()
181
182	if err := d.configure(nil); err != nil {
183		t.Fatalf("Failed to setup driver config: %v", err)
184	}
185
186	config := &networkConfiguration{
187		BridgeName: DefaultBridgeName,
188		EnableIPv6: true}
189	genericOption := make(map[string]interface{})
190	genericOption[netlabel.GenericData] = config
191
192	ipdList := getIPv4Data(t, "")
193	err := d.CreateNetwork("dummy", genericOption, nil, ipdList, nil)
194	if err != nil {
195		t.Fatalf("Failed to create bridge: %v", err)
196	}
197
198	te := newTestEndpoint(ipdList[0].Pool, 30)
199	err = d.CreateEndpoint("dummy", "ep1", te.Interface(), nil)
200	if err != nil {
201		t.Fatalf("Failed to create a link: %s", err.Error())
202	}
203
204	err = d.DeleteEndpoint("dummy", "")
205	if err != nil {
206		if _, ok := err.(InvalidEndpointIDError); !ok {
207			t.Fatalf("Failed with a wrong error :%s", err.Error())
208		}
209	} else {
210		t.Fatal("Failed to detect invalid config")
211	}
212
213	err = d.DeleteEndpoint("dummy", "ep1")
214	if err != nil {
215		t.Fatal(err)
216	}
217}
218