1
// Copyright 2015 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
10
"github.com/juju/errors"
11
"github.com/juju/loggo"
12
jc "github.com/juju/testing/checkers"
13
gc "gopkg.in/check.v1"
14
"gopkg.in/juju/names.v2"
16
"github.com/juju/juju/cmd/juju/commands"
17
"github.com/juju/juju/core/description"
18
jujutesting "github.com/juju/juju/juju/testing"
19
"github.com/juju/juju/state"
20
"github.com/juju/juju/testing"
21
"github.com/juju/juju/testing/factory"
24
type cmdModelSuite struct {
28
func (s *cmdModelSuite) SetUpTest(c *gc.C) {
29
s.RepoSuite.SetUpTest(c)
32
func (s *cmdModelSuite) run(c *gc.C, args ...string) *cmd.Context {
33
context := testing.Context(c)
34
jujuCmd := commands.NewJujuCommand(context)
35
err := testing.InitCommand(jujuCmd, args)
36
c.Assert(err, jc.ErrorIsNil)
37
err = jujuCmd.Run(context)
38
c.Assert(err, jc.ErrorIsNil)
42
func (s *cmdModelSuite) TestGrantModelCmdStack(c *gc.C) {
43
username := "bar@ubuntuone"
44
context := s.run(c, "grant", username, "controller")
45
obtained := strings.Replace(testing.Stdout(context), "\n", "", -1)
47
c.Assert(obtained, gc.Equals, expected)
49
user := names.NewUserTag(username)
50
modelUser, err := s.State.UserAccess(user, s.State.ModelTag())
51
c.Assert(err, jc.ErrorIsNil)
52
c.Assert(modelUser.UserName, gc.Equals, user.Canonical())
53
c.Assert(modelUser.CreatedBy.Canonical(), gc.Equals, s.AdminUserTag(c).Canonical())
54
lastConn, err := s.State.LastModelConnection(modelUser.UserTag)
55
c.Assert(err, jc.Satisfies, state.IsNeverConnectedError)
56
c.Assert(lastConn.IsZero(), jc.IsTrue)
59
func (s *cmdModelSuite) TestRevokeModelCmdStack(c *gc.C) {
60
// Firstly share a model with a user
61
username := "bar@ubuntuone"
62
s.Factory.MakeModelUser(c, &factory.ModelUserParams{
63
User: username, Access: description.ReadAccess})
65
// Because we are calling into juju through the main command,
66
// and the main command adds a warning logging writer, we need
67
// to clear the logging writers here.
68
loggo.RemoveWriter("warning")
70
// Then test that the unshare command stack is hooked up
71
context := s.run(c, "revoke", username, "controller")
72
obtained := strings.Replace(testing.Stdout(context), "\n", "", -1)
74
c.Assert(obtained, gc.Equals, expected)
76
user := names.NewUserTag(username)
77
modelUser, err := s.State.UserAccess(user, s.State.ModelTag())
78
c.Assert(errors.IsNotFound(err), jc.IsTrue)
79
c.Assert(modelUser, gc.DeepEquals, description.UserAccess{})
82
func (s *cmdModelSuite) TestModelUsersCmd(c *gc.C) {
83
// Firstly share an model with a user
84
username := "bar@ubuntuone"
85
context := s.run(c, "grant", username, "controller")
86
user := names.NewUserTag(username)
87
modelUser, err := s.State.UserAccess(user, s.State.ModelTag())
88
c.Assert(err, jc.ErrorIsNil)
89
c.Assert(modelUser, gc.NotNil)
91
// Because we are calling into juju through the main command,
92
// and the main command adds a warning logging writer, we need
93
// to clear the logging writers here.
94
loggo.RemoveWriter("warning")
96
context = s.run(c, "list-shares")
97
c.Assert(err, jc.ErrorIsNil)
98
c.Assert(testing.Stdout(context), gc.Equals, ""+
99
"NAME ACCESS LAST CONNECTION\n"+
100
"admin@local (admin) admin just now\n"+
101
"bar@ubuntuone read never connected\n"+
106
func (s *cmdModelSuite) TestGet(c *gc.C) {
107
err := s.State.UpdateModelConfig(map[string]interface{}{"special": "known"}, nil, nil)
108
c.Assert(err, jc.ErrorIsNil)
110
context := s.run(c, "get-model-config", "special")
111
c.Assert(testing.Stdout(context), gc.Equals, "known\n")
114
func (s *cmdModelSuite) TestSet(c *gc.C) {
115
s.run(c, "set-model-config", "special=known")
116
s.assertEnvValue(c, "special", "known")
119
func (s *cmdModelSuite) TestUnset(c *gc.C) {
120
err := s.State.UpdateModelConfig(map[string]interface{}{"special": "known"}, nil, nil)
121
c.Assert(err, jc.ErrorIsNil)
123
s.run(c, "unset-model-config", "special")
124
s.assertEnvValueMissing(c, "special")
127
func (s *cmdModelSuite) TestRetryProvisioning(c *gc.C) {
128
s.Factory.MakeMachine(c, &factory.MachineParams{
129
Jobs: []state.MachineJob{state.JobManageModel},
131
ctx := s.run(c, "retry-provisioning", "0")
132
output := testing.Stderr(ctx)
133
stripped := strings.Replace(output, "\n", "", -1)
134
c.Check(stripped, gc.Equals, `machine 0 is not in an error state`)
137
func (s *cmdModelSuite) assertEnvValue(c *gc.C, key string, expected interface{}) {
138
envConfig, err := s.State.ModelConfig()
139
c.Assert(err, jc.ErrorIsNil)
140
value, found := envConfig.AllAttrs()[key]
141
c.Assert(found, jc.IsTrue)
142
c.Assert(value, gc.Equals, expected)
145
func (s *cmdModelSuite) assertEnvValueMissing(c *gc.C, key string) {
146
envConfig, err := s.State.ModelConfig()
147
c.Assert(err, jc.ErrorIsNil)
148
_, found := envConfig.AllAttrs()[key]
149
c.Assert(found, jc.IsFalse)