5
. "launchpad.net/gocheck"
7
"launchpad.net/juju-core/constraints"
8
"launchpad.net/juju-core/environs/agent"
9
"launchpad.net/juju-core/state"
10
"launchpad.net/juju-core/testing"
13
// We don't want to use JujuConnSuite because it gives us
14
// an already-bootstrapped environment.
15
type BootstrapSuite struct {
21
var _ = Suite(&BootstrapSuite{})
23
func (s *BootstrapSuite) SetUpSuite(c *C) {
24
s.LoggingSuite.SetUpSuite(c)
25
s.MgoSuite.SetUpSuite(c)
28
func (s *BootstrapSuite) TearDownSuite(c *C) {
29
s.MgoSuite.TearDownSuite(c)
30
s.LoggingSuite.TearDownSuite(c)
33
func (s *BootstrapSuite) SetUpTest(c *C) {
34
s.LoggingSuite.SetUpTest(c)
35
s.MgoSuite.SetUpTest(c)
39
func (s *BootstrapSuite) TearDownTest(c *C) {
40
s.MgoSuite.TearDownTest(c)
41
s.LoggingSuite.TearDownTest(c)
44
func (s *BootstrapSuite) initBootstrapCommand(c *C, args ...string) (*agent.Conf, *BootstrapCommand, error) {
47
StateInfo: &state.Info{
49
Addrs: []string{testing.MgoAddr},
50
CACert: []byte(testing.CACert),
55
cmd := &BootstrapCommand{}
56
err = testing.InitCommand(cmd, append([]string{"--data-dir", s.dataDir}, args...))
60
func (s *BootstrapSuite) TestInitializeEnvironment(c *C) {
61
_, cmd, err := s.initBootstrapCommand(c, "--env-config", testConfig)
66
st, err := state.Open(&state.Info{
67
Addrs: []string{testing.MgoAddr},
68
CACert: []byte(testing.CACert),
69
}, state.DefaultDialOpts())
72
machines, err := st.AllMachines()
74
c.Assert(machines, HasLen, 1)
76
instid, ok := machines[0].InstanceId()
77
c.Assert(ok, Equals, true)
78
c.Assert(instid, Equals, state.InstanceId("dummy.instance.id"))
80
cons, err := st.EnvironConstraints()
82
c.Assert(cons, DeepEquals, constraints.Value{})
85
func (s *BootstrapSuite) TestSetConstraints(c *C) {
86
tcons := constraints.Value{Mem: uint64p(2048), CpuCores: uint64p(2)}
87
_, cmd, err := s.initBootstrapCommand(c, "--env-config", testConfig, "--constraints", tcons.String())
92
st, err := state.Open(&state.Info{
93
Addrs: []string{testing.MgoAddr},
94
CACert: []byte(testing.CACert),
95
}, state.DefaultDialOpts())
98
cons, err := st.EnvironConstraints()
100
c.Assert(cons, DeepEquals, tcons)
102
machines, err := st.AllMachines()
104
c.Assert(machines, HasLen, 1)
105
cons, err = machines[0].Constraints()
107
c.Assert(cons, DeepEquals, tcons)
110
func uint64p(v uint64) *uint64 {
114
func (s *BootstrapSuite) TestMachinerWorkers(c *C) {
115
_, cmd, err := s.initBootstrapCommand(c, "--env-config", testConfig)
120
st, err := state.Open(&state.Info{
121
Addrs: []string{testing.MgoAddr},
122
CACert: []byte(testing.CACert),
123
}, state.DefaultDialOpts())
126
m, err := st.Machine("0")
128
c.Assert(m.Jobs(), DeepEquals, []state.MachineJob{state.JobManageEnviron, state.JobServeAPI})
131
func testOpenState(c *C, info *state.Info, expectErr error) {
132
st, err := state.Open(info, state.DefaultDialOpts())
136
if expectErr != nil {
137
c.Assert(state.IsUnauthorizedError(err), Equals, true)
143
func (s *BootstrapSuite) TestInitialPassword(c *C) {
144
conf, cmd, err := s.initBootstrapCommand(c, "--env-config", testConfig)
146
conf.OldPassword = "foo"
153
// Check that we cannot now connect to the state
154
// without a password.
156
Addrs: []string{testing.MgoAddr},
157
CACert: []byte(testing.CACert),
159
testOpenState(c, info, state.Unauthorizedf("some auth problem"))
161
info.Tag, info.Password = "machine-0", "foo"
162
testOpenState(c, info, nil)
165
st, err := state.Open(info, state.DefaultDialOpts())
169
// Reset password so the tests can continue to use the same server.
170
err = st.SetAdminMongoPassword("")
174
var base64ConfigTests = []struct {
177
expected map[string]interface{}
182
"--env-config option must be set",
186
[]string{"--env-config", ""},
187
"--env-config option must be set",
190
// wrong, should be base64
191
[]string{"--env-config", "name: banana\n"},
192
".*illegal base64 data at input byte.*",
195
[]string{"--env-config", base64.StdEncoding.EncodeToString([]byte("name: banana\n"))},
197
map[string]interface{}{"name": "banana"},
201
func (s *BootstrapSuite) TestBase64Config(c *C) {
202
for i, t := range base64ConfigTests {
205
args = append(args, t.input...)
206
_, cmd, err := s.initBootstrapCommand(c, args...)
208
c.Assert(cmd, NotNil)
210
c.Assert(cmd.EnvConfig, DeepEquals, t.expected)
212
c.Assert(err, ErrorMatches, t.err)
217
type b64yaml map[string]interface{}
219
func (m b64yaml) encode() string {
220
data, err := goyaml.Marshal(m)
224
return base64.StdEncoding.EncodeToString(data)
227
var testConfig = b64yaml{
230
"state-server": false,
231
"agent-version": "1.2.3",
232
"authorized-keys": "i-am-a-key",
233
"ca-cert": testing.CACert,
234
"ca-private-key": "",