Files
cloudpods/pkg/hostman/monitor/monitor.go
T
2019-01-14 16:44:01 +08:00

114 lines
2.5 KiB
Go

package monitor
import (
"fmt"
"net"
"sync"
"time"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
)
type StringCallback func(string)
type Monitor interface {
Connect(host string, port int) error
Dicconnect()
IsConnected() bool
// The callback function will be called in another goroutine
SimpleCommand(cmd string, callback StringCallback)
QueryStatus(StringCallback)
GetVersion(StringCallback)
GetBlockJobs(func(jobs int))
GetBlocks(callback func(*jsonutils.JSONArray))
EjectCdrom(dev string, callback StringCallback)
ChangeCdrom(dev string, path string, callback StringCallback)
DriveDel(idstr string, callback StringCallback)
DeviceDel(idstr string, callback StringCallback)
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)
type MonitorSuccFunc func()
type SBaseMonitor struct {
OnMonitorDisConnect MonitorErrorFunc
OnMonitorConnected MonitorSuccFunc
OnMonitorTimeout MonitorErrorFunc
QemuVersion string
connected bool
rwc net.Conn
mutex *sync.Mutex
writing bool
reading bool
}
func NewBaseMonitor(OnMonitorConnected MonitorSuccFunc, OnMonitorDisConnect, OnMonitorTimeout MonitorErrorFunc) *SBaseMonitor {
return &SBaseMonitor{
OnMonitorConnected: OnMonitorConnected,
OnMonitorDisConnect: OnMonitorDisConnect,
OnMonitorTimeout: OnMonitorTimeout,
mutex: &sync.Mutex{},
}
}
func (m *SBaseMonitor) Connect(host string, port int) error {
address := fmt.Sprintf("%s:%d", host, port)
conn, err := net.Dial("tcp", address)
if err != nil {
log.Errorln("Connect monitor error:%s", err)
return err
}
// Setup reader timeout
conn.SetReadDeadline(time.Now().Add(90 * time.Second))
m.rwc = conn
return nil
}
func (m *SBaseMonitor) Disconnect() {
if m.connected {
m.connected = false
m.rwc.Close()
}
}
func (m *SBaseMonitor) IsConnected() bool {
return m.connected
}
func (m *SBaseMonitor) checkReading() bool {
m.mutex.Lock()
defer m.mutex.Unlock()
if m.reading {
return false
} else {
m.reading = true
}
return true
}
func (m *SBaseMonitor) checkWriting() bool {
m.mutex.Lock()
defer m.mutex.Unlock()
if m.writing {
return false
} else {
m.writing = true
}
return true
}