feature(manager): skeleton for worker-manager communication

This commit is contained in:
bigeagle 2016-04-23 21:54:00 +08:00
parent 681388ffdd
commit afee5b2a81
No known key found for this signature in database
GPG Key ID: 9171A4571C27920A
3 changed files with 74 additions and 3 deletions

42
internal/msg.go Normal file
View File

@ -0,0 +1,42 @@
package internal
import "time"
// A StatusUpdateMsg represents a msg when
// a worker has done syncing
type StatusUpdateMsg struct {
Name string `json:"name"`
Worker string `json:"worker"`
IsMaster bool `json:"is_master"`
Status SyncStatus `json:"status"`
LastUpdate time.Time `json:"last_update"`
Upstream string `json:"upstream"`
Size string `json:"size"`
}
// A WorkerInfoMsg is
type WorkerInfoMsg struct {
Name string `json:"name"`
}
type CmdVerb uint8
const (
CmdStart CmdVerb = iota
CmdStop // stop syncing keep the job
CmdDisable // disable the job (stops goroutine)
CmdRestart // restart syncing
CmdPing // ensure the goroutine is alive
)
type WorkerCmd struct {
Cmd CmdVerb `json:"cmd"`
Args []string `json:"args"`
}
type ClientCmd struct {
Cmd CmdVerb `json:"cmd"`
MirrorID string `json:"mirror_id"`
WorkerID string `json:"worker_id"`
Args []string `json:"args"`
}

23
manager/db.go Normal file
View File

@ -0,0 +1,23 @@
package manager
import "github.com/boltdb/bolt"
type dbAdapter interface {
GetWorker(workerID string)
UpdateMirrorStatus(workerID, mirrorID string, status mirrorStatus)
GetMirrorStatus(workerID, mirrorID string)
GetMirrorStatusList(workerID string)
Close()
}
type boltAdapter struct {
db *bolt.DB
dbFile string
}
func (b *boltAdapter) Close() error {
if b.db != nil {
return b.db.Close()
}
return nil
}

View File

@ -23,14 +23,20 @@ func makeHTTPServer(debug bool) *gin.Engine {
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"msg": "pong"})
})
// List jobs, status page
// list jobs, status page
r.GET("/jobs", func(c *gin.Context) {})
// worker online
r.POST("/workers/:name", func(c *gin.Context) {})
// post job list
r.POST("/workers/:name/jobs", func(c *gin.Context) {})
// get job list
r.GET("/workers/:name/jobs", func(c *gin.Context) {})
// post job status
r.POST("/workers/:name/jobs/:job", func(c *gin.Context) {})
// worker command polling
r.GET("/workers/:name/cmd_stream", func(c *gin.Context) {})
// for tunasynctl to post commands
r.POST("/cmd/", func(c *gin.Context) {})
return r
}