فهرست منبع

feat(worker): added global `exec_on_success` and `exec_on_failure` options

if `exec_on_success` is set on mirror-level config, it overrides the global option; if on mirror

level, extra hook cmd is needed, use `exec_on_success_extra` option
bigeagle 9 سال پیش
والد
کامیت
2b83ea4b45
3فایلهای تغییر یافته به همراه41 افزوده شده و 18 حذف شده
  1. 10 2
      worker/config.go
  2. 6 2
      worker/config_test.go
  3. 25 14
      worker/provider.go

+ 10 - 2
worker/config.go

@@ -47,6 +47,9 @@ type globalConfig struct {
 	MirrorDir  string `toml:"mirror_dir"`
 	Concurrent int    `toml:"concurrent"`
 	Interval   int    `toml:"interval"`
+
+	ExecOnSuccess []string `toml:"exec_on_success"`
+	ExecOnFailure []string `toml:"exec_on_failure"`
 }
 
 type managerConfig struct {
@@ -87,8 +90,13 @@ type mirrorConfig struct {
 	Env       map[string]string `toml:"env"`
 	Role      string            `toml:"role"`
 
-	ExecOnSuccess string `toml:"exec_on_success"`
-	ExecOnFailure string `toml:"exec_on_failure"`
+	// These two options over-write the global options
+	ExecOnSuccess []string `toml:"exec_on_success"`
+	ExecOnFailure []string `toml:"exec_on_failure"`
+
+	// These two options  the global options
+	ExecOnSuccessExtra []string `toml:"exec_on_success_extra"`
+	ExecOnFailureExtra []string `toml:"exec_on_failure_extra"`
 
 	Command       string `toml:"command"`
 	UseIPv6       bool   `toml:"use_ipv6"`

+ 6 - 2
worker/config_test.go

@@ -36,7 +36,9 @@ provider = "command"
 upstream = "https://aosp.google.com/"
 interval = 720
 mirror_dir = "/data/git/AOSP"
-exec_on_success = "bash -c 'echo ${TUNASYNC_JOB_EXIT_STATUS} > ${TUNASYNC_WORKING_DIR}/exit_status'"
+exec_on_success = [
+	"bash -c 'echo ${TUNASYNC_JOB_EXIT_STATUS} > ${TUNASYNC_WORKING_DIR}/exit_status'"
+]
 	[mirrors.env]
 	REPO = "/usr/local/bin/aosp-repo"
 
@@ -53,7 +55,9 @@ provider = "rsync"
 upstream = "rsync://ftp.fedoraproject.org/fedora/"
 use_ipv6 = true
 exclude_file = "/etc/tunasync.d/fedora-exclude.txt"
-exec_on_failure = "bash -c 'echo ${TUNASYNC_JOB_EXIT_STATUS} > ${TUNASYNC_WORKING_DIR}/exit_status'"
+exec_on_failure = [
+	"bash -c 'echo ${TUNASYNC_JOB_EXIT_STATUS} > ${TUNASYNC_WORKING_DIR}/exit_status'"
+]
 	`
 
 	Convey("When giving invalid file", t, func() {

+ 25 - 14
worker/provider.go

@@ -169,24 +169,35 @@ func newMirrorProvider(mirror mirrorConfig, cfg *Config) mirrorProvider {
 		)
 	}
 
-	// ExecOnSuccess hook
-	if mirror.ExecOnSuccess != "" {
-		h, err := newExecPostHook(provider, execOnSuccess, mirror.ExecOnSuccess)
-		if err != nil {
-			logger.Errorf("Error initializing mirror %s: %s", mirror.Name, err.Error())
-			panic(err)
+	addHookFromCmdList := func(cmdList []string, execOn uint8) {
+		if execOn != execOnSuccess && execOn != execOnFailure {
+			panic("Invalid option for exec-on")
+		}
+		for _, cmd := range cmdList {
+			h, err := newExecPostHook(provider, execOn, cmd)
+			if err != nil {
+				logger.Errorf("Error initializing mirror %s: %s", mirror.Name, err.Error())
+				panic(err)
+			}
+			provider.AddHook(h)
 		}
-		provider.AddHook(h)
 	}
+
+	// ExecOnSuccess hook
+	if len(mirror.ExecOnSuccess) > 0 {
+		addHookFromCmdList(mirror.ExecOnSuccess, execOnSuccess)
+	} else {
+		addHookFromCmdList(cfg.Global.ExecOnSuccess, execOnSuccess)
+	}
+	addHookFromCmdList(mirror.ExecOnSuccessExtra, execOnSuccess)
+
 	// ExecOnFailure hook
-	if mirror.ExecOnFailure != "" {
-		h, err := newExecPostHook(provider, execOnFailure, mirror.ExecOnFailure)
-		if err != nil {
-			logger.Errorf("Error initializing mirror %s: %s", mirror.Name, err.Error())
-			panic(err)
-		}
-		provider.AddHook(h)
+	if len(mirror.ExecOnFailure) > 0 {
+		addHookFromCmdList(mirror.ExecOnFailure, execOnFailure)
+	} else {
+		addHookFromCmdList(cfg.Global.ExecOnFailure, execOnFailure)
 	}
+	addHookFromCmdList(mirror.ExecOnFailureExtra, execOnFailure)
 
 	return provider
 }