qmp: add query-status API

So that caller can find out guest status via qmp.

Signed-off-by: Peng Tao <bergwolf@hyper.sh>
This commit is contained in:
Peng Tao 2019-08-13 02:06:46 -07:00
parent 234e0edfd7
commit 73555a409c
2 changed files with 54 additions and 0 deletions

View File

@ -251,6 +251,13 @@ type SchemaInfo struct {
Name string `json:"name"`
}
// StatusInfo represents guest running status
type StatusInfo struct {
Running bool `json:"running"`
SingleStep bool `json:"singlestep"`
Status string `json:"status"`
}
func (q *QMP) readLoop(fromVMCh chan<- []byte) {
scanner := bufio.NewScanner(q.conn)
if q.cfg.MaxCapacity > 0 {
@ -1545,3 +1552,23 @@ func (q *QMP) ExecQueryQmpSchema(ctx context.Context) ([]SchemaInfo, error) {
return schemaInfo, nil
}
// ExecuteQueryStatus queries guest status
func (q *QMP) ExecuteQueryStatus(ctx context.Context) (StatusInfo, error) {
response, err := q.executeCommandWithResponse(ctx, "query-status", nil, nil, nil)
if err != nil {
return StatusInfo{}, err
}
data, err := json.Marshal(response)
if err != nil {
return StatusInfo{}, fmt.Errorf("unable to extract migrate status information: %v", err)
}
var status StatusInfo
if err = json.Unmarshal(data, &status); err != nil {
return StatusInfo{}, fmt.Errorf("unable to convert migrate status information: %v", err)
}
return status, nil
}

View File

@ -1623,3 +1623,30 @@ func TestQMPExecQueryQmpSchema(t *testing.T) {
q.Shutdown()
<-disconnectedCh
}
func TestQMPExecQueryQmpStatus(t *testing.T) {
connectedCh := make(chan *QMPVersion)
disconnectedCh := make(chan struct{})
buf := newQMPTestCommandBuffer(t)
statusInfo := StatusInfo{
Running: true,
SingleStep: false,
Status: "running",
}
buf.AddCommand("query-status", nil, "return", statusInfo)
cfg := QMPConfig{
Logger: qmpTestLogger{},
MaxCapacity: 1024,
}
q := startQMPLoop(buf, cfg, connectedCh, disconnectedCh)
checkVersion(t, connectedCh)
info, err := q.ExecuteQueryStatus(context.Background())
if err != nil {
t.Fatalf("Unexpected error: %v\n", err)
}
if reflect.DeepEqual(info, statusInfo) == false {
t.Fatalf("Expected %v equals to %v\n", info, statusInfo)
}
q.Shutdown()
<-disconnectedCh
}