8d842645b3 | ||
---|---|---|
.. | ||
README.md | ||
qmp.go | ||
rpc.go | ||
socket.go |
README.md
QMP
Package qmp
enables interaction with QEMU instances via the QEMU Machine Protocol (QMP).
Available Drivers
Libvirt
If your environment is managed by Libvirt, QMP interaction must be proxied through the Libvirt daemon. This can be be done through two available drivers:
RPC
The RPC driver provides a pure Go implementation of Libvirt's RPC protocol.
//conn, err := net.DialTimeout("unix", "/var/run/libvirt/libvirt-sock", 2*time.Second)
conn, err := net.DialTimeout("tcp", "192.168.1.1:16509", 2*time.Second)
monitor := libvirtrpc.New("stage-lb-1", conn)
virsh
A connection to the monitor socket is provided by proxing requests through the virsh
executable.
monitor, err := qmp.NewLibvirtMonitor("qemu:///system", "stage-lb-1")
Socket
If your QEMU instances are not managed by libvirt, direct communication over its UNIX socket is available.
monitor, err := qmp.NewSocketMonitor("unix", "/var/lib/qemu/example.monitor", 2*time.Second)
Examples
Using the above to establish a new qmp.Monitor
, the following examples provide a brief overview of QMP usage.
error checking omitted for the sake of brevity.
Command Execution
type StatusResult struct {
ID string `json:"id"`
Return struct {
Running bool `json:"running"`
Singlestep bool `json:"singlestep"`
Status string `json:"status"`
} `json:"return"`
}
monitor.Connect()
defer monitor.Disconnect()
cmd := []byte(`{ "execute": "query-status" }`)
raw, _ := monitor.Run(cmd)
var result StatusResult
json.Unmarshal(raw, &result)
fmt.Println(result.Return.Status)
running
Event Monitor
monitor.Connect()
defer monitor.Disconnect()
stream, _ := monitor.Events()
for e := range stream {
log.Printf("EVENT: %s", e.Event)
}
$ virsh reboot example
Domain example is being rebooted
EVENT: POWERDOWN
EVENT: SHUTDOWN
EVENT: STOP
EVENT: RESET
EVENT: RESUME
EVENT: RESET
...