guest migrate snapshot

This commit is contained in:
wanyaoqi
2019-01-14 16:44:01 +08:00
parent 3d2183a7c9
commit 71856e430e
32 changed files with 2308 additions and 140 deletions
+52
View File
@@ -217,6 +217,7 @@ func (m *HmpMonitor) GetBlocks(callback func(*jsonutils.JSONArray)) {
break
}
}
drv.Set("inserted", inserted)
}
outputJson.Add(drv)
}
@@ -259,3 +260,54 @@ func (m *HmpMonitor) DeviceAdd(dev string, params map[string]interface{}, callba
}
m.Query(fmt.Sprintf("device_add %s,%s", dev, strings.Join(paramsKvs, ",")), callback)
}
func (m *HmpMonitor) MigrateSetCapability(capability, state string, callback StringCallback) {
m.Query(fmt.Sprintf("migrate_set_capability %s %s", capability, state), callback)
}
func (m *HmpMonitor) Migrate(
destStr string, copyIncremental, copyFull bool, callback StringCallback,
) {
cmd := "migrate -d"
if copyIncremental {
cmd += " -i"
} else if copyIncremental {
cmd += " -b"
}
cmd += " " + destStr
m.Query(cmd, callback)
}
func (m *HmpMonitor) GetMigrateStatus(callback StringCallback) {
cb := func(output string) {
log.Infof("Query migrate status: %s", output)
var status string
for _, line := range strings.Split(output, "\n") {
if strings.HasPrefix(line, "Migration status") {
status = line[strings.LastIndex(line, " ")+1:]
break
}
}
callback(status)
}
m.Query("info migrate", cb)
}
func (m *HmpMonitor) GetBlockJobs(callback func(jobs int)) {
cb := func(output string) {
lines := strings.Split(output, "\n")
if lines[0] == "No active jobs" {
callback(0)
} else {
callback(len(lines))
}
}
m.Query("info block-jobs", cb)
}
func (m *HmpMonitor) ReloadDiskBlkdev(device, path string, callback StringCallback) {
m.Query(fmt.Sprintf("reload_disk_snapshot_blkdev -n %s %s", device, path), callback)
}
+7
View File
@@ -21,6 +21,7 @@ type Monitor interface {
SimpleCommand(cmd string, callback StringCallback)
QueryStatus(StringCallback)
GetVersion(StringCallback)
GetBlockJobs(func(jobs int))
GetBlocks(callback func(*jsonutils.JSONArray))
EjectCdrom(dev string, callback StringCallback)
@@ -31,6 +32,12 @@ type Monitor interface {
DriveAdd(bus string, params map[string]string, callback StringCallback)
DeviceAdd(dev string, params map[string]interface{}, callback StringCallback)
MigrateSetCapability(capability, state string, callback StringCallback)
Migrate(destStr string, copyIncremental, copyFull bool, callback StringCallback)
GetMigrateStatus(callback StringCallback)
ReloadDiskBlkdev(device, path string, callback StringCallback)
}
type MonitorErrorFunc func(error)
+105
View File
@@ -458,3 +458,108 @@ func (m *QmpMonitor) DeviceAdd(dev string, params map[string]interface{}, callba
m.Query(cmd, cb)
}
func (m *QmpMonitor) MigrateSetCapability(capability, state string, callback StringCallback) {
var (
cb = func(res *Response) {
callback(m.actionResult(res))
}
st = false
)
if state == "on" {
st = true
}
cmd := &Command{
Execute: "query-migrate-capabilities",
Args: map[string]interface{}{
"capabilities": []interface{}{
map[string]interface{}{
"capability": capability,
"state": st,
},
},
},
}
m.Query(cmd, cb)
}
func (m *QmpMonitor) Migrate(
destStr string, copyIncremental, copyFull bool, callback StringCallback,
) {
var (
cb = func(res *Response) {
callback(m.actionResult(res))
}
cmd = &Command{
Execute: "migrate",
Args: map[string]interface{}{
"uri": destStr,
"blk": copyFull,
"inc": copyIncremental,
},
}
)
m.Query(cmd, cb)
}
func (m *QmpMonitor) GetMigrateStatus(callback StringCallback) {
var (
cmd = &Command{Execute: "query-migrate"}
cb = func(res *Response) {
if res.ErrorVal != nil {
callback(res.ErrorVal.Error())
} else {
ret, err := jsonutils.Parse(res.Return)
if err != nil {
log.Errorf("Parse qmp res error: %s", err)
callback("")
} else {
log.Infof("Query migrate status: %s", ret.String())
status, _ := ret.GetString("status")
callback(status)
}
}
}
)
m.Query(cmd, cb)
}
func (m *QmpMonitor) GetBlockJobs(callback func(jobs int)) {
var cb = func(res *Response) {
if res.ErrorVal != nil {
log.Errorln(res.ErrorVal.Error())
callback(-1)
} else {
ret, err := jsonutils.Parse(res.Return)
if err != nil {
log.Errorf("Parse qmp res error: %s", err)
callback(-1)
} else {
jobs, _ := ret.GetArray()
callback(len(jobs))
}
}
}
m.Query(&Command{Execute: "query-block-jobs"}, cb)
}
func (m *QmpMonitor) ReloadDiskBlkdev(device, path string, callback StringCallback) {
var (
cb = func(res *Response) {
callback(m.actionResult(res))
}
cmd = &Command{
Execute: "reload-disk-snapshot-blkdev-sync",
Args: map[string]string{
"device": device,
"snapshot-file": path,
"mode": "existing",
"format": "qcow2",
},
}
)
m.Query(cmd, cb)
}