github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/apiserver/systemmanager/systemmanager_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package systemmanager_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/loggo"
    10  	"github.com/juju/names"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/apiserver"
    15  	"github.com/juju/juju/apiserver/common"
    16  	"github.com/juju/juju/apiserver/params"
    17  	"github.com/juju/juju/apiserver/systemmanager"
    18  	apiservertesting "github.com/juju/juju/apiserver/testing"
    19  	jujutesting "github.com/juju/juju/juju/testing"
    20  	"github.com/juju/juju/state"
    21  	"github.com/juju/juju/state/multiwatcher"
    22  	"github.com/juju/juju/testing"
    23  	"github.com/juju/juju/testing/factory"
    24  )
    25  
    26  type systemManagerSuite struct {
    27  	jujutesting.JujuConnSuite
    28  
    29  	systemManager *systemmanager.SystemManagerAPI
    30  	resources     *common.Resources
    31  	authorizer    apiservertesting.FakeAuthorizer
    32  }
    33  
    34  var _ = gc.Suite(&systemManagerSuite{})
    35  
    36  func (s *systemManagerSuite) SetUpTest(c *gc.C) {
    37  	s.JujuConnSuite.SetUpTest(c)
    38  	s.resources = common.NewResources()
    39  	s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() })
    40  
    41  	s.authorizer = apiservertesting.FakeAuthorizer{
    42  		Tag: s.AdminUserTag(c),
    43  	}
    44  
    45  	systemManager, err := systemmanager.NewSystemManagerAPI(s.State, s.resources, s.authorizer)
    46  	c.Assert(err, jc.ErrorIsNil)
    47  	s.systemManager = systemManager
    48  
    49  	loggo.GetLogger("juju.apiserver.systemmanager").SetLogLevel(loggo.TRACE)
    50  }
    51  
    52  func (s *systemManagerSuite) TestNewAPIRefusesNonClient(c *gc.C) {
    53  	anAuthoriser := apiservertesting.FakeAuthorizer{
    54  		Tag: names.NewUnitTag("mysql/0"),
    55  	}
    56  	endPoint, err := systemmanager.NewSystemManagerAPI(s.State, s.resources, anAuthoriser)
    57  	c.Assert(endPoint, gc.IsNil)
    58  	c.Assert(err, gc.ErrorMatches, "permission denied")
    59  }
    60  
    61  func (s *systemManagerSuite) TestNewAPIRefusesNonAdmins(c *gc.C) {
    62  	user := s.Factory.MakeUser(c, &factory.UserParams{NoEnvUser: true})
    63  	anAuthoriser := apiservertesting.FakeAuthorizer{
    64  		Tag: user.Tag(),
    65  	}
    66  	endPoint, err := systemmanager.NewSystemManagerAPI(s.State, s.resources, anAuthoriser)
    67  	c.Assert(endPoint, gc.IsNil)
    68  	c.Assert(err, gc.ErrorMatches, "permission denied")
    69  }
    70  
    71  func (s *systemManagerSuite) checkEnvironmentMatches(c *gc.C, env params.Environment, expected *state.Environment) {
    72  	c.Check(env.Name, gc.Equals, expected.Name())
    73  	c.Check(env.UUID, gc.Equals, expected.UUID())
    74  	c.Check(env.OwnerTag, gc.Equals, expected.Owner().String())
    75  }
    76  
    77  func (s *systemManagerSuite) TestAllEnvironments(c *gc.C) {
    78  	admin := s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar"})
    79  
    80  	s.Factory.MakeEnvironment(c, &factory.EnvParams{
    81  		Name: "owned", Owner: admin.UserTag()}).Close()
    82  	remoteUserTag := names.NewUserTag("user@remote")
    83  	st := s.Factory.MakeEnvironment(c, &factory.EnvParams{
    84  		Name: "user", Owner: remoteUserTag})
    85  	defer st.Close()
    86  	st.AddEnvironmentUser(admin.UserTag(), remoteUserTag, "Foo Bar")
    87  
    88  	s.Factory.MakeEnvironment(c, &factory.EnvParams{
    89  		Name: "no-access", Owner: remoteUserTag}).Close()
    90  
    91  	response, err := s.systemManager.AllEnvironments()
    92  	c.Assert(err, jc.ErrorIsNil)
    93  	// The results are sorted.
    94  	expected := []string{"dummyenv", "no-access", "owned", "user"}
    95  	var obtained []string
    96  	for _, env := range response.UserEnvironments {
    97  		obtained = append(obtained, env.Name)
    98  		stateEnv, err := s.State.GetEnvironment(names.NewEnvironTag(env.UUID))
    99  		c.Assert(err, jc.ErrorIsNil)
   100  		s.checkEnvironmentMatches(c, env.Environment, stateEnv)
   101  	}
   102  	c.Assert(obtained, jc.DeepEquals, expected)
   103  }
   104  
   105  func (s *systemManagerSuite) TestListBlockedEnvironments(c *gc.C) {
   106  	st := s.Factory.MakeEnvironment(c, &factory.EnvParams{
   107  		Name: "test"})
   108  	defer st.Close()
   109  
   110  	s.State.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment")
   111  	s.State.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock")
   112  	st.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment")
   113  	st.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock")
   114  
   115  	list, err := s.systemManager.ListBlockedEnvironments()
   116  	c.Assert(err, jc.ErrorIsNil)
   117  
   118  	c.Assert(list.Environments, jc.DeepEquals, []params.EnvironmentBlockInfo{
   119  		params.EnvironmentBlockInfo{
   120  			Name:     "dummyenv",
   121  			UUID:     s.State.EnvironUUID(),
   122  			OwnerTag: s.AdminUserTag(c).String(),
   123  			Blocks: []string{
   124  				"BlockDestroy",
   125  				"BlockChange",
   126  			},
   127  		},
   128  		params.EnvironmentBlockInfo{
   129  			Name:     "test",
   130  			UUID:     st.EnvironUUID(),
   131  			OwnerTag: s.AdminUserTag(c).String(),
   132  			Blocks: []string{
   133  				"BlockDestroy",
   134  				"BlockChange",
   135  			},
   136  		},
   137  	})
   138  
   139  }
   140  
   141  func (s *systemManagerSuite) TestListBlockedEnvironmentsNoBlocks(c *gc.C) {
   142  	list, err := s.systemManager.ListBlockedEnvironments()
   143  	c.Assert(err, jc.ErrorIsNil)
   144  	c.Assert(list.Environments, gc.HasLen, 0)
   145  }
   146  
   147  func (s *systemManagerSuite) TestEnvironmentConfig(c *gc.C) {
   148  	env, err := s.systemManager.EnvironmentConfig()
   149  	c.Assert(err, jc.ErrorIsNil)
   150  	c.Assert(env.Config["name"], gc.Equals, "dummyenv")
   151  }
   152  
   153  func (s *systemManagerSuite) TestEnvironmentConfigFromNonStateServer(c *gc.C) {
   154  	st := s.Factory.MakeEnvironment(c, &factory.EnvParams{
   155  		Name: "test"})
   156  	defer st.Close()
   157  
   158  	authorizer := &apiservertesting.FakeAuthorizer{Tag: s.AdminUserTag(c)}
   159  	systemManager, err := systemmanager.NewSystemManagerAPI(st, common.NewResources(), authorizer)
   160  	c.Assert(err, jc.ErrorIsNil)
   161  	env, err := systemManager.EnvironmentConfig()
   162  	c.Assert(err, jc.ErrorIsNil)
   163  	c.Assert(env.Config["name"], gc.Equals, "dummyenv")
   164  }
   165  
   166  func (s *systemManagerSuite) TestRemoveBlocks(c *gc.C) {
   167  	st := s.Factory.MakeEnvironment(c, &factory.EnvParams{
   168  		Name: "test"})
   169  	defer st.Close()
   170  
   171  	s.State.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment")
   172  	s.State.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock")
   173  	st.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment")
   174  	st.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock")
   175  
   176  	err := s.systemManager.RemoveBlocks(params.RemoveBlocksArgs{All: true})
   177  	c.Assert(err, jc.ErrorIsNil)
   178  
   179  	blocks, err := s.State.AllBlocksForSystem()
   180  	c.Assert(err, jc.ErrorIsNil)
   181  	c.Assert(blocks, gc.HasLen, 0)
   182  }
   183  
   184  func (s *systemManagerSuite) TestRemoveBlocksNotAll(c *gc.C) {
   185  	err := s.systemManager.RemoveBlocks(params.RemoveBlocksArgs{})
   186  	c.Assert(err, gc.ErrorMatches, "not supported")
   187  }
   188  
   189  func (s *systemManagerSuite) TestWatchAllEnvs(c *gc.C) {
   190  	watcherId, err := s.systemManager.WatchAllEnvs()
   191  	c.Assert(err, jc.ErrorIsNil)
   192  
   193  	watcherAPI_, err := apiserver.NewAllWatcher(s.State, s.resources, s.authorizer, watcherId.AllWatcherId)
   194  	c.Assert(err, jc.ErrorIsNil)
   195  	watcherAPI := watcherAPI_.(*apiserver.SrvAllWatcher)
   196  	defer func() {
   197  		err := watcherAPI.Stop()
   198  		c.Assert(err, jc.ErrorIsNil)
   199  	}()
   200  
   201  	resultC := make(chan params.AllWatcherNextResults)
   202  	go func() {
   203  		result, err := watcherAPI.Next()
   204  		c.Assert(err, jc.ErrorIsNil)
   205  		resultC <- result
   206  	}()
   207  
   208  	select {
   209  	case result := <-resultC:
   210  		// Expect to see the initial environment be reported.
   211  		deltas := result.Deltas
   212  		c.Assert(deltas, gc.HasLen, 1)
   213  		envInfo := deltas[0].Entity.(*multiwatcher.EnvironmentInfo)
   214  		c.Assert(envInfo.EnvUUID, gc.Equals, s.State.EnvironUUID())
   215  	case <-time.After(testing.LongWait):
   216  		c.Fatal("timed out")
   217  	}
   218  }