mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-27 07:48:55 +00:00
govmm: Optionally pass QMP listener to QEMU
QEMU's -qmp option can be passed the file descriptor of a socket that is already in listening mode. This is done with by passing `fd=XXX` to `-qmp` instead of a path. Note that these two options are mutually exclusive : QEMU errors out if both are passed, so we check that as well in the validation function. While here add the `path=` stanza in the path based case for clarity. Signed-off-by: Greg Kurz <groug@kaod.org>
This commit is contained in:
parent
219bb8e7d0
commit
8a4f08cb0f
@ -2340,6 +2340,9 @@ type QMPSocket struct {
|
|||||||
// Type is the socket type (e.g. "unix").
|
// Type is the socket type (e.g. "unix").
|
||||||
Type QMPSocketType
|
Type QMPSocketType
|
||||||
|
|
||||||
|
// QMP listener file descriptor to be passed to qemu
|
||||||
|
FD *os.File
|
||||||
|
|
||||||
// Name is the socket name.
|
// Name is the socket name.
|
||||||
Name string
|
Name string
|
||||||
|
|
||||||
@ -2352,7 +2355,8 @@ type QMPSocket struct {
|
|||||||
|
|
||||||
// Valid returns true if the QMPSocket structure is valid and complete.
|
// Valid returns true if the QMPSocket structure is valid and complete.
|
||||||
func (qmp QMPSocket) Valid() bool {
|
func (qmp QMPSocket) Valid() bool {
|
||||||
if qmp.Type == "" || qmp.Name == "" {
|
// Exactly one of Name of FD must be set.
|
||||||
|
if qmp.Type == "" || (qmp.Name == "") == (qmp.FD == nil) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2692,7 +2696,13 @@ func (config *Config) appendQMPSockets() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
qmpParams := append([]string{}, fmt.Sprintf("%s:%s", q.Type, q.Name))
|
var qmpParams []string
|
||||||
|
if q.FD != nil {
|
||||||
|
qemuFDs := config.appendFDs([]*os.File{q.FD})
|
||||||
|
qmpParams = append([]string{}, fmt.Sprintf("%s:fd=%d", q.Type, qemuFDs[0]))
|
||||||
|
} else {
|
||||||
|
qmpParams = append([]string{}, fmt.Sprintf("%s:path=%s", q.Type, q.Name))
|
||||||
|
}
|
||||||
if q.Server {
|
if q.Server {
|
||||||
qmpParams = append(qmpParams, "server=on")
|
qmpParams = append(qmpParams, "server=on")
|
||||||
if q.NoWait {
|
if q.NoWait {
|
||||||
|
@ -698,8 +698,8 @@ func TestFailToAppendCPUs(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var qmpSingleSocketServerString = "-qmp unix:cc-qmp,server=on,wait=off"
|
var qmpSingleSocketServerString = "-qmp unix:path=cc-qmp,server=on,wait=off"
|
||||||
var qmpSingleSocketString = "-qmp unix:cc-qmp"
|
var qmpSingleSocketString = "-qmp unix:path=cc-qmp"
|
||||||
|
|
||||||
func TestAppendSingleQMPSocketServer(t *testing.T) {
|
func TestAppendSingleQMPSocketServer(t *testing.T) {
|
||||||
qmp := QMPSocket{
|
qmp := QMPSocket{
|
||||||
@ -722,7 +722,27 @@ func TestAppendSingleQMPSocket(t *testing.T) {
|
|||||||
testAppend(qmp, qmpSingleSocketString, t)
|
testAppend(qmp, qmpSingleSocketString, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
var qmpSocketServerString = "-qmp unix:cc-qmp-1,server=on,wait=off -qmp unix:cc-qmp-2,server=on,wait=off"
|
var qmpSocketServerFdString = "-qmp unix:fd=3,server=on,wait=off"
|
||||||
|
|
||||||
|
func TestAppendQMPSocketServerFd(t *testing.T) {
|
||||||
|
foo, _ := os.CreateTemp(os.TempDir(), "govmm-qemu-test")
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
_ = foo.Close()
|
||||||
|
_ = os.Remove(foo.Name())
|
||||||
|
}()
|
||||||
|
|
||||||
|
qmp := QMPSocket{
|
||||||
|
Type: "unix",
|
||||||
|
FD: foo,
|
||||||
|
Server: true,
|
||||||
|
NoWait: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
testAppend(qmp, qmpSocketServerFdString, t)
|
||||||
|
}
|
||||||
|
|
||||||
|
var qmpSocketServerString = "-qmp unix:path=cc-qmp-1,server=on,wait=off -qmp unix:path=cc-qmp-2,server=on,wait=off"
|
||||||
|
|
||||||
func TestAppendQMPSocketServer(t *testing.T) {
|
func TestAppendQMPSocketServer(t *testing.T) {
|
||||||
qmp := []QMPSocket{
|
qmp := []QMPSocket{
|
||||||
|
Loading…
Reference in New Issue
Block a user