domain.go | 34 +++++++++++++++++++++++ domain_test.go | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+)
Add support for device RNG (random number generator), and add test code.
Signed-off-by: Thomas Hipp <thipp@suse.de>
---
domain.go | 34 +++++++++++++++++++++++
domain_test.go | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 119 insertions(+)
diff --git a/domain.go b/domain.go
index f9e3a80..b4f56bf 100644
--- a/domain.go
+++ b/domain.go
@@ -184,6 +184,8 @@ type DomainInterfaceSource struct {
Path string `xml:"path,attr,omitempty"`
Mode string `xml:"mode,attr,omitempty"`
Port uint `xml:"port,attr,omitempty"`
+ Service string `xml:"service,attr,omitempty"`
+ Host string `xml:"host,attr,omitempty"`
}
type DomainInterfaceTarget struct {
@@ -384,6 +386,25 @@ type DomainSound struct {
Address *DomainAddress `xml:"address"`
}
+type DomainRNGRate struct {
+ Bytes uint `xml:"bytes,attr"`
+ Period uint `xml:"period,attr,omitempty"`
+}
+
+type DomainRNGBackend struct {
+ Backend string `xml:",chardata"`
+ Model string `xml:"model,attr"`
+ Type string `xml:"type,attr,omitempty"`
+ Sources []DomainInterfaceSource `xml:"source"`
+}
+
+type DomainRNG struct {
+ XMLName xml.Name `xml:"rng"`
+ Model string `xml:"model,attr"`
+ Rate *DomainRNGRate `xml:"rate"`
+ Backend *DomainRNGBackend `xml:"backend"`
+}
+
type DomainDeviceList struct {
Emulator string `xml:"emulator,omitempty"`
Controllers []DomainController `xml:"controller"`
@@ -398,6 +419,7 @@ type DomainDeviceList struct {
Channels []DomainChannel `xml:"channel"`
MemBalloon *DomainMemBalloon `xml:"memballoon"`
Sounds []DomainSound `xml:"sound"`
+ RNGs []DomainRNG `xml:"rng"`
}
type DomainMemory struct {
@@ -734,3 +756,15 @@ func (d *DomainSound) Marshal() (string, error) {
}
return string(doc), nil
}
+
+func (d *DomainRNG) Unmarshal(doc string) error {
+ return xml.Unmarshal([]byte(doc), d)
+}
+
+func (d *DomainRNG) Marshal() (string, error) {
+ doc, err := xml.MarshalIndent(d, "", " ")
+ if err != nil {
+ return "", err
+ }
+ return string(doc), nil
+}
diff --git a/domain_test.go b/domain_test.go
index 0ce908b..aac23fe 100644
--- a/domain_test.go
+++ b/domain_test.go
@@ -333,6 +333,30 @@ var domainTestData = []struct {
},
},
},
+ RNGs: []DomainRNG{
+ DomainRNG{
+ Model: "virtio",
+ Rate: &DomainRNGRate{
+ Period: 2000,
+ Bytes: 1234,
+ },
+ Backend: &DomainRNGBackend{
+ Model: "egd",
+ Type: "udp",
+ Sources: []DomainInterfaceSource{
+ DomainInterfaceSource{
+ Mode: "bind",
+ Service: "1234",
+ },
+ DomainInterfaceSource{
+ Mode: "connect",
+ Host: "1.2.3.4",
+ Service: "1234",
+ },
+ },
+ },
+ },
+ },
},
},
Expected: []string{
@@ -368,6 +392,13 @@ var domainTestData = []struct {
` <codec type="duplex"></codec>`,
` <address type="pci" domain="0" bus="0" slot="8" function="0"></address>`,
` </sound>`,
+ ` <rng model="virtio">`,
+ ` <rate bytes="1234" period="2000"></rate>`,
+ ` <backend model="egd" type="udp">`,
+ ` <source mode="bind" service="1234"></source>`,
+ ` <source mode="connect" service="1234" host="1.2.3.4"></source>`,
+ ` </backend>`,
+ ` </rng>`,
` </devices>`,
`</domain>`,
},
@@ -1334,6 +1365,60 @@ var domainTestData = []struct {
`</sound>`,
},
},
+ {
+ Object: &DomainRNG{
+ Model: "virtio",
+ Rate: &DomainRNGRate{
+ Period: 2000,
+ Bytes: 1234,
+ },
+ Backend: &DomainRNGBackend{
+ Backend: "/dev/random",
+ Model: "random",
+ },
+ },
+
+ Expected: []string{
+ `<rng model="virtio">`,
+ ` <rate bytes="1234" period="2000"></rate>`,
+ ` <backend model="random">/dev/random</backend>`,
+ `</rng>`,
+ },
+ },
+ {
+ Object: &DomainRNG{
+ Model: "virtio",
+ Rate: &DomainRNGRate{
+ Period: 2000,
+ Bytes: 1234,
+ },
+ Backend: &DomainRNGBackend{
+ Model: "egd",
+ Type: "udp",
+ Sources: []DomainInterfaceSource{
+ DomainInterfaceSource{
+ Mode: "bind",
+ Service: "1234",
+ },
+ DomainInterfaceSource{
+ Mode: "connect",
+ Host: "1.2.3.4",
+ Service: "1234",
+ },
+ },
+ },
+ },
+
+ Expected: []string{
+ `<rng model="virtio">`,
+ ` <rate bytes="1234" period="2000"></rate>`,
+ ` <backend model="egd" type="udp">`,
+ ` <source mode="bind" service="1234"></source>`,
+ ` <source mode="connect" service="1234" host="1.2.3.4"></source>`,
+ ` </backend>`,
+ `</rng>`,
+ },
+ },
}
func TestDomain(t *testing.T) {
--
2.13.2
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Tue, Jul 04, 2017 at 10:16:07AM +0200, Thomas Hipp wrote: > Add support for device RNG (random number generator), and add test code. > > Signed-off-by: Thomas Hipp <thipp@suse.de> > --- > domain.go | 34 +++++++++++++++++++++++ > domain_test.go | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 119 insertions(+) > > diff --git a/domain.go b/domain.go > index f9e3a80..b4f56bf 100644 > --- a/domain.go > +++ b/domain.go > @@ -184,6 +184,8 @@ type DomainInterfaceSource struct { > Path string `xml:"path,attr,omitempty"` > Mode string `xml:"mode,attr,omitempty"` > Port uint `xml:"port,attr,omitempty"` > + Service string `xml:"service,attr,omitempty"` > + Host string `xml:"host,attr,omitempty"` > } > > type DomainInterfaceTarget struct { > @@ -384,6 +386,25 @@ type DomainSound struct { > Address *DomainAddress `xml:"address"` > } > > +type DomainRNGRate struct { > + Bytes uint `xml:"bytes,attr"` > + Period uint `xml:"period,attr,omitempty"` > +} > + > +type DomainRNGBackend struct { > + Backend string `xml:",chardata"` Nitpick, I'll rename this to 'Device' to make it more obvious what it is. > + Model string `xml:"model,attr"` > + Type string `xml:"type,attr,omitempty"` > + Sources []DomainInterfaceSource `xml:"source"` > +} > + > +type DomainRNG struct { > + XMLName xml.Name `xml:"rng"` > + Model string `xml:"model,attr"` > + Rate *DomainRNGRate `xml:"rate"` > + Backend *DomainRNGBackend `xml:"backend"` > +} > + > type DomainDeviceList struct { > Emulator string `xml:"emulator,omitempty"` > Controllers []DomainController `xml:"controller"` > @@ -398,6 +419,7 @@ type DomainDeviceList struct { > Channels []DomainChannel `xml:"channel"` > MemBalloon *DomainMemBalloon `xml:"memballoon"` > Sounds []DomainSound `xml:"sound"` > + RNGs []DomainRNG `xml:"rng"` > } > > type DomainMemory struct { > @@ -734,3 +756,15 @@ func (d *DomainSound) Marshal() (string, error) { > } > return string(doc), nil > } > + > +func (d *DomainRNG) Unmarshal(doc string) error { > + return xml.Unmarshal([]byte(doc), d) > +} > + > +func (d *DomainRNG) Marshal() (string, error) { > + doc, err := xml.MarshalIndent(d, "", " ") > + if err != nil { > + return "", err > + } > + return string(doc), nil > +} > diff --git a/domain_test.go b/domain_test.go > index 0ce908b..aac23fe 100644 > --- a/domain_test.go > +++ b/domain_test.go > @@ -333,6 +333,30 @@ var domainTestData = []struct { > }, > }, > }, > + RNGs: []DomainRNG{ > + DomainRNG{ > + Model: "virtio", > + Rate: &DomainRNGRate{ > + Period: 2000, > + Bytes: 1234, > + }, > + Backend: &DomainRNGBackend{ > + Model: "egd", > + Type: "udp", > + Sources: []DomainInterfaceSource{ > + DomainInterfaceSource{ > + Mode: "bind", > + Service: "1234", > + }, > + DomainInterfaceSource{ > + Mode: "connect", > + Host: "1.2.3.4", > + Service: "1234", > + }, > + }, > + }, > + }, > + }, > }, > }, > Expected: []string{ > @@ -368,6 +392,13 @@ var domainTestData = []struct { > ` <codec type="duplex"></codec>`, > ` <address type="pci" domain="0" bus="0" slot="8" function="0"></address>`, > ` </sound>`, > + ` <rng model="virtio">`, > + ` <rate bytes="1234" period="2000"></rate>`, > + ` <backend model="egd" type="udp">`, > + ` <source mode="bind" service="1234"></source>`, > + ` <source mode="connect" service="1234" host="1.2.3.4"></source>`, > + ` </backend>`, > + ` </rng>`, > ` </devices>`, > `</domain>`, > }, > @@ -1334,6 +1365,60 @@ var domainTestData = []struct { > `</sound>`, > }, > }, > + { > + Object: &DomainRNG{ > + Model: "virtio", > + Rate: &DomainRNGRate{ > + Period: 2000, > + Bytes: 1234, > + }, > + Backend: &DomainRNGBackend{ > + Backend: "/dev/random", > + Model: "random", > + }, > + }, > + > + Expected: []string{ > + `<rng model="virtio">`, > + ` <rate bytes="1234" period="2000"></rate>`, > + ` <backend model="random">/dev/random</backend>`, > + `</rng>`, > + }, > + }, > + { > + Object: &DomainRNG{ > + Model: "virtio", > + Rate: &DomainRNGRate{ > + Period: 2000, > + Bytes: 1234, > + }, > + Backend: &DomainRNGBackend{ > + Model: "egd", > + Type: "udp", > + Sources: []DomainInterfaceSource{ > + DomainInterfaceSource{ > + Mode: "bind", > + Service: "1234", > + }, > + DomainInterfaceSource{ > + Mode: "connect", > + Host: "1.2.3.4", > + Service: "1234", > + }, > + }, > + }, > + }, > + > + Expected: []string{ > + `<rng model="virtio">`, > + ` <rate bytes="1234" period="2000"></rate>`, > + ` <backend model="egd" type="udp">`, > + ` <source mode="bind" service="1234"></source>`, > + ` <source mode="connect" service="1234" host="1.2.3.4"></source>`, > + ` </backend>`, > + `</rng>`, > + }, > + }, > } Reviewed-by: Daniel P. Berrange <berrange@redhat.com> THanks, I'll merge this Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2025 Red Hat, Inc.