Parcourir la source

feature(worker): implemented mirror role (master/slave) option

bigeagle il y a 9 ans
Parent
commit
56459f2ce0
4 fichiers modifiés avec 22 ajouts et 1 suppressions
  1. 1 0
      tests/worker.conf
  2. 1 0
      worker/config.go
  3. 6 0
      worker/provider.go
  4. 14 1
      worker/worker.go

+ 1 - 0
tests/worker.conf

@@ -29,6 +29,7 @@ command = "/tmp/tunasync/bin/myrsync2.sh"
 upstream = "https://aosp.google.com/"
 interval = 2
 mirror_dir = "/tmp/tunasync/git/AOSP"
+role = "slave"
 	[mirrors.env]
 	REPO = "/usr/local/bin/aosp-repo"
 

+ 1 - 0
worker/config.go

@@ -75,6 +75,7 @@ type mirrorConfig struct {
 	MirrorDir string            `toml:"mirror_dir"`
 	LogDir    string            `toml:"log_dir"`
 	Env       map[string]string `toml:"env"`
+	Role      string            `toml:"role"`
 
 	ExecOnSuccess string `toml:"exec_on_success"`
 	ExecOnFailure string `toml:"exec_on_failure"`

+ 6 - 0
worker/provider.go

@@ -44,6 +44,7 @@ type mirrorProvider interface {
 	WorkingDir() string
 	LogDir() string
 	LogFile() string
+	IsMaster() bool
 
 	// enter context
 	EnterContext() *Context
@@ -59,6 +60,7 @@ type baseProvider struct {
 	ctx      *Context
 	name     string
 	interval time.Duration
+	isMaster bool
 
 	cmd       *cmdJob
 	isRunning atomic.Value
@@ -92,6 +94,10 @@ func (p *baseProvider) Interval() time.Duration {
 	return p.interval
 }
 
+func (p *baseProvider) IsMaster() bool {
+	return p.isMaster
+}
+
 func (p *baseProvider) WorkingDir() string {
 	if v, ok := p.ctx.Get(_WorkingDirKey); ok {
 		if s, ok := v.(string); ok {

+ 14 - 1
worker/worker.go

@@ -90,6 +90,16 @@ func (w *Worker) initProviders() {
 		}
 		logDir = formatLogDir(logDir, mirror)
 
+		// IsMaster
+		isMaster := true
+		if mirror.Role == "slave" {
+			isMaster = false
+		} else {
+			if mirror.Role != "" && mirror.Role != "master" {
+				logger.Warningf("Invalid role configuration for %s", mirror.Name)
+			}
+		}
+
 		var provider mirrorProvider
 
 		switch mirror.Provider {
@@ -105,6 +115,7 @@ func (w *Worker) initProviders() {
 				env:         mirror.Env,
 			}
 			p, err := newCmdProvider(pc)
+			p.isMaster = isMaster
 			if err != nil {
 				panic(err)
 			}
@@ -123,6 +134,7 @@ func (w *Worker) initProviders() {
 				interval:    time.Duration(mirror.Interval) * time.Minute,
 			}
 			p, err := newRsyncProvider(rc)
+			p.isMaster = isMaster
 			if err != nil {
 				panic(err)
 			}
@@ -142,6 +154,7 @@ func (w *Worker) initProviders() {
 				interval:      time.Duration(mirror.Interval) * time.Minute,
 			}
 			p, err := newTwoStageRsyncProvider(rc)
+			p.isMaster = isMaster
 			if err != nil {
 				panic(err)
 			}
@@ -395,7 +408,7 @@ func (w *Worker) updateStatus(jobMsg jobMessage) {
 	smsg := MirrorStatus{
 		Name:     jobMsg.name,
 		Worker:   w.cfg.Global.Name,
-		IsMaster: true,
+		IsMaster: p.IsMaster(),
 		Status:   jobMsg.status,
 		Upstream: p.Upstream(),
 		Size:     "unknown",