Files
wanyaoqi f0810bbe88 guest import from libvirt (#11)
* import servers from libvirt

* dep add libvirt-go-xml

* fix code

* fix code
2019-04-01 23:07:41 +08:00

539 lines
16 KiB
Go

/*
* This file is part of the libvirt-go-xml project
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* Copyright (C) 2017 Lian Duan <blazeblue@gmail.com>
*
*/
package libvirtxml
import (
"encoding/xml"
)
type NetworkBridge struct {
Name string `xml:"name,attr,omitempty"`
STP string `xml:"stp,attr,omitempty"`
Delay string `xml:"delay,attr,omitempty"`
MACTableManager string `xml:"macTableManager,attr,omitempty"`
Zone string `xml:"zone,attr,omitempty"`
}
type NetworkVirtualPort struct {
Params *NetworkVirtualPortParams `xml:"parameters"`
}
type NetworkVirtualPortParams struct {
Any *NetworkVirtualPortParamsAny `xml:"-"`
VEPA8021QBG *NetworkVirtualPortParamsVEPA8021QBG `xml:"-"`
VNTag8011QBH *NetworkVirtualPortParamsVNTag8021QBH `xml:"-"`
OpenVSwitch *NetworkVirtualPortParamsOpenVSwitch `xml:"-"`
MidoNet *NetworkVirtualPortParamsMidoNet `xml:"-"`
}
type NetworkVirtualPortParamsAny struct {
ManagerID *uint `xml:"managerid,attr"`
TypeID *uint `xml:"typeid,attr"`
TypeIDVersion *uint `xml:"typeidversion,attr"`
InstanceID string `xml:"instanceid,attr,omitempty"`
ProfileID string `xml:"profileid,attr,omitempty"`
InterfaceID string `xml:"interfaceid,attr,omitempty"`
}
type NetworkVirtualPortParamsVEPA8021QBG struct {
ManagerID *uint `xml:"managerid,attr"`
TypeID *uint `xml:"typeid,attr"`
TypeIDVersion *uint `xml:"typeidversion,attr"`
InstanceID string `xml:"instanceid,attr,omitempty"`
}
type NetworkVirtualPortParamsVNTag8021QBH struct {
ProfileID string `xml:"profileid,attr,omitempty"`
}
type NetworkVirtualPortParamsOpenVSwitch struct {
InterfaceID string `xml:"interfaceid,attr,omitempty"`
ProfileID string `xml:"profileid,attr,omitempty"`
}
type NetworkVirtualPortParamsMidoNet struct {
InterfaceID string `xml:"interfaceid,attr,omitempty"`
}
type NetworkDomain struct {
Name string `xml:"name,attr,omitempty"`
LocalOnly string `xml:"localOnly,attr,omitempty"`
}
type NetworkForwardNATAddress struct {
Start string `xml:"start,attr"`
End string `xml:"end,attr"`
}
type NetworkForwardNATPort struct {
Start uint `xml:"start,attr"`
End uint `xml:"end,attr"`
}
type NetworkForwardNAT struct {
Addresses []NetworkForwardNATAddress `xml:"address"`
Ports []NetworkForwardNATPort `xml:"port"`
}
type NetworkForward struct {
Mode string `xml:"mode,attr,omitempty"`
Dev string `xml:"dev,attr,omitempty"`
Managed string `xml:"managed,attr,omitempty"`
Driver *NetworkForwardDriver `xml:"driver"`
PFs []NetworkForwardPF `xml:"pf"`
NAT *NetworkForwardNAT `xml:"nat"`
Interfaces []NetworkForwardInterface `xml:"interface"`
Addresses []NetworkForwardAddress `xml:"address"`
}
type NetworkForwardDriver struct {
Name string `xml:"name,attr"`
}
type NetworkForwardPF struct {
Dev string `xml:"dev,attr"`
}
type NetworkForwardAddress struct {
PCI *NetworkForwardAddressPCI `xml:"-"`
}
type NetworkForwardAddressPCI struct {
Domain *uint `xml:"domain,attr"`
Bus *uint `xml:"bus,attr"`
Slot *uint `xml:"slot,attr"`
Function *uint `xml:"function,attr"`
}
type NetworkForwardInterface struct {
XMLName xml.Name `xml:"interface"`
Dev string `xml:"dev,attr,omitempty"`
}
type NetworkMAC struct {
Address string `xml:"address,attr,omitempty"`
}
type NetworkDHCPRange struct {
XMLName xml.Name `xml:"range"`
Start string `xml:"start,attr,omitempty"`
End string `xml:"end,attr,omitempty"`
}
type NetworkDHCPHost struct {
XMLName xml.Name `xml:"host"`
ID string `xml:"id,attr,omitempty"`
MAC string `xml:"mac,attr,omitempty"`
Name string `xml:"name,attr,omitempty"`
IP string `xml:"ip,attr,omitempty"`
}
type NetworkBootp struct {
File string `xml:"file,attr,omitempty"`
Server string `xml:"server,attr,omitempty"`
}
type NetworkDHCP struct {
Ranges []NetworkDHCPRange `xml:"range"`
Hosts []NetworkDHCPHost `xml:"host"`
Bootp []NetworkBootp `xml:"bootp"`
}
type NetworkIP struct {
Address string `xml:"address,attr,omitempty"`
Family string `xml:"family,attr,omitempty"`
Netmask string `xml:"netmask,attr,omitempty"`
Prefix uint `xml:"prefix,attr,omitempty"`
LocalPtr string `xml:"localPtr,attr,omitempty"`
DHCP *NetworkDHCP `xml:"dhcp"`
TFTP *NetworkTFTP `xml:"tftp"`
}
type NetworkTFTP struct {
Root string `xml:"root,attr,omitempty"`
}
type NetworkRoute struct {
Family string `xml:"family,attr,omitempty"`
Address string `xml:"address,attr,omitempty"`
Netmask string `xml:"netmask,attr,omitempty"`
Prefix uint `xml:"prefix,attr,omitempty"`
Gateway string `xml:"gateway,attr,omitempty"`
Metric string `xml:"metric,attr,omitempty"`
}
type NetworkDNSForwarder struct {
Domain string `xml:"domain,attr,omitempty"`
Addr string `xml:"addr,attr,omitempty"`
}
type NetworkDNSTXT struct {
XMLName xml.Name `xml:"txt"`
Name string `xml:"name,attr"`
Value string `xml:"value,attr"`
}
type NetworkDNSHostHostname struct {
Hostname string `xml:",chardata"`
}
type NetworkDNSHost struct {
XMLName xml.Name `xml:"host"`
IP string `xml:"ip,attr"`
Hostnames []NetworkDNSHostHostname `xml:"hostname"`
}
type NetworkDNSSRV struct {
XMLName xml.Name `xml:"srv"`
Service string `xml:"service,attr,omitempty"`
Protocol string `xml:"protocol,attr,omitempty"`
Target string `xml:"target,attr,omitempty"`
Port uint `xml:"port,attr,omitempty"`
Priority uint `xml:"priority,attr,omitempty"`
Weight uint `xml:"weight,attr,omitempty"`
Domain string `xml:"domain,attr,omitempty"`
}
type NetworkDNS struct {
Enable string `xml:"enable,attr,omitempty"`
ForwardPlainNames string `xml:"forwardPlainNames,attr,omitempty"`
Forwarders []NetworkDNSForwarder `xml:"forwarder"`
TXTs []NetworkDNSTXT `xml:"txt"`
Host []NetworkDNSHost `xml:"host"`
SRVs []NetworkDNSSRV `xml:"srv"`
}
type NetworkMetadata struct {
XML string `xml:",innerxml"`
}
type NetworkMTU struct {
Size uint `xml:"size,attr"`
}
type Network struct {
XMLName xml.Name `xml:"network"`
IPv6 string `xml:"ipv6,attr,omitempty"`
TrustGuestRxFilters string `xml:"trustGuestRxFilters,attr,omitempty"`
Name string `xml:"name,omitempty"`
UUID string `xml:"uuid,omitempty"`
Metadata *NetworkMetadata `xml:"metadata"`
Forward *NetworkForward `xml:"forward"`
Bridge *NetworkBridge `xml:"bridge"`
MTU *NetworkMTU `xml:"mtu"`
MAC *NetworkMAC `xml:"mac"`
Domain *NetworkDomain `xml:"domain"`
DNS *NetworkDNS `xml:"dns"`
VLAN *NetworkVLAN `xml:"vlan"`
Bandwidth *NetworkBandwidth `xml:"bandwidth"`
IPs []NetworkIP `xml:"ip"`
Routes []NetworkRoute `xml:"route"`
VirtualPort *NetworkVirtualPort `xml:"virtualport"`
PortGroups []NetworkPortGroup `xml:"portgroup"`
}
type NetworkPortGroup struct {
XMLName xml.Name `xml:"portgroup"`
Name string `xml:"name,attr,omitempty"`
Default string `xml:"default,attr,omitempty"`
TrustGuestRxFilters string `xml:"trustGuestRxFilters,attr,omitempty"`
VLAN *NetworkVLAN `xml:"vlan"`
VirtualPort *NetworkVirtualPort `xml:"virtualport"`
}
type NetworkVLAN struct {
Trunk string `xml:"trunk,attr,omitempty"`
Tags []NetworkVLANTag `xml:"tag"`
}
type NetworkVLANTag struct {
ID uint `xml:"id,attr"`
NativeMode string `xml:"nativeMode,attr,omitempty"`
}
type NetworkBandwidthParams struct {
Average *uint `xml:"average,attr"`
Peak *uint `xml:"peak,attr"`
Burst *uint `xml:"burst,attr"`
Floor *uint `xml:"floor,attr"`
}
type NetworkBandwidth struct {
Inbound *NetworkBandwidthParams `xml:"inbound"`
Outbound *NetworkBandwidthParams `xml:"outbound"`
}
func (a *NetworkVirtualPortParams) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
start.Name.Local = "parameters"
if a.Any != nil {
return e.EncodeElement(a.Any, start)
} else if a.VEPA8021QBG != nil {
return e.EncodeElement(a.VEPA8021QBG, start)
} else if a.VNTag8011QBH != nil {
return e.EncodeElement(a.VNTag8011QBH, start)
} else if a.OpenVSwitch != nil {
return e.EncodeElement(a.OpenVSwitch, start)
} else if a.MidoNet != nil {
return e.EncodeElement(a.MidoNet, start)
}
return nil
}
func (a *NetworkVirtualPortParams) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
if a.Any != nil {
return d.DecodeElement(a.Any, &start)
} else if a.VEPA8021QBG != nil {
return d.DecodeElement(a.VEPA8021QBG, &start)
} else if a.VNTag8011QBH != nil {
return d.DecodeElement(a.VNTag8011QBH, &start)
} else if a.OpenVSwitch != nil {
return d.DecodeElement(a.OpenVSwitch, &start)
} else if a.MidoNet != nil {
return d.DecodeElement(a.MidoNet, &start)
}
return nil
}
type networkVirtualPort NetworkVirtualPort
func (a *NetworkVirtualPort) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
start.Name.Local = "virtualport"
if a.Params != nil {
if a.Params.Any != nil {
/* no type attr wanted */
} else if a.Params.VEPA8021QBG != nil {
start.Attr = append(start.Attr, xml.Attr{
xml.Name{Local: "type"}, "802.1Qbg",
})
} else if a.Params.VNTag8011QBH != nil {
start.Attr = append(start.Attr, xml.Attr{
xml.Name{Local: "type"}, "802.1Qbh",
})
} else if a.Params.OpenVSwitch != nil {
start.Attr = append(start.Attr, xml.Attr{
xml.Name{Local: "type"}, "openvswitch",
})
} else if a.Params.MidoNet != nil {
start.Attr = append(start.Attr, xml.Attr{
xml.Name{Local: "type"}, "midonet",
})
}
}
vp := networkVirtualPort(*a)
return e.EncodeElement(&vp, start)
}
func (a *NetworkVirtualPort) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
typ, ok := getAttr(start.Attr, "type")
a.Params = &NetworkVirtualPortParams{}
if !ok {
var any NetworkVirtualPortParamsAny
a.Params.Any = &any
} else if typ == "802.1Qbg" {
var vepa NetworkVirtualPortParamsVEPA8021QBG
a.Params.VEPA8021QBG = &vepa
} else if typ == "802.1Qbh" {
var vntag NetworkVirtualPortParamsVNTag8021QBH
a.Params.VNTag8011QBH = &vntag
} else if typ == "openvswitch" {
var ovs NetworkVirtualPortParamsOpenVSwitch
a.Params.OpenVSwitch = &ovs
} else if typ == "midonet" {
var mido NetworkVirtualPortParamsMidoNet
a.Params.MidoNet = &mido
}
vp := networkVirtualPort(*a)
err := d.DecodeElement(&vp, &start)
if err != nil {
return err
}
*a = NetworkVirtualPort(vp)
return nil
}
func (a *NetworkForwardAddressPCI) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
marshalUintAttr(&start, "domain", a.Domain, "0x%04x")
marshalUintAttr(&start, "bus", a.Bus, "0x%02x")
marshalUintAttr(&start, "slot", a.Slot, "0x%02x")
marshalUintAttr(&start, "function", a.Function, "0x%x")
e.EncodeToken(start)
e.EncodeToken(start.End())
return nil
}
func (a *NetworkForwardAddressPCI) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
for _, attr := range start.Attr {
if attr.Name.Local == "domain" {
if err := unmarshalUintAttr(attr.Value, &a.Domain, 0); err != nil {
return err
}
} else if attr.Name.Local == "bus" {
if err := unmarshalUintAttr(attr.Value, &a.Bus, 0); err != nil {
return err
}
} else if attr.Name.Local == "slot" {
if err := unmarshalUintAttr(attr.Value, &a.Slot, 0); err != nil {
return err
}
} else if attr.Name.Local == "function" {
if err := unmarshalUintAttr(attr.Value, &a.Function, 0); err != nil {
return err
}
}
}
d.Skip()
return nil
}
func (a *NetworkForwardAddress) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if a.PCI != nil {
start.Attr = append(start.Attr, xml.Attr{
xml.Name{Local: "type"}, "pci",
})
return e.EncodeElement(a.PCI, start)
} else {
return nil
}
}
func (a *NetworkForwardAddress) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
var typ string
for _, attr := range start.Attr {
if attr.Name.Local == "type" {
typ = attr.Value
break
}
}
if typ == "" {
d.Skip()
return nil
}
if typ == "pci" {
a.PCI = &NetworkForwardAddressPCI{}
return d.DecodeElement(a.PCI, &start)
}
return nil
}
func (s *NetworkDHCPHost) Unmarshal(doc string) error {
return xml.Unmarshal([]byte(doc), s)
}
func (s *NetworkDHCPHost) Marshal() (string, error) {
doc, err := xml.MarshalIndent(s, "", " ")
if err != nil {
return "", err
}
return string(doc), nil
}
func (s *NetworkDNSHost) Unmarshal(doc string) error {
return xml.Unmarshal([]byte(doc), s)
}
func (s *NetworkDNSHost) Marshal() (string, error) {
doc, err := xml.MarshalIndent(s, "", " ")
if err != nil {
return "", err
}
return string(doc), nil
}
func (s *NetworkPortGroup) Unmarshal(doc string) error {
return xml.Unmarshal([]byte(doc), s)
}
func (s *NetworkPortGroup) Marshal() (string, error) {
doc, err := xml.MarshalIndent(s, "", " ")
if err != nil {
return "", err
}
return string(doc), nil
}
func (s *NetworkDNSTXT) Unmarshal(doc string) error {
return xml.Unmarshal([]byte(doc), s)
}
func (s *NetworkDNSTXT) Marshal() (string, error) {
doc, err := xml.MarshalIndent(s, "", " ")
if err != nil {
return "", err
}
return string(doc), nil
}
func (s *NetworkDNSSRV) Unmarshal(doc string) error {
return xml.Unmarshal([]byte(doc), s)
}
func (s *NetworkDNSSRV) Marshal() (string, error) {
doc, err := xml.MarshalIndent(s, "", " ")
if err != nil {
return "", err
}
return string(doc), nil
}
func (s *NetworkDHCPRange) Unmarshal(doc string) error {
return xml.Unmarshal([]byte(doc), s)
}
func (s *NetworkDHCPRange) Marshal() (string, error) {
doc, err := xml.MarshalIndent(s, "", " ")
if err != nil {
return "", err
}
return string(doc), nil
}
func (s *NetworkForwardInterface) Unmarshal(doc string) error {
return xml.Unmarshal([]byte(doc), s)
}
func (s *NetworkForwardInterface) Marshal() (string, error) {
doc, err := xml.MarshalIndent(s, "", " ")
if err != nil {
return "", err
}
return string(doc), nil
}
func (s *Network) Unmarshal(doc string) error {
return xml.Unmarshal([]byte(doc), s)
}
func (s *Network) Marshal() (string, error) {
doc, err := xml.MarshalIndent(s, "", " ")
if err != nil {
return "", err
}
return string(doc), nil
}