12
12
"github.com/juju/cmd"
13
13
"github.com/juju/errors"
14
"github.com/juju/names"
14
15
jc "github.com/juju/testing/checkers"
15
16
gc "gopkg.in/check.v1"
18
"github.com/juju/juju/api"
17
19
"github.com/juju/juju/api/modelmanager"
18
20
undertakerapi "github.com/juju/juju/api/undertaker"
19
21
"github.com/juju/juju/cmd/juju/commands"
20
"github.com/juju/juju/cmd/modelcmd"
21
"github.com/juju/juju/environs/configstore"
22
"github.com/juju/juju/environs/config"
22
23
"github.com/juju/juju/juju"
23
24
jujutesting "github.com/juju/juju/juju/testing"
25
"github.com/juju/juju/jujuclient"
24
26
"github.com/juju/juju/provider/dummy"
25
27
"github.com/juju/juju/state"
26
28
"github.com/juju/juju/testing"
43
func (s *cmdControllerSuite) createEnv(c *gc.C, envname string, isServer bool) {
45
func (s *cmdControllerSuite) createModelAdminUser(c *gc.C, modelname string, isServer bool) {
44
46
modelManager := modelmanager.NewClient(s.APIState)
45
47
_, err := modelManager.CreateModel(s.AdminUserTag(c).Id(), nil, map[string]interface{}{
49
"controller": isServer,
51
c.Assert(err, jc.ErrorIsNil)
54
func (s *cmdControllerSuite) createModelNormalUser(c *gc.C, modelname string, isServer bool) {
55
s.run(c, "add-user", "test")
56
modelManager := modelmanager.NewClient(s.APIState)
57
_, err := modelManager.CreateModel(names.NewLocalUserTag("test").Id(), nil, map[string]interface{}{
47
59
"authorized-keys": "ssh-key",
48
60
"controller": isServer,
53
65
func (s *cmdControllerSuite) TestControllerListCommand(c *gc.C) {
54
66
context := s.run(c, "list-controllers")
56
CONTROLLER MODEL USER SERVER
57
dummymodel* dummymodel admin@local
67
expectedOutput := fmt.Sprintf(`
68
CONTROLLER MODEL USER SERVER
69
kontroll* admin admin@local %s
71
`[1:], s.APIState.Addr())
60
72
c.Assert(testing.Stdout(context), gc.Equals, expectedOutput)
63
func (s *cmdControllerSuite) TestControllerModelsCommand(c *gc.C) {
64
c.Assert(modelcmd.WriteCurrentController("dummymodel"), jc.ErrorIsNil)
65
s.createEnv(c, "new-model", false)
66
context := s.run(c, "list-models")
67
c.Assert(testing.Stdout(context), gc.Equals, ""+
68
"NAME OWNER LAST CONNECTION\n"+
69
"dummymodel* admin@local just now\n"+
70
"new-model admin@local never connected\n"+
75
func (s *cmdControllerSuite) TestCreateModelAdminUser(c *gc.C) {
76
s.createModelAdminUser(c, "new-model", false)
77
context := s.run(c, "list-models")
78
c.Assert(testing.Stdout(context), gc.Equals, ""+
79
"NAME OWNER LAST CONNECTION\n"+
80
"admin* admin@local just now\n"+
81
"new-model admin@local never connected\n"+
85
func (s *cmdControllerSuite) TestCreateModelNormalUser(c *gc.C) {
86
s.createModelAdminUser(c, "new-model", false)
87
context := s.run(c, "list-models")
88
c.Assert(testing.Stdout(context), gc.Equals, ""+
89
"NAME OWNER LAST CONNECTION\n"+
90
"admin* admin@local just now\n"+
91
"new-model admin@local never connected\n"+
74
95
func (s *cmdControllerSuite) TestCreateModel(c *gc.C) {
75
c.Assert(modelcmd.WriteCurrentController("dummymodel"), jc.ErrorIsNil)
76
96
// The JujuConnSuite doesn't set up an ssh key in the fake home dir,
77
97
// so fake one on the command line. The dummy provider also expects
78
98
// a config value for 'controller'.
83
103
// Make sure that the saved server details are sufficient to connect
84
104
// to the api server.
85
api, err := juju.NewAPIConnection(s.ControllerStore, "dummymodel", "admin@local", "new-model", nil)
105
accountDetails, err := s.ControllerStore.AccountByName("kontroll", "admin@local")
106
c.Assert(err, jc.ErrorIsNil)
107
modelDetails, err := s.ControllerStore.ModelByName("kontroll", "admin@local", "new-model")
108
c.Assert(err, jc.ErrorIsNil)
109
api, err := juju.NewAPIConnection(juju.NewAPIConnectionParams{
110
Store: s.ControllerStore,
111
ControllerName: "kontroll",
112
AccountDetails: accountDetails,
113
ModelUUID: modelDetails.ModelUUID,
114
BootstrapConfig: noBootstrapConfig,
115
DialOpts: api.DefaultDialOpts(),
86
117
c.Assert(err, jc.ErrorIsNil)
126
s.run(c, "destroy-controller", "dummymodel", "-y", "--destroy-all-models", "--debug")
157
s.run(c, "destroy-controller", "kontroll", "-y", "--destroy-all-models", "--debug")
130
store, err := configstore.Default()
131
_, err = store.ReadInfo("dummymodel")
161
store := jujuclient.NewFileClientStore()
162
_, err := store.ControllerByName("kontroll")
132
163
c.Assert(err, jc.Satisfies, errors.IsNotFound)
135
166
func (s *cmdControllerSuite) TestRemoveBlocks(c *gc.C) {
136
c.Assert(modelcmd.WriteCurrentController("dummymodel"), jc.ErrorIsNil)
137
167
s.State.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyModel")
138
168
s.State.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock")
152
182
st.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyModel")
155
s.run(c, "kill-controller", "dummymodel", "-y")
185
s.run(c, "kill-controller", "kontroll", "-y")
157
store, err := configstore.Default()
158
_, err = store.ReadInfo("dummymodel")
187
store := jujuclient.NewFileClientStore()
188
_, err := store.ControllerByName("kontroll")
159
189
c.Assert(err, jc.Satisfies, errors.IsNotFound)
162
192
func (s *cmdControllerSuite) TestListBlocks(c *gc.C) {
163
c.Assert(modelcmd.WriteCurrentController("dummymodel"), jc.ErrorIsNil)
164
193
s.State.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyModel")
165
194
s.State.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock")
167
196
ctx := s.run(c, "list-all-blocks", "--format", "json")
168
expected := fmt.Sprintf(`[{"name":"dummymodel","model-uuid":"%s","owner-tag":"%s","blocks":["BlockDestroy","BlockChange"]}]`,
197
expected := fmt.Sprintf(`[{"name":"admin","model-uuid":"%s","owner-tag":"%s","blocks":["BlockDestroy","BlockChange"]}]`,
169
198
s.State.ModelUUID(), s.AdminUserTag(c).String())
171
200
strippedOut := strings.Replace(testing.Stdout(ctx), "\n", "", -1)
190
219
mClock := testing.NewClock(startTime)
191
220
undertaker.NewUndertaker(client, mClock)
193
store, err := configstore.Default()
194
_, err = store.ReadInfo("dummymodel:dummymodel")
222
store := jujuclient.NewFileClientStore()
223
_, err := store.ControllerByName("kontroll")
195
224
c.Assert(err, jc.ErrorIsNil)
197
s.run(c, "kill-controller", "dummymodel", "-y")
226
s.run(c, "kill-controller", "kontroll", "-y")
199
228
// Ensure that Destroy was called on the hosted model ...
200
229
opRecvTimeout(c, st, opc, dummy.OpDestroy{})
202
// ... and that the configstore was removed.
203
_, err = store.ReadInfo("dummymodel")
231
// ... and that the details were removed removed from
233
_, err = store.ControllerByName("kontroll")
204
234
c.Assert(err, jc.Satisfies, errors.IsNotFound)