// ExecuteCommand will pretend to execute the given command, recording data // about it. // // The output of the command must be prepared with PrepareOutput, and failures // must be prepared with PrepareFailure. In case of failure, the prepared // output will be sent to the standard error stream, otherwise, it will be sent // to the standard error stream. // // When there is no output nor failure prepared, ExecuteCommand will return a // timeout error. func (p *FakeProvisioner) ExecuteCommand(stdout, stderr io.Writer, app provision.App, cmd string, args ...string) error { var ( output []byte err error ) command := Cmd{ Cmd: cmd, Args: args, App: app, } p.cmdMut.Lock() p.cmds = append(p.cmds, command) p.cmdMut.Unlock() units, err := app.Units() if err != nil { return err } for range units { select { case output = <-p.outputs: select { case fail := <-p.failures: if fail.method == "ExecuteCommand" { stderr.Write(output) return fail.err } p.failures <- fail default: stdout.Write(output) } case fail := <-p.failures: if fail.method == "ExecuteCommand" { err = fail.err select { case output = <-p.outputs: stderr.Write(output) default: } } else { p.failures <- fail } case <-time.After(2e9): return errors.New("FakeProvisioner timed out waiting for output.") } } return err }
func minifyApp(app provision.App) (miniApp, error) { units, err := app.Units() if err != nil { return miniApp{}, err } return miniApp{ Name: app.GetName(), Units: units, CName: app.GetCname(), Ip: app.GetIp(), Lock: app.GetLock(), }, nil }