[libvirt] [PATCH go-xml] Add support for Node Device with basic testing.
--- node_device.go | 277 node_device_test.go | 111 + 2 files changed, 388 insertions(+) create mode 100644 node_device.go create mode 100644 node_device_test.go diff --git a/node_device.go b/node_device.go new file mode 100644 index 000..5375d32 --- /dev/null +++ b/node_device.go @@ -0,0 +1,277 @@ +/* + * 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 Red Hat, Inc. + * + */ + +package libvirtxml + +import ( + "encoding/xml" + "fmt" +) + +type NodeDevice struct { + Name string `xml:"name"` + Path string `xml:"path,omitempty"` + Parent string `xml:"parent,omitempty"` + Driver string `xml:"driver>name,omitempty"` + Capability *CapabilityType `xml:"capability"` +} + +type CapabilityType struct { + Type interface{} `xml:"type,attr"` +} + +type IDName struct { + ID string `xml:"id,attr"` + Name string `xml:",chardata"` +} + +type PciExpress struct { + Links []PciExpressLink `xml:"link"` +} + +type PciExpressLink struct { + Validity string `xml:"validity,attr,omitempty"` + Speedfloat64 `xml:"speed,attr,omitempty"` + Port int `xml:"port,attr,omitempty"` + Widthint `xml:"width,attr,omitempty"` +} + +type IOMMUGroupType struct { + Number int `xml:"number,attr"` +} + +type NUMA struct { + Node int `xml:"node,attr"` +} + +type PciCapabilityType struct { + Domain int `xml:"domain,omitempty"` + Bus int `xml:"bus,omitempty"` + Slot int `xml:"slot,omitempty"` + Function int `xml:"function,omitempty"` + Product IDName `xml:"product,omitempty"` + Vendor IDName `xml:"vendor,omitempty"` + IommuGroup IOMMUGroupType `xml:"iommuGroup,omitempty"` + Numa NUMA`xml:"numa,omitempty"` + PciExpress PciExpress `xml:"pci-express,omitempty"` + Capabilities []PciCapability `xml:"capability,omitempty"` +} + +type PCIAddress struct { + Domain string `xml:"domain,attr"` + Bus string `xml:"bus,attr"` + Slot string `xml:"slot,attr"` + Function string `xml:"function,attr"` +} + +type PciCapability struct { + Type string `xml:"type,attr"` + Address []PCIAddress `xml:"address,omitempty"` + MaxCount int `xml:"maxCount,attr,omitempty"` +} + +type SystemHardware struct { + Vendor string `xml:"vendor"` + Version string `xml:"version"` + Serial string `xml:"serial"` + UUIDstring `xml:"uuid"` +} + +type SystemFirmware struct { + Vendor string `xml:"vendor"` + Version string `xml:"version"` + ReleaseData string `xml:"release_date"` +} + +type SystemCapabilityType struct { + Product string `xml:"product"` + Hardware SystemHardware `xml:"hardware"` + Firmware SystemFirmware `xml:"firmware"` +} + +type USBDeviceCapabilityType struct { + Bus int`xml:"bus"` + Device int`xml:"device"` + Product IDName `xml:"product,omitempty"` + Vendor IDName `xml:"vendor,omitempty"` +} + +type USBCapabilityType struct { + Number int`xml:"number"` + Class int`xml:"class"` + Subclassint`xml:"subclass"` + Protocolint`xml:"protocol"` + Description string `xml:"description,omitempty"` +} + +type NetOffloadFeatures struct { + Name string `xml:"number"` +} + +type NetLink struct { + State string `xml:"state,attr"` + Speed string `xml:"speed,attr,omitempty"` +} + +type NetCapability struct { + Type string `xml:"type,attr"` +} + +type NetCapabilityTyp
Re: [libvirt] [PATCH go-xml] Add support for Node Device with basic testing.
Thanks for the review. On Tue, May 30, 2017 at 8:46 AM, Daniel P. Berrange wrote: > On Mon, May 29, 2017 at 03:58:52AM -0400, Vladik Romanovsky wrote: >> --- >> node_device.go | 277 >> >> node_device_test.go | 111 + >> 2 files changed, 388 insertions(+) >> create mode 100644 node_device.go >> create mode 100644 node_device_test.go >> >> diff --git a/node_device.go b/node_device.go >> new file mode 100644 >> index 000..5375d32 >> --- /dev/null >> +++ b/node_device.go >> @@ -0,0 +1,277 @@ >> +/* >> + * 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 Red Hat, Inc. >> + * >> + */ >> + >> +package libvirtxml >> + >> +import ( >> + "encoding/xml" >> + "fmt" >> +) >> + >> +type NodeDevice struct { >> + Name string `xml:"name"` >> + Path string `xml:"path,omitempty"` >> + Parent string `xml:"parent,omitempty"` >> + Driver string `xml:"driver>name,omitempty"` >> + Capability *CapabilityType `xml:"capability"` >> +} > > A single device can have multiple capabilities. Do you mean it should be: Capability []CapabilityType `xml:"capability"` ? > >> + >> +type CapabilityType struct { >> + Type interface{} `xml:"type,attr"` >> +} > > I'm not convinced about this approach - it differs from what we've > done in other schemas, where we just have a single struct containing > the union of data from all types. The user has no idea what they > should be providing for 'Type' here since its a generic interface > type. > Yes. I wasn't sure about this either. Originally, I wanted to avoid the Type attribute and make CapabilityType to be an interface type. However, I figured that it's not possible to write an UnmarshalXML for an interface type. The reason I didn't use the same approach as in the rest of the schemas is because the Capability determins it's type by a XML attribute and not an element name. I didn't find an easy way to query the xml attribue as something like.. `xml:"type=something,attr"` OK, I'll try a ddiffernt approach. >> >> +type IDName struct { >> + ID string `xml:"id,attr"` >> + Name string `xml:",chardata"` >> +} >> + >> +type PciExpress struct { >> + Links []PciExpressLink `xml:"link"` >> +} >> + >> +type PciExpressLink struct { >> + Validity string `xml:"validity,attr,omitempty"` >> + Speedfloat64 `xml:"speed,attr,omitempty"` >> + Port int `xml:"port,attr,omitempty"` >> + Widthint `xml:"width,attr,omitempty"` >> +} >> + >> +type IOMMUGroupType struct { >> + Number int `xml:"number,attr"` >> +} >> + >> +type NUMA struct { >> + Node int `xml:"node,attr"` >> +} >> + >> +type PciCapabilityType struct { >> + Domain int `xml:"domain,omitempty"` >> + Bus int `xml:"bus,omitempty"` >
[libvirt] [PATCH go-xml] Add support for Node Device with basic testing.
--- node_device.go | 168 node_device_test.go | 128 +++ 2 files changed, 296 insertions(+) create mode 100644 node_device.go create mode 100644 node_device_test.go diff --git a/node_device.go b/node_device.go new file mode 100644 index 000..d7850e9 --- /dev/null +++ b/node_device.go @@ -0,0 +1,168 @@ +/* + * 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 Red Hat, Inc. + * + */ + +package libvirtxml + +import ( + "encoding/xml" +) + +type NodeDevice struct { + Name string `xml:"name"` + Path string `xml:"path,omitempty"` + Parent string `xml:"parent,omitempty"` + Driver string `xml:"driver>name,omitempty"` + Capability []NodeDeviceCapability `xml:"capability"` +} + +type NodeDeviceCapability struct { + Domain int`xml:"domain,omitempty"` + Bus int`xml:"bus,omitempty"` + Slotint`xml:"slot,omitempty"` + Functionint`xml:"function,omitempty"` + IommuGroup *NodeDeviceIOMMUGroup `xml:"iommuGroup,omitempty"` + Numa*NodeDeviceNUMA`xml:"numa,omitempty"` + PciExpress *NodeDevicePciExpress `xml:"pci-express,omitempty"` + Hardware*NodeDeviceSystemHardware `xml:"hardware"` + Firmware*NodeDeviceSystemFirmware `xml:"firmware"` + Device int`xml:"device"` + Number int`xml:"number"` + Class int`xml:"class"` + Subclassint`xml:"subclass"` + Protocolint`xml:"protocol"` + Description string `xml:"description,omitempty"` + Interface string `xml:"interface"` + Address string `xml:"address"` + Link*NodeDeviceNetLink `xml:"link"` + Features[]NodeDeviceNetOffloadFeatures `xml:"feature,omitempty"` + UniqueIDint`xml:"unique_id"` + Target int`xml:"target"` + Lun int`xml:"lun"` + Block string `xml:"block"` + DriverType string `xml:"drive_type"` + Model string `xml:"model"` + Serial string `xml:"serial"` + Sizeint`xml:"size"` + Hostint`xml:"host"` + Typestring `xml:"type"` + Product *NodeDeviceProduct `xml:"product,omitempty"` + Vendor *NodeDeviceVendor `xml:"vendor,omitempty"` + Capability []NodeDeviceNestedCapabilities `xml:"capability,omitempty"` +} + +type NodeDeviceVendor struct { + ID string `xml:"id,attr,omitempty"` + Name string `xml:",chardata"` +} +type NodeDeviceProduct struct { + ID string `xml:"id,attr,omitempty"` + Name string `xml:",chardata"` +} + +type NodeDeviceNestedCapabilities struct { + Type string `xml:"type,attr"` + Address[]NodeDevicePCIAddress `xml:"address,omitempty"` + MaxCount int `xml:"maxCount,attr,omitempty"` + VportsOPS *NodeDeviceSCSIVportsOPS `xml:"vports_ops,omitempty"` + FCHost *NodeDeviceSCSIFCHost`xml:"fc_host,omitempty"` + MediaAvailable int
[libvirt] [PATCH go-xml] Add support for Node Device with basic testing.
--- node_device.go | 310 +++ node_device_test.go | 337 2 files changed, 647 insertions(+) create mode 100644 node_device.go create mode 100644 node_device_test.go diff --git a/node_device.go b/node_device.go new file mode 100644 index 000..cc40451 --- /dev/null +++ b/node_device.go @@ -0,0 +1,310 @@ +/* + * 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 Red Hat, Inc. + * + */ + +package libvirtxml + +import ( + "encoding/xml" +) + +type NodeDevice struct { + Name string `xml:"name"` + Path string `xml:"path,omitempty"` + Parent string `xml:"parent,omitempty"` + Driver string `xml:"driver>name,omitempty"` + Capability interface{} `xml:"capability"` +} + +type NodeDeviceVendor struct { + ID string `xml:"id,attr,omitempty"` + Namestring `xml:",chardata"` +} +type NodeDeviceProduct struct { + ID string `xml:"id,attr,omitempty"` + Namestring `xml:",chardata"` +} + +type NodeDevicePciExpress struct { + Links []NodeDevicePciExpressLink`xml:"link"` +} + +type NodeDevicePciExpressLink struct { + Validitystring `xml:"validity,attr,omitempty"` + Speed float64 `xml:"speed,attr,omitempty"` + Portint `xml:"port,attr,omitempty"` + Width int `xml:"width,attr,omitempty"` +} + +type NodeDeviceIOMMUGroup struct { + Number int `xml:"number,attr"` +} + +type NodeDeviceNUMA struct { + Nodeint `xml:"node,attr"` +} + +type NodeDevicePCIAddress struct { + Domain string `xml:"domain,attr"` + Bus string `xml:"bus,attr"` + Slotstring `xml:"slot,attr"` + Functionstring `xml:"function,attr"` +} + +type NodeDeviceSystemHardware struct { + Vendor string `xml:"vendor"` + Version string `xml:"version"` + Serial string `xml:"serial"` + UUIDstring `xml:"uuid"` +} + +type NodeDeviceSystemFirmware struct { + Vendor string `xml:"vendor"` + Version string `xml:"version"` + ReleaseDate string `xml:"release_date"` +} + +type NodeDeviceNetOffloadFeatures struct { + Namestring `xml:"name,attr"` +} + +type NodeDeviceNetLink struct { + State string `xml:"state,attr"` + Speed string `xml:"speed,attr,omitempty"` +} + +type NodeDevicePciCapability struct { + Domain int `xml:"domain,omitempty"` + Bus int `xml:"bus,omitempty"` + Slotint `xml:"slot,omitempty"` + Functionint `xml:"function,omitempty"` + Product *NodeDeviceProduct `xml:"product,omitempty"` + Vendor *NodeDeviceVendor `xml:"vendor,omitempty"` + IommuGroup *NodeDeviceIOMMUGroup `xml:"iommuGroup,omitempty"` + Numa*NodeDeviceNUMA `xml:"numa,omitempty"` + PciExpress *NodeDevicePciExpress `xml:"pci-express,omitempty"` + Capability []NodeDeviceNestedPciCapability `xml:"capability,omitempty"` +} + +type NodeDeviceNestedPciCapability struct { + Typestring `xml:"type,attr"` + Address []NodeDevicePCIAddress `xml:"address,omitempty"` + MaxCountint `xml:"maxCount,attr,omitempty"` +} + +type NodeDeviceSystemCapability struct { + Product string `xml:"product"` + Hardware*Nod