func (ms *MinionServer) launchHyperkubeServer(server string, args []string, logFileName string, options ...tasks.Option) { log.V(2).Infof("Spawning hyperkube %v with args '%+v'", server, args) kmArgs := append([]string{server}, args...) maxSize := ms.logMaxSize.Value() if maxSize > 0 { // convert to MB maxSize = maxSize / 1024 / 1024 if maxSize == 0 { log.Warning("maximal log file size is rounded to 1 MB") maxSize = 1 } } writerFunc := func() io.WriteCloser { return &lumberjack.Logger{ Filename: logFileName, MaxSize: int(maxSize), MaxBackups: ms.logMaxBackups, MaxAge: ms.logMaxAgeInDays, } } // prepend env, allow later options to customize further options = append([]tasks.Option{tasks.Environment(os.Environ()), ms.applyPathOverride()}, options...) t := tasks.New(server, ms.kmBinary, kmArgs, writerFunc, options...) go t.Start() ms.tasks = append(ms.tasks, t) }
// applyPathOverride overrides PATH and also adds $SANDBOX/bin (needed for locating bundled binary deps // as well as external deps like iptables) func (ms *MinionServer) applyPathOverride() tasks.Option { return func(t *tasks.Task) tasks.Option { kmEnv := make([]string, 0, len(t.Env)) for _, e := range t.Env { if !strings.HasPrefix(e, "PATH=") { kmEnv = append(kmEnv, e) } else { if ms.pathOverride != "" { e = "PATH=" + ms.pathOverride } pwd, err := os.Getwd() if err != nil { panic(fmt.Errorf("Cannot get current directory: %v", err)) } kmEnv = append(kmEnv, fmt.Sprintf("%s:%s", e, path.Join(pwd, "bin"))) } } oldenv := t.Env t.Env = kmEnv return tasks.Environment(oldenv) } }