// RunCommands exists to satisfy the Runner interface. func (runner *runner) RunCommands(commands string) (*utilexec.ExecResponse, error) { srv, err := runner.startJujucServer() if err != nil { return nil, err } defer srv.Close() env, err := runner.context.HookVars(runner.paths) if err != nil { return nil, errors.Trace(err) } command := utilexec.RunParams{ Commands: commands, WorkingDir: runner.paths.GetCharmDir(), Environment: env, } err = command.Run() if err != nil { return nil, err } runner.context.SetProcess(command.Process()) // Block and wait for process to finish result, err := command.Wait() return result, runner.context.Flush("run commands", err) }
// runScript executes the given lines in bash func (c *Client) runScript(lines ...string) error { p := exec.RunParams{ Commands: strings.Join(lines, "\n"), } os.MkdirAll(c.SccDir, 0755) p.WorkingDir = c.SccDir if err := p.Run(); err != nil { return err } if r, err := p.Wait(); err != nil { return err } else { os.Stderr.Write(r.Stderr) os.Stdout.Write(r.Stdout) if r.Code != 0 { return errors.New("Script failed") } return nil } }
func (*execSuite) TestRunCommands(c *gc.C) { newDir, err := longPathAsString(c.MkDir()) c.Assert(err, gc.IsNil) for i, test := range []struct { message string commands string workingDir string environment []string stdout string stderr string code int }{ { message: "test stdout capture", commands: "echo 'testing stdout'", stdout: "testing stdout\r\n", }, { message: "test stderr capture", commands: "Write-Error 'testing stderr'", stderr: "testing stderr\r\n", }, { message: "test return code", commands: "exit 42", code: 42, }, { message: "test working dir", commands: "(pwd).Path", workingDir: newDir, stdout: filepath.FromSlash(newDir) + "\r\n", }, { message: "test environment", commands: "echo $env:OMG_IT_WORKS", environment: []string{"OMG_IT_WORKS=like magic"}, stdout: "like magic\r\n", }, } { c.Logf("%v: %s", i, test.message) params := exec.RunParams{ Commands: test.commands, WorkingDir: test.workingDir, Environment: test.environment, } result, err := exec.RunCommands(params) c.Assert(err, gc.IsNil) c.Assert(string(result.Stdout), gc.Equals, test.stdout) c.Assert(string(result.Stderr), jc.Contains, test.stderr) c.Assert(result.Code, gc.Equals, test.code) err = params.Run() c.Assert(err, gc.IsNil) c.Assert(params.Process(), gc.Not(gc.IsNil)) result, err = params.Wait() c.Assert(err, gc.IsNil) c.Assert(string(result.Stdout), gc.Equals, test.stdout) c.Assert(string(result.Stderr), jc.Contains, test.stderr) c.Assert(result.Code, gc.Equals, test.code) } }
func (*execSuite) TestRunCommands(c *gc.C) { newDir := c.MkDir() for i, test := range []struct { message string commands string workingDir string environment []string stdout string stderr string code int }{ { message: "test stdout capture", commands: "echo testing stdout", stdout: "testing stdout\n", }, { message: "test stderr capture", commands: "echo testing stderr >&2", stderr: "testing stderr\n", }, { message: "test return code", commands: "exit 42", code: 42, }, { message: "test working dir", commands: "pwd", workingDir: newDir, stdout: newDir + "\n", }, { message: "test environment", commands: "echo $OMG_IT_WORKS", environment: []string{"OMG_IT_WORKS=like magic"}, stdout: "like magic\n", }, { message: "multiple commands", commands: "cat\necho 123", stdout: "123\n", }, } { c.Logf("%v: %s", i, test.message) params := exec.RunParams{ Commands: test.commands, WorkingDir: test.workingDir, Environment: test.environment, } result, err := exec.RunCommands(params) c.Assert(err, gc.IsNil) c.Assert(string(result.Stdout), gc.Equals, test.stdout) c.Assert(string(result.Stderr), gc.Equals, test.stderr) c.Assert(result.Code, gc.Equals, test.code) err = params.Run() c.Assert(err, gc.IsNil) c.Assert(params.Process(), gc.Not(gc.IsNil)) result, err = params.Wait() c.Assert(err, gc.IsNil) c.Assert(string(result.Stdout), gc.Equals, test.stdout) c.Assert(string(result.Stderr), gc.Equals, test.stderr) c.Assert(result.Code, gc.Equals, test.code) } }