mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-29 08:47:56 +00:00
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:
parent
234e0edfd7
commit
73555a409c
27
qemu/qmp.go
27
qemu/qmp.go
@ -251,6 +251,13 @@ type SchemaInfo struct {
|
|||||||
Name string `json:"name"`
|
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) {
|
func (q *QMP) readLoop(fromVMCh chan<- []byte) {
|
||||||
scanner := bufio.NewScanner(q.conn)
|
scanner := bufio.NewScanner(q.conn)
|
||||||
if q.cfg.MaxCapacity > 0 {
|
if q.cfg.MaxCapacity > 0 {
|
||||||
@ -1545,3 +1552,23 @@ func (q *QMP) ExecQueryQmpSchema(ctx context.Context) ([]SchemaInfo, error) {
|
|||||||
|
|
||||||
return schemaInfo, nil
|
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
|
||||||
|
}
|
||||||
|
@ -1623,3 +1623,30 @@ func TestQMPExecQueryQmpSchema(t *testing.T) {
|
|||||||
q.Shutdown()
|
q.Shutdown()
|
||||||
<-disconnectedCh
|
<-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
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user