mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-10-29 17:58:36 +08:00
guest migrate snapshot
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user