~juju-qa/ubuntu/yakkety/juju/2.0-rc3-again

« back to all changes in this revision

Viewing changes to src/launchpad.net/juju-core/cmd/juju/ssh_test.go

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2013-04-24 22:34:47 UTC
  • Revision ID: package-import@ubuntu.com-20130424223447-f0qdji7ubnyo0s71
Tags: upstream-1.10.0.1
ImportĀ upstreamĀ versionĀ 1.10.0.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package main
 
2
 
 
3
import (
 
4
        "bytes"
 
5
        "fmt"
 
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"
 
12
        "net/url"
 
13
        "os"
 
14
        "path/filepath"
 
15
)
 
16
 
 
17
var _ = Suite(&SSHSuite{})
 
18
 
 
19
type SSHSuite struct {
 
20
        SSHCommonSuite
 
21
}
 
22
 
 
23
type SSHCommonSuite struct {
 
24
        testing.JujuConnSuite
 
25
        oldpath string
 
26
}
 
27
 
 
28
// fakecommand outputs its arguments to stdout for verification
 
29
var fakecommand = `#!/bin/bash
 
30
 
 
31
echo $@
 
32
`
 
33
 
 
34
func (s *SSHCommonSuite) SetUpTest(c *C) {
 
35
        s.JujuConnSuite.SetUpTest(c)
 
36
 
 
37
        path := c.MkDir()
 
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)
 
42
                c.Assert(err, IsNil)
 
43
                _, err = f.Write([]byte(fakecommand))
 
44
                c.Assert(err, IsNil)
 
45
                err = f.Close()
 
46
                c.Assert(err, IsNil)
 
47
        }
 
48
}
 
49
 
 
50
func (s *SSHCommonSuite) TearDownTest(c *C) {
 
51
        os.Setenv("PATH", s.oldpath)
 
52
        s.JujuConnSuite.TearDownTest(c)
 
53
}
 
54
 
 
55
const (
 
56
        commonArgs = `-o StrictHostKeyChecking no -o PasswordAuthentication no `
 
57
        sshArgs    = `-l ubuntu -t ` + commonArgs
 
58
)
 
59
 
 
60
var sshTests = []struct {
 
61
        args   []string
 
62
        result string
 
63
}{
 
64
        {
 
65
                []string{"0"},
 
66
                sshArgs + "dummyenv-0.dns\n",
 
67
        },
 
68
        // juju ssh 0 'uname -a'
 
69
        {
 
70
                []string{"0", "uname -a"},
 
71
                sshArgs + "dummyenv-0.dns uname -a\n",
 
72
        },
 
73
        // juju ssh 0 -- uname -a
 
74
        {
 
75
                []string{"0", "--", "uname", "-a"},
 
76
                sshArgs + "dummyenv-0.dns uname -a\n",
 
77
        },
 
78
        {
 
79
                []string{"mysql/0"},
 
80
                sshArgs + "dummyenv-0.dns\n",
 
81
        },
 
82
        {
 
83
                []string{"mongodb/1"},
 
84
                sshArgs + "dummyenv-2.dns\n",
 
85
        },
 
86
}
 
87
 
 
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()),
 
93
        )
 
94
        bundleURL, err := url.Parse("http://bundles.example.com/dummy-1")
 
95
        c.Assert(err, IsNil)
 
96
        dummy, err := s.State.AddCharm(ch, curl, bundleURL, "dummy-1-sha256")
 
97
        c.Assert(err, IsNil)
 
98
        srv, err := s.State.AddService("mysql", dummy)
 
99
        c.Assert(err, IsNil)
 
100
        s.addUnit(srv, m[0], c)
 
101
 
 
102
        srv, err = s.State.AddService("mongodb", dummy)
 
103
        c.Assert(err, IsNil)
 
104
        s.addUnit(srv, m[1], c)
 
105
        s.addUnit(srv, m[2], c)
 
106
 
 
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)
 
114
        }
 
115
}
 
116
 
 
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)
 
121
                c.Assert(err, IsNil)
 
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)
 
126
                machines[i] = m
 
127
        }
 
128
        return machines
 
129
}
 
130
 
 
131
func (s *SSHCommonSuite) addUnit(srv *state.Service, m *state.Machine, c *C) {
 
132
        u, err := srv.AddUnit()
 
133
        c.Assert(err, IsNil)
 
134
        err = u.AssignToMachine(m)
 
135
        c.Assert(err, IsNil)
 
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})
 
140
        c.Assert(err, IsNil)
 
141
        addr, err := insts[0].WaitDNSName()
 
142
        c.Assert(err, IsNil)
 
143
        err = u.SetPublicAddress(addr)
 
144
        c.Assert(err, IsNil)
 
145
}