github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/api/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  	"fmt"
     8  	"time"
     9  
    10  	"github.com/juju/names"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	"github.com/juju/juju/api"
    15  	"github.com/juju/juju/api/systemmanager"
    16  	commontesting "github.com/juju/juju/apiserver/common/testing"
    17  	"github.com/juju/juju/apiserver/params"
    18  	"github.com/juju/juju/feature"
    19  	"github.com/juju/juju/juju"
    20  	jujutesting "github.com/juju/juju/juju/testing"
    21  	"github.com/juju/juju/state"
    22  	"github.com/juju/juju/state/multiwatcher"
    23  	"github.com/juju/juju/testing"
    24  	"github.com/juju/juju/testing/factory"
    25  )
    26  
    27  type systemManagerSuite struct {
    28  	jujutesting.JujuConnSuite
    29  	commontesting.BlockHelper
    30  }
    31  
    32  var _ = gc.Suite(&systemManagerSuite{})
    33  
    34  func (s *systemManagerSuite) SetUpTest(c *gc.C) {
    35  	s.SetInitialFeatureFlags(feature.JES)
    36  	s.JujuConnSuite.SetUpTest(c)
    37  }
    38  
    39  func (s *systemManagerSuite) OpenAPI(c *gc.C) *systemmanager.Client {
    40  	conn, err := juju.NewAPIState(s.AdminUserTag(c), s.Environ, api.DialOpts{})
    41  	c.Assert(err, jc.ErrorIsNil)
    42  	s.AddCleanup(func(*gc.C) { conn.Close() })
    43  	return systemmanager.NewClient(conn)
    44  }
    45  
    46  func (s *systemManagerSuite) TestAllEnvironments(c *gc.C) {
    47  	owner := names.NewUserTag("user@remote")
    48  	s.Factory.MakeEnvironment(c, &factory.EnvParams{
    49  		Name: "first", Owner: owner}).Close()
    50  	s.Factory.MakeEnvironment(c, &factory.EnvParams{
    51  		Name: "second", Owner: owner}).Close()
    52  
    53  	sysManager := s.OpenAPI(c)
    54  	envs, err := sysManager.AllEnvironments()
    55  	c.Assert(err, jc.ErrorIsNil)
    56  	c.Assert(envs, gc.HasLen, 3)
    57  
    58  	var obtained []string
    59  	for _, env := range envs {
    60  		obtained = append(obtained, fmt.Sprintf("%s/%s", env.Owner, env.Name))
    61  	}
    62  	expected := []string{
    63  		"dummy-admin@local/dummyenv",
    64  		"user@remote/first",
    65  		"user@remote/second",
    66  	}
    67  	c.Assert(obtained, jc.SameContents, expected)
    68  }
    69  
    70  func (s *systemManagerSuite) TestEnvironmentConfig(c *gc.C) {
    71  	sysManager := s.OpenAPI(c)
    72  	env, err := sysManager.EnvironmentConfig()
    73  	c.Assert(err, jc.ErrorIsNil)
    74  	c.Assert(env["name"], gc.Equals, "dummyenv")
    75  }
    76  
    77  func (s *systemManagerSuite) TestDestroySystem(c *gc.C) {
    78  	s.Factory.MakeEnvironment(c, &factory.EnvParams{Name: "foo"}).Close()
    79  
    80  	sysManager := s.OpenAPI(c)
    81  	err := sysManager.DestroySystem(false, false)
    82  	c.Assert(err, gc.ErrorMatches, "state server environment cannot be destroyed before all other environments are destroyed")
    83  }
    84  
    85  func (s *systemManagerSuite) TestListBlockedEnvironments(c *gc.C) {
    86  	err := s.State.SwitchBlockOn(state.ChangeBlock, "change block for state server")
    87  	err = s.State.SwitchBlockOn(state.DestroyBlock, "destroy block for state server")
    88  	c.Assert(err, jc.ErrorIsNil)
    89  
    90  	sysManager := s.OpenAPI(c)
    91  	results, err := sysManager.ListBlockedEnvironments()
    92  	c.Assert(err, jc.ErrorIsNil)
    93  	c.Assert(results, jc.DeepEquals, []params.EnvironmentBlockInfo{
    94  		params.EnvironmentBlockInfo{
    95  			Name:     "dummyenv",
    96  			UUID:     s.State.EnvironUUID(),
    97  			OwnerTag: s.AdminUserTag(c).String(),
    98  			Blocks: []string{
    99  				"BlockChange",
   100  				"BlockDestroy",
   101  			},
   102  		},
   103  	})
   104  }
   105  
   106  func (s *systemManagerSuite) TestRemoveBlocks(c *gc.C) {
   107  	s.State.SwitchBlockOn(state.DestroyBlock, "TestBlockDestroyEnvironment")
   108  	s.State.SwitchBlockOn(state.ChangeBlock, "TestChangeBlock")
   109  
   110  	sysManager := s.OpenAPI(c)
   111  	err := sysManager.RemoveBlocks()
   112  	c.Assert(err, jc.ErrorIsNil)
   113  
   114  	blocks, err := s.State.AllBlocksForSystem()
   115  	c.Assert(err, jc.ErrorIsNil)
   116  	c.Assert(blocks, gc.HasLen, 0)
   117  }
   118  
   119  func (s *systemManagerSuite) TestWatchAllEnvs(c *gc.C) {
   120  	// The WatchAllEnvs infrastructure is comprehensively tested
   121  	// else. This test just ensure that the API calls work end-to-end.
   122  	sysManager := s.OpenAPI(c)
   123  
   124  	w, err := sysManager.WatchAllEnvs()
   125  	c.Assert(err, jc.ErrorIsNil)
   126  	defer func() {
   127  		err := w.Stop()
   128  		c.Assert(err, jc.ErrorIsNil)
   129  	}()
   130  
   131  	deltasC := make(chan []multiwatcher.Delta)
   132  	go func() {
   133  		deltas, err := w.Next()
   134  		c.Assert(err, jc.ErrorIsNil)
   135  		deltasC <- deltas
   136  	}()
   137  
   138  	select {
   139  	case deltas := <-deltasC:
   140  		c.Assert(deltas, gc.HasLen, 1)
   141  		envInfo := deltas[0].Entity.(*multiwatcher.EnvironmentInfo)
   142  
   143  		env, err := s.State.Environment()
   144  		c.Assert(err, jc.ErrorIsNil)
   145  
   146  		c.Assert(envInfo.EnvUUID, gc.Equals, env.UUID())
   147  		c.Assert(envInfo.Name, gc.Equals, env.Name())
   148  		c.Assert(envInfo.Life, gc.Equals, multiwatcher.Life("alive"))
   149  		c.Assert(envInfo.Owner, gc.Equals, env.Owner().Id())
   150  		c.Assert(envInfo.ServerUUID, gc.Equals, env.ServerUUID())
   151  	case <-time.After(testing.LongWait):
   152  		c.Fatal("timed out")
   153  	}
   154  }