github.com/libvirt/libvirt-go-xml@v7.4.0+incompatible/network_test.go (about) 1 /* 2 * This file is part of the libvirt-go-xml project 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a copy 5 * of this software and associated documentation files (the "Software"), to deal 6 * in the Software without restriction, including without limitation the rights 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 * copies of the Software, and to permit persons to whom the Software is 9 * furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 * THE SOFTWARE. 21 * 22 * Copyright (C) 2017 Lian Duan <blazeblue@gmail.com> 23 * 24 */ 25 26 package libvirtxml 27 28 import ( 29 "strings" 30 "testing" 31 ) 32 33 var nicInAverage uint = 1000 34 var nicInBurst uint = 10000 35 var nicInPeak uint = 2000 36 var nicInFloor uint = 500 37 var nicOutAverage uint = 2000 38 39 var netFwdDomain uint = 0 40 var netFwdBus uint = 3 41 var netFwdSlot uint = 0 42 var netFwdFunc1 uint = 1 43 var netFwdFunc2 uint = 2 44 45 var networkTestData = []struct { 46 Object *Network 47 Expected []string 48 }{ 49 { 50 Object: &Network{ 51 Name: "test", 52 IPv6: "yes", 53 Metadata: &NetworkMetadata{ 54 XML: "<myvalue xmlns='http://myapp.com/schemeas/my/1.0'><widget name='foo'/></myvalue>" + 55 "<myothervalue xmlns='http://myotherapp.com/schemeas/my/1.0'><gizmo name='foo'/></myothervalue>", 56 }, 57 }, 58 Expected: []string{ 59 `<network ipv6="yes">`, 60 ` <name>test</name>`, 61 ` <metadata>` + 62 `<myvalue xmlns='http://myapp.com/schemeas/my/1.0'><widget name='foo'/></myvalue>` + 63 `<myothervalue xmlns='http://myotherapp.com/schemeas/my/1.0'><gizmo name='foo'/></myothervalue>` + 64 `</metadata>`, 65 `</network>`, 66 }, 67 }, 68 { 69 Object: &Network{ 70 Name: "test", 71 MTU: &NetworkMTU{ 72 Size: 1400, 73 }, 74 Domain: &NetworkDomain{ 75 Name: "example.com", 76 }, 77 Forward: &NetworkForward{ 78 Mode: "hostdev", 79 Managed: "yes", 80 Driver: &NetworkForwardDriver{ 81 Name: "vfio", 82 }, 83 Addresses: []NetworkForwardAddress{ 84 NetworkForwardAddress{ 85 PCI: &NetworkForwardAddressPCI{ 86 Domain: &netFwdDomain, 87 Bus: &netFwdBus, 88 Slot: &netFwdSlot, 89 Function: &netFwdFunc1, 90 }, 91 }, 92 NetworkForwardAddress{ 93 PCI: &NetworkForwardAddressPCI{ 94 Domain: &netFwdDomain, 95 Bus: &netFwdBus, 96 Slot: &netFwdSlot, 97 Function: &netFwdFunc2, 98 }, 99 }, 100 }, 101 PFs: []NetworkForwardPF{ 102 NetworkForwardPF{ 103 Dev: "eth2", 104 }, 105 }, 106 }, 107 PortGroups: []NetworkPortGroup{ 108 NetworkPortGroup{ 109 Name: "main", 110 Default: "yes", 111 VLAN: &NetworkVLAN{ 112 Trunk: "yes", 113 Tags: []NetworkVLANTag{ 114 NetworkVLANTag{ 115 ID: 123, 116 NativeMode: "tagged", 117 }, 118 NetworkVLANTag{ 119 ID: 444, 120 }, 121 }, 122 }, 123 }, 124 }, 125 }, 126 Expected: []string{ 127 `<network>`, 128 ` <name>test</name>`, 129 ` <forward mode="hostdev" managed="yes">`, 130 ` <driver name="vfio"></driver>`, 131 ` <pf dev="eth2"></pf>`, 132 ` <address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x1"></address>`, 133 ` <address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x2"></address>`, 134 ` </forward>`, 135 ` <mtu size="1400"></mtu>`, 136 ` <domain name="example.com"></domain>`, 137 ` <portgroup name="main" default="yes">`, 138 ` <vlan trunk="yes">`, 139 ` <tag id="123" nativeMode="tagged"></tag>`, 140 ` <tag id="444"></tag>`, 141 ` </vlan>`, 142 ` </portgroup>`, 143 `</network>`, 144 }, 145 }, 146 { 147 Object: &Network{ 148 Name: "test", 149 Bridge: &NetworkBridge{ 150 Name: "virbr0", 151 }, 152 VirtualPort: &NetworkVirtualPort{ 153 Params: &NetworkVirtualPortParams{ 154 OpenVSwitch: &NetworkVirtualPortParamsOpenVSwitch{ 155 InterfaceID: "09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f", 156 }, 157 }, 158 }, 159 Forward: &NetworkForward{ 160 Mode: "nat", 161 NAT: &NetworkForwardNAT{ 162 Addresses: []NetworkForwardNATAddress{ 163 NetworkForwardNATAddress{ 164 Start: "1.2.3.4", 165 End: "1.2.3.10", 166 }, 167 }, 168 Ports: []NetworkForwardNATPort{ 169 NetworkForwardNATPort{ 170 Start: 500, 171 End: 1000, 172 }, 173 }, 174 }, 175 Interfaces: []NetworkForwardInterface{ 176 NetworkForwardInterface{ 177 Dev: "eth0", 178 }, 179 }, 180 }, 181 IPs: []NetworkIP{ 182 NetworkIP{ 183 Address: "192.168.122.1", 184 Netmask: "255.255.255.0", 185 DHCP: &NetworkDHCP{ 186 Ranges: []NetworkDHCPRange{ 187 NetworkDHCPRange{ 188 Start: "192.168.122.2", 189 End: "192.168.122.254", 190 }, 191 }, 192 Hosts: []NetworkDHCPHost{ 193 NetworkDHCPHost{ 194 MAC: "00:16:3e:77:e2:ed", 195 Name: "foo.example.com", 196 IP: "192.168.122.10", 197 }, 198 }, 199 Bootp: []NetworkBootp{ 200 NetworkBootp{ 201 File: "pxelinux.0", 202 Server: "192.168.122.1", 203 }, 204 }, 205 }, 206 TFTP: &NetworkTFTP{ 207 Root: "/var/lib/tftp", 208 }, 209 }, 210 NetworkIP{ 211 Family: "ipv6", 212 Address: "2001:db8:ca2:2::1", 213 Prefix: 64, 214 DHCP: &NetworkDHCP{ 215 Hosts: []NetworkDHCPHost{ 216 NetworkDHCPHost{ 217 IP: "2001:db8:ca2:2:3::1", 218 Name: "paul", 219 }, 220 NetworkDHCPHost{ 221 ID: "0:1:0:1:18:aa:62:fe:0:16:3e:44:55:66", 222 IP: "2001:db8:ca2:2:3::2", 223 }, 224 }, 225 }, 226 }, 227 }, 228 DNS: &NetworkDNS{ 229 Enable: "yes", 230 ForwardPlainNames: "no", 231 Forwarders: []NetworkDNSForwarder{ 232 NetworkDNSForwarder{ 233 Addr: "8.8.8.8", 234 }, 235 NetworkDNSForwarder{ 236 Domain: "example.com", 237 Addr: "8.8.4.4", 238 }, 239 NetworkDNSForwarder{ 240 Domain: "www.example.com", 241 }, 242 }, 243 TXTs: []NetworkDNSTXT{ 244 NetworkDNSTXT{ 245 Name: "example", 246 Value: "example value", 247 }, 248 }, 249 Host: []NetworkDNSHost{ 250 NetworkDNSHost{ 251 IP: "192.168.122.2", 252 Hostnames: []NetworkDNSHostHostname{ 253 NetworkDNSHostHostname{ 254 Hostname: "myhost", 255 }, 256 NetworkDNSHostHostname{ 257 Hostname: "myhostalias", 258 }, 259 }, 260 }, 261 }, 262 SRVs: []NetworkDNSSRV{ 263 NetworkDNSSRV{ 264 Service: "name", 265 Protocol: "tcp", 266 Domain: "test-domain-name", 267 Target: ".", 268 Port: 1024, 269 Priority: 10, 270 Weight: 10, 271 }, 272 }, 273 }, 274 Bandwidth: &NetworkBandwidth{ 275 Inbound: &NetworkBandwidthParams{ 276 Average: &nicInAverage, 277 Peak: &nicInPeak, 278 Burst: &nicInBurst, 279 Floor: &nicInFloor, 280 }, 281 Outbound: &NetworkBandwidthParams{ 282 Average: &nicOutAverage, 283 }, 284 }, 285 Routes: []NetworkRoute{ 286 NetworkRoute{ 287 Address: "192.168.222.0", 288 Netmask: "255.255.255.0", 289 Gateway: "192.168.122.10", 290 }, 291 NetworkRoute{ 292 Family: "ipv6", 293 Address: "2001:db8:ac10:fc00::", 294 Prefix: 64, 295 Gateway: "2001:db8:ac10:fd01::1:24", 296 }, 297 }, 298 VLAN: &NetworkVLAN{ 299 Tags: []NetworkVLANTag{ 300 NetworkVLANTag{ 301 ID: 49, 302 }, 303 NetworkVLANTag{ 304 ID: 52, 305 NativeMode: "tagged", 306 }, 307 }, 308 }, 309 }, 310 Expected: []string{ 311 `<network>`, 312 ` <name>test</name>`, 313 ` <forward mode="nat">`, 314 ` <nat>`, 315 ` <address start="1.2.3.4" end="1.2.3.10"></address>`, 316 ` <port start="500" end="1000"></port>`, 317 ` </nat>`, 318 ` <interface dev="eth0"></interface>`, 319 ` </forward>`, 320 ` <bridge name="virbr0"></bridge>`, 321 ` <dns enable="yes" forwardPlainNames="no">`, 322 ` <forwarder addr="8.8.8.8"></forwarder>`, 323 ` <forwarder domain="example.com" addr="8.8.4.4"></forwarder>`, 324 ` <forwarder domain="www.example.com"></forwarder>`, 325 ` <txt name="example" value="example value"></txt>`, 326 ` <host ip="192.168.122.2">`, 327 ` <hostname>myhost</hostname>`, 328 ` <hostname>myhostalias</hostname>`, 329 ` </host>`, 330 ` <srv service="name" protocol="tcp" target="." port="1024" priority="10" weight="10" domain="test-domain-name"></srv>`, 331 ` </dns>`, 332 ` <vlan>`, 333 ` <tag id="49"></tag>`, 334 ` <tag id="52" nativeMode="tagged"></tag>`, 335 ` </vlan>`, 336 ` <bandwidth>`, 337 ` <inbound average="1000" peak="2000" burst="10000" floor="500"></inbound>`, 338 ` <outbound average="2000"></outbound>`, 339 ` </bandwidth>`, 340 ` <ip address="192.168.122.1" netmask="255.255.255.0">`, 341 ` <dhcp>`, 342 ` <range start="192.168.122.2" end="192.168.122.254"></range>`, 343 ` <host mac="00:16:3e:77:e2:ed" name="foo.example.com" ip="192.168.122.10"></host>`, 344 ` <bootp file="pxelinux.0" server="192.168.122.1"></bootp>`, 345 ` </dhcp>`, 346 ` <tftp root="/var/lib/tftp"></tftp>`, 347 ` </ip>`, 348 ` <ip address="2001:db8:ca2:2::1" family="ipv6" prefix="64">`, 349 ` <dhcp>`, 350 ` <host name="paul" ip="2001:db8:ca2:2:3::1"></host>`, 351 ` <host id="0:1:0:1:18:aa:62:fe:0:16:3e:44:55:66" ip="2001:db8:ca2:2:3::2"></host>`, 352 ` </dhcp>`, 353 ` </ip>`, 354 ` <route address="192.168.222.0" netmask="255.255.255.0" gateway="192.168.122.10"></route>`, 355 ` <route family="ipv6" address="2001:db8:ac10:fc00::" prefix="64" gateway="2001:db8:ac10:fd01::1:24"></route>`, 356 ` <virtualport type="openvswitch">`, 357 ` <parameters interfaceid="09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f"></parameters>`, 358 ` </virtualport>`, 359 `</network>`, 360 }, 361 }, 362 } 363 364 func TestNetwork(t *testing.T) { 365 for _, test := range networkTestData { 366 doc, err := test.Object.Marshal() 367 if err != nil { 368 t.Fatal(err) 369 } 370 371 expect := strings.Join(test.Expected, "\n") 372 373 if doc != expect { 374 t.Fatal("Bad xml:\n", string(doc), "\n does not match\n", expect, "\n") 375 } 376 } 377 }