gitee.com/leisunstar/runtime@v0.0.0-20200521203717-5cef3e7b53f9/virtcontainers/network_test.go (about) 1 // Copyright (c) 2016 Intel Corporation 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 // 5 6 package virtcontainers 7 8 import ( 9 "fmt" 10 "net" 11 "os" 12 "reflect" 13 "testing" 14 15 ktu "github.com/kata-containers/runtime/pkg/katatestutils" 16 vcTypes "github.com/kata-containers/runtime/virtcontainers/pkg/types" 17 "github.com/stretchr/testify/assert" 18 "github.com/vishvananda/netlink" 19 ) 20 21 func TestCreateDeleteNetNS(t *testing.T) { 22 assert := assert.New(t) 23 if tc.NotValid(ktu.NeedRoot()) { 24 t.Skip(testDisabledAsNonRoot) 25 } 26 27 netNSPath, err := createNetNS() 28 assert.NoError(err) 29 assert.NotEmpty(netNSPath) 30 31 _, err = os.Stat(netNSPath) 32 assert.NoError(err) 33 34 err = deleteNetNS(netNSPath) 35 assert.NoError(err) 36 } 37 38 func TestGenerateInterfacesAndRoutes(t *testing.T) { 39 // 40 //Create a couple of addresses 41 // 42 address1 := &net.IPNet{IP: net.IPv4(172, 17, 0, 2), Mask: net.CIDRMask(16, 32)} 43 address2 := &net.IPNet{IP: net.IPv4(182, 17, 0, 2), Mask: net.CIDRMask(16, 32)} 44 address3 := &net.IPNet{IP: net.ParseIP("2001:db8:1::242:ac11:2"), Mask: net.CIDRMask(64, 128)} 45 46 addrs := []netlink.Addr{ 47 {IPNet: address1, Label: "phyaddr1"}, 48 {IPNet: address2, Label: "phyaddr2"}, 49 {IPNet: address3, Label: "phyaddr3"}, 50 } 51 52 // Create a couple of routes: 53 dst2 := &net.IPNet{IP: net.IPv4(172, 17, 0, 0), Mask: net.CIDRMask(16, 32)} 54 src2 := net.IPv4(172, 17, 0, 2) 55 gw2 := net.IPv4(172, 17, 0, 1) 56 57 dstV6 := &net.IPNet{IP: net.ParseIP("2001:db8:1::"), Mask: net.CIDRMask(64, 128)} 58 gatewayV6 := net.ParseIP("2001:db8:1::1") 59 60 routes := []netlink.Route{ 61 {LinkIndex: 329, Dst: nil, Src: nil, Gw: net.IPv4(172, 17, 0, 1), Scope: netlink.Scope(254)}, 62 {LinkIndex: 329, Dst: dst2, Src: src2, Gw: gw2}, 63 {LinkIndex: 329, Dst: dstV6, Src: nil, Gw: nil}, 64 {LinkIndex: 329, Dst: nil, Src: nil, Gw: gatewayV6}, 65 } 66 67 networkInfo := NetworkInfo{ 68 Iface: NetlinkIface{ 69 LinkAttrs: netlink.LinkAttrs{MTU: 1500}, 70 Type: "", 71 }, 72 Addrs: addrs, 73 Routes: routes, 74 } 75 76 ep0 := &PhysicalEndpoint{ 77 IfaceName: "eth0", 78 HardAddr: net.HardwareAddr{0x02, 0x00, 0xca, 0xfe, 0x00, 0x04}.String(), 79 EndpointProperties: networkInfo, 80 } 81 82 endpoints := []Endpoint{ep0} 83 84 nns := NetworkNamespace{NetNsPath: "foobar", NetNsCreated: true, Endpoints: endpoints} 85 86 resInterfaces, resRoutes, err := generateInterfacesAndRoutes(nns) 87 88 // 89 // Build expected results: 90 // 91 expectedAddresses := []*vcTypes.IPAddress{ 92 {Family: netlink.FAMILY_V4, Address: "172.17.0.2", Mask: "16"}, 93 {Family: netlink.FAMILY_V4, Address: "182.17.0.2", Mask: "16"}, 94 {Family: netlink.FAMILY_V6, Address: "2001:db8:1::242:ac11:2", Mask: "64"}, 95 } 96 97 expectedInterfaces := []*vcTypes.Interface{ 98 {Device: "eth0", Name: "eth0", IPAddresses: expectedAddresses, Mtu: 1500, HwAddr: "02:00:ca:fe:00:04"}, 99 } 100 101 expectedRoutes := []*vcTypes.Route{ 102 {Dest: "", Gateway: "172.17.0.1", Device: "eth0", Source: "", Scope: uint32(254)}, 103 {Dest: "172.17.0.0/16", Gateway: "172.17.0.1", Device: "eth0", Source: "172.17.0.2"}, 104 {Dest: "2001:db8:1::/64", Gateway: "", Device: "eth0", Source: ""}, 105 {Dest: "", Gateway: "2001:db8:1::1", Device: "eth0", Source: ""}, 106 } 107 108 for _, r := range resRoutes { 109 fmt.Printf("resRoute: %+v\n", r) 110 } 111 112 assert.Nil(t, err, "unexpected failure when calling generateKataInterfacesAndRoutes") 113 assert.True(t, reflect.DeepEqual(resInterfaces, expectedInterfaces), 114 "Interfaces returned didn't match: got %+v, expecting %+v", resInterfaces, expectedInterfaces) 115 assert.True(t, reflect.DeepEqual(resRoutes, expectedRoutes), 116 "Routes returned didn't match: got %+v, expecting %+v", resRoutes, expectedRoutes) 117 118 } 119 120 func TestNetInterworkingModelIsValid(t *testing.T) { 121 tests := []struct { 122 name string 123 n NetInterworkingModel 124 want bool 125 }{ 126 {"Invalid Model", NetXConnectInvalidModel, false}, 127 {"Default Model", NetXConnectDefaultModel, true}, 128 {"TC Filter Model", NetXConnectTCFilterModel, true}, 129 {"Macvtap Model", NetXConnectMacVtapModel, true}, 130 } 131 for _, tt := range tests { 132 t.Run(tt.name, func(t *testing.T) { 133 if got := tt.n.IsValid(); got != tt.want { 134 t.Errorf("NetInterworkingModel.IsValid() = %v, want %v", got, tt.want) 135 } 136 }) 137 } 138 } 139 140 func TestNetInterworkingModelSetModel(t *testing.T) { 141 var n NetInterworkingModel 142 tests := []struct { 143 name string 144 modelName string 145 wantErr bool 146 }{ 147 {"Invalid Model", "Invalid", true}, 148 {"default Model", defaultNetModelStr, false}, 149 {"macvtap Model", macvtapNetModelStr, false}, 150 {"tcfilter Model", tcFilterNetModelStr, false}, 151 {"none Model", noneNetModelStr, false}, 152 } 153 154 for _, tt := range tests { 155 t.Run(tt.name, func(t *testing.T) { 156 if err := n.SetModel(tt.modelName); (err != nil) != tt.wantErr { 157 t.Errorf("NetInterworkingModel.SetModel() error = %v, wantErr %v", err, tt.wantErr) 158 } 159 }) 160 } 161 } 162 163 func TestGenerateRandomPrivateMacAdd(t *testing.T) { 164 assert := assert.New(t) 165 166 addr1, err := generateRandomPrivateMacAddr() 167 assert.NoError(err) 168 169 _, err = net.ParseMAC(addr1) 170 assert.NoError(err) 171 172 addr2, err := generateRandomPrivateMacAddr() 173 assert.NoError(err) 174 175 _, err = net.ParseMAC(addr2) 176 assert.NoError(err) 177 178 assert.NotEqual(addr1, addr2) 179 } 180 181 func TestCreateGetTunTapLink(t *testing.T) { 182 if tc.NotValid(ktu.NeedRoot()) { 183 t.Skip(testDisabledAsNonRoot) 184 } 185 186 assert := assert.New(t) 187 188 netHandle, err := netlink.NewHandle() 189 defer netHandle.Delete() 190 191 assert.NoError(err) 192 193 tapName := "testtap0" 194 tapLink, fds, err := createLink(netHandle, tapName, &netlink.Tuntap{}, 1) 195 assert.NoError(err) 196 assert.NotNil(tapLink) 197 assert.NotZero(len(fds)) 198 199 tapLink, err = getLinkByName(netHandle, tapName, &netlink.Tuntap{}) 200 assert.NoError(err) 201 202 err = netHandle.LinkDel(tapLink) 203 assert.NoError(err) 204 } 205 206 func TestCreateMacVtap(t *testing.T) { 207 if tc.NotValid(ktu.NeedRoot()) { 208 t.Skip(testDisabledAsNonRoot) 209 } 210 211 assert := assert.New(t) 212 213 netHandle, err := netlink.NewHandle() 214 defer netHandle.Delete() 215 216 assert.NoError(err) 217 218 tapName := "testtap0" 219 tapLink, _, err := createLink(netHandle, tapName, &netlink.Tuntap{}, 1) 220 assert.NoError(err) 221 222 attrs := tapLink.Attrs() 223 224 mcLink := &netlink.Macvtap{ 225 Macvlan: netlink.Macvlan{ 226 LinkAttrs: netlink.LinkAttrs{ 227 TxQLen: attrs.TxQLen, 228 ParentIndex: attrs.Index, 229 }, 230 }, 231 } 232 233 macvtapName := "testmc0" 234 _, err = createMacVtap(netHandle, macvtapName, mcLink, 1) 235 assert.NoError(err) 236 237 macvtapLink, err := getLinkByName(netHandle, macvtapName, &netlink.Macvtap{}) 238 assert.NoError(err) 239 240 err = netHandle.LinkDel(macvtapLink) 241 assert.NoError(err) 242 243 tapLink, err = getLinkByName(netHandle, tapName, &netlink.Tuntap{}) 244 assert.NoError(err) 245 246 err = netHandle.LinkDel(tapLink) 247 assert.NoError(err) 248 } 249 250 func TestTcRedirectNetwork(t *testing.T) { 251 if tc.NotValid(ktu.NeedRoot()) { 252 t.Skip(testDisabledAsNonRoot) 253 } 254 255 assert := assert.New(t) 256 257 netHandle, err := netlink.NewHandle() 258 assert.NoError(err) 259 defer netHandle.Delete() 260 261 // Create a test veth interface. 262 vethName := "foo" 263 veth := &netlink.Veth{LinkAttrs: netlink.LinkAttrs{Name: vethName, TxQLen: 200, MTU: 1400}, PeerName: "bar"} 264 265 err = netlink.LinkAdd(veth) 266 assert.NoError(err) 267 268 endpoint, err := createVethNetworkEndpoint(1, vethName, NetXConnectTCFilterModel) 269 assert.NoError(err) 270 271 link, err := netlink.LinkByName(vethName) 272 assert.NoError(err) 273 274 err = netHandle.LinkSetUp(link) 275 assert.NoError(err) 276 277 err = setupTCFiltering(endpoint, 1, true) 278 assert.NoError(err) 279 280 err = removeTCFiltering(endpoint) 281 assert.NoError(err) 282 283 // Remove the veth created for testing. 284 err = netHandle.LinkDel(link) 285 assert.NoError(err) 286 }