- return []string{
- "-n", fmt.Sprintf("%d", vcpus),
- "-D", fmt.Sprintf("%dMB", mem), // ulimit -d (note this doesn't limit the total container memory usage)
- "-R", fmt.Sprintf("rusage[mem=%dMB:tmp=%dMB] span[hosts=1]", mem, tmp),
+
+ r := regexp.MustCompile(`([^%]|^)%([^%])`)
+ undoubleRE := regexp.MustCompile(`%%`)
+ for _, a := range tmpArgs {
+ tmp := r.ReplaceAllStringFunc(a, func(m string) string {
+ parts := r.FindStringSubmatch(m)
+ return parts[1] + disp.substitute(parts[2], container.UUID, vcpus, mem, tmp)
+ })
+ // handle escaped literal % symbols
+ tmp = undoubleRE.ReplaceAllString(tmp, "%")
+ args = append(args, tmp)
+ }
+
+ if u := disp.Cluster.Containers.LSF.BsubSudoUser; u != "" {
+ args = append([]string{"sudo", "-E", "-u", u}, args...)
+ }
+ return args, nil
+}
+
+func (disp *dispatcher) substitute(l string, uuid string, vcpus int, mem, tmp int64) string {
+ var arg string
+ switch l {
+ case "C":
+ arg = fmt.Sprintf("%d", vcpus)
+ case "T":
+ arg = fmt.Sprintf("%d", tmp)
+ case "M":
+ arg = fmt.Sprintf("%d", mem)
+ case "U":
+ arg = uuid
+ default:
+ arg = "%" + l