6
. "launchpad.net/gocheck"
7
"launchpad.net/juju-core/charm"
8
"launchpad.net/juju-core/cmd"
9
"launchpad.net/juju-core/juju/testing"
10
"launchpad.net/juju-core/state"
11
coretesting "launchpad.net/juju-core/testing"
17
var _ = Suite(&SSHSuite{})
19
type SSHSuite struct {
23
type SSHCommonSuite struct {
28
// fakecommand outputs its arguments to stdout for verification
29
var fakecommand = `#!/bin/bash
34
func (s *SSHCommonSuite) SetUpTest(c *C) {
35
s.JujuConnSuite.SetUpTest(c)
38
s.oldpath = os.Getenv("PATH")
39
os.Setenv("PATH", path+":"+s.oldpath)
40
for _, name := range []string{"ssh", "scp"} {
41
f, err := os.OpenFile(filepath.Join(path, name), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777)
43
_, err = f.Write([]byte(fakecommand))
50
func (s *SSHCommonSuite) TearDownTest(c *C) {
51
os.Setenv("PATH", s.oldpath)
52
s.JujuConnSuite.TearDownTest(c)
56
commonArgs = `-o StrictHostKeyChecking no -o PasswordAuthentication no `
57
sshArgs = `-l ubuntu -t ` + commonArgs
60
var sshTests = []struct {
66
sshArgs + "dummyenv-0.dns\n",
68
// juju ssh 0 'uname -a'
70
[]string{"0", "uname -a"},
71
sshArgs + "dummyenv-0.dns uname -a\n",
73
// juju ssh 0 -- uname -a
75
[]string{"0", "--", "uname", "-a"},
76
sshArgs + "dummyenv-0.dns uname -a\n",
80
sshArgs + "dummyenv-0.dns\n",
83
[]string{"mongodb/1"},
84
sshArgs + "dummyenv-2.dns\n",
88
func (s *SSHSuite) TestSSHCommand(c *C) {
89
m := s.makeMachines(3, c)
90
ch := coretesting.Charms.Dir("dummy")
91
curl := charm.MustParseURL(
92
fmt.Sprintf("local:series/%s-%d", ch.Meta().Name, ch.Revision()),
94
bundleURL, err := url.Parse("http://bundles.example.com/dummy-1")
96
dummy, err := s.State.AddCharm(ch, curl, bundleURL, "dummy-1-sha256")
98
srv, err := s.State.AddService("mysql", dummy)
100
s.addUnit(srv, m[0], c)
102
srv, err = s.State.AddService("mongodb", dummy)
104
s.addUnit(srv, m[1], c)
105
s.addUnit(srv, m[2], c)
107
for _, t := range sshTests {
108
c.Logf("testing juju ssh %s", t.args)
109
ctx := coretesting.Context(c)
110
code := cmd.Main(&SSHCommand{}, ctx, t.args)
111
c.Check(code, Equals, 0)
112
c.Check(ctx.Stderr.(*bytes.Buffer).String(), Equals, "")
113
c.Check(ctx.Stdout.(*bytes.Buffer).String(), Equals, t.result)
117
func (s *SSHCommonSuite) makeMachines(n int, c *C) []*state.Machine {
118
var machines = make([]*state.Machine, n)
119
for i := 0; i < n; i++ {
120
m, err := s.State.AddMachine("series", state.JobHostUnits)
122
// must set an instance id as the ssh command uses that as a signal the machine
123
// has been provisioned
124
inst := testing.StartInstance(c, s.Conn.Environ, m.Id())
125
c.Assert(m.SetProvisioned(inst.Id(), "fake_nonce"), IsNil)
131
func (s *SSHCommonSuite) addUnit(srv *state.Service, m *state.Machine, c *C) {
132
u, err := srv.AddUnit()
134
err = u.AssignToMachine(m)
136
// fudge unit.SetPublicAddress
137
id, ok := m.InstanceId()
138
c.Assert(ok, Equals, true)
139
insts, err := s.Conn.Environ.Instances([]state.InstanceId{id})
141
addr, err := insts[0].WaitDNSName()
143
err = u.SetPublicAddress(addr)