gitee.com/zeroway/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  }